LoginSignup
5
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-13

はじめに

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のネイティブモジュールで古くから作られてる
作者の方々の苦労が少しだけ分かった。

皆さん神すぎる。感謝!

関連記事

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5