search
LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

Organization

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

はじめに

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

皆さん神すぎる。感謝!

関連記事

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
What you can do with signing up
5