modulr 0.1.0

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 (217) hide show
  1. data/LICENSE +22 -0
  2. data/README.markdown +62 -0
  3. data/Rakefile +55 -0
  4. data/VERSION +1 -0
  5. data/assets/modulr.js +58 -0
  6. data/bin/modulrize +39 -0
  7. data/example/foo/bar.js +1 -0
  8. data/example/foo/foo.js +3 -0
  9. data/example/increment.js +6 -0
  10. data/example/inspect.js +3 -0
  11. data/example/math.js +7 -0
  12. data/example/program.js +9 -0
  13. data/lib/modulr/collector.rb +60 -0
  14. data/lib/modulr/js_module.rb +88 -0
  15. data/lib/modulr/version.rb +6 -0
  16. data/lib/modulr.rb +21 -0
  17. data/vendor/rkelly/CHANGELOG.rdoc +13 -0
  18. data/vendor/rkelly/Manifest.txt +198 -0
  19. data/vendor/rkelly/README.rdoc +58 -0
  20. data/vendor/rkelly/Rakefile +39 -0
  21. data/vendor/rkelly/lib/parser.y +870 -0
  22. data/vendor/rkelly/lib/rkelly/constants.rb +3 -0
  23. data/vendor/rkelly/lib/rkelly/generated_parser.rb +3237 -0
  24. data/vendor/rkelly/lib/rkelly/js/array.rb +15 -0
  25. data/vendor/rkelly/lib/rkelly/js/base.rb +91 -0
  26. data/vendor/rkelly/lib/rkelly/js/boolean.rb +21 -0
  27. data/vendor/rkelly/lib/rkelly/js/function.rb +39 -0
  28. data/vendor/rkelly/lib/rkelly/js/function_prototype.rb +15 -0
  29. data/vendor/rkelly/lib/rkelly/js/global_object.rb +52 -0
  30. data/vendor/rkelly/lib/rkelly/js/math.rb +10 -0
  31. data/vendor/rkelly/lib/rkelly/js/nan.rb +18 -0
  32. data/vendor/rkelly/lib/rkelly/js/number.rb +22 -0
  33. data/vendor/rkelly/lib/rkelly/js/object.rb +30 -0
  34. data/vendor/rkelly/lib/rkelly/js/object_prototype.rb +14 -0
  35. data/vendor/rkelly/lib/rkelly/js/property.rb +20 -0
  36. data/vendor/rkelly/lib/rkelly/js/scope.rb +6 -0
  37. data/vendor/rkelly/lib/rkelly/js/string.rb +21 -0
  38. data/vendor/rkelly/lib/rkelly/js.rb +14 -0
  39. data/vendor/rkelly/lib/rkelly/lexeme.rb +18 -0
  40. data/vendor/rkelly/lib/rkelly/nodes/binary_node.rb +18 -0
  41. data/vendor/rkelly/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  42. data/vendor/rkelly/lib/rkelly/nodes/case_clause_node.rb +11 -0
  43. data/vendor/rkelly/lib/rkelly/nodes/comma_node.rb +11 -0
  44. data/vendor/rkelly/lib/rkelly/nodes/conditional_node.rb +11 -0
  45. data/vendor/rkelly/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  46. data/vendor/rkelly/lib/rkelly/nodes/for_in_node.rb +12 -0
  47. data/vendor/rkelly/lib/rkelly/nodes/for_node.rb +13 -0
  48. data/vendor/rkelly/lib/rkelly/nodes/function_call_node.rb +16 -0
  49. data/vendor/rkelly/lib/rkelly/nodes/function_decl_node.rb +6 -0
  50. data/vendor/rkelly/lib/rkelly/nodes/function_expr_node.rb +12 -0
  51. data/vendor/rkelly/lib/rkelly/nodes/if_node.rb +12 -0
  52. data/vendor/rkelly/lib/rkelly/nodes/label_node.rb +11 -0
  53. data/vendor/rkelly/lib/rkelly/nodes/new_expr_node.rb +11 -0
  54. data/vendor/rkelly/lib/rkelly/nodes/node.rb +88 -0
  55. data/vendor/rkelly/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  56. data/vendor/rkelly/lib/rkelly/nodes/op_equal_node.rb +16 -0
  57. data/vendor/rkelly/lib/rkelly/nodes/postfix_node.rb +11 -0
  58. data/vendor/rkelly/lib/rkelly/nodes/prefix_node.rb +6 -0
  59. data/vendor/rkelly/lib/rkelly/nodes/property_node.rb +13 -0
  60. data/vendor/rkelly/lib/rkelly/nodes/resolve_node.rb +19 -0
  61. data/vendor/rkelly/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  62. data/vendor/rkelly/lib/rkelly/nodes/try_node.rb +13 -0
  63. data/vendor/rkelly/lib/rkelly/nodes/var_decl_node.rb +15 -0
  64. data/vendor/rkelly/lib/rkelly/nodes.rb +25 -0
  65. data/vendor/rkelly/lib/rkelly/parser.rb +104 -0
  66. data/vendor/rkelly/lib/rkelly/runtime/ruby_function.rb +13 -0
  67. data/vendor/rkelly/lib/rkelly/runtime/scope_chain.rb +57 -0
  68. data/vendor/rkelly/lib/rkelly/runtime.rb +36 -0
  69. data/vendor/rkelly/lib/rkelly/syntax_error.rb +4 -0
  70. data/vendor/rkelly/lib/rkelly/token.rb +15 -0
  71. data/vendor/rkelly/lib/rkelly/tokenizer.rb +122 -0
  72. data/vendor/rkelly/lib/rkelly/visitable.rb +16 -0
  73. data/vendor/rkelly/lib/rkelly/visitors/dot_visitor.rb +228 -0
  74. data/vendor/rkelly/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  75. data/vendor/rkelly/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  76. data/vendor/rkelly/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  77. data/vendor/rkelly/lib/rkelly/visitors/function_visitor.rb +46 -0
  78. data/vendor/rkelly/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  79. data/vendor/rkelly/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  80. data/vendor/rkelly/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  81. data/vendor/rkelly/lib/rkelly/visitors/visitor.rb +136 -0
  82. data/vendor/rkelly/lib/rkelly/visitors.rb +4 -0
  83. data/vendor/rkelly/lib/rkelly.rb +14 -0
  84. data/vendor/rkelly/rkelly.gemspec +34 -0
  85. data/vendor/rkelly/test/ecma_script_test_case.rb +21 -0
  86. data/vendor/rkelly/test/execute_test_case.rb +16 -0
  87. data/vendor/rkelly/test/execution_contexts/test_10_1_3-1.rb +32 -0
  88. data/vendor/rkelly/test/expressions/test_11_3_1.rb +64 -0
  89. data/vendor/rkelly/test/expressions/test_11_3_2.rb +64 -0
  90. data/vendor/rkelly/test/expressions/test_11_4_2.rb +13 -0
  91. data/vendor/rkelly/test/expressions/test_11_4_3.rb +52 -0
  92. data/vendor/rkelly/test/expressions/test_11_4_4.rb +68 -0
  93. data/vendor/rkelly/test/expressions/test_11_4_5.rb +69 -0
  94. data/vendor/rkelly/test/expressions/test_11_4_6.rb +88 -0
  95. data/vendor/rkelly/test/expressions/test_11_4_8.rb +28 -0
  96. data/vendor/rkelly/test/expressions/test_11_4_9.rb +103 -0
  97. data/vendor/rkelly/test/expressions/test_11_5_1.rb +51 -0
  98. data/vendor/rkelly/test/expressions/test_11_5_2.rb +80 -0
  99. data/vendor/rkelly/test/expressions/test_11_5_3.rb +88 -0
  100. data/vendor/rkelly/test/expressions/test_11_6_1-1.rb +19 -0
  101. data/vendor/rkelly/test/expressions/test_11_9_1.rb +19 -0
  102. data/vendor/rkelly/test/function/test_15_3_1_1-1.rb +34 -0
  103. data/vendor/rkelly/test/global_object/test_15_1_1_1.rb +29 -0
  104. data/vendor/rkelly/test/global_object/test_15_1_1_2.rb +17 -0
  105. data/vendor/rkelly/test/global_object/test_15_1_1_3.rb +9 -0
  106. data/vendor/rkelly/test/helper.rb +5 -0
  107. data/vendor/rkelly/test/node_test_case.rb +11 -0
  108. data/vendor/rkelly/test/object/test_15_2_1_1.rb +257 -0
  109. data/vendor/rkelly/test/object/test_15_2_1_2.rb +21 -0
  110. data/vendor/rkelly/test/object/test_15_2_2_1.rb +52 -0
  111. data/vendor/rkelly/test/statements/test_12_5-1.rb +27 -0
  112. data/vendor/rkelly/test/test_add_node.rb +8 -0
  113. data/vendor/rkelly/test/test_arguments_node.rb +8 -0
  114. data/vendor/rkelly/test/test_array_node.rb +9 -0
  115. data/vendor/rkelly/test/test_assign_expr_node.rb +8 -0
  116. data/vendor/rkelly/test/test_automatic_semicolon_insertion.rb +137 -0
  117. data/vendor/rkelly/test/test_bit_and_node.rb +8 -0
  118. data/vendor/rkelly/test/test_bit_or_node.rb +8 -0
  119. data/vendor/rkelly/test/test_bit_x_or_node.rb +8 -0
  120. data/vendor/rkelly/test/test_bitwise_not_node.rb +8 -0
  121. data/vendor/rkelly/test/test_block_node.rb +14 -0
  122. data/vendor/rkelly/test/test_bracket_accessor_node.rb +16 -0
  123. data/vendor/rkelly/test/test_break_node.rb +11 -0
  124. data/vendor/rkelly/test/test_case_block_node.rb +11 -0
  125. data/vendor/rkelly/test/test_case_clause_node.rb +15 -0
  126. data/vendor/rkelly/test/test_comma_node.rb +13 -0
  127. data/vendor/rkelly/test/test_comments.rb +44 -0
  128. data/vendor/rkelly/test/test_conditional_node.rb +17 -0
  129. data/vendor/rkelly/test/test_const_statement_node.rb +14 -0
  130. data/vendor/rkelly/test/test_continue_node.rb +11 -0
  131. data/vendor/rkelly/test/test_delete_node.rb +8 -0
  132. data/vendor/rkelly/test/test_divide_node.rb +8 -0
  133. data/vendor/rkelly/test/test_do_while_node.rb +13 -0
  134. data/vendor/rkelly/test/test_dot_accessor_node.rb +9 -0
  135. data/vendor/rkelly/test/test_ecma_visitor.rb +192 -0
  136. data/vendor/rkelly/test/test_element_node.rb +8 -0
  137. data/vendor/rkelly/test/test_empty_statement_node.rb +8 -0
  138. data/vendor/rkelly/test/test_equal_node.rb +8 -0
  139. data/vendor/rkelly/test/test_evaluation_visitor.rb +66 -0
  140. data/vendor/rkelly/test/test_expression_statement_node.rb +10 -0
  141. data/vendor/rkelly/test/test_false_node.rb +8 -0
  142. data/vendor/rkelly/test/test_for_in_node.rb +17 -0
  143. data/vendor/rkelly/test/test_for_node.rb +24 -0
  144. data/vendor/rkelly/test/test_function_body_node.rb +8 -0
  145. data/vendor/rkelly/test/test_function_call_node.rb +10 -0
  146. data/vendor/rkelly/test/test_function_decl_node.rb +16 -0
  147. data/vendor/rkelly/test/test_function_expr_node.rb +16 -0
  148. data/vendor/rkelly/test/test_function_visitor.rb +26 -0
  149. data/vendor/rkelly/test/test_getter_property_node.rb +10 -0
  150. data/vendor/rkelly/test/test_global_object.rb +49 -0
  151. data/vendor/rkelly/test/test_greater_node.rb +8 -0
  152. data/vendor/rkelly/test/test_greater_or_equal_node.rb +8 -0
  153. data/vendor/rkelly/test/test_if_node.rb +17 -0
  154. data/vendor/rkelly/test/test_in_node.rb +8 -0
  155. data/vendor/rkelly/test/test_instance_of_node.rb +8 -0
  156. data/vendor/rkelly/test/test_label_node.rb +13 -0
  157. data/vendor/rkelly/test/test_left_shift_node.rb +8 -0
  158. data/vendor/rkelly/test/test_less_node.rb +8 -0
  159. data/vendor/rkelly/test/test_less_or_equal_node.rb +8 -0
  160. data/vendor/rkelly/test/test_line_number.rb +23 -0
  161. data/vendor/rkelly/test/test_logical_and_node.rb +8 -0
  162. data/vendor/rkelly/test/test_logical_not_node.rb +8 -0
  163. data/vendor/rkelly/test/test_logical_or_node.rb +8 -0
  164. data/vendor/rkelly/test/test_modulus_node.rb +8 -0
  165. data/vendor/rkelly/test/test_multiply_node.rb +8 -0
  166. data/vendor/rkelly/test/test_new_expr_node.rb +9 -0
  167. data/vendor/rkelly/test/test_not_equal_node.rb +8 -0
  168. data/vendor/rkelly/test/test_not_strict_equal_node.rb +8 -0
  169. data/vendor/rkelly/test/test_null_node.rb +8 -0
  170. data/vendor/rkelly/test/test_number_node.rb +8 -0
  171. data/vendor/rkelly/test/test_object_literal_node.rb +9 -0
  172. data/vendor/rkelly/test/test_op_and_equal_node.rb +10 -0
  173. data/vendor/rkelly/test/test_op_divide_equal_node.rb +10 -0
  174. data/vendor/rkelly/test/test_op_equal_node.rb +10 -0
  175. data/vendor/rkelly/test/test_op_l_shift_equal_node.rb +10 -0
  176. data/vendor/rkelly/test/test_op_minus_equal_node.rb +10 -0
  177. data/vendor/rkelly/test/test_op_mod_equal_node.rb +10 -0
  178. data/vendor/rkelly/test/test_op_multiply_equal_node.rb +10 -0
  179. data/vendor/rkelly/test/test_op_or_equal_node.rb +10 -0
  180. data/vendor/rkelly/test/test_op_plus_equal_node.rb +10 -0
  181. data/vendor/rkelly/test/test_op_r_shift_equal_node.rb +10 -0
  182. data/vendor/rkelly/test/test_op_u_r_shift_equal_node.rb +10 -0
  183. data/vendor/rkelly/test/test_op_x_or_equal_node.rb +10 -0
  184. data/vendor/rkelly/test/test_parameter_node.rb +8 -0
  185. data/vendor/rkelly/test/test_parser.rb +1361 -0
  186. data/vendor/rkelly/test/test_pointcut_visitor.rb +34 -0
  187. data/vendor/rkelly/test/test_postfix_node.rb +8 -0
  188. data/vendor/rkelly/test/test_prefix_node.rb +8 -0
  189. data/vendor/rkelly/test/test_property_node.rb +8 -0
  190. data/vendor/rkelly/test/test_regexp_node.rb +8 -0
  191. data/vendor/rkelly/test/test_resolve_node.rb +22 -0
  192. data/vendor/rkelly/test/test_return_node.rb +11 -0
  193. data/vendor/rkelly/test/test_right_shift_node.rb +8 -0
  194. data/vendor/rkelly/test/test_rkelly.rb +19 -0
  195. data/vendor/rkelly/test/test_runtime.rb +12 -0
  196. data/vendor/rkelly/test/test_scope_chain.rb +50 -0
  197. data/vendor/rkelly/test/test_setter_property_node.rb +10 -0
  198. data/vendor/rkelly/test/test_source_elements.rb +9 -0
  199. data/vendor/rkelly/test/test_strict_equal_node.rb +8 -0
  200. data/vendor/rkelly/test/test_string_node.rb +8 -0
  201. data/vendor/rkelly/test/test_subtract_node.rb +8 -0
  202. data/vendor/rkelly/test/test_switch_node.rb +12 -0
  203. data/vendor/rkelly/test/test_this_node.rb +8 -0
  204. data/vendor/rkelly/test/test_throw_node.rb +7 -0
  205. data/vendor/rkelly/test/test_tokenizer.rb +148 -0
  206. data/vendor/rkelly/test/test_true_node.rb +8 -0
  207. data/vendor/rkelly/test/test_try_node.rb +59 -0
  208. data/vendor/rkelly/test/test_type_of_node.rb +8 -0
  209. data/vendor/rkelly/test/test_unary_minus_node.rb +8 -0
  210. data/vendor/rkelly/test/test_unary_plus_node.rb +8 -0
  211. data/vendor/rkelly/test/test_unsigned_right_shift_node.rb +8 -0
  212. data/vendor/rkelly/test/test_var_decl_node.rb +21 -0
  213. data/vendor/rkelly/test/test_var_statement_node.rb +14 -0
  214. data/vendor/rkelly/test/test_void_node.rb +8 -0
  215. data/vendor/rkelly/test/test_while_node.rb +15 -0
  216. data/vendor/rkelly/test/test_with_node.rb +8 -0
  217. metadata +271 -0
@@ -0,0 +1,373 @@
1
+ module RKelly
2
+ module Visitors
3
+ class SexpVisitor < Visitor
4
+ def visit_NumberNode(o)
5
+ [:lit, o.value]
6
+ end
7
+
8
+ def visit_RegexpNode(o)
9
+ [:lit, o.value]
10
+ end
11
+
12
+ def visit_AssignExprNode(o)
13
+ [:assign, super]
14
+ end
15
+
16
+ def visit_VarDeclNode(o)
17
+ [ o.constant? ? :const_decl : :var_decl ] + super(o)
18
+ end
19
+
20
+ def visit_VarStatementNode(o)
21
+ [:var, super]
22
+ end
23
+
24
+ def visit_PostfixNode(o)
25
+ [:postfix, super, o.value]
26
+ end
27
+
28
+ def visit_PrefixNode(o)
29
+ [:prefix, super, o.value]
30
+ end
31
+
32
+ def visit_DeleteNode(o)
33
+ [:delete, super]
34
+ end
35
+
36
+ def visit_VoidNode(o)
37
+ [:void, super]
38
+ end
39
+
40
+ def visit_TypeOfNode(o)
41
+ [:typeof, super]
42
+ end
43
+
44
+ def visit_UnaryPlusNode(o)
45
+ [:u_plus, super]
46
+ end
47
+
48
+ def visit_UnaryMinusNode(o)
49
+ [:u_minus, super]
50
+ end
51
+
52
+ def visit_BitwiseNotNode(o)
53
+ [:bitwise_not, super]
54
+ end
55
+
56
+ def visit_LogicalNotNode(o)
57
+ [:not, super]
58
+ end
59
+
60
+ def visit_ConstStatementNode(o)
61
+ [:const, super]
62
+ end
63
+
64
+ def visit_MultiplyNode(o)
65
+ [:multiply, *super]
66
+ end
67
+
68
+ def visit_DivideNode(o)
69
+ [:divide, *super]
70
+ end
71
+
72
+ def visit_ModulusNode(o)
73
+ [:modulus, *super]
74
+ end
75
+
76
+ def visit_AddNode(o)
77
+ [:add, *super]
78
+ end
79
+
80
+ def visit_LeftShiftNode(o)
81
+ [:lshift, *super]
82
+ end
83
+
84
+ def visit_RightShiftNode(o)
85
+ [:rshift, *super]
86
+ end
87
+
88
+ def visit_UnsignedRightShiftNode(o)
89
+ [:urshift, *super]
90
+ end
91
+
92
+ def visit_SubtractNode(o)
93
+ [:subtract, *super]
94
+ end
95
+
96
+ def visit_LessNode(o)
97
+ [:less, *super]
98
+ end
99
+
100
+ def visit_GreaterNode(o)
101
+ [:greater, *super]
102
+ end
103
+
104
+ def visit_LessOrEqualNode(o)
105
+ [:less_or_equal, *super]
106
+ end
107
+
108
+ def visit_GreaterOrEqualNode(o)
109
+ [:greater_or_equal, *super]
110
+ end
111
+
112
+ def visit_InstanceOfNode(o)
113
+ [:instance_of, *super]
114
+ end
115
+
116
+ def visit_EqualNode(o)
117
+ [:equal, *super]
118
+ end
119
+
120
+ def visit_NotEqualNode(o)
121
+ [:not_equal, *super]
122
+ end
123
+
124
+ def visit_StrictEqualNode(o)
125
+ [:strict_equal, *super]
126
+ end
127
+
128
+ def visit_NotStrictEqualNode(o)
129
+ [:not_strict_equal, *super]
130
+ end
131
+
132
+ def visit_BitAndNode(o)
133
+ [:bit_and, *super]
134
+ end
135
+
136
+ def visit_BitOrNode(o)
137
+ [:bit_or, *super]
138
+ end
139
+
140
+ def visit_BitXOrNode(o)
141
+ [:bit_xor, *super]
142
+ end
143
+
144
+ def visit_LogicalAndNode(o)
145
+ [:and, *super]
146
+ end
147
+
148
+ def visit_LogicalOrNode(o)
149
+ [:or, *super]
150
+ end
151
+
152
+ def visit_InNode(o)
153
+ [:in, *super]
154
+ end
155
+
156
+ def visit_DoWhileNode(o)
157
+ [:do_while, *super]
158
+ end
159
+
160
+ def visit_WhileNode(o)
161
+ [:while, *super]
162
+ end
163
+
164
+ def visit_WithNode(o)
165
+ [:with, *super]
166
+ end
167
+
168
+ def visit_CaseClauseNode(o)
169
+ [:case, *super]
170
+ end
171
+
172
+ def visit_CaseBlockNode(o)
173
+ [:case_block, super]
174
+ end
175
+
176
+ def visit_SwitchNode(o)
177
+ [:switch, *super]
178
+ end
179
+
180
+ def visit_ForNode(o)
181
+ [ :for, *super]
182
+ end
183
+
184
+ def visit_BlockNode(o)
185
+ [:block, super]
186
+ end
187
+
188
+ def visit_IfNode(o)
189
+ [:if, *super].compact
190
+ end
191
+
192
+ def visit_ConditionalNode(o)
193
+ [:conditional, *super]
194
+ end
195
+
196
+ def visit_ForInNode(o)
197
+ [ :for_in, *super]
198
+ end
199
+
200
+ def visit_TryNode(o)
201
+ [ :try, *super]
202
+ end
203
+
204
+ def visit_EmptyStatementNode(o)
205
+ [:empty]
206
+ end
207
+
208
+ def visit_FunctionBodyNode(o)
209
+ [:func_body, super]
210
+ end
211
+
212
+ def visit_ResolveNode(o)
213
+ [:resolve, o.value]
214
+ end
215
+
216
+ def visit_BracketAccessorNode(o)
217
+ [:bracket_access, *super]
218
+ end
219
+
220
+ def visit_NewExprNode(o)
221
+ [:new_expr, *super]
222
+ end
223
+
224
+ def visit_ParameterNode(o)
225
+ [:param, o.value]
226
+ end
227
+
228
+ def visit_BreakNode(o)
229
+ [:break, o.value].compact
230
+ end
231
+
232
+ def visit_ContinueNode(o)
233
+ [:continue, o.value].compact
234
+ end
235
+
236
+ def visit_LabelNode(o)
237
+ [:label ] + super
238
+ end
239
+
240
+ def visit_ThrowNode(o)
241
+ [:throw, super]
242
+ end
243
+
244
+ def visit_ObjectLiteralNode(o)
245
+ [:object, super]
246
+ end
247
+
248
+ def visit_PropertyNode(o)
249
+ [ :property ] + super
250
+ end
251
+
252
+ def visit_GetterPropertyNode(o)
253
+ [ :getter ] + super
254
+ end
255
+
256
+ def visit_SetterPropertyNode(o)
257
+ [ :setter ] + super
258
+ end
259
+
260
+ def visit_ElementNode(o)
261
+ [:element, super ]
262
+ end
263
+
264
+ def visit_ExpressionStatementNode(o)
265
+ [:expression, super ]
266
+ end
267
+
268
+ def visit_OpEqualNode(o)
269
+ [:op_equal, *super ]
270
+ end
271
+
272
+ def visit_OpPlusEqualNode(o)
273
+ [:op_plus_equal, *super ]
274
+ end
275
+
276
+ def visit_OpMinusEqualNode(o)
277
+ [:op_minus_equal, *super ]
278
+ end
279
+
280
+ def visit_OpMultiplyEqualNode(o)
281
+ [:op_multiply_equal, *super ]
282
+ end
283
+
284
+ def visit_OpDivideEqualNode(o)
285
+ [:op_divide_equal, *super]
286
+ end
287
+
288
+ def visit_OpLShiftEqualNode(o)
289
+ [:op_lshift_equal, *super ]
290
+ end
291
+
292
+ def visit_OpRShiftEqualNode(o)
293
+ [:op_rshift_equal, *super ]
294
+ end
295
+
296
+ def visit_OpURShiftEqualNode(o)
297
+ [:op_urshift_equal, *super ]
298
+ end
299
+
300
+ def visit_OpAndEqualNode(o)
301
+ [:op_and_equal, *super ]
302
+ end
303
+
304
+ def visit_OpXOrEqualNode(o)
305
+ [:op_xor_equal, *super ]
306
+ end
307
+
308
+ def visit_OpOrEqualNode(o)
309
+ [:op_or_equal, *super ]
310
+ end
311
+
312
+ def visit_OpModEqualNode(o)
313
+ [:op_mod_equal, *super]
314
+ end
315
+
316
+ def visit_CommaNode(o)
317
+ [:comma, *super]
318
+ end
319
+
320
+ def visit_FunctionCallNode(o)
321
+ [:function_call, *super]
322
+ end
323
+
324
+ def visit_ArrayNode(o)
325
+ [:array, super]
326
+ end
327
+
328
+ def visit_ThisNode(o)
329
+ [:this]
330
+ end
331
+
332
+ def visit_ReturnNode(o)
333
+ o.value ? [:return, super] : [:return]
334
+ end
335
+
336
+ def visit_FunctionExprNode(o)
337
+ [ :func_expr, *super]
338
+ end
339
+
340
+ def visit_FunctionDeclNode(o)
341
+ [ :func_decl, *super]
342
+ end
343
+
344
+ def visit_ArgumentsNode(o)
345
+ [:args, super]
346
+ end
347
+
348
+ def visit_DotAccessorNode(o)
349
+ [:dot_access,
350
+ super,
351
+ o.accessor
352
+ ]
353
+ end
354
+
355
+ def visit_NullNode(o)
356
+ [:nil]
357
+ end
358
+
359
+ def visit_StringNode(o)
360
+ [:str, o.value]
361
+ end
362
+
363
+ def visit_FalseNode(o)
364
+ [:false]
365
+ end
366
+
367
+ def visit_TrueNode(o)
368
+ [:true]
369
+ end
370
+
371
+ end
372
+ end
373
+ end
@@ -0,0 +1,136 @@
1
+ module RKelly
2
+ module Visitors
3
+ class Visitor
4
+ TERMINAL_NODES = %w{
5
+ Break Continue EmptyStatement False Null Number Parameter Regexp Resolve
6
+ String This True
7
+ }
8
+ SINGLE_VALUE_NODES = %w{
9
+ AssignExpr BitwiseNot Block Delete Element ExpressionStatement
10
+ FunctionBody LogicalNot Return Throw TypeOf UnaryMinus UnaryPlus Void
11
+ }
12
+ BINARY_NODES = %w{
13
+ Add BitAnd BitOr BitXOr CaseClause Comma Divide DoWhile Equal Greater
14
+ GreaterOrEqual In InstanceOf LeftShift Less LessOrEqual LogicalAnd
15
+ LogicalOr Modulus Multiply NotEqual NotStrictEqual OpAndEqual
16
+ OpDivideEqual OpEqual OpLShiftEqual OpMinusEqual OpModEqual
17
+ OpMultiplyEqual OpOrEqual OpPlusEqual OpRShiftEqual OpURShiftEqual
18
+ OpXOrEqual RightShift StrictEqual Subtract Switch UnsignedRightShift
19
+ While With
20
+ }
21
+ ARRAY_VALUE_NODES = %w{
22
+ Arguments Array CaseBlock ConstStatement ObjectLiteral SourceElements
23
+ VarStatement
24
+ }
25
+ NAME_VALUE_NODES = %w{
26
+ Label Property GetterProperty SetterProperty VarDecl
27
+ }
28
+ PREFIX_POSTFIX_NODES = %w{ Postfix Prefix }
29
+ CONDITIONAL_NODES = %w{ If Conditional }
30
+ FUNC_CALL_NODES = %w{ NewExpr FunctionCall }
31
+ FUNC_DECL_NODES = %w{ FunctionExpr FunctionDecl }
32
+ ALL_NODES = %w{ For ForIn Try BracketAccessor DotAcessor } +
33
+ TERMINAL_NODES + SINGLE_VALUE_NODES + BINARY_NODES + ARRAY_VALUE_NODES +
34
+ NAME_VALUE_NODES + PREFIX_POSTFIX_NODES + CONDITIONAL_NODES +
35
+ FUNC_CALL_NODES + FUNC_DECL_NODES
36
+
37
+ def accept(target)
38
+ target.accept(self)
39
+ end
40
+
41
+ TERMINAL_NODES.each do |type|
42
+ define_method(:"visit_#{type}Node") { |o| o.value }
43
+ end
44
+
45
+ BINARY_NODES.each do |type|
46
+ define_method(:"visit_#{type}Node") do |o|
47
+ [o.left && o.left.accept(self), o.value && o.value.accept(self)]
48
+ end
49
+ end
50
+
51
+ ARRAY_VALUE_NODES.each do |type|
52
+ define_method(:"visit_#{type}Node") do |o|
53
+ o.value && o.value.map { |v| v ? v.accept(self) : nil }
54
+ end
55
+ end
56
+
57
+ NAME_VALUE_NODES.each do |type|
58
+ define_method(:"visit_#{type}Node") do |o|
59
+ [o.name.to_s.to_sym, o.value ? o.value.accept(self) : nil]
60
+ end
61
+ end
62
+
63
+ SINGLE_VALUE_NODES.each do |type|
64
+ define_method(:"visit_#{type}Node") do |o|
65
+ o.value.accept(self) if o.value
66
+ end
67
+ end
68
+
69
+ PREFIX_POSTFIX_NODES.each do |type|
70
+ define_method(:"visit_#{type}Node") do |o|
71
+ o.operand.accept(self)
72
+ end
73
+ end
74
+
75
+ CONDITIONAL_NODES.each do |type|
76
+ define_method(:"visit_#{type}Node") do |o|
77
+ [ o.conditions.accept(self),
78
+ o.value.accept(self),
79
+ o.else ? o.else.accept(self) : nil
80
+ ]
81
+ end
82
+ end
83
+ FUNC_CALL_NODES.each do |type|
84
+ define_method(:"visit_#{type}Node") do |o|
85
+ [o.value.accept(self), o.arguments.accept(self)]
86
+ end
87
+ end
88
+ FUNC_DECL_NODES.each do |type|
89
+ define_method(:"visit_#{type}Node") do |o|
90
+ [
91
+ o.value ? o.value : nil,
92
+ o.arguments.map { |x| x.accept(self) },
93
+ o.function_body.accept(self)
94
+ ]
95
+ end
96
+ end
97
+
98
+ def visit_ForNode(o)
99
+ [
100
+ o.init ? o.init.accept(self) : nil,
101
+ o.test ? o.test.accept(self) : nil,
102
+ o.counter ? o.counter.accept(self) : nil,
103
+ o.value.accept(self)
104
+ ]
105
+ end
106
+
107
+ def visit_ForInNode(o)
108
+ [
109
+ o.left.accept(self),
110
+ o.right.accept(self),
111
+ o.value.accept(self)
112
+ ]
113
+ end
114
+
115
+ def visit_TryNode(o)
116
+ [
117
+ o.value.accept(self),
118
+ o.catch_var ? o.catch_var : nil,
119
+ o.catch_block ? o.catch_block.accept(self) : nil,
120
+ o.finally_block ? o.finally_block.accept(self) : nil
121
+ ]
122
+ end
123
+
124
+ def visit_BracketAccessorNode(o)
125
+ [
126
+ o.value.accept(self),
127
+ o.accessor.accept(self)
128
+ ]
129
+ end
130
+
131
+ def visit_DotAccessorNode(o)
132
+ o.value.accept(self)
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,4 @@
1
+ require 'rkelly/visitors/visitor'
2
+ Dir[File.join(File.dirname(__FILE__), "visitors/*_visitor.rb")].each do |file|
3
+ require file[/rkelly\/visitors\/.*/]
4
+ end
@@ -0,0 +1,14 @@
1
+ require 'rkelly/constants'
2
+ require 'rkelly/visitable'
3
+ require 'rkelly/visitors'
4
+ require 'rkelly/parser'
5
+ require 'rkelly/runtime'
6
+ require 'rkelly/syntax_error'
7
+
8
+ module RKelly
9
+ class << self
10
+ def parse *args
11
+ RKelly::Parser.new.parse(*args)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{rkelly}
5
+ s.version = "1.0.0.20090608145201"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Aaron Patterson"]
9
+ s.date = %q{2009-06-08}
10
+ s.description = %q{The RKelly library will parse JavaScript and return a parse tree.}
11
+ s.email = ["aaronp@rubyforge.org"]
12
+ s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "README.rdoc"]
13
+ s.files = ["CHANGELOG.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "lib/parser.y", "lib/rkelly.rb", "lib/rkelly/constants.rb", "lib/rkelly/generated_parser.rb", "lib/rkelly/js.rb", "lib/rkelly/js/array.rb", "lib/rkelly/js/base.rb", "lib/rkelly/js/boolean.rb", "lib/rkelly/js/function.rb", "lib/rkelly/js/function_prototype.rb", "lib/rkelly/js/global_object.rb", "lib/rkelly/js/math.rb", "lib/rkelly/js/nan.rb", "lib/rkelly/js/number.rb", "lib/rkelly/js/object.rb", "lib/rkelly/js/object_prototype.rb", "lib/rkelly/js/property.rb", "lib/rkelly/js/scope.rb", "lib/rkelly/js/string.rb", "lib/rkelly/lexeme.rb", "lib/rkelly/nodes.rb", "lib/rkelly/nodes/binary_node.rb", "lib/rkelly/nodes/bracket_accessor_node.rb", "lib/rkelly/nodes/case_clause_node.rb", "lib/rkelly/nodes/comma_node.rb", "lib/rkelly/nodes/conditional_node.rb", "lib/rkelly/nodes/dot_accessor_node.rb", "lib/rkelly/nodes/for_in_node.rb", "lib/rkelly/nodes/for_node.rb", "lib/rkelly/nodes/function_call_node.rb", "lib/rkelly/nodes/function_decl_node.rb", "lib/rkelly/nodes/function_expr_node.rb", "lib/rkelly/nodes/if_node.rb", "lib/rkelly/nodes/label_node.rb", "lib/rkelly/nodes/new_expr_node.rb", "lib/rkelly/nodes/node.rb", "lib/rkelly/nodes/not_strict_equal_node.rb", "lib/rkelly/nodes/op_equal_node.rb", "lib/rkelly/nodes/postfix_node.rb", "lib/rkelly/nodes/prefix_node.rb", "lib/rkelly/nodes/property_node.rb", "lib/rkelly/nodes/resolve_node.rb", "lib/rkelly/nodes/strict_equal_node.rb", "lib/rkelly/nodes/try_node.rb", "lib/rkelly/nodes/var_decl_node.rb", "lib/rkelly/parser.rb", "lib/rkelly/runtime.rb", "lib/rkelly/runtime/ruby_function.rb", "lib/rkelly/runtime/scope_chain.rb", "lib/rkelly/token.rb", "lib/rkelly/tokenizer.rb", "lib/rkelly/visitable.rb", "lib/rkelly/visitors.rb", "lib/rkelly/visitors/dot_visitor.rb", "lib/rkelly/visitors/ecma_visitor.rb", "lib/rkelly/visitors/enumerable_visitor.rb", "lib/rkelly/visitors/evaluation_visitor.rb", "lib/rkelly/visitors/function_visitor.rb", "lib/rkelly/visitors/pointcut_visitor.rb", "lib/rkelly/visitors/real_sexp_visitor.rb", "lib/rkelly/visitors/sexp_visitor.rb", "lib/rkelly/visitors/visitor.rb", "test/ecma_script_test_case.rb", "test/execute_test_case.rb", "test/execution_contexts/test_10_1_3-1.rb", "test/expressions/test_11_3_1.rb", "test/expressions/test_11_3_2.rb", "test/expressions/test_11_4_2.rb", "test/expressions/test_11_4_3.rb", "test/expressions/test_11_4_4.rb", "test/expressions/test_11_4_5.rb", "test/expressions/test_11_4_6.rb", "test/expressions/test_11_4_8.rb", "test/expressions/test_11_4_9.rb", "test/expressions/test_11_5_1.rb", "test/expressions/test_11_5_2.rb", "test/expressions/test_11_5_3.rb", "test/expressions/test_11_6_1-1.rb", "test/expressions/test_11_9_1.rb", "test/function/test_15_3_1_1-1.rb", "test/global_object/test_15_1_1_1.rb", "test/global_object/test_15_1_1_2.rb", "test/global_object/test_15_1_1_3.rb", "test/helper.rb", "test/node_test_case.rb", "test/object/test_15_2_1_1.rb", "test/object/test_15_2_1_2.rb", "test/object/test_15_2_2_1.rb", "test/statements/test_12_5-1.rb", "test/test_add_node.rb", "test/test_arguments_node.rb", "test/test_array_node.rb", "test/test_assign_expr_node.rb", "test/test_automatic_semicolon_insertion.rb", "test/test_bit_and_node.rb", "test/test_bit_or_node.rb", "test/test_bit_x_or_node.rb", "test/test_bitwise_not_node.rb", "test/test_block_node.rb", "test/test_bracket_accessor_node.rb", "test/test_break_node.rb", "test/test_case_block_node.rb", "test/test_case_clause_node.rb", "test/test_comma_node.rb", "test/test_comments.rb", "test/test_conditional_node.rb", "test/test_const_statement_node.rb", "test/test_continue_node.rb", "test/test_delete_node.rb", "test/test_divide_node.rb", "test/test_do_while_node.rb", "test/test_dot_accessor_node.rb", "test/test_ecma_visitor.rb", "test/test_element_node.rb", "test/test_empty_statement_node.rb", "test/test_equal_node.rb", "test/test_evaluation_visitor.rb", "test/test_expression_statement_node.rb", "test/test_false_node.rb", "test/test_for_in_node.rb", "test/test_for_node.rb", "test/test_function_body_node.rb", "test/test_function_call_node.rb", "test/test_function_decl_node.rb", "test/test_function_expr_node.rb", "test/test_function_visitor.rb", "test/test_getter_property_node.rb", "test/test_global_object.rb", "test/test_greater_node.rb", "test/test_greater_or_equal_node.rb", "test/test_if_node.rb", "test/test_in_node.rb", "test/test_instance_of_node.rb", "test/test_label_node.rb", "test/test_left_shift_node.rb", "test/test_less_node.rb", "test/test_less_or_equal_node.rb", "test/test_line_number.rb", "test/test_logical_and_node.rb", "test/test_logical_not_node.rb", "test/test_logical_or_node.rb", "test/test_modulus_node.rb", "test/test_multiply_node.rb", "test/test_new_expr_node.rb", "test/test_not_equal_node.rb", "test/test_not_strict_equal_node.rb", "test/test_null_node.rb", "test/test_number_node.rb", "test/test_object_literal_node.rb", "test/test_op_and_equal_node.rb", "test/test_op_divide_equal_node.rb", "test/test_op_equal_node.rb", "test/test_op_l_shift_equal_node.rb", "test/test_op_minus_equal_node.rb", "test/test_op_mod_equal_node.rb", "test/test_op_multiply_equal_node.rb", "test/test_op_or_equal_node.rb", "test/test_op_plus_equal_node.rb", "test/test_op_r_shift_equal_node.rb", "test/test_op_u_r_shift_equal_node.rb", "test/test_op_x_or_equal_node.rb", "test/test_parameter_node.rb", "test/test_parser.rb", "test/test_pointcut_visitor.rb", "test/test_postfix_node.rb", "test/test_prefix_node.rb", "test/test_property_node.rb", "test/test_regexp_node.rb", "test/test_resolve_node.rb", "test/test_return_node.rb", "test/test_right_shift_node.rb", "test/test_rkelly.rb", "test/test_runtime.rb", "test/test_scope_chain.rb", "test/test_setter_property_node.rb", "test/test_source_elements.rb", "test/test_strict_equal_node.rb", "test/test_string_node.rb", "test/test_subtract_node.rb", "test/test_switch_node.rb", "test/test_this_node.rb", "test/test_throw_node.rb", "test/test_tokenizer.rb", "test/test_true_node.rb", "test/test_try_node.rb", "test/test_type_of_node.rb", "test/test_unary_minus_node.rb", "test/test_unary_plus_node.rb", "test/test_unsigned_right_shift_node.rb", "test/test_var_decl_node.rb", "test/test_var_statement_node.rb", "test/test_void_node.rb", "test/test_while_node.rb", "test/test_with_node.rb"]
14
+ s.homepage = %q{http://rkelly.rubyforge.org/}
15
+ s.rdoc_options = ["--main", "README.rdoc"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{rkelly}
18
+ s.rubygems_version = %q{1.3.3}
19
+ s.summary = %q{The RKelly library will parse JavaScript and return a parse tree.}
20
+ s.test_files = ["test/execution_contexts/test_10_1_3-1.rb", "test/expressions/test_11_3_1.rb", "test/expressions/test_11_3_2.rb", "test/expressions/test_11_4_2.rb", "test/expressions/test_11_4_3.rb", "test/expressions/test_11_4_4.rb", "test/expressions/test_11_4_5.rb", "test/expressions/test_11_4_6.rb", "test/expressions/test_11_4_8.rb", "test/expressions/test_11_4_9.rb", "test/expressions/test_11_5_1.rb", "test/expressions/test_11_5_2.rb", "test/expressions/test_11_5_3.rb", "test/expressions/test_11_6_1-1.rb", "test/expressions/test_11_9_1.rb", "test/function/test_15_3_1_1-1.rb", "test/global_object/test_15_1_1_1.rb", "test/global_object/test_15_1_1_2.rb", "test/global_object/test_15_1_1_3.rb", "test/object/test_15_2_1_1.rb", "test/object/test_15_2_1_2.rb", "test/object/test_15_2_2_1.rb", "test/statements/test_12_5-1.rb", "test/test_add_node.rb", "test/test_arguments_node.rb", "test/test_array_node.rb", "test/test_assign_expr_node.rb", "test/test_automatic_semicolon_insertion.rb", "test/test_bit_and_node.rb", "test/test_bit_or_node.rb", "test/test_bit_x_or_node.rb", "test/test_bitwise_not_node.rb", "test/test_block_node.rb", "test/test_bracket_accessor_node.rb", "test/test_break_node.rb", "test/test_case_block_node.rb", "test/test_case_clause_node.rb", "test/test_comma_node.rb", "test/test_comments.rb", "test/test_conditional_node.rb", "test/test_const_statement_node.rb", "test/test_continue_node.rb", "test/test_delete_node.rb", "test/test_divide_node.rb", "test/test_do_while_node.rb", "test/test_dot_accessor_node.rb", "test/test_ecma_visitor.rb", "test/test_element_node.rb", "test/test_empty_statement_node.rb", "test/test_equal_node.rb", "test/test_evaluation_visitor.rb", "test/test_expression_statement_node.rb", "test/test_false_node.rb", "test/test_for_in_node.rb", "test/test_for_node.rb", "test/test_function_body_node.rb", "test/test_function_call_node.rb", "test/test_function_decl_node.rb", "test/test_function_expr_node.rb", "test/test_function_visitor.rb", "test/test_getter_property_node.rb", "test/test_global_object.rb", "test/test_greater_node.rb", "test/test_greater_or_equal_node.rb", "test/test_if_node.rb", "test/test_in_node.rb", "test/test_instance_of_node.rb", "test/test_label_node.rb", "test/test_left_shift_node.rb", "test/test_less_node.rb", "test/test_less_or_equal_node.rb", "test/test_line_number.rb", "test/test_logical_and_node.rb", "test/test_logical_not_node.rb", "test/test_logical_or_node.rb", "test/test_modulus_node.rb", "test/test_multiply_node.rb", "test/test_new_expr_node.rb", "test/test_not_equal_node.rb", "test/test_not_strict_equal_node.rb", "test/test_null_node.rb", "test/test_number_node.rb", "test/test_object_literal_node.rb", "test/test_op_and_equal_node.rb", "test/test_op_divide_equal_node.rb", "test/test_op_equal_node.rb", "test/test_op_l_shift_equal_node.rb", "test/test_op_minus_equal_node.rb", "test/test_op_mod_equal_node.rb", "test/test_op_multiply_equal_node.rb", "test/test_op_or_equal_node.rb", "test/test_op_plus_equal_node.rb", "test/test_op_r_shift_equal_node.rb", "test/test_op_u_r_shift_equal_node.rb", "test/test_op_x_or_equal_node.rb", "test/test_parameter_node.rb", "test/test_parser.rb", "test/test_pointcut_visitor.rb", "test/test_postfix_node.rb", "test/test_prefix_node.rb", "test/test_property_node.rb", "test/test_regexp_node.rb", "test/test_resolve_node.rb", "test/test_return_node.rb", "test/test_right_shift_node.rb", "test/test_rkelly.rb", "test/test_runtime.rb", "test/test_scope_chain.rb", "test/test_setter_property_node.rb", "test/test_source_elements.rb", "test/test_strict_equal_node.rb", "test/test_string_node.rb", "test/test_subtract_node.rb", "test/test_switch_node.rb", "test/test_this_node.rb", "test/test_throw_node.rb", "test/test_tokenizer.rb", "test/test_true_node.rb", "test/test_try_node.rb", "test/test_type_of_node.rb", "test/test_unary_minus_node.rb", "test/test_unary_plus_node.rb", "test/test_unsigned_right_shift_node.rb", "test/test_var_decl_node.rb", "test/test_var_statement_node.rb", "test/test_void_node.rb", "test/test_while_node.rb", "test/test_with_node.rb"]
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_development_dependency(%q<hoe>, [">= 1.12.2"])
28
+ else
29
+ s.add_dependency(%q<hoe>, [">= 1.12.2"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<hoe>, [">= 1.12.2"])
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ECMAScriptTestCase < Test::Unit::TestCase
4
+ include RKelly::JS
5
+
6
+ undef :default_test
7
+
8
+ def setup
9
+ @runtime = RKelly::Runtime.new
10
+ @runtime.define_function(:assert_equal) do |*args|
11
+ assert_equal(*args)
12
+ end
13
+ @runtime.define_function(:assert_in_delta) do |*args|
14
+ assert_in_delta(*args)
15
+ end
16
+ end
17
+
18
+ def js_assert_equal(expected, actual)
19
+ @runtime.execute("assert_equal(#{expected}, #{actual});")
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ExecuteTestCase < Test::Unit::TestCase
4
+ include RKelly::Nodes
5
+
6
+ undef :default_test
7
+
8
+ def assert_execute(expected, code)
9
+ scope_chain = @runtime.execute(code)
10
+ expected.each do |name, value|
11
+ assert scope_chain.has_property?(name)
12
+ assert_equal value, scope_chain[name].value
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class ExecutionContext_10_1_3_1_Test < Test::Unit::TestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ @runtime.define_function(:assert_equal) do |*args|
7
+ assert_equal(*args)
8
+ end
9
+ end
10
+
11
+ def test_myfun3_void_0
12
+ scope_chain = @runtime.execute("
13
+ function myfun3(a, b, a) {
14
+ return a;
15
+ }
16
+ var x = myfun3(2,4);
17
+ ")
18
+ assert scope_chain.has_property?('x')
19
+ #assert_equal :undefined, scope_chain['x'].value
20
+ end
21
+
22
+ def test_myfun3
23
+ scope_chain = @runtime.execute("
24
+ function myfun3(a, b, a) {
25
+ return a;
26
+ }
27
+ var x = myfun3(2,4,8);
28
+ ")
29
+ assert scope_chain.has_property?('x')
30
+ assert_equal 8, scope_chain['x'].value
31
+ end
32
+ end