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

# はじめに

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

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

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

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

って触れ込みで

- [node.jsのnative addonを作るときはNANを使おう。 - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2014/04/07/205935)

など詳しい日本語の解説記事もあったりして、安心していたが、
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のネイティブモジュールで古くから作られてる
作者の方々の苦労が少しだけ分かった。

皆さん神すぎる。感謝！


# 関連記事

- [俺が雑にAtom ShellをWebCLに対応させた件: misc](http://kjunichi.cocolog-nifty.com/misc/2014/12/atom-shellwebcl.html)
- [俺がnan化されたモジュールだから安心していた件: misc](http://kjunichi.cocolog-nifty.com/misc/2014/12/post-fce2-1.html)