superchris-rubyjs 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/README +131 -0
  2. data/Rakefile +65 -0
  3. data/bin/rubyjs +144 -0
  4. data/rubyjs.gemspec +112 -0
  5. data/src/rubyjs.rb +3 -0
  6. data/src/rubyjs/code_generator.rb +474 -0
  7. data/src/rubyjs/compiler.rb +2061 -0
  8. data/src/rubyjs/debug_name_generator.rb +95 -0
  9. data/src/rubyjs/encoder.rb +171 -0
  10. data/src/rubyjs/eval_into.rb +59 -0
  11. data/src/rubyjs/lib/core.rb +1016 -0
  12. data/src/rubyjs/lib/dom_element.rb +66 -0
  13. data/src/rubyjs/lib/json.rb +101 -0
  14. data/src/rubyjs/lib/microunit.rb +188 -0
  15. data/src/rubyjs/model.rb +293 -0
  16. data/src/rubyjs/name_generator.rb +71 -0
  17. data/src/rwt/AbsolutePanel.rb +161 -0
  18. data/src/rwt/DOM.Konqueror.rb +89 -0
  19. data/src/rwt/DOM.Opera.rb +65 -0
  20. data/src/rwt/DOM.rb +1044 -0
  21. data/src/rwt/Event.Opera.rb +35 -0
  22. data/src/rwt/Event.rb +429 -0
  23. data/src/rwt/HTTPRequest.IE6.rb +5 -0
  24. data/src/rwt/HTTPRequest.rb +74 -0
  25. data/src/rwt/Label.rb +164 -0
  26. data/src/rwt/Panel.rb +90 -0
  27. data/src/rwt/RootPanel.rb +16 -0
  28. data/src/rwt/UIObject.rb +495 -0
  29. data/src/rwt/Widget.rb +193 -0
  30. data/src/rwt/ported-from/AbsolutePanel.java +158 -0
  31. data/src/rwt/ported-from/DOM.java +571 -0
  32. data/src/rwt/ported-from/DOMImpl.java +426 -0
  33. data/src/rwt/ported-from/DOMImplOpera.java +82 -0
  34. data/src/rwt/ported-from/DOMImplStandard.java +234 -0
  35. data/src/rwt/ported-from/HTTPRequest.java +81 -0
  36. data/src/rwt/ported-from/HTTPRequestImpl.java +103 -0
  37. data/src/rwt/ported-from/Label.java +163 -0
  38. data/src/rwt/ported-from/Panel.java +99 -0
  39. data/src/rwt/ported-from/UIObject.java +614 -0
  40. data/src/rwt/ported-from/Widget.java +221 -0
  41. data/test/benchmark/bm_vm1_block.rb +15 -0
  42. data/test/benchmark/bm_vm1_const.rb +13 -0
  43. data/test/benchmark/bm_vm1_ensure.rb +15 -0
  44. data/test/benchmark/common.rb +5 -0
  45. data/test/benchmark/params.yaml +7 -0
  46. data/test/common.Browser.rb +13 -0
  47. data/test/common.rb +8 -0
  48. data/test/gen_browser_test_suite.rb +129 -0
  49. data/test/gen_test_suite.rb +41 -0
  50. data/test/run_benchs.rb +58 -0
  51. data/test/run_tests.rb +22 -0
  52. data/test/test_args.rb +24 -0
  53. data/test/test_array.rb +22 -0
  54. data/test/test_case.rb +35 -0
  55. data/test/test_class.rb +55 -0
  56. data/test/test_eql.rb +9 -0
  57. data/test/test_exception.rb +61 -0
  58. data/test/test_expr.rb +12 -0
  59. data/test/test_hash.rb +29 -0
  60. data/test/test_hot_ruby.rb +146 -0
  61. data/test/test_if.rb +28 -0
  62. data/test/test_insertion_sort.rb +25 -0
  63. data/test/test_inspect.rb +10 -0
  64. data/test/test_lebewesen.rb +39 -0
  65. data/test/test_massign.rb +66 -0
  66. data/test/test_new.rb +12 -0
  67. data/test/test_range.rb +70 -0
  68. data/test/test_regexp.rb +22 -0
  69. data/test/test_send.rb +65 -0
  70. data/test/test_simple_output.rb +5 -0
  71. data/test/test_splat.rb +21 -0
  72. data/test/test_string.rb +51 -0
  73. data/test/test_test.rb +17 -0
  74. data/test/test_yield.rb +154 -0
  75. data/utils/js/Makefile +9 -0
  76. data/utils/js/RunScript.class +0 -0
  77. data/utils/js/RunScript.java +73 -0
  78. data/utils/js/js.jar +0 -0
  79. data/utils/js/run.sh +3 -0
  80. data/utils/jsc/Makefile +7 -0
  81. data/utils/jsc/README +3 -0
  82. data/utils/jsc/RunScript.c +93 -0
  83. data/utils/jsc/run.sh +15 -0
  84. data/utils/yuicompressor/README +1 -0
  85. data/utils/yuicompressor/yuicompressor-2.2.5.jar +0 -0
  86. metadata +157 -0
@@ -0,0 +1,58 @@
1
+ require 'yaml'
2
+ require 'tempfile'
3
+ params = YAML.load(File.read('test/benchmark/params.yaml'))
4
+ benchs = Dir["test/benchmark/bm_*.{rb,js}"]
5
+ OPTS = "--opt NoArgumentArityChecks --opt OptimizeArithOps"
6
+
7
+ def run_rubyjs(param, klassname, file)
8
+ par = param ? param.inspect : "nil"
9
+ cmd_rubyjs_gen =
10
+ %{./rubyjs_gen -I./test -o - -o /tmp/#{klassname} -r common -r benchmark/common #{OPTS} -m #{klassname} -a "main(undefined, #{par})" #{file}}
11
+
12
+ cmd_run_js = %{/usr/bin/time ./utils/js/run.sh 2>&1}
13
+
14
+ result = `#{cmd_rubyjs_gen} | #{cmd_run_js}`
15
+ arr = result.split("\n")
16
+ time = arr.pop.split(" ")[2].sub(",", ".").to_f # user
17
+ return [file, klassname, param, time.to_f, arr.join("\n")]
18
+ end
19
+
20
+ def run_js(param, klassname, file)
21
+ par = param ? param.inspect : "null"
22
+
23
+ script = ""
24
+ script << File.read('./test/benchmark/common.js')
25
+ script << "\n"
26
+ script << File.read(file)
27
+ script << "\n"
28
+ script << "main(#{par});"
29
+
30
+ jscode = Tempfile.new('rubyjs')
31
+ jscode.write(script)
32
+ jscode.close(false)
33
+
34
+ cmd_run_js = %{/usr/bin/time ./utils/js/run.sh 2>&1}
35
+
36
+ result = `#{cmd_run_js} < #{jscode.path}`
37
+ arr = result.split("\n")
38
+ time = arr.pop.split(" ")[2].sub(",", ".").to_f # user
39
+ return [file, klassname, param, time.to_f, arr.join("\n")]
40
+ end
41
+
42
+ benchs.sort.each do |file|
43
+ basename = File.basename(file)[0..-4]
44
+ klassname = basename.gsub(/(^|_)./) {|m| m[-1,1].upcase}
45
+ humanname = basename.gsub('_', ' ').capitalize
46
+ ext = File.extname(file)
47
+
48
+ (params[klassname] || [nil]).each do |i|
49
+ case ext
50
+ when '.rb'
51
+ p run_rubyjs(i, klassname, file)
52
+ when '.js'
53
+ p run_js(i, klassname, file)
54
+ else
55
+ raise
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,22 @@
1
+ require 'tempfile'
2
+ require 'test/gen_test_suite'
3
+
4
+ if ARGV.empty?
5
+ tests = Dir['test/test_*.rb']
6
+ else
7
+ tests = Dir["test/test_{" + ARGV.join(',') + "}.rb"]
8
+ end
9
+
10
+ rubycode = Tempfile.new('rubyjs')
11
+ script = gen_test_suite(tests)
12
+ rubycode.write(script)
13
+ rubycode.close(false)
14
+
15
+ jsout = `./bin/rubyjs -I./test -a ";main()" -m TestSuite #{rubycode.path} | ./utils/js/run.sh`
16
+ rbout = `ruby -I./test < #{rubycode.path}`
17
+
18
+ if jsout == rbout
19
+ else
20
+ puts "FAILED"
21
+ exit 1
22
+ end
@@ -0,0 +1,24 @@
1
+ class TestArgs
2
+ def m(a, b=1, c="hallo", *args)
3
+ p a
4
+ p b
5
+ p c
6
+ p args
7
+ end
8
+
9
+ def self.main
10
+ obj = new()
11
+
12
+ obj.m(0)
13
+ puts "--"
14
+ obj.m(1,2)
15
+ puts "--"
16
+ obj.m(1,2,9)
17
+ puts "--"
18
+ obj.m(1,2,9,5)
19
+ puts "--"
20
+ obj.m(1,2,9,5,6)
21
+ puts "--"
22
+ obj.m(1,2,9,5,6,7,8,9,10,11,12)
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ require 'microunit'
2
+
3
+ class TestArray < MicroUnit::TestCase
4
+
5
+ def test_array
6
+ a = [1, 2, `null`, [`null`, `null`, 4]]
7
+ assert_equal a, [1, 2, nil, [nil, nil, 4]]
8
+ assert a.eql? [1, 2, nil, [nil, nil, 4]]
9
+ end
10
+
11
+ def test_delete
12
+ a = [ "a", "b", "b", "b", "c" ]
13
+ a.delete "b"
14
+ assert_equal a, ["a", "c"]
15
+ end
16
+
17
+ def test_include
18
+ assert [1, 2, 3].include? 5
19
+ assert ! [1, 3].include?(2)
20
+ end
21
+
22
+ end
@@ -0,0 +1,35 @@
1
+ class TestCase
2
+ def test
3
+ case 1+1
4
+ when 1, 3
5
+ puts "NOT OKAY"
6
+ when 2
7
+ puts "OKAY"
8
+ else
9
+ puts "NOT OKAY"
10
+ end
11
+
12
+ p (Array === [])
13
+ p (RuntimeError === RuntimeError.new)
14
+
15
+ case 1
16
+ when Fixnum
17
+ puts "OK"
18
+ when 1
19
+ puts "OK"
20
+ end
21
+
22
+ case 4
23
+ when 0..3
24
+ puts "NOT OKAY"
25
+ when 1...4
26
+ puts "NOT OKAY"
27
+ when 2..4
28
+ puts "OKAY"
29
+ end
30
+ end
31
+
32
+ def self.main
33
+ new.test
34
+ end
35
+ end
@@ -0,0 +1,55 @@
1
+ module X
2
+ end
3
+
4
+ class A
5
+ include X
6
+ end
7
+
8
+ class B < A
9
+ end
10
+
11
+ class C < B
12
+ end
13
+
14
+ class D
15
+ end
16
+
17
+ class TestClass
18
+ def self.main
19
+ p A.new.instance_of?(A) # => true
20
+ p A.new.instance_of?(B) # => false
21
+ p B.new.instance_of?(A) # => false
22
+ p A.new.instance_of?(X) # => false
23
+ p B.new.instance_of?(X) # => false
24
+
25
+ p A.new.kind_of?(A) # => true
26
+ p A.new.kind_of?(B) # => false
27
+ p B.new.kind_of?(A) # => true
28
+ p A.new.kind_of?(X) # => true
29
+ p B.new.kind_of?(X) # => true
30
+
31
+ p C.new.kind_of?(X) # => true
32
+ p C.new.kind_of?(A) # => true
33
+ p C.new.kind_of?(B) # => true
34
+ p C.new.kind_of?(C) # => true
35
+ p C.new.kind_of?(D) # => false
36
+ p C.new.kind_of?(Object) # => true
37
+ p C.new.kind_of?(Kernel) # => true
38
+ p C.new.kind_of?(Class) # => false
39
+
40
+ p ("hallo".class.name)
41
+ p (nil.class.name)
42
+ p (nil.instance_of?(NilClass))
43
+ p ("hallo".instance_of?(String))
44
+ p ("hallo".class)
45
+ p A
46
+ p B
47
+ p C
48
+ p D
49
+ p X
50
+
51
+ p X.name
52
+ p A.name
53
+ p B.name
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ class TestEql
2
+ def self.main
3
+ p "a".eql?("a") # => true
4
+ p "a".eql?(1) # => false
5
+ p "1".eql?(1) # => false
6
+ p [1,2].eql?([1,2]) # => true
7
+ p 1.eql?("1") # => false
8
+ end
9
+ end
@@ -0,0 +1,61 @@
1
+ class TestException
2
+ def self.main
3
+
4
+ p "before block"
5
+ begin
6
+ p "in block"
7
+ end
8
+ p "after block"
9
+
10
+ ###
11
+ begin
12
+ p "block"
13
+ rescue
14
+ p "rescue"
15
+ rescue Exception => a
16
+ p "another rescue"
17
+ p a
18
+ else
19
+ p "else"
20
+ end
21
+
22
+ p RuntimeError.new("test")
23
+
24
+ puts "before begin"
25
+ begin
26
+ puts "before raise"
27
+ raise Exception, "blah"
28
+ puts "after raise"
29
+ rescue
30
+ puts "noooo"
31
+ rescue Exception => a
32
+ p a
33
+ puts "yes"
34
+ ensure
35
+ puts "ensure"
36
+ end
37
+ puts "after begin"
38
+
39
+ puts "--"
40
+
41
+ begin
42
+ puts "abc"
43
+ raise "r"
44
+ rescue
45
+ p $!
46
+ puts "b"
47
+ ensure
48
+ puts "e"
49
+ end
50
+
51
+ #
52
+ # Test arity checks
53
+ #
54
+
55
+ begin
56
+ p("hallo".to_s(2))
57
+ rescue ArgumentError => a
58
+ p a
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ class TestExpr
2
+ def test
3
+ i = if true then 1 else 2 end
4
+ p i
5
+ i = true or return
6
+ p i
7
+ end
8
+
9
+ def self.main
10
+ new.test
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+ class TestHash
2
+ if $RUBYJS
3
+ def hash
4
+ `var el = {}; el["1"] = null; return el`
5
+ end
6
+ else
7
+ def hash
8
+ {"1" => nil}
9
+ end
10
+ end
11
+
12
+ def test
13
+ h = {"a" => 6, "b" => 7, "1" => 1, 1 => 2, "1,2" => "hello", [1,2] => "good"}
14
+ p h["a"]
15
+ p h["b"]
16
+ p h["1"]
17
+ p h[1]
18
+ p h["1,2"]
19
+ p h[[1,2]]
20
+
21
+ puts "test native JS hash"
22
+ a = hash()
23
+ #p a
24
+ end
25
+
26
+ def self.main
27
+ new.test
28
+ end
29
+ end
@@ -0,0 +1,146 @@
1
+ #
2
+ # Examples taken from: http://hotruby.accelart.jp/
3
+ #
4
+ class TestHotRuby
5
+ def sort ary
6
+ puts "Before insertion sort:"
7
+ p ary
8
+
9
+ for i in 1..(ary.length-1) do
10
+ n = i
11
+ while n >= 1 && ary[n] < ary[n - 1] do
12
+ if ary[n] < ary[n - 1]
13
+ tmp = ary[n]
14
+ ary[n] = ary[n - 1]
15
+ ary[n - 1] = tmp
16
+ end
17
+ n -= 1
18
+ end
19
+ end
20
+
21
+ puts "After insertion sort:"
22
+ p ary
23
+ end
24
+
25
+ def addPrint a, b, c
26
+ puts a + b + c
27
+ end
28
+
29
+ def self.main
30
+ t = new()
31
+
32
+ puts "InsertionSort"
33
+ t.sort [3, 6, 2, 5, 3, 7, 1, 8]
34
+
35
+ puts "Array args"
36
+ ary = [' World ', '!']
37
+ t.addPrint 'Hello', *ary
38
+
39
+ puts "Block"
40
+ Foo.new.main
41
+
42
+ puts "Class"
43
+ puts Pi::PI
44
+ # different precision on Ruby vs. Javascript
45
+ puts Pi.new.calc.to_s[0,13]
46
+
47
+
48
+ puts "Const"
49
+ # FIXME
50
+ =begin
51
+ Bar_::Baz_.new.run
52
+ Bar2.new.run
53
+ Object::Bar2.new.run
54
+ Bar3.new.run
55
+ =end
56
+ end
57
+ end
58
+
59
+ #
60
+ # Block
61
+ #
62
+ class Hoge
63
+ def add_msg &block
64
+ block.call "is" # s/yield/call/
65
+ end
66
+ end
67
+
68
+ class Foo
69
+ NAME = ' - William Shakespeare'
70
+ def main
71
+ pre = "Action"
72
+ @space = " "
73
+ Hoge.new.add_msg do |msg|
74
+ fuga = "eloquence"
75
+ puts pre + @space + msg + @space + fuga + NAME
76
+ end
77
+ end
78
+ end
79
+
80
+ #
81
+ # Class
82
+ #
83
+ class Pi
84
+ def initialize
85
+ @a = 355.0
86
+ end
87
+
88
+ def calc
89
+ b = 113.0
90
+ return @a / b
91
+ end
92
+
93
+ PI = 'PI is about'
94
+ end
95
+
96
+ #
97
+ # Const
98
+ #
99
+ class Foo_
100
+ CONST = 'Foo'
101
+ end
102
+
103
+ class Bar_
104
+ CONST = 'Bar'
105
+
106
+ class Baz_ < Foo_
107
+ def run
108
+ puts CONST # => "Bar" Outer class const
109
+ # In this case, you have to specify if you want to see parent class const.
110
+ puts Foo_::CONST # => "Foo"
111
+ end
112
+ end
113
+ end
114
+
115
+ class Foo2
116
+ CONST = 'Foo'
117
+ end
118
+
119
+ CONST = 'Object'
120
+
121
+ class Bar2 < Foo2
122
+ def run
123
+ puts CONST # => "Foo"
124
+ end
125
+ end
126
+
127
+ # If you specify "Object", then const in Object is searched before.
128
+ class Object
129
+ class Bar2 < Foo2
130
+ def run
131
+ puts CONST # => "Object"
132
+ end
133
+ end
134
+ end
135
+
136
+ class Foo3
137
+ CONST = 'Foo'
138
+ end
139
+ class Bar3 < Foo3
140
+ def run
141
+ puts CONST # => "Foo"
142
+ #CONST = 'Bar' # Define Bar's const "CONST"
143
+ puts CONST # => "Bar" (Foo::CONST is hidden)
144
+ puts Foo3::CONST # => "Foo" (You can see by "::")
145
+ end
146
+ end