Help us understand the problem. What is going on with this article?

nanに対応したのにnan,nanだ!

More than 5 years have passed since last update.

はじめに

2015年には大ブレイク間違いなし、誰もが注目しているWebCLが
2014年も残り僅か、神ライブラリtmlib.jsで作られた、
2014年バッテリーでの残量がもう5%しかないというのに、Firefoxでしかまともに
動かせない。Chromeでは動かない(半年くらい前にバイナリ恐る恐る動かすもNG、なにより
アドベントカレンダーでのChromeで動かせる紹介記事を見かけてない!)

そんなわけで、Atom Shellにnan化されていることを把握していたnode-webclを組み込めば、
ChromeでWebCLが出来た!と言えるんじゃねぇ。

ってなノリで始めたが、タイトルの感想を持つ羽目に

nanを使えば、0.10と0.12でも両方動くネイティブモジュールが出来る

って触れ込みで

など詳しい日本語の解説記事もあったりして、安心していたが、
nanの想定していたよりも激しくV8の最新版をnodeの0.11が採用してしまったのか、
一旦nanに対応しても、0.11.13以降に採用したV8のAPIが大きく変更され、
今回作業したnode-webclはかなり早い段階でnan対応していたが為に、色々
Atom Shellで動くようにするのに手間取った。

おかげで、isolate機能が0.7で採用されたが、すぐにボツになったことやら、
nodeの歴史を垣間見ることができたり収穫も多かった。

以下、マジでメモ

Newするときにisolateが必須になった件

Local<Array> arr=Array::New(v8::Isolate::GetCurrent(),3);
Local<Array> arr=Array::NanNew(3);

NanNewを使えばよかったっぽい

perlは-iでファイル単位で置換できて便利

.bakとかつけてる辺りが小物感満載w

perl -pi.bak -e 's/Integer::NewFromUnsigned\(/Integer::NewFromUnsigned\(v8::Isolate::GetCurrent\(\),/g' src/
perl -pi.bak -e 's/NanAssignPersistent\(FunctionTemplate, /NanAssignPersistent\(/g' src/
perl -pi.bak -e 's/NanPersistentToLocal\(/NanNew\(/g' src/
perl -pi.bak -e 's/Array::New\(/Array::New\(v8::Isolate::GetCurrent\(\),/g' src/
perl -pi.bak -e 's/FunctionTemplate::New\(/FunctionTemplate::New\(v8::Isolate::GetCurrent\(\),/g' src/
perl -pi.bak -e 's/Number::New\(/Number::New\(v8::Isolate::GetCurrent\(\),/g' src/*.c*
perl -pi.bak -e 's/NanReturnValue\(Undefined\(\)\)/NanReturnUndefined\(\)/g' src/*.c*
perl -pi.bak -e 's/Boolean::New\(/Boolean::New\(v8::Isolate::GetCurrent\(\),/g' src/*.c*
perl -pi.bak -e 's/String::New\(/String::NewFromUtf8\(v8::Isolate::GetCurrent\(\),/g' src/*.c*
perl -pi.bak -e 's/String::AsciiValue/String::Utf8Value/g' src/*.c*
perl -pi.bak -e 's/NanInitPersistent\(Function,/NanInitPersistent\(/g' src/*.c*
perl -pi.bak -e 's/v8::Integer::New\(/v8::Integer::New\(v8::Isolate::GetCurrent\(\),/g' src/*.c*
no member named 'Dispose' in 'v8::Persistent<v8::Function,
      v8::NonCopyablePersistentTraits<v8::Function> >'
    getter.Dispose();

no member named 'GetCurrent' in 'v8::Context'

Context::GetCurrent()->Global()
NanGetCurrentContext()->Global()

no member named 'ThrowException' in namespace 'v8'

NanReturnUndefined

NanInitPersistent
->廃止
とりあえず該当箇所をコメントアウト

no member named 'ThrowException' in namespace 'v8'
no member named 'New' in 'v8::String'

NewFromUtf8

../src/device.cc:84:39: error: cannot initialize a parameter of type 'v8::String::NewStringType'
      with an rvalue of type 'int'

NanPersistentToLocal
NanNewって書き換えればコンパイル通った

NanAssignPersistent(constructor, ctor);
第一引数が無くなった?

  CXX(target) Release/obj.target/webcl/src/commandqueue.o
../src/commandqueue.cc:61:23: error: 'FunctionTemplate' does not refer to a value
  NanAssignPersistent(FunctionTemplate, constructor_template, ctor);
                      ^
/Users/junichi/.atom-shell-gyp/.node-gyp/0.19.5/deps/v8/include/v8.h:3452:17: note: declared here
class V8_EXPORT FunctionTemplate : public Template {
                ^
../src/commandqueue.cc:63:22: warning: 'NanSymbol' is deprecated [-Wdeprecated-declarations]
  ctor->SetClassName(NanSymbol("WebCLCommandQueue"));
                     ^
../node_modules/nan/nan.h:611:51: note: 'NanSymbol' has been explicitly marked deprecated here
  NAN_DEPRECATED NAN_INLINE v8::Local<v8::String> NanSymbol(
                                                  ^
../src/commandqueue.cc:92:15: warning: 'NanSymbol' is deprecated [-Wdeprecated-declarations]
  target->Set(NanSymbol("WebCLCommandQueue"), ctor->GetFunction());
              ^
../node_modules/nan/nan.h:611:51: note: 'NanSymbol' has been explicitly marked deprecated here
  NAN_DEPRECATED NAN_INLINE v8::Local<v8::String> NanSymbol(

v8::Integer::New(value)

CXX(target) Release/obj.target/webcl/src/bindings.o
../src/bindings.cc:59:3: warning: 'NanSymbol' is deprecated [-Wdeprecated-declarations]
  NODE_DEFINE_CONSTANT_VALUE(target, "size_CHAR", sizeof(char));
  ^
../src/bindings.cc:46:17: note: expanded from macro 'NODE_DEFINE_CONSTANT_VALUE'
  (target)->Set(NanSymbol(name),                         \
                ^
../node_modules/nan/nan.h:611:51: note: 'NanSymbol' has been explicitly marked deprecated here
  NAN_DEPRECATED NAN_INLINE v8::Local<v8::String> NanSymbol(
                                                  ^
../src/bindings.cc:59:3: error: too few arguments to function call, expected 2, have 1
  NODE_DEFINE_CONSTANT_VALUE(target, "size_CHAR", sizeof(char));


In file included from ../src/common.h:32:
../node_modules/nan/nan.h:339:13: error: no member named 'New' in 'v8::String'
    return  _NAN_ERROR(v8::Exception::Error, errmsg);

おわりに

今回の作業でnode.jsのネイティブモジュールで古くから作られてる
作者の方々の苦労が少しだけ分かった。

皆さん神すぎる。感謝!

関連記事

kjunichi
WebRubyがきっかけで、mrubyで実装されたhttp2サーバーのtrusterdに絡んだ事をやってみたり、ElectronのIssue眺めたり、手元で動かしたり、node.js関連。WASMも少々。投稿する記事の内容は個人の意見であり、所属する企業の見解を代表するものではありません。
https://abrakatabura.hatenablog.com/
japan-systems
「2019年に50周年を迎えたIT企業です。最先端の技術により全国の企業、官公庁、自治体に多くの実績があります。」
https://www.japan-systems.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away