はじめに
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のネイティブモジュールで古くから作られてる
作者の方々の苦労が少しだけ分かった。
皆さん神すぎる。感謝!