AmberVM 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. data/README +38 -0
  2. data/bin/ambervm +278 -0
  3. data/lib/amber/acts_as_rvm_type.rb +157 -0
  4. data/lib/amber/classes/association.rb +36 -0
  5. data/lib/amber/classes/block.rb +52 -0
  6. data/lib/amber/classes/boolean.rb +40 -0
  7. data/lib/amber/classes/class.rb +50 -0
  8. data/lib/amber/classes/error.rb +22 -0
  9. data/lib/amber/classes/list.rb +96 -0
  10. data/lib/amber/classes/null.rb +35 -0
  11. data/lib/amber/classes/number.rb +95 -0
  12. data/lib/amber/classes/object.rb +56 -0
  13. data/lib/amber/classes/string.rb +79 -0
  14. data/lib/amber/classes.rb +113 -0
  15. data/lib/amber/environment.rb +251 -0
  16. data/lib/amber/fukubukuro/ecma_core.rb +409 -0
  17. data/lib/amber/fukubukuro.rb +866 -0
  18. data/lib/amber/functions/all.rb +3 -0
  19. data/lib/amber/functions/array/append.rb +50 -0
  20. data/lib/amber/functions/array/at.rb +50 -0
  21. data/lib/amber/functions/array/set_at.rb +50 -0
  22. data/lib/amber/functions/array.rb +30 -0
  23. data/lib/amber/functions/association/assoc_get.rb +55 -0
  24. data/lib/amber/functions/association/assoc_set.rb +56 -0
  25. data/lib/amber/functions/bitwise/bitwise_and.rb +41 -0
  26. data/lib/amber/functions/bitwise/bitwise_not.rb +41 -0
  27. data/lib/amber/functions/bitwise/bitwise_or.rb +41 -0
  28. data/lib/amber/functions/bitwise/bitwise_xor.rb +41 -0
  29. data/lib/amber/functions/bitwise.rb +3 -0
  30. data/lib/amber/functions/collection/get.rb +66 -0
  31. data/lib/amber/functions/collection/set.rb +67 -0
  32. data/lib/amber/functions/collection/size.rb +54 -0
  33. data/lib/amber/functions/general/cmp.rb +43 -0
  34. data/lib/amber/functions/general/eq.rb +45 -0
  35. data/lib/amber/functions/general/gt.rb +45 -0
  36. data/lib/amber/functions/general/gte.rb +45 -0
  37. data/lib/amber/functions/general/lt.rb +45 -0
  38. data/lib/amber/functions/general/lte.rb +45 -0
  39. data/lib/amber/functions/general/neq.rb +45 -0
  40. data/lib/amber/functions/general/type.rb +43 -0
  41. data/lib/amber/functions/general.rb +3 -0
  42. data/lib/amber/functions/io/print.rb +45 -0
  43. data/lib/amber/functions/io.rb +3 -0
  44. data/lib/amber/functions/list/align.rb +73 -0
  45. data/lib/amber/functions/list/join.rb +45 -0
  46. data/lib/amber/functions/list/map.rb +58 -0
  47. data/lib/amber/functions/list/split.rb +55 -0
  48. data/lib/amber/functions/list.rb +3 -0
  49. data/lib/amber/functions/logic/and.rb +55 -0
  50. data/lib/amber/functions/logic/not.rb +40 -0
  51. data/lib/amber/functions/logic/or.rb +50 -0
  52. data/lib/amber/functions/logic.rb +3 -0
  53. data/lib/amber/functions/math/abs.rb +39 -0
  54. data/lib/amber/functions/math/acos.rb +39 -0
  55. data/lib/amber/functions/math/add.rb +40 -0
  56. data/lib/amber/functions/math/asin.rb +39 -0
  57. data/lib/amber/functions/math/atan.rb +39 -0
  58. data/lib/amber/functions/math/ceil.rb +39 -0
  59. data/lib/amber/functions/math/cos.rb +39 -0
  60. data/lib/amber/functions/math/dec.rb +39 -0
  61. data/lib/amber/functions/math/div.rb +44 -0
  62. data/lib/amber/functions/math/exp.rb +39 -0
  63. data/lib/amber/functions/math/floor.rb +39 -0
  64. data/lib/amber/functions/math/inc.rb +39 -0
  65. data/lib/amber/functions/math/log.rb +39 -0
  66. data/lib/amber/functions/math/mod.rb +41 -0
  67. data/lib/amber/functions/math/mul.rb +43 -0
  68. data/lib/amber/functions/math/neg.rb +43 -0
  69. data/lib/amber/functions/math/power.rb +43 -0
  70. data/lib/amber/functions/math/rand.rb +36 -0
  71. data/lib/amber/functions/math/round.rb +39 -0
  72. data/lib/amber/functions/math/shl.rb +41 -0
  73. data/lib/amber/functions/math/shr.rb +41 -0
  74. data/lib/amber/functions/math/sin.rb +39 -0
  75. data/lib/amber/functions/math/sub.rb +43 -0
  76. data/lib/amber/functions/math/tan.rb +39 -0
  77. data/lib/amber/functions/math.rb +3 -0
  78. data/lib/amber/functions/objects/send.rb +22 -0
  79. data/lib/amber/functions/rails/print.rb +44 -0
  80. data/lib/amber/functions/rails.rb +3 -0
  81. data/lib/amber/functions/string/ansi.rb +24 -0
  82. data/lib/amber/functions/string/capstr.rb +23 -0
  83. data/lib/amber/functions/string/center.rb +25 -0
  84. data/lib/amber/functions/string/chr.rb +16 -0
  85. data/lib/amber/functions/string/ljust.rb +26 -0
  86. data/lib/amber/functions/string/regmatch.rb +34 -0
  87. data/lib/amber/functions/string/rjust.rb +26 -0
  88. data/lib/amber/functions/string.rb +3 -0
  89. data/lib/amber/functions.rb +103 -0
  90. data/lib/amber/interpreter.rb +1380 -0
  91. data/lib/amber/languages/brainfuck.rb +153 -0
  92. data/lib/amber/languages/ecma/compiler.rb +1661 -0
  93. data/lib/amber/languages/ecma/core-math.js +67 -0
  94. data/lib/amber/languages/ecma/core-objects.js +57 -0
  95. data/lib/amber/languages/ecma.rb +9 -0
  96. data/lib/amber/languages/ecma_fuku/compiler.rb +1622 -0
  97. data/lib/amber/languages/ecma_fuku/core-math.js +67 -0
  98. data/lib/amber/languages/ecma_fuku/core-objects.js +56 -0
  99. data/lib/amber/languages/ecma_fuku.rb +13 -0
  100. data/lib/amber/languages/math/compiler.rb +70 -0
  101. data/lib/amber/languages/math/tokenizer.rb +69 -0
  102. data/lib/amber/languages/math/tree.rb +110 -0
  103. data/lib/amber/languages/math.rb +26 -0
  104. data/lib/amber/languages.rb +99 -0
  105. data/lib/amber/library.rb +79 -0
  106. data/lib/amber/optimisation.rb +299 -0
  107. data/lib/amber/plugin.rb +337 -0
  108. data/lib/amber/rails.rb +90 -0
  109. data/lib/amber.rb +106 -0
  110. data/spec/amber/class_spec.rb +27 -0
  111. data/spec/amber/enviroment_spec.rb +61 -0
  112. data/spec/amber/function_spec.rb +25 -0
  113. data/spec/amber/functions/association/assoc_get_spec.rb +41 -0
  114. data/spec/amber/functions/association/assoc_set_spec.rb +43 -0
  115. data/spec/amber/functions/collection/get_spec.rb +12 -0
  116. data/spec/amber/functions/collection/set_spec.rb +10 -0
  117. data/spec/amber/functions/collection/size_spec.rb +10 -0
  118. data/spec/amber/functions/list/split_spec.rb +47 -0
  119. data/spec/amber/functions/string/ansi_spec.rb +44 -0
  120. data/spec/amber/functions/string/capstr_spec.rb +42 -0
  121. data/spec/amber/functions/string/center_spec.rb +49 -0
  122. data/spec/amber/functions/string/ljust_spec.rb +49 -0
  123. data/spec/amber/functions/string/regmatch_spec.rb +52 -0
  124. data/spec/amber/functions/string/rjust_spec.rb +49 -0
  125. data/spec/amber/interpreter/assignment_spec.rb +22 -0
  126. data/spec/amber/interpreter/condition_spec.rb +103 -0
  127. data/spec/amber/interpreter/constant_spec.rb +31 -0
  128. data/spec/amber/interpreter/core_call_spec.rb +72 -0
  129. data/spec/amber/interpreter/interpreter_spec.rb +11 -0
  130. data/spec/amber/interpreter/parameter_spec.rb +24 -0
  131. data/spec/amber/interpreter/sequence_spec.rb +47 -0
  132. data/spec/amber/interpreter/variable_spec.rb +24 -0
  133. data/spec/amber/plugin_spec.rb +10 -0
  134. data/spec/classes/atom/association_spec.rb +39 -0
  135. data/spec/classes/atom/block_spec.rb +25 -0
  136. data/spec/classes/atom/boolean_spec.rb +67 -0
  137. data/spec/classes/atom/error_spec.rb +43 -0
  138. data/spec/classes/atom/list_spec.rb +68 -0
  139. data/spec/classes/atom/number_spec.rb +132 -0
  140. data/spec/classes/atom/string_spec.rb +175 -0
  141. data/spec/languages/ecma/ecma_array_spec.rb +79 -0
  142. data/spec/languages/ecma/ecma_closure_spec.rb +38 -0
  143. data/spec/languages/ecma/ecma_literals_spec.rb +71 -0
  144. data/spec/languages/ecma/ecma_objects_spec.rb +165 -0
  145. data/spec/languages/ecma/ecma_old_spec.rb +540 -0
  146. data/spec/languages/ecma/ecma_spec.rb +64 -0
  147. data/spec/languages/ecma_fuku/ecma_array_spec.rb +61 -0
  148. data/spec/languages/ecma_fuku/ecma_closure_spec.rb +33 -0
  149. data/spec/languages/ecma_fuku/ecma_function_spec.rb +84 -0
  150. data/spec/languages/ecma_fuku/ecma_literals_spec.rb +55 -0
  151. data/spec/languages/ecma_fuku/ecma_objects_spec.rb +133 -0
  152. data/spec/languages/ecma_fuku/ecma_old_spec.rb +415 -0
  153. data/spec/languages/ecma_fuku/ecma_operator_spec.rb +33 -0
  154. data/spec/languages/ecma_fuku/ecma_spec.rb +52 -0
  155. data/spec/languages/math/compiler_spec.rb +49 -0
  156. data/spec/languages/math/tokenizer_spec.rb +73 -0
  157. data/spec/languages/math/tree_spec.rb +153 -0
  158. metadata +225 -0
@@ -0,0 +1,64 @@
1
+ $: << 'lib'
2
+
3
+ require 'amber'
4
+ require 'amber/languages'
5
+ require 'amber/languages/ecma'
6
+
7
+ describe AmberVM::Languages::ECMA do
8
+ before(:each) do
9
+ @compiler = AmberVM::Languages::ECMA.new
10
+ @env = @compiler.env
11
+ end
12
+
13
+ def run code, &tests
14
+ env = @env.dup
15
+ yield(@compiler.compile(code).execute(@env), @env)
16
+ yield(@compiler.compile(code).optimize.execute(env), env)
17
+ end
18
+
19
+ describe "variables" do
20
+ it "should get varibles" do
21
+ @env['test'] = 42
22
+ code = <<-CODE
23
+ test;
24
+ CODE
25
+
26
+ run code do |result, env|
27
+ result.should == 42
28
+ end
29
+ end
30
+
31
+ it "should allow to assign literals to variables" do
32
+ code = <<-CODE
33
+ test = 23;
34
+ CODE
35
+ run code do |result, env|
36
+ result.should == 23
37
+ env['test'].val.should == 23
38
+ end
39
+ end
40
+
41
+ it "should autocast strings when using <var>++" do
42
+ code = <<-CODE
43
+ test = '1.2';
44
+ test++;
45
+ CODE
46
+ run code do |result, env|
47
+ result.should == '1.2'
48
+ env['test'].val.should == 2.2
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '+ operator' do
54
+ it 'should behave like ECMA' do
55
+ code = <<-CODE
56
+ 1 + "3";
57
+ CODE
58
+ run code do |result, env|
59
+ result.should == "13"
60
+ end
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,61 @@
1
+ $: << 'lib'
2
+ require 'amber'
3
+ require 'amber/languages'
4
+ require 'amber/languages/ecma_fuku'
5
+
6
+ describe AmberVM::Languages::ECMA_Fuku do
7
+ before(:each) do
8
+ @env = {}
9
+ @compiler = AmberVM::Languages::ECMA_Fuku.new
10
+ end
11
+
12
+ def run code
13
+ @compiler.compile(code).execute(@env)
14
+ end
15
+
16
+ describe "arrays" do
17
+ it "should allow accessing data on an array" do
18
+ @env['test'] = [42]
19
+ result = run <<-CODE
20
+ test[0]
21
+ CODE
22
+ result.should == 42
23
+ end
24
+ it "should allow set data on an array" do
25
+ @env['test'] = [42]
26
+ result = run <<-CODE
27
+ test[0] = 23
28
+ CODE
29
+ result.should == 23
30
+ @env['test'].should == [23]
31
+ @env['test'][0].should == 23
32
+ end
33
+ it "should allow to concat arrays" do
34
+ a1 = [42]
35
+ @env['test'] = [a1]
36
+ result = run <<-CODE
37
+ test[0][0]
38
+ CODE
39
+ result.should == 42
40
+ end
41
+
42
+ it "should allow to concat arrays when setting values" do
43
+ a1 = [42]
44
+ @env['test'] = [a1]
45
+ result = run <<-CODE
46
+ test[0][0] = 23
47
+ CODE
48
+ result.should == 23
49
+ @env['test'].should == [[23]]
50
+ end
51
+
52
+ it "should wrap arrays" do
53
+ a1 = [42]
54
+ @env['test'] = a1
55
+ result = run <<-CODE
56
+ test[0] = 23
57
+ CODE
58
+ a1.should == [23]
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ $: << 'lib'
2
+ require 'amber'
3
+ require 'amber/languages'
4
+ require 'amber/languages/ecma_fuku'
5
+
6
+ describe AmberVM::Languages::ECMA_Fuku do
7
+ before(:each) do
8
+ @env = {} # AmberVM::Interpreter.env
9
+ @compiler = AmberVM::Languages::ECMA_Fuku.new
10
+ end
11
+
12
+ def run code
13
+ @compiler.compile(code).execute(@env)
14
+ end
15
+
16
+ describe "closure" do
17
+ it "should be created" do
18
+ pending 'No closures implemented yet.'
19
+ result = run <<-CODE
20
+ function createClosure(x) {
21
+ return function() {
22
+ return x;
23
+ };
24
+ }
25
+ closure = createClosure(42);
26
+ createClosure("wrong!");
27
+ closure();
28
+ CODE
29
+ result.should == 42
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,84 @@
1
+ $: << 'lib'
2
+ require 'amber'
3
+ require 'amber/languages'
4
+ require 'amber/languages/ecma_fuku'
5
+
6
+ describe AmberVM::Languages::ECMA_Fuku do
7
+ before(:each) do
8
+ @env = {}
9
+ @compiler = AmberVM::Languages::ECMA_Fuku.new
10
+ end
11
+
12
+ def run code
13
+ @compiler.compile(code).execute(@env)
14
+ end
15
+
16
+ describe "functions" do
17
+ it "should handle function definitions without parameters" do
18
+ res = run <<-EOC
19
+ function f() {
20
+ return 42;
21
+ }
22
+ EOC
23
+ res.class.should == Proc
24
+ @env['f'].should be
25
+ end
26
+
27
+ it "should handle function definitions with parameters" do
28
+ res = run <<-EOC
29
+ function g(x) {
30
+ return 42 + x;
31
+ }
32
+ EOC
33
+ res.class.should == Proc
34
+ @env['g'].should be
35
+ end
36
+
37
+ it "should execute function definitions without parameters" do
38
+ result = run <<-EOC
39
+ function f() {
40
+ return 42;
41
+ }
42
+ f();
43
+ EOC
44
+ result.should == 42
45
+ end
46
+
47
+ it "should execute function with parameters" do
48
+ result = run <<-EOC
49
+ function g(x) {
50
+ return 42 + x;
51
+ }
52
+ g(2)
53
+ EOC
54
+ result.should == 44
55
+ end
56
+
57
+ it "should execute function that calls a function" do
58
+ result = run <<-EOC
59
+ function f() {
60
+ return 'inner';
61
+ }
62
+ function g() {
63
+ return f();
64
+ }
65
+ g();
66
+ EOC
67
+ result.should == 'inner'
68
+ end
69
+
70
+ it "should execute member functions (methods)" do
71
+ result = run <<-CODE
72
+ o = {
73
+ b: function() {
74
+ return 1;
75
+ }
76
+ };
77
+ o.b();
78
+ CODE
79
+ result.should == 1
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,55 @@
1
+ $: << 'lib'
2
+ require 'amber'
3
+ require 'amber/languages'
4
+ require 'amber/languages/ecma_fuku'
5
+
6
+ describe AmberVM::Languages::ECMA_Fuku do
7
+ before(:each) do
8
+ @compiler = AmberVM::Languages::ECMA_Fuku.new
9
+ @env = {}
10
+ end
11
+ def run code
12
+ @compiler.compile(code).execute(@env)
13
+ end
14
+
15
+ describe "literals" do
16
+ it "should know String literals" do
17
+ res = run <<-CODE
18
+ "test"
19
+ CODE
20
+ res.should == "test"
21
+ end
22
+ it "should know Integer literals" do
23
+ res = run <<-CODE
24
+ 42
25
+ CODE
26
+ res.should == 42
27
+ end
28
+ it "should know Float literals" do
29
+ res = run <<-CODE
30
+ 4.2
31
+ CODE
32
+ res.should == 4.2
33
+ end
34
+
35
+ it "should know complex Float literals" do
36
+ res = run <<-CODE
37
+ .2e-10
38
+ CODE
39
+ res.should == 0.2e-10
40
+ end
41
+ it "should know the false literals" do
42
+ res = run <<-CODE
43
+ false
44
+ CODE
45
+ res.should_not be_true
46
+ end
47
+ it "should know the true literals" do
48
+ res = run <<-CODE
49
+ true
50
+ CODE
51
+ res.should be_true
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,133 @@
1
+ $: << 'lib'
2
+ require 'amber'
3
+ require 'amber/languages'
4
+ require 'amber/languages/ecma_fuku'
5
+ require 'ostruct'
6
+
7
+ describe AmberVM::Languages::ECMA_Fuku do
8
+ before(:each) do
9
+ @env = {}
10
+ @compiler = AmberVM::Languages::ECMA_Fuku.new
11
+ end
12
+
13
+ def run code
14
+ @compiler.compile(code).execute(@env)
15
+ end
16
+
17
+ describe "objects" do
18
+
19
+ it "should see outer functions" do
20
+ result = run <<-CODE
21
+ function a() {
22
+ return 1;
23
+ }
24
+ o = {
25
+ b: function() {
26
+ return a();
27
+ }
28
+ };
29
+ o.b();
30
+ CODE
31
+ result.should == 1
32
+ end
33
+
34
+ it "should get variables" do
35
+ result = run <<-CODE
36
+ obj = { variable: 42 };
37
+ obj.variable
38
+ CODE
39
+ result.should == 42
40
+ end
41
+
42
+ it "should set variables" do
43
+ result = run <<-CODE
44
+ obj = { variable: 42 };
45
+ obj.variable = 23
46
+ CODE
47
+ @env['obj'].variable.should == 23
48
+ end
49
+
50
+ it "should allow to concat objects variables" do
51
+ result = run <<-CODE
52
+ obj = {};
53
+ obj2 = { variable: 42 };
54
+ obj.obj = obj2;
55
+ obj.obj.variable
56
+ CODE
57
+ result.should == 42
58
+ end
59
+
60
+ it "should handle this.member" do
61
+ result = run <<-CODE
62
+ obj = {
63
+ a: 42,
64
+ b: function() {
65
+ return this.a;
66
+ }
67
+ };
68
+ obj.b();
69
+ CODE
70
+ result.should == 42
71
+ end
72
+
73
+ it "should handle this.method()" do
74
+ result = run <<-CODE
75
+ obj = {
76
+ a: function() {
77
+ return 42;
78
+ },
79
+ b: function() {
80
+ return this.a();
81
+ }
82
+ };
83
+ obj.b();
84
+ CODE
85
+ result.should == 42
86
+ end
87
+
88
+ end
89
+
90
+ describe "external objects" do
91
+ it "should get variables" do
92
+ object = OpenStruct.new
93
+ object.variable = 42
94
+ @env['obj'] = object
95
+ result = run <<-CODE
96
+ obj.variable
97
+ CODE
98
+ result.should == 42
99
+ end
100
+
101
+ it "should set variables" do
102
+ object = OpenStruct.new
103
+ object.variable = 42
104
+ @env['obj'] = object
105
+ result = run <<-CODE
106
+ obj.variable = 23
107
+ CODE
108
+ @env['obj'].variable.should == 23
109
+ end
110
+
111
+ it "should allow to concat objects variables" do
112
+ object = OpenStruct.new
113
+ object2 = OpenStruct.new
114
+ object.obj = object2
115
+ object2.variable = 42
116
+ @env['obj'] = object
117
+ result = run <<-CODE
118
+ obj.obj.variable
119
+ CODE
120
+ result.should == 42
121
+ end
122
+
123
+ it "should allow to assign literals to variables" do
124
+ result = run <<-CODE
125
+ test = 23
126
+ CODE
127
+ result.should == 23
128
+ @env['test'].should == 23
129
+ end
130
+
131
+ end
132
+
133
+ end