Permalink
Browse files

All of the work to convert the original Japanese Ruby/SM to a viable …

…version.

Some of the more notable changes:
* Support for Hashes and Arrays in JS mode
* Support for foo in bar
* Support for with(foo) { ... }
* RubyObj == RubyObj
* Interactive mode for testing things out (interactive.rb)
  • Loading branch information...
0 parents commit 01453412474545670add5af36683117e11f4d2d4 @wycats wycats committed Apr 2, 2008
Showing with 6,703 additions and 0 deletions.
  1. +24 −0 ChangeLog
  2. +149 −0 Makefile
  3. +176 −0 README.ja.txt
  4. +26 −0 env/env.js
  5. +223 −0 env/env.rb
  6. +16 −0 env/html.html
  7. +3,381 −0 env/jquery.js
  8. +27 −0 extconf.rb
  9. +73 −0 interactive.rb
  10. +189 −0 jspec/jspec.js
  11. +126 −0 pkg-config.rb
  12. +3 −0 rbsm.msg
  13. +1,854 −0 spidermonkey.c
  14. +436 −0 test.rb
@@ -0,0 +1,24 @@
+2006-10-09
+ * Change : pkg-config を使うように変更( kou )
+ * Fix: rbsm.js を添付し忘れていたので追加
+
+2006-10-03
+ * Change : 内部の日本語をUTF-8に変更
+ * : Google Code にアップロード
+
+2006-07-25
+ * Change : bind_object の廃止。set_property に統一
+ * Change : eval を SpiderMonkey::Value
+ のメソッドに変更。SpiderMonkey,SpiderMonkey::Context へは Valueへのdelegate
+ とする
+
+2006-07-18
+ * Change : JavaScriptオブジェクトの関数の呼び出しメソッドを call_function に変更
+
+2006-06-28
+ * : eval の動作を変更。プリミティブ値を返す場合は、Ruby型に返還して返す
+
+2006-06-27
+ * Windows : Win32対応 http://rubyist.g.hatena.ne.jp/miyamuko/
+
+
@@ -0,0 +1,149 @@
+
+SHELL = /bin/sh
+
+#### Start of system configuration section. ####
+
+srcdir = .
+topdir = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0
+hdrdir = $(topdir)
+VPATH = $(srcdir):$(topdir):$(hdrdir)
+prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr
+exec_prefix = $(prefix)
+sitedir = $(DESTDIR)/Library/Ruby/Site
+rubylibdir = $(libdir)/ruby/$(ruby_version)
+docdir = $(datarootdir)/doc/$(PACKAGE)
+dvidir = $(docdir)
+datarootdir = $(prefix)/share
+archdir = $(rubylibdir)/$(arch)
+sbindir = $(exec_prefix)/sbin
+psdir = $(docdir)
+localedir = $(datarootdir)/locale
+htmldir = $(docdir)
+datadir = $(datarootdir)
+includedir = $(prefix)/include
+infodir = $(DESTDIR)/usr/share/info
+sysconfdir = $(prefix)/etc
+mandir = $(DESTDIR)/usr/share/man
+libdir = $(exec_prefix)/lib
+sharedstatedir = $(prefix)/com
+oldincludedir = $(DESTDIR)/usr/include
+pdfdir = $(docdir)
+sitearchdir = $(sitelibdir)/$(sitearch)
+bindir = $(exec_prefix)/bin
+localstatedir = $(prefix)/var
+sitelibdir = $(sitedir)/$(ruby_version)
+libexecdir = $(exec_prefix)/libexec
+
+CC = gcc
+LIBRUBY = $(LIBRUBY_SO)
+LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
+LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
+LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)
+
+RUBY_EXTCONF_H =
+CFLAGS = -fno-common -arch ppc -arch i386 -Os -pipe -fno-common
+INCFLAGS = -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I.
+CPPFLAGS = -DXP_UNIX -DNEED_MOZJS_PREFIX -DXP_UNIX -DNEED_JS_PREFIX -I/sw//include
+CXXFLAGS = $(CFLAGS)
+DLDFLAGS = -L. -arch ppc -arch i386
+LDSHARED = cc -arch ppc -arch i386 -pipe -bundle -undefined dynamic_lookup
+AR = ar
+EXEEXT =
+
+RUBY_INSTALL_NAME = ruby
+RUBY_SO_NAME = ruby
+arch = universal-darwin9.0
+sitearch = universal-darwin9.0
+ruby_version = 1.8
+ruby = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
+RUBY = $(ruby)
+RM = rm -f
+MAKEDIRS = mkdir -p
+INSTALL = /usr/bin/install -c
+INSTALL_PROG = $(INSTALL) -m 0755
+INSTALL_DATA = $(INSTALL) -m 644
+COPY = cp
+
+#### End of system configuration section. ####
+
+preload =
+
+libpath = . $(libdir) /sw//lib
+LIBPATH = -L"." -L"$(libdir)" -L"/sw//lib"
+DEFFILE =
+
+CLEANFILES = mkmf.log
+DISTCLEANFILES =
+
+extout =
+extout_prefix =
+target_prefix =
+LOCAL_LIBS =
+LIBS = $(LIBRUBYARG_SHARED) -ljs -lpthread -ldl -lm
+SRCS = spidermonkey.c
+OBJS = spidermonkey.o
+TARGET = spidermonkey
+DLLIB = $(TARGET).bundle
+EXTSTATIC =
+STATIC_LIB =
+
+RUBYCOMMONDIR = $(sitedir)$(target_prefix)
+RUBYLIBDIR = $(sitelibdir)$(target_prefix)
+RUBYARCHDIR = $(sitearchdir)$(target_prefix)
+
+TARGET_SO = $(DLLIB)
+CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
+CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
+
+all: $(DLLIB)
+static: $(STATIC_LIB)
+
+clean:
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
+
+distclean: clean
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
+
+realclean: distclean
+install: install-so install-rb
+
+install-so: $(RUBYARCHDIR)
+install-so: $(RUBYARCHDIR)/$(DLLIB)
+$(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
+install-rb: pre-install-rb install-rb-default
+install-rb-default: pre-install-rb-default
+pre-install-rb: Makefile
+pre-install-rb-default: Makefile
+$(RUBYARCHDIR):
+ $(MAKEDIRS) $@
+
+site-install: site-install-so site-install-rb
+site-install-so: install-so
+site-install-rb: install-rb
+
+.SUFFIXES: .c .m .cc .cxx .cpp .C .o
+
+.cc.o:
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+.cxx.o:
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+.cpp.o:
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+.C.o:
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+.c.o:
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
+
+$(DLLIB): $(OBJS)
+ @-$(RM) $@
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
+
+
+
+$(OBJS): ruby.h defines.h
@@ -0,0 +1,176 @@
+=begin
+=Ruby/SpiderMonkey
+-------------------------------------------------
+nazoking@gmail.com
+http://nazo.yi.org/rubysmjs/
+-------------------------------------------------
+
+Ruby で JavaScript を使うためのモジュールです。
+
+現在アルファバージョンです。
+クラス名、メソッド名などが変更される可能性があります。
+
+==
+サーバサイドでJavaScriptが使えると色々幸せだろう。
+
+
+==インストール
+ ruby extconf.rb
+ make
+ make install
+
+ただし、現在まだアルファバージョンなので、インストールしない方がいいでしょう。
+Debian/sarge 以外で上手く動作した方はご一報ください。
+ Debian/sid , FreeBSD6/ppc でも動いたという報告が
+
+上手く動作しない方は、上手く動作するようにしてください…
+
+test.rb はテストコードです。
+
+ ruby test.rb
+
+で実行します。通らないテストがあっても気にしない!
+(あるいは、テストが通るように修正してパッチを nazoking@gmail.com まで)
+
+
+==使用法
+
+require "spidermonkey"
+
+make install していない場合は、require "./spidermonkey" などと、spidermonkey.so の場所をパス付きで指定しましょう。
+
+SpiderMonkey::evalget("1").to_ruby #=> 1
+
+のようにできます。
+
+
+=== JavaScriptから見たRubyオブジェクト
+
+ Rubyオブジェクト rbobj は Context::set_property( "name", rbobj )で JavaScript に name として渡すことができます。Rubyから渡されたオブジェクトは、対応するJavaScriptプリミティブ値がある場合、その値に変換されます。ない場合はRubyオブジェクトをラップしたJavaScriptオブジェクトになります。
+
+ Rubyでは、オブジェクトのプロパティーという概念がなく、オブジェクトに対してアクセスできる手段はメソッドのみです。また、JavaScriptにはない概念として、定数という種類の変数があります。Ruby/SpiderMonkeyでは、Rubyオブジェクトをラップする際に、次のようにメソッドとプロパティーが設定されているものとして振る舞います。
+
+* Rubyの定数 → プロパティー
+* Rubyのメソッドの内、引数が0個固定のもの → プロパティー
+* Rubyのメソッドの内、引数が可変あるいは一個以上のもの → メソッド
+
+この方法の問題点は可変引数0個から複数のメソッドの扱いがわかりにくいことです。が、他に方法が思いつかなかったので、現状こうなっています。
+
+
+==リファレンス
+
+SpiderMonkey では、ランタイムを作成し、ランタイム上でコンテキストを作成し、そのコンテキストに対してスクリプトを実行します。
+が、手間がかかるため、ランタイムはモジュールがロードされた時点で作成されます。また、default_context というコンテキストを用意し、SpiderMonkeyクラスオブジェクトに対してメッセージを投げ、該当するメソッドが SpiderMonkeyクラスオブジェクトにない場合、デフォルトコンテキストに委譲されます。
+
+同じく Contextオブジェクトのメソッドも、該当するものがない場合、globalオブジェクトに委譲されます。
+
+=== SpiderMonkey
+
+:SpiderMonkey::LIB_VERSION
+ SpiderMonkeyのバージョンが文字列で返ります
+
+:SpiderMonkey::eval( code )
+ デフォルトコンテキスト上で javascript-code をevalします。
+ 結果の SpiderMonkey::Value が返ります。
+
+:SpiderMonkey::evaluate( code )
+ デフォルトコンテキスト上で javascript-code をevalします。
+ 結果の Rubyオブジェクト が返ります。
+ SpiderMonkey::evalate( code ).to_ruby
+ と同意です
+
+=== SpiderMonkey::Context
+コンテキスト情報のラッパークラスです。
+
+:SpiderMonkey::Context.new( stack_size=8192 )
+ 新しいコンテキストを作成します。
+
+:SpiderMonkey::Context#eval( code )
+ Javascriptコード code を、コンテキスト上で実行します。
+ 結果がプリミティブ値の場合、対応するRubyのオブジェクトが返ります。
+ 結果がオブジェクトの SpiderMonkey::Value が返ります。
+ 結果が Ruby から渡されたオブジェクトであった場合、元のRubyオブジェクトが返ります。
+
+:SpiderMonkey::Context#eval( code )
+ Javascriptコード code を、コンテキスト上で実行します。
+ 結果の SpiderMonkey::Value が返ります。
+
+:SpiderMonkey::Context#evaluate( code )
+ Javascriptコード code を、コンテキスト上で実行します。
+ 結果の Rubyオブジェクトが返ります。
+ SpiderMonkey::Context#evalget( code ).to_ruby
+ と同意です
+
+:SpiderMonkey::Context#version
+ ContextのJavaScriptのバージョンを文字列で返します。
+
+:SpiderMonkey::Context#version=
+ ContextのJavaScriptのバージョンを文字列で設定します。
+ 設定できないバージョンの場合は SpiderMonkey::Error が発生します。
+
+:SpiderMonkey::Context#gc()
+ ガベレージコレクションを発生させます。主にデバッグ用
+
+:SpiderMonkey::Context#running?
+ eval 実行中ならtrueを返します。コールバック関数中にrubyが呼ばれたなら trueになります。
+
+:SpiderMonkey::Context#global
+ globalオブジェクトのSpiderMonkey::Valueラッパーを返します。
+
+=== SpiderMonkey::Value
+ JavaScriptオブジェクトのRubyラッパーです。
+ JavaScriptから渡される値は、プリミティブ値以外はこのクラスにラップされます。
+
+:SpiderMonkey::Value#to_ruby
+ 適当なRubyオブジェクトに変換して返します。
+ undefined および null は nil に変換されます。
+ ObjectはHashに、ArrayはArrayに変換されます。
+ ObjectやArrayの子(プロパティー)も含めて変換します。
+ function型、function型を含むObjectを変換しようとすると ConvertError が発生します。
+ Rubyから渡されてきたオブジェクトは元のRubyオブジェクトになります。
+ JavaScript上でArrayに個別のプロパティーを設定しても、その値は変換されません。
+
+:SpiderMonkey::Value#to_a
+ Rubyの Array にして返します。
+ JavaScript の Array以外のものは適当なオブジェクトにした後に to_a メソッドを呼び出します。
+ JavaScript上でArrayに個別のプロパティーを設定しても、その値は変換されません。
+ JavaScriptの関数は変換できません。(SpiderMonkey::ConvertError が起こります)
+
+:SpiderMonkey::Value#to_i
+ Rubyの Integer にして返します。
+
+:SpiderMonkey::Value#to_f
+ Rubyの Float にして返します。
+
+:SpiderMonkey::Value#to_num
+ Rubyの Integer または Float にして返します。
+
+:SpiderMonkey::Value#to_h
+ Rubyの Hashにして返します。
+ オブジェクト以外は例外を返します。
+ 関数を含むオブジェクトは変換できません。
+
+:SpiderMonkey::Value#to_bool
+ true または false が返ります。JavaScript基準で変換されるので、空文字、0などはfalse になります。
+
+:SpiderMonkey::Value#typeof
+ typeof x をJavaScript上で行い、その結果の文字列を返します。
+
+:SpiderMonkey::Value#function( name , &proc )
+ JavaScriptオブジェクトに name という名前で関数を定義します。
+ その関数が呼ばれると、proc が実行されます
+
+:SpiderMonkey::Value#call( name , args... )
+ JavaScriptオブジェクトの関数を呼び出します。
+ args が引数になります。
+ 返値は SpiderMonkey::Value です
+
+:SpiderMonkey::Value#set_property( name, value )
+ JavaScriptオブジェクトに name という名前でプロパティーを定義します。
+
+:SpiderMonkey::Value#get_property( name )
+ JavaScriptオブジェクトの name という名前のプロパティーを取得します。
+ SpiderMonkey::Value オブジェクトが返ります。
+
+=end
+
@@ -0,0 +1,26 @@
+window.load = function(file) {
+ var text = File.read(file);
+ eval(text);
+};
+
+window.navigator = {
+ get userAgent(){
+ return "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3";
+ }
+};
+
+window.__defineSetter__("location", function(url) {
+ var text = File.read(url);
+ window.document = text;
+});
+
+window.__defineSetter__("document", function(text) {
+ window.__document__ = DOMDocument.create(text);
+});
+
+window.__defineGetter__("document", function() {
+ return window.__document__;
+});
+
+load("env/jquery.js")
+window.location = "env/html.html"
Oops, something went wrong. Retry.

0 comments on commit 0145341

Please sign in to comment.