nazonoRubyist RubyでJavaScriptのためにC このページをアンテナに追加 RSSフィード

2006-07-29

js_ObjectClass を使わないように変更 22:04 js_ObjectClass を使わないように変更 - nazonoRubyist RubyでJavaScriptのためにC を含むブックマーク はてなブックマーク - js_ObjectClass を使わないように変更 - nazonoRubyist RubyでJavaScriptのためにC js_ObjectClass を使わないように変更 - nazonoRubyist RubyでJavaScriptのためにC のブックマークコメント

http://rubyist.g.hatena.ne.jp/secondlife/20060729/1154157935

うう、エラります。なんでだろう…。

$ ruby test.rb

./spidermonkey.so: ./spidermonkey.so: undefined symbol: js_ObjectClass - ./spidermonkey.so (LoadError)

from test.rb:3

およよ…確かに小文字で始まっているものは使ってはいけないのに使っています…

  • Extern but library-private function names use a js_ prefix and mixed case, e.g. js_SearchScope.
  • And library-private and static data use underscores, not intercaps (but library-private data do use a js_ prefix).

http://lxr.mozilla.org/mozilla/source/js/src/README.html

とりあえず js_ObjectClass は使わないようにしました。NULLで普通Objectクラスが生成されるはず。運がよければ実行できると思います…

  // ガベレージコレクタのためのマーカー・ハッシュ
  cs->store = JS_NewObject( cs->cx, NULL, 0, 0);

運がよければ、というのは、同じくプライベートな感じの js_ObjectOps は使ってるからで…js_ObjectOpsを自分で定義する方法がわからないのです。これを実装しないと、解決したはずの Functionのtypeofがfunctionと出るように の問題が、またぶり返すことに。

あと、どうしてこちらではエラーが出ないんだろう…?

ちなみに make では

$ make

gcc -fPIC -Wall -g -fno-strict-aliasing -O2 -fPIC -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -DXP_UNIX -c spidermonkey.c

spidermonkey.c:605: warning: ‘rbsm_class_no_such_method’ defined but not used

gcc -shared -L"/usr/lib" -o spidermonkey.so spidermonkey.o -lruby1.8 -lsmjs -lpthread -ldl -lcrypt -lm -lc

と warning がでました。

ああ、こちらの警告は無視してもらって大丈夫な、未実装の機能のための関数です。


js_GetErrorMessageを自前実装 16:18 js_GetErrorMessageを自前実装 - nazonoRubyist RubyでJavaScriptのためにC を含むブックマーク はてなブックマーク - js_GetErrorMessageを自前実装 - nazonoRubyist RubyでJavaScriptのためにC js_GetErrorMessageを自前実装 - nazonoRubyist RubyでJavaScriptのためにC のブックマークコメント

早速エラーレポートありがとうございます

http://rubyist.g.hatena.ne.jp/secondlife/20060727/1153976440

と思ったら spidermonkey.so をロードすると

./spidermonkey.so: ./spidermonkey.so: undefined symbol: js_GetErrorMessage - ./spidermonkey.so (LoadError)

と言われて落ちる罠。むーん。

spidermonkey は 1.5rc6a-2 なら、僕が使ってるのと同じようなものだしなぁ…どのコードで違いが出ているのか不思議です。その部分を自前で実装してみました。

typedef enum RBSMErrNum {
#define MSG_DEF(name, number, count, exception, format) \
    name = number,
MSG_DEF(RBSMMSG_INCOMPATIBLE_PROTO,       8, 3, JSEXN_TYPEERR, "{0}.prototype.{1} called on incompatible {2}")
MSG_DEF(RBSMMSG_NOT_FUNCTION,            22, 1, JSEXN_TYPEERR, "{0} is not a function")
#undef MSG_DEF
    RBSMErr_Limit
#undef MSGDEF
} RBSMErrNum;

JSErrorFormatString rbsm_ErrorFormatString[2] = {
#define MSG_DEF(name, number, count, exception, format) 
MSG_DEF(JSMSG_INCOMPATIBLE_PROTO,       8, 3, JSEXN_TYPEERR, "{0}.prototype.{1} called on incompatible {2}")
MSG_DEF(JSMSG_NOT_FUNCTION,            22, 1, JSEXN_TYPEERR, "{0} is not a function")
#undef MSG_DEF
};

static const JSErrorFormatString *
rbsm_GetErrorMessage(void *userRef, const char *locale, const uintN errorNumber){
  return &rbsm_ErrorFormatString[errorNumber];
}

使い方がよくわからないままにほぼコピペで実装してみたので、間違ってるかも…まあ、とりあえずテストは通っています。あとテストコード削除コメントアウト)したつもり。

また、この変更によって jscntxt.h を include しなくてもよくなったため、js.msg、 jsopcode.tblが必要なくなりました。多分。

とりあえず、お試しくださいm(..)m

koukou 2006/09/27 22:37 はじめまして,このプロジェクトに興味があります.
Google Codeにプロジェクトを作成していらっしゃるようですが,Google Codeのリポジトリでソースを公開する予定はありますか?そうなったら開発状況を追いやすくなるので嬉しいです.

secondlifesecondlife 2006/10/02 13:13 ↑キタコレ!!!

nazokingnazoking 2006/10/03 01:28 おお、どうもありがとうございます 予定はあるけど使い方がよくわからないので放置してあり(汗) コード自体はここからダウンロードできるものから変わりないです

nazokingnazoking 2006/10/03 13:46 現状をアップロードしました 共同開発してもらえたりしますか!?

nazokingnazoking 2006/10/03 13:49 うーん、GoogleCodeって何か不便だにゃあ…

koukou 2006/10/04 17:34 気になったところがあったらパッチを送ると思います.
ところで,MLはありますか?

koukou 2006/10/04 23:07 rbsm.msgがないと怒られてしまいます.

koukou 2006/10/04 23:15 手元のDebian sid環境ではsmjs/jsXXX.hは使えなくて,xulrunner-jsなどpkg-configでビルド環境を取得するようになっていました.
ということで,pkg-configでビルド環境が取得できるならそちらを優先するパッチです.
http://pub.cozmixng.org/~kou/diff/ruby-smjs-pkg-config.diff

# pkg-config.rbはRuby/GLib2からいただいてきました.

secondlifesecondlife 2006/10/06 13:49 google group かなんかでさくっと ML 作ったりするとうれしいかも…。>のぞきさん

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/nazoking/20060729