rkelly 1.0.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 (200) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/Manifest.txt +199 -0
  3. data/README.txt +58 -0
  4. data/Rakefile +85 -0
  5. data/lib/parser.y +870 -0
  6. data/lib/rkelly.rb +13 -0
  7. data/lib/rkelly/constants.rb +3 -0
  8. data/lib/rkelly/generated_parser.rb +3237 -0
  9. data/lib/rkelly/js.rb +14 -0
  10. data/lib/rkelly/js/array.rb +15 -0
  11. data/lib/rkelly/js/base.rb +91 -0
  12. data/lib/rkelly/js/boolean.rb +21 -0
  13. data/lib/rkelly/js/function.rb +39 -0
  14. data/lib/rkelly/js/function_prototype.rb +15 -0
  15. data/lib/rkelly/js/global_object.rb +52 -0
  16. data/lib/rkelly/js/math.rb +10 -0
  17. data/lib/rkelly/js/nan.rb +18 -0
  18. data/lib/rkelly/js/number.rb +22 -0
  19. data/lib/rkelly/js/object.rb +30 -0
  20. data/lib/rkelly/js/object_prototype.rb +14 -0
  21. data/lib/rkelly/js/property.rb +20 -0
  22. data/lib/rkelly/js/scope.rb +6 -0
  23. data/lib/rkelly/js/string.rb +21 -0
  24. data/lib/rkelly/lexeme.rb +18 -0
  25. data/lib/rkelly/nodes.rb +5 -0
  26. data/lib/rkelly/nodes/binary_node.rb +18 -0
  27. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  28. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  29. data/lib/rkelly/nodes/comma_node.rb +11 -0
  30. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  31. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  32. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  33. data/lib/rkelly/nodes/for_node.rb +13 -0
  34. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  35. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  36. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  37. data/lib/rkelly/nodes/if_node.rb +12 -0
  38. data/lib/rkelly/nodes/label_node.rb +11 -0
  39. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  40. data/lib/rkelly/nodes/node.rb +88 -0
  41. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  42. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  43. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  44. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  45. data/lib/rkelly/nodes/property_node.rb +13 -0
  46. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  47. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  48. data/lib/rkelly/nodes/try_node.rb +13 -0
  49. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  50. data/lib/rkelly/parser.rb +100 -0
  51. data/lib/rkelly/runtime.rb +36 -0
  52. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  53. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  54. data/lib/rkelly/token.rb +15 -0
  55. data/lib/rkelly/tokenizer.rb +122 -0
  56. data/lib/rkelly/visitable.rb +16 -0
  57. data/lib/rkelly/visitors.rb +4 -0
  58. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  59. data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  60. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  61. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  62. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  63. data/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  64. data/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  65. data/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  66. data/lib/rkelly/visitors/visitor.rb +136 -0
  67. data/rkelly.gemspec +33 -0
  68. data/test/ecma_script_test_case.rb +21 -0
  69. data/test/execute_test_case.rb +16 -0
  70. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  71. data/test/expressions/test_11_3_1.rb +64 -0
  72. data/test/expressions/test_11_3_2.rb +64 -0
  73. data/test/expressions/test_11_4_2.rb +13 -0
  74. data/test/expressions/test_11_4_3.rb +52 -0
  75. data/test/expressions/test_11_4_4.rb +68 -0
  76. data/test/expressions/test_11_4_5.rb +69 -0
  77. data/test/expressions/test_11_4_6.rb +88 -0
  78. data/test/expressions/test_11_4_8.rb +28 -0
  79. data/test/expressions/test_11_4_9.rb +103 -0
  80. data/test/expressions/test_11_5_1.rb +51 -0
  81. data/test/expressions/test_11_5_2.rb +80 -0
  82. data/test/expressions/test_11_5_3.rb +88 -0
  83. data/test/expressions/test_11_6_1-1.rb +19 -0
  84. data/test/expressions/test_11_9_1.rb +19 -0
  85. data/test/function/test_15_3_1_1-1.rb +34 -0
  86. data/test/global_object/test_15_1_1_1.rb +29 -0
  87. data/test/global_object/test_15_1_1_2.rb +17 -0
  88. data/test/global_object/test_15_1_1_3.rb +9 -0
  89. data/test/helper.rb +5 -0
  90. data/test/node_test_case.rb +11 -0
  91. data/test/object/test_15_2_1_1.rb +257 -0
  92. data/test/object/test_15_2_1_2.rb +21 -0
  93. data/test/object/test_15_2_2_1.rb +52 -0
  94. data/test/statements/test_12_5-1.rb +27 -0
  95. data/test/test_add_node.rb +8 -0
  96. data/test/test_arguments_node.rb +8 -0
  97. data/test/test_array_node.rb +9 -0
  98. data/test/test_assign_expr_node.rb +8 -0
  99. data/test/test_automatic_semicolon_insertion.rb +137 -0
  100. data/test/test_bit_and_node.rb +8 -0
  101. data/test/test_bit_or_node.rb +8 -0
  102. data/test/test_bit_x_or_node.rb +8 -0
  103. data/test/test_bitwise_not_node.rb +8 -0
  104. data/test/test_block_node.rb +14 -0
  105. data/test/test_bracket_accessor_node.rb +16 -0
  106. data/test/test_break_node.rb +11 -0
  107. data/test/test_case_block_node.rb +11 -0
  108. data/test/test_case_clause_node.rb +15 -0
  109. data/test/test_comma_node.rb +13 -0
  110. data/test/test_comments.rb +44 -0
  111. data/test/test_conditional_node.rb +17 -0
  112. data/test/test_const_statement_node.rb +14 -0
  113. data/test/test_continue_node.rb +11 -0
  114. data/test/test_delete_node.rb +8 -0
  115. data/test/test_divide_node.rb +8 -0
  116. data/test/test_do_while_node.rb +13 -0
  117. data/test/test_dot_accessor_node.rb +9 -0
  118. data/test/test_ecma_visitor.rb +192 -0
  119. data/test/test_element_node.rb +8 -0
  120. data/test/test_empty_statement_node.rb +8 -0
  121. data/test/test_equal_node.rb +8 -0
  122. data/test/test_evaluation_visitor.rb +66 -0
  123. data/test/test_expression_statement_node.rb +10 -0
  124. data/test/test_false_node.rb +8 -0
  125. data/test/test_for_in_node.rb +17 -0
  126. data/test/test_for_node.rb +24 -0
  127. data/test/test_function_body_node.rb +8 -0
  128. data/test/test_function_call_node.rb +10 -0
  129. data/test/test_function_decl_node.rb +16 -0
  130. data/test/test_function_expr_node.rb +16 -0
  131. data/test/test_function_visitor.rb +26 -0
  132. data/test/test_getter_property_node.rb +10 -0
  133. data/test/test_global_object.rb +49 -0
  134. data/test/test_greater_node.rb +8 -0
  135. data/test/test_greater_or_equal_node.rb +8 -0
  136. data/test/test_if_node.rb +17 -0
  137. data/test/test_in_node.rb +8 -0
  138. data/test/test_instance_of_node.rb +8 -0
  139. data/test/test_label_node.rb +13 -0
  140. data/test/test_left_shift_node.rb +8 -0
  141. data/test/test_less_node.rb +8 -0
  142. data/test/test_less_or_equal_node.rb +8 -0
  143. data/test/test_line_number.rb +23 -0
  144. data/test/test_logical_and_node.rb +8 -0
  145. data/test/test_logical_not_node.rb +8 -0
  146. data/test/test_logical_or_node.rb +8 -0
  147. data/test/test_modulus_node.rb +8 -0
  148. data/test/test_multiply_node.rb +8 -0
  149. data/test/test_new_expr_node.rb +9 -0
  150. data/test/test_not_equal_node.rb +8 -0
  151. data/test/test_not_strict_equal_node.rb +8 -0
  152. data/test/test_null_node.rb +8 -0
  153. data/test/test_number_node.rb +8 -0
  154. data/test/test_object_literal_node.rb +9 -0
  155. data/test/test_op_and_equal_node.rb +10 -0
  156. data/test/test_op_divide_equal_node.rb +10 -0
  157. data/test/test_op_equal_node.rb +10 -0
  158. data/test/test_op_l_shift_equal_node.rb +10 -0
  159. data/test/test_op_minus_equal_node.rb +10 -0
  160. data/test/test_op_mod_equal_node.rb +10 -0
  161. data/test/test_op_multiply_equal_node.rb +10 -0
  162. data/test/test_op_or_equal_node.rb +10 -0
  163. data/test/test_op_plus_equal_node.rb +10 -0
  164. data/test/test_op_r_shift_equal_node.rb +10 -0
  165. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  166. data/test/test_op_x_or_equal_node.rb +10 -0
  167. data/test/test_parameter_node.rb +8 -0
  168. data/test/test_parser.rb +1355 -0
  169. data/test/test_pointcut_visitor.rb +34 -0
  170. data/test/test_postfix_node.rb +8 -0
  171. data/test/test_prefix_node.rb +8 -0
  172. data/test/test_property_node.rb +8 -0
  173. data/test/test_regexp_node.rb +8 -0
  174. data/test/test_resolve_node.rb +22 -0
  175. data/test/test_return_node.rb +11 -0
  176. data/test/test_right_shift_node.rb +8 -0
  177. data/test/test_rkelly.rb +19 -0
  178. data/test/test_runtime.rb +12 -0
  179. data/test/test_scope_chain.rb +50 -0
  180. data/test/test_setter_property_node.rb +10 -0
  181. data/test/test_source_elements.rb +9 -0
  182. data/test/test_strict_equal_node.rb +8 -0
  183. data/test/test_string_node.rb +8 -0
  184. data/test/test_subtract_node.rb +8 -0
  185. data/test/test_switch_node.rb +12 -0
  186. data/test/test_this_node.rb +8 -0
  187. data/test/test_throw_node.rb +7 -0
  188. data/test/test_tokenizer.rb +143 -0
  189. data/test/test_true_node.rb +8 -0
  190. data/test/test_try_node.rb +59 -0
  191. data/test/test_type_of_node.rb +8 -0
  192. data/test/test_unary_minus_node.rb +8 -0
  193. data/test/test_unary_plus_node.rb +8 -0
  194. data/test/test_unsigned_right_shift_node.rb +8 -0
  195. data/test/test_var_decl_node.rb +21 -0
  196. data/test/test_var_statement_node.rb +14 -0
  197. data/test/test_void_node.rb +8 -0
  198. data/test/test_while_node.rb +15 -0
  199. data/test/test_with_node.rb +8 -0
  200. metadata +390 -0
@@ -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
data/rkelly.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{rkelly}
3
+ s.version = "0.0.0.20080909095845"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Aaron Patterson"]
7
+ s.date = %q{2008-09-09}
8
+ s.description = %q{The RKelly library will parse JavaScript and return a parse tree.}
9
+ s.email = %q{aaronp@rubyforge.org}
10
+ s.extra_rdoc_files = ["CHANGELOG.txt", "Manifest.txt", "README.txt"]
11
+ s.files = ["CHANGELOG.txt", "Manifest.txt", "README.txt", "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/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_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"]
12
+ s.has_rdoc = true
13
+ s.homepage = %q{http://rkelly.rubyforge.org/}
14
+ s.rdoc_options = ["--main", "README.txt"]
15
+ s.require_paths = ["lib"]
16
+ s.rubyforge_project = %q{rkelly}
17
+ s.rubygems_version = %q{1.2.0}
18
+ s.summary = %q{RKelly parses JavaScript and returns a parse tree suitable for feeding to Ruby2Ruby.}
19
+ 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_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"]
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 2
24
+
25
+ if current_version >= 3 then
26
+ s.add_development_dependency(%q<hoe>, [">= 1.7.0"])
27
+ else
28
+ s.add_dependency(%q<hoe>, [">= 1.7.0"])
29
+ end
30
+ else
31
+ s.add_dependency(%q<hoe>, [">= 1.7.0"])
32
+ end
33
+ 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
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_3_1_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("var MYVAR; assert_equal(NaN, MYVAR++); assert_equal(NaN, MYVAR);")
6
+ end
7
+
8
+ @@tests = [
9
+ :undefined => [ '(void 0)', 'NaN', 'NaN'],
10
+ :null => [ 'null', '0', '1'],
11
+ :true => [ 'true', '1', '2'],
12
+ :false => [ 'false', '0', '1'],
13
+ :positive_infinity => [ 'Number.POSITIVE_INFINITY',
14
+ 'Number.POSITIVE_INFINITY',
15
+ 'Number.POSITIVE_INFINITY'],
16
+ :negative_infinity => [ 'Number.NEGATIVE_INFINITY',
17
+ 'Number.NEGATIVE_INFINITY',
18
+ 'Number.NEGATIVE_INFINITY'],
19
+ :nan => [ 'Number.NaN', 'Number.NaN', 'Number.NaN'],
20
+ :zero => [ '0', '0', '1'],
21
+ :boolean_false => ['new Boolean(false)', '0', '1'],
22
+ :boolean_true => ['new Boolean(true)', '1', '2'],
23
+ :string_string => ["'string'", 'Number.NaN', 'Number.NaN'],
24
+ :number_s => ["'12345'", '12345', '12346'],
25
+ :negative_s => ["'-12345'", '-12345', '-12344'],
26
+ :hex_s => ["'0Xf'", '15', '16'],
27
+ :num_0_s => ["'077'", '77', '78'],
28
+ :empty_s => ["''", '0', '1'],
29
+ :obj_string_string => ['new String("string")', 'Number.NaN', 'Number.NaN'],
30
+ :obj_string_num => ['new String("12345")', '12345', '12346'],
31
+ :obj_negative => ['new String("-12345")', '-12345', '-12344'],
32
+ :obj_hex => ['new String("0Xf")', '15', '16'],
33
+ :obj_0_s => ['new String("077")', '77', '78'],
34
+ :obj_empty => ['new String("")', '0', '1'],
35
+ ]
36
+
37
+ def test_positive_float
38
+ @runtime.execute("
39
+ var MYVAR=0.2345;
40
+ assert_equal(0.2345, MYVAR++);
41
+ assert_in_delta(1.2345, MYVAR, 0.00001);
42
+ ")
43
+ end
44
+
45
+ def test_negative_float
46
+ @runtime.execute("
47
+ var MYVAR=-0.2345;
48
+ assert_equal(-0.2345, MYVAR++);
49
+ assert_in_delta(0.7655, MYVAR, 0.00001);
50
+ ")
51
+ end
52
+
53
+ @@tests.each do |testing|
54
+ testing.each do |name, values|
55
+ define_method(:"test_#{name}") do
56
+ @runtime.execute("
57
+ var MYVAR=#{values[0]};
58
+ assert_equal(#{values[1]}, MYVAR++);
59
+ assert_equal(#{values[2]}, MYVAR);
60
+ ")
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_3_2_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("var MYVAR; assert_equal(NaN, MYVAR--); assert_equal(NaN, MYVAR);")
6
+ end
7
+
8
+ @@tests = [
9
+ :undefined => [ '(void 0)', 'NaN', 'NaN'],
10
+ :null => [ 'null', '0', '-1'],
11
+ :true => [ 'true', '1', '0'],
12
+ :false => [ 'false', '0', '-1'],
13
+ :positive_infinity => [ 'Number.POSITIVE_INFINITY',
14
+ 'Number.POSITIVE_INFINITY',
15
+ 'Number.POSITIVE_INFINITY'],
16
+ :negative_infinity => [ 'Number.NEGATIVE_INFINITY',
17
+ 'Number.NEGATIVE_INFINITY',
18
+ 'Number.NEGATIVE_INFINITY'],
19
+ :nan => [ 'Number.NaN', 'Number.NaN', 'Number.NaN'],
20
+ :zero => [ '0', '0', '-1'],
21
+ :boolean_false => ['new Boolean(false)', '0', '-1'],
22
+ :boolean_true => ['new Boolean(true)', '1', '0'],
23
+ :string_string => ["'string'", 'Number.NaN', 'Number.NaN'],
24
+ :number_s => ["'12345'", '12345', '12344'],
25
+ :negative_s => ["'-12345'", '-12345', '-12346'],
26
+ :hex_s => ["'0Xf'", '15', '14'],
27
+ :num_0_s => ["'077'", '77', '76'],
28
+ :empty_s => ["''", '0', '-1'],
29
+ :obj_string_string => ['new String("string")', 'Number.NaN', 'Number.NaN'],
30
+ :obj_string_num => ['new String("12345")', '12345', '12344'],
31
+ :obj_negative => ['new String("-12345")', '-12345', '-12346'],
32
+ :obj_hex => ['new String("0Xf")', '15', '14'],
33
+ :obj_0_s => ['new String("077")', '77', '76'],
34
+ :obj_empty => ['new String("")', '0', '-1'],
35
+ ]
36
+
37
+ def test_positive_float
38
+ @runtime.execute("
39
+ var MYVAR=0.2345;
40
+ assert_equal(0.2345, MYVAR--);
41
+ assert_in_delta(-0.7655, MYVAR, 0.00001);
42
+ ")
43
+ end
44
+
45
+ def test_negative_float
46
+ @runtime.execute("
47
+ var MYVAR=-0.2345;
48
+ assert_equal(-0.2345, MYVAR--);
49
+ assert_in_delta(-1.2345, MYVAR, 0.00001);
50
+ ")
51
+ end
52
+
53
+ @@tests.each do |testing|
54
+ testing.each do |name, values|
55
+ define_method(:"test_#{name}") do
56
+ @runtime.execute("
57
+ var MYVAR=#{values[0]};
58
+ assert_equal(#{values[1]}, MYVAR--);
59
+ assert_equal(#{values[2]}, MYVAR);
60
+ ")
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_2_Test < Test::Unit::TestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ end
7
+
8
+ def test_void_1
9
+ scope_chain = @runtime.execute("var x = void(10);")
10
+ assert scope_chain.has_property?('x')
11
+ assert_equal :undefined, scope_chain['x'].value
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Typeof_11_4_3_Test < ExecuteTestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ end
7
+
8
+ def test_typeof_null
9
+ assert_execute({ 'x' => 'object' },
10
+ "var x = typeof(null);")
11
+ end
12
+
13
+ def test_typeof_void_0
14
+ assert_execute({ 'x' => 'undefined' },
15
+ "var x = typeof(void(0));")
16
+ end
17
+
18
+ def test_typeof_true
19
+ assert_execute({ 'x' => 'boolean' },
20
+ "var x = typeof(true);")
21
+ end
22
+
23
+ def test_typeof_false
24
+ assert_execute({ 'x' => 'boolean' },
25
+ "var x = typeof(false);")
26
+ end
27
+
28
+ def test_typeof_nan
29
+ assert_execute({ 'x' => 'number' },
30
+ "var x = typeof(NaN);")
31
+ end
32
+
33
+ def test_typeof_zero
34
+ assert_execute({ 'x' => 'number' }, "var x = typeof(0);")
35
+ end
36
+
37
+ def test_typeof_one
38
+ assert_execute({ 'x' => 'number' }, "var x = typeof(1);")
39
+ end
40
+
41
+ def test_typeof_minus_one
42
+ assert_execute({ 'x' => 'number' }, "var x = typeof(-1);")
43
+ end
44
+
45
+ def test_typeof_plus_one
46
+ assert_execute({ 'x' => 'number' }, "var x = typeof(+1);")
47
+ end
48
+
49
+ def test_typeof_zero_string
50
+ assert_execute({ 'x' => 'string' }, "var x = typeof('0');")
51
+ end
52
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_4_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("
6
+ var MYVAR;
7
+ assert_equal(NaN, ++MYVAR);
8
+ assert_equal(NaN, MYVAR);
9
+ ")
10
+ end
11
+
12
+ @@tests = [
13
+ :undefined => ['(void 0)', 'NaN'],
14
+ :null => ['null', '1'],
15
+ :true => ['true', '2'],
16
+ :false => ['false', '1'],
17
+ :positive_infinity => ['Number.POSITIVE_INFINITY',
18
+ 'Number.POSITIVE_INFINITY'],
19
+ :negative_infinity => ['Number.NEGATIVE_INFINITY',
20
+ 'Number.NEGATIVE_INFINITY'],
21
+ :nan => ['Number.NaN', 'Number.NaN'],
22
+ :zero => ['0', '1'],
23
+ #:pos_float => ['0.2345', '1.2345'],
24
+ #:neg_float => ['-0.2345', '0.7655'],
25
+ :boolean_false => ['new Boolean(false)', '1'],
26
+ :boolean_true => ['new Boolean(true)', '2'],
27
+ :string_string => ["'string'", 'Number.NaN'],
28
+ :number_s => ["'12345'", '12346'],
29
+ :negative_s => ["'-12345'", '-12344'],
30
+ :hex_s => ["'0Xf'", '16'],
31
+ :num_0_s => ["'077'", '78'],
32
+ :empty_s => ["''", '1'],
33
+ :obj_string_string => ['new String("string")', 'Number.NaN'],
34
+ :obj_string_num => ['new String("12345")', '12346'],
35
+ :obj_negative => ['new String("-12345")', '-12344'],
36
+ :obj_hex => ['new String("0Xf")', '16'],
37
+ :obj_0_s => ['new String("077")', '78'],
38
+ :obj_empty => ['new String("")', '1'],
39
+ ]
40
+
41
+ def test_positive_float
42
+ @runtime.execute("
43
+ var MYVAR=0.2345;
44
+ assert_in_delta(1.2345, ++MYVAR, 0.00001);
45
+ assert_in_delta(1.2345, MYVAR, 0.00001);
46
+ ")
47
+ end
48
+
49
+ def test_negative_float
50
+ @runtime.execute("
51
+ var MYVAR=-0.2345;
52
+ assert_in_delta(0.7655, ++MYVAR, 0.00001);
53
+ assert_in_delta(0.7655, MYVAR, 0.00001);
54
+ ")
55
+ end
56
+
57
+ @@tests.each do |testing|
58
+ testing.each do |name, values|
59
+ define_method(:"test_#{name}") do
60
+ @runtime.execute("
61
+ var MYVAR=#{values[0]};
62
+ assert_equal(#{values[1]}, ++MYVAR);
63
+ assert_equal(#{values[1]}, MYVAR);
64
+ ")
65
+ end
66
+ end
67
+ end
68
+ end