opal 0.3.41 → 0.3.42

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 (285) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +14 -1
  4. data/Gemfile +2 -5
  5. data/Rakefile +41 -3
  6. data/bin/opal +33 -0
  7. data/lib/opal.rb +2 -12
  8. data/lib/opal/core_ext.rb +5 -0
  9. data/lib/opal/grammar.rb +2207 -2138
  10. data/lib/opal/grammar.y +21 -0
  11. data/lib/opal/grammar_helpers.rb +360 -0
  12. data/lib/opal/lexer.rb +55 -401
  13. data/lib/opal/lexer_scope.rb +28 -0
  14. data/lib/opal/parser.rb +155 -171
  15. data/lib/opal/target_scope.rb +257 -0
  16. data/lib/opal/version.rb +1 -1
  17. data/opal.gemspec +6 -2
  18. data/opal/opal-parser.js.erb +3 -2
  19. data/opal/opal.rb +20 -18
  20. data/opal/opal/array.rb +21 -12
  21. data/opal/opal/basic_object.rb +2 -1
  22. data/opal/opal/boolean.rb +3 -0
  23. data/opal/opal/browser_loader.js +57 -0
  24. data/opal/opal/class.rb +51 -13
  25. data/opal/opal/date.rb +1 -20
  26. data/opal/opal/enumerable.rb +66 -33
  27. data/opal/opal/error.rb +2 -0
  28. data/opal/opal/hash.rb +1 -1
  29. data/opal/opal/kernel.rb +14 -3
  30. data/opal/opal/nil_class.rb +4 -0
  31. data/opal/opal/proc.rb +9 -1
  32. data/opal/opal/racc.rb +2 -2
  33. data/opal/opal/regexp.rb +1 -1
  34. data/opal/opal/runtime.js +14 -4
  35. data/opal/opal/string.rb +21 -4
  36. data/opal/opal/time.rb +27 -0
  37. data/spec/core/array/allocate_spec.rb +7 -1
  38. data/spec/core/array/append_spec.rb +18 -3
  39. data/spec/core/array/array_spec.rb +7 -0
  40. data/spec/core/array/assoc_spec.rb +23 -8
  41. data/spec/core/array/at_spec.rb +23 -3
  42. data/spec/core/array/choice_spec.rb +20 -0
  43. data/spec/core/array/clear_spec.rb +45 -4
  44. data/spec/core/array/combination_spec.rb +55 -0
  45. data/spec/core/array/compact_spec.rb +72 -1
  46. data/spec/core/array/constructor_spec.rb +13 -2
  47. data/spec/core/array/count_spec.rb +15 -7
  48. data/spec/core/array/delete_at_spec.rb +44 -1
  49. data/spec/core/array/delete_if_spec.rb +52 -2
  50. data/spec/core/array/delete_spec.rb +83 -2
  51. data/spec/core/array/drop_spec.rb +24 -16
  52. data/spec/core/array/drop_while_spec.rb +17 -0
  53. data/spec/core/array/each_index_spec.rb +11 -1
  54. data/spec/core/array/each_spec.rb +20 -2
  55. data/spec/core/array/empty_spec.rb +4 -1
  56. data/spec/core/array/eql_spec.rb +14 -0
  57. data/spec/core/array/fetch_spec.rb +31 -2
  58. data/spec/core/array/find_index_spec.rb +8 -0
  59. data/spec/core/array/first_spec.rb +45 -8
  60. data/spec/core/array/fixtures/classes.rb +538 -0
  61. data/spec/core/array/flatten_spec.rb +200 -7
  62. data/spec/core/array/frozen_spec.rb +32 -0
  63. data/spec/core/array/include_spec.rb +16 -1
  64. data/spec/core/array/index_spec.rb +5 -25
  65. data/spec/core/array/insert_spec.rb +37 -3
  66. data/spec/core/array/inspect_spec.rb +6 -12
  67. data/spec/core/array/intersection_spec.rb +55 -4
  68. data/spec/core/array/join_spec.rb +29 -4
  69. data/spec/core/array/keep_if_spec.rb +13 -6
  70. data/spec/core/array/last_spec.rb +35 -1
  71. data/spec/core/array/length_spec.rb +7 -4
  72. data/spec/core/array/map_spec.rb +9 -47
  73. data/spec/core/array/minus_spec.rb +68 -4
  74. data/spec/core/array/multiply_spec.rb +138 -6
  75. data/spec/core/array/new_spec.rb +92 -3
  76. data/spec/core/array/ntimes_spec.rb +26 -0
  77. data/spec/core/array/plus_spec.rb +48 -2
  78. data/spec/core/array/pop_spec.rb +159 -39
  79. data/spec/core/array/push_spec.rb +29 -1
  80. data/spec/core/array/rassoc_spec.rb +31 -2
  81. data/spec/core/array/reject_spec.rb +89 -2
  82. data/spec/core/array/replace_spec.rb +7 -29
  83. data/spec/core/array/reverse_each_spec.rb +25 -1
  84. data/spec/core/array/reverse_spec.rb +53 -1
  85. data/spec/core/array/rindex_spec.rb +55 -5
  86. data/spec/core/array/select_spec.rb +35 -8
  87. data/spec/core/array/shared/collect.rb +0 -0
  88. data/spec/core/array/shared/enumeratorize.rb +12 -0
  89. data/spec/core/array/shared/eql.rb +95 -0
  90. data/spec/core/array/shared/index.rb +37 -0
  91. data/spec/core/array/shared/inspect.rb +3 -0
  92. data/spec/core/array/shared/join.rb +7 -0
  93. data/spec/core/array/shared/keep_if.rb +0 -0
  94. data/spec/core/array/shared/length.rb +0 -0
  95. data/spec/core/array/shared/replace.rb +0 -0
  96. data/spec/core/array/shared/slice.rb +0 -0
  97. data/spec/core/array/shift_spec.rb +132 -23
  98. data/spec/core/array/shuffle_spec.rb +82 -6
  99. data/spec/core/array/size_spec.rb +7 -4
  100. data/spec/core/array/slice_spec.rb +132 -1
  101. data/spec/core/array/sort_spec.rb +263 -14
  102. data/spec/core/array/take_spec.rb +24 -16
  103. data/spec/core/array/take_while_spec.rb +14 -10
  104. data/spec/core/array/to_a_spec.rb +18 -1
  105. data/spec/core/array/to_ary_spec.rb +15 -1
  106. data/spec/core/array/try_convert_spec.rb +39 -2
  107. data/spec/core/array/uniq_spec.rb +148 -3
  108. data/spec/core/array/unshift_spec.rb +36 -1
  109. data/spec/core/array/zip_spec.rb +36 -1
  110. data/spec/core/class/new_spec.rb +8 -6
  111. data/spec/core/enumerable/all_spec.rb +37 -9
  112. data/spec/core/enumerable/any_spec.rb +45 -7
  113. data/spec/core/enumerable/collect_spec.rb +4 -1
  114. data/spec/core/enumerable/count_spec.rb +4 -1
  115. data/spec/core/enumerable/detect_spec.rb +2 -2
  116. data/spec/core/enumerable/drop_spec.rb +4 -1
  117. data/spec/core/enumerable/drop_while_spec.rb +4 -1
  118. data/spec/core/enumerable/each_slice_spec.rb +2 -1
  119. data/spec/core/enumerable/each_with_index_spec.rb +4 -1
  120. data/spec/core/enumerable/each_with_object_spec.rb +4 -1
  121. data/spec/core/enumerable/entries_spec.rb +4 -1
  122. data/spec/core/enumerable/find_all_spec.rb +4 -1
  123. data/spec/core/enumerable/find_index_spec.rb +4 -1
  124. data/spec/core/enumerable/find_spec.rb +5 -2
  125. data/spec/core/enumerable/first_spec.rb +4 -1
  126. data/spec/core/enumerable/fixtures/classes.rb +198 -2
  127. data/spec/core/enumerable/grep_spec.rb +4 -1
  128. data/spec/core/enumerable/take_spec.rb +4 -1
  129. data/spec/core/enumerable/to_a_spec.rb +4 -1
  130. data/spec/core/false/and_spec.rb +11 -0
  131. data/spec/core/false/inspect_spec.rb +7 -0
  132. data/spec/core/false/or_spec.rb +11 -0
  133. data/spec/core/false/to_s_spec.rb +7 -0
  134. data/spec/core/false/xor_spec.rb +11 -0
  135. data/spec/core/kernel/rand_spec.rb +5 -5
  136. data/spec/core/module/const_get_spec.rb +4 -4
  137. data/spec/core/module/fixtures/classes.rb +434 -0
  138. data/spec/core/module/method_defined_spec.rb +49 -0
  139. data/spec/core/module/module_function_spec.rb +28 -0
  140. data/spec/core/nil/and_spec.rb +3 -1
  141. data/spec/core/nil/dup_spec.rb +7 -0
  142. data/spec/core/nil/inspect_spec.rb +3 -1
  143. data/spec/core/nil/nil_spec.rb +3 -1
  144. data/spec/core/nil/or_spec.rb +4 -2
  145. data/spec/core/nil/to_a_spec.rb +3 -1
  146. data/spec/core/nil/to_f_spec.rb +3 -1
  147. data/spec/core/nil/to_i_spec.rb +3 -1
  148. data/spec/core/nil/to_s_spec.rb +3 -1
  149. data/spec/core/nil/xor_spec.rb +4 -2
  150. data/spec/core/string/element_reference_spec.rb +14 -1
  151. data/spec/core/string/fixtures/classes.rb +0 -0
  152. data/spec/core/true/and_spec.rb +11 -0
  153. data/spec/core/true/inspect_spec.rb +7 -0
  154. data/spec/core/true/or_spec.rb +11 -0
  155. data/spec/core/true/to_s_spec.rb +7 -0
  156. data/spec/core/true/xor_spec.rb +11 -0
  157. data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
  158. data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
  159. data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
  160. data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
  161. data/spec/core_ext/basic_object/send_spec.rb +3 -3
  162. data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
  163. data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
  164. data/spec/core_ext/class/_inherited_spec.rb +3 -3
  165. data/spec/core_ext/class/proc_methods_spec.rb +2 -2
  166. data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
  167. data/spec/core_ext/method_missing_spec.rb +3 -3
  168. data/spec/core_ext/native/method_missing_spec.rb +3 -2
  169. data/spec/core_ext/native/to_native_spec.rb +3 -2
  170. data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
  171. data/spec/date.rb +0 -0
  172. data/spec/fileutils.rb +0 -0
  173. data/spec/filters/ancestors.rb +4 -0
  174. data/spec/filters/array_delete.rb +3 -0
  175. data/spec/filters/array_fetch.rb +3 -0
  176. data/spec/filters/array_first.rb +3 -0
  177. data/spec/filters/array_flatten.rb +14 -0
  178. data/spec/filters/array_intersection.rb +5 -0
  179. data/spec/filters/array_join.rb +6 -0
  180. data/spec/filters/array_subclasses.rb +4 -0
  181. data/spec/filters/block_args.rb +3 -0
  182. data/spec/filters/coerce_integer.rb +9 -0
  183. data/spec/filters/frozen.rb +4 -0
  184. data/spec/filters/mocks.rb +3 -0
  185. data/spec/filters/should_receive.rb +4 -0
  186. data/spec/filters/tainted.rb +7 -0
  187. data/spec/fixtures/class.rb +124 -0
  188. data/spec/fixtures/class_variables.rb +0 -0
  189. data/spec/fixtures/constants.rb +0 -0
  190. data/spec/grammar/alias_spec.rb +1 -1
  191. data/spec/grammar/def_spec.rb +1 -0
  192. data/spec/grammar/lvar_spec.rb +1 -2
  193. data/spec/grammar/nth_ref_spec.rb +13 -0
  194. data/spec/grammar/sclass_spec.rb +6 -7
  195. data/spec/grammar/str_spec.rb +4 -4
  196. data/spec/grammar/string_spec.rb +8 -0
  197. data/spec/grammar/xstr_spec.rb +4 -4
  198. data/spec/iconv.rb +0 -0
  199. data/spec/language/alias_spec.rb +140 -3
  200. data/spec/language/and_spec.rb +14 -7
  201. data/spec/language/array_spec.rb +57 -5
  202. data/spec/language/block_spec.rb +466 -49
  203. data/spec/language/break_spec.rb +294 -44
  204. data/spec/language/case_spec.rb +151 -3
  205. data/spec/language/class_spec.rb +196 -0
  206. data/spec/language/class_variable_spec.rb +56 -0
  207. data/spec/language/def_spec.rb +507 -4
  208. data/spec/language/defined_spec.rb +19 -7
  209. data/spec/language/ensure_spec.rb +26 -39
  210. data/spec/language/execution_spec.rb +15 -0
  211. data/spec/language/fixtures/array.rb +11 -0
  212. data/spec/language/fixtures/block.rb +57 -0
  213. data/spec/language/fixtures/break.rb +240 -0
  214. data/spec/language/fixtures/ensure.rb +72 -0
  215. data/spec/language/fixtures/literal_lambda.rb +7 -0
  216. data/spec/language/fixtures/metaclass.rb +33 -0
  217. data/spec/language/fixtures/module.rb +24 -0
  218. data/spec/language/fixtures/next.rb +78 -12
  219. data/spec/language/fixtures/return.rb +118 -0
  220. data/spec/language/fixtures/send.rb +110 -0
  221. data/spec/language/fixtures/send_1.9.rb +22 -0
  222. data/spec/language/fixtures/super.rb +308 -0
  223. data/spec/language/fixtures/variables.rb +58 -0
  224. data/spec/language/fixtures/yield.rb +5 -0
  225. data/spec/language/for_spec.rb +192 -0
  226. data/spec/language/hash_spec.rb +29 -5
  227. data/spec/language/if_spec.rb +90 -9
  228. data/spec/language/literal_lambda_spec.rb +1 -47
  229. data/spec/language/loop_spec.rb +39 -2
  230. data/spec/language/metaclass_spec.rb +151 -5
  231. data/spec/language/module_spec.rb +56 -0
  232. data/spec/language/next_spec.rb +370 -12
  233. data/spec/language/not_spec.rb +55 -0
  234. data/spec/language/numbers_spec.rb +56 -0
  235. data/spec/language/or_spec.rb +31 -3
  236. data/spec/language/order_spec.rb +79 -0
  237. data/spec/language/precedence_spec.rb +483 -0
  238. data/spec/language/proc_spec.rb +249 -21
  239. data/spec/language/redo_spec.rb +67 -0
  240. data/spec/language/rescue_spec.rb +121 -0
  241. data/spec/language/retry_spec.rb +56 -0
  242. data/spec/language/return_spec.rb +281 -0
  243. data/spec/language/send_spec.rb +141 -48
  244. data/spec/language/singleton_class_spec.rb +1 -1
  245. data/spec/language/string_spec.rb +11 -0
  246. data/spec/language/super_spec.rb +213 -133
  247. data/spec/language/symbol_spec.rb +2 -1
  248. data/spec/language/undef_spec.rb +3 -1
  249. data/spec/language/unless_spec.rb +6 -2
  250. data/spec/language/until_spec.rb +102 -3
  251. data/spec/language/variables_spec.rb +1212 -16
  252. data/spec/language/versions/array_1.9.rb +39 -0
  253. data/spec/language/versions/case_1.9.rb +20 -0
  254. data/spec/language/versions/hash_1.9.rb +18 -0
  255. data/spec/language/versions/literal_lambda_1.9.rb +143 -0
  256. data/spec/language/versions/not_1.9.rb +22 -0
  257. data/spec/language/versions/send_1.9.rb +241 -0
  258. data/spec/language/versions/symbol_1.9.rb +15 -0
  259. data/spec/language/versions/variables_1.9.rb +8 -0
  260. data/spec/language/while_spec.rb +70 -5
  261. data/spec/language/yield_spec.rb +32 -6
  262. data/spec/mspec/guards/block_device.rb +0 -0
  263. data/spec/mspec/guards/endian.rb +0 -0
  264. data/spec/mspec/helpers/environment.rb +0 -0
  265. data/spec/mspec/helpers/language_version.rb +0 -0
  266. data/spec/mspec/helpers/tmp.rb +0 -0
  267. data/spec/ospec/filter.rb +32 -0
  268. data/spec/ospec/main.rb.erb +18 -0
  269. data/spec/ospec/phantom.rb +97 -0
  270. data/spec/ospec/runner.rb +95 -0
  271. data/spec/ospec/sprockets.js +40 -0
  272. data/spec/pp.rb +3 -0
  273. data/spec/rbconfig.rb +5 -0
  274. data/spec/spec_helper.rb +53 -26
  275. data/spec/yaml.rb +0 -0
  276. metadata +275 -31
  277. data/config.ru +0 -8
  278. data/lib/opal/processor.rb +0 -47
  279. data/lib/opal/scope.rb +0 -236
  280. data/lib/opal/server.rb +0 -94
  281. data/spec/core/boolean/and_spec.rb +0 -17
  282. data/spec/core/boolean/inspect_spec.rb +0 -9
  283. data/spec/core/boolean/or_spec.rb +0 -17
  284. data/spec/core/boolean/to_s_spec.rb +0 -9
  285. data/spec/core/boolean/xor_spec.rb +0 -17
@@ -0,0 +1,257 @@
1
+ module Opal
2
+ # Instances of TargetScope are used by the parser when a new scope is
3
+ # being processed. It is used to keep track of used variables,
4
+ # temp variables and ivars so they can be processed and output
5
+ # along with the scope implementation.
6
+ class TargetScope
7
+
8
+ # Every scope can have a parent scope
9
+ attr_accessor :parent
10
+
11
+ # The class or module name if this scope is a class scope
12
+ attr_accessor :name
13
+
14
+ # The given block name for a def scope
15
+ attr_accessor :block_name
16
+
17
+ attr_reader :scope_name
18
+ attr_reader :ivars
19
+
20
+ attr_reader :type
21
+
22
+ attr_accessor :defines_defn
23
+ attr_accessor :defines_defs
24
+
25
+ # One of - :class, :module, :top, :iter, :def
26
+ attr_accessor :mid
27
+
28
+ # true if singleton def, false otherwise
29
+ attr_accessor :defs
30
+
31
+ # used by modules to know what methods to donate to includees
32
+ attr_reader :methods
33
+
34
+ # uses parents super method
35
+ attr_accessor :uses_super
36
+
37
+ # @param [Symbol] type the scope type (:class, :module, :iter, :def, :top)
38
+ # @param [Opal::Parser] parser a parser instance used to create this scope
39
+ def initialize(type, parser)
40
+ @parser = parser
41
+ @type = type
42
+ @locals = []
43
+ @temps = []
44
+ @args = []
45
+ @ivars = []
46
+ @parent = nil
47
+ @queue = []
48
+ @unique = "a"
49
+ @while_stack = []
50
+
51
+ @defines_defs = false
52
+ @defines_defn = false
53
+
54
+ @methods = []
55
+
56
+ @uses_block = false
57
+
58
+ # used by classes to store all ivars used in direct def methods
59
+ @proto_ivars = []
60
+ end
61
+
62
+ # Returns true if this scope is a class/module body scope
63
+ def class_scope?
64
+ @type == :class or @type == :module
65
+ end
66
+
67
+ # Returns true if this is strictly a class scope
68
+ def class?
69
+ @type == :class
70
+ end
71
+
72
+ # True if this is a module scope
73
+ def module?
74
+ @type == :module
75
+ end
76
+
77
+ def sclass?
78
+ @type == :sclass
79
+ end
80
+
81
+ # Returns true if this is a top scope (main file body)
82
+ def top?
83
+ @type == :top
84
+ end
85
+
86
+ # True if a block/iter scope
87
+ def iter?
88
+ @type == :iter
89
+ end
90
+
91
+ # Is this a normal def method directly inside a class? This is
92
+ # used for optimizing ivars as we can set them to nil in the
93
+ # class body
94
+ def def_in_class?
95
+ !@defs && @type == :def && @parent && @parent.class?
96
+ end
97
+
98
+ # Inside a class or module scope, the javascript variable name returned
99
+ # by this function points to the classes' prototype. This is the target
100
+ # to where methods are actually added inside a class body.
101
+ def proto
102
+ "def"
103
+ end
104
+
105
+ # A scope donates its methods if it is a module, or the core Object
106
+ # class. Modules donate their methods to classes or objects they are
107
+ # included in. Object donates methods to bridged classes whose native
108
+ # prototypes do not actually inherit from Opal.Object.prototype.
109
+ def should_donate?
110
+ @type == :module or @name.to_s == 'Object'
111
+ end
112
+
113
+ ##
114
+ # Vars to use inside each scope
115
+ def to_vars
116
+ vars = @locals.map { |l| "#{l} = nil" }
117
+ vars.push(*@temps)
118
+ current_self = @parser.current_self
119
+
120
+ iv = ivars.map do |ivar|
121
+ "if (#{current_self}#{ivar} == null) #{current_self}#{ivar} = nil;\n"
122
+ end
123
+
124
+ indent = @parser.parser_indent
125
+ res = vars.empty? ? '' : "var #{vars.join ', '};"
126
+ str = ivars.empty? ? res : "#{res}\n#{indent}#{iv.join indent}"
127
+
128
+ if class? and !@proto_ivars.empty?
129
+ pvars = @proto_ivars.map { |i| "#{proto}#{i}"}.join(' = ')
130
+ "%s\n%s%s = nil;" % [str, indent, pvars]
131
+ else
132
+ str
133
+ end
134
+ end
135
+
136
+ # Generates code for this module to donate methods
137
+ def to_donate_methods
138
+ if should_donate? and !@methods.empty?
139
+ "%s;#{@name}._donate([%s]);" % [@parser.parser_indent, @methods.map(&:inspect).join(', ')]
140
+ else
141
+ ""
142
+ end
143
+ end
144
+
145
+ def add_ivar(ivar)
146
+ if def_in_class?
147
+ @parent.add_proto_ivar ivar
148
+ else
149
+ @ivars << ivar unless @ivars.include? ivar
150
+ end
151
+ end
152
+
153
+ def add_proto_ivar(ivar)
154
+ @proto_ivars << ivar unless @proto_ivars.include? ivar
155
+ end
156
+
157
+ def add_arg(arg)
158
+ @args << arg unless @args.include? arg
159
+ end
160
+
161
+ def add_local(local)
162
+ return if has_local? local
163
+
164
+ @locals << local
165
+ end
166
+
167
+ def has_local?(local)
168
+ return true if @locals.include? local or @args.include? local
169
+ return @parent.has_local?(local) if @parent and @type == :iter
170
+
171
+ false
172
+ end
173
+
174
+ def add_temp(*tmps)
175
+ @temps.push(*tmps)
176
+ end
177
+
178
+ def has_temp?(tmp)
179
+ @temps.include? tmp
180
+ end
181
+
182
+ def new_temp
183
+ return @queue.pop unless @queue.empty?
184
+
185
+ tmp = "_#{@unique}"
186
+ @unique = @unique.succ
187
+ @temps << tmp
188
+ tmp
189
+ end
190
+
191
+ def queue_temp(name)
192
+ @queue << name
193
+ end
194
+
195
+ def push_while
196
+ info = {}
197
+ @while_stack.push info
198
+ info
199
+ end
200
+
201
+ def pop_while
202
+ @while_stack.pop
203
+ end
204
+
205
+ def in_while?
206
+ !@while_stack.empty?
207
+ end
208
+
209
+ def uses_block!
210
+ if @type == :iter && @parent
211
+ @parent.uses_block!
212
+ else
213
+ @uses_block = true
214
+ identify!
215
+ end
216
+ end
217
+
218
+ def identify!
219
+ return @identity if @identity
220
+
221
+ @identity = @parser.unique_temp
222
+ @parent.add_temp @identity if @parent
223
+
224
+ @identity
225
+ end
226
+
227
+ def identity
228
+ @identity
229
+ end
230
+
231
+ def get_super_chain
232
+ chain, scope, defn, mid = [], self, 'null', 'null'
233
+
234
+ while scope
235
+ if scope.type == :iter
236
+ chain << scope.identify!
237
+ scope = scope.parent if scope.parent
238
+
239
+ elsif scope.type == :def
240
+ defn = scope.identify!
241
+ mid = "'$#{scope.mid}'"
242
+ break
243
+
244
+ else
245
+ break
246
+ end
247
+ end
248
+
249
+ [chain, defn, mid]
250
+ end
251
+
252
+ def uses_block?
253
+ @uses_block
254
+ end
255
+ end
256
+ end
257
+
data/lib/opal/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Opal
2
- VERSION = '0.3.41'
2
+ VERSION = '0.3.42'
3
3
  end
data/opal.gemspec CHANGED
@@ -12,7 +12,11 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
- s.require_paths = ['lib']
15
+ s.require_paths = ['lib']
16
16
 
17
- s.add_runtime_dependency 'sprockets'
17
+ s.add_dependency 'rake'
18
+ s.add_dependency 'racc'
19
+ s.add_dependency 'opal-sprockets'
20
+
21
+ s.add_development_dependency 'mspec', '1.5.18'
18
22
  end
@@ -1,7 +1,8 @@
1
+ <% require_asset 'opal/browser_loader' %>
1
2
  <% require_asset 'opal/racc' %>
2
3
  <% require_asset 'opal/strscan' %>
3
4
 
4
5
  // We need (some) of the libs from our real ruby parser (not in sprockets load path)
5
- <% %w(opal/grammar opal/lexer opal/parser opal/scope opal).each do |f| %>
6
- <%= Opal.parse File.read(File.join Opal.core_dir, '..', 'lib', "#{f}.rb") %>
6
+ <% %w(opal/grammar opal/lexer opal/parser opal/target_scope opal/core_ext opal/lexer_scope opal/grammar_helpers opal/parser opal).each do |f| %>
7
+ <%= Opal.parse File.read(File.join Opal.core_dir, '..', 'lib', "#{f}.rb") %>
7
8
  <% end %>
data/opal/opal.rb CHANGED
@@ -1,21 +1,21 @@
1
- require 'opal/runtime'
2
- require 'opal/class'
3
- require 'opal/basic_object'
4
- require 'opal/kernel'
5
- require 'opal/nil_class'
6
- require 'opal/boolean'
7
- require 'opal/error'
8
- require 'opal/regexp'
9
- require 'opal/comparable'
10
- require 'opal/enumerable'
11
- require 'opal/array'
12
- require 'opal/hash'
13
- require 'opal/string'
14
- require 'opal/numeric'
15
- require 'opal/proc'
16
- require 'opal/range'
17
- require 'opal/time'
18
- require 'opal/json'
1
+ #= require opal/runtime
2
+ #= require opal/class
3
+ #= require opal/basic_object
4
+ #= require opal/kernel
5
+ #= require opal/nil_class
6
+ #= require opal/boolean
7
+ #= require opal/error
8
+ #= require opal/regexp
9
+ #= require opal/comparable
10
+ #= require opal/enumerable
11
+ #= require opal/array
12
+ #= require opal/hash
13
+ #= require opal/string
14
+ #= require opal/numeric
15
+ #= require opal/proc
16
+ #= require opal/range
17
+ #= require opal/time
18
+ #= require opal/json
19
19
 
20
20
  # regexp matches
21
21
  $~ = nil
@@ -23,6 +23,8 @@ $~ = nil
23
23
  # split lines
24
24
  $/ = "\n"
25
25
 
26
+ $stderr = $stdout = Object.new
27
+
26
28
  RUBY_ENGINE = 'opal'
27
29
  RUBY_PLATFORM = 'opal'
28
30
 
data/opal/opal/array.rb CHANGED
@@ -421,7 +421,7 @@ class Array < `Array`
421
421
  return block(original);
422
422
  }
423
423
 
424
- #{ raise "Array#fetch" };
424
+ #{ raise IndexError, "Array#fetch" };
425
425
  }
426
426
  end
427
427
 
@@ -536,7 +536,7 @@ class Array < `Array`
536
536
  index += #{self}.length + 1;
537
537
 
538
538
  if (index < 0) {
539
- #{ raise "#{index} is out of bounds" };
539
+ #{ raise IndexError, "#{index} is out of bounds" };
540
540
  }
541
541
  }
542
542
  if (index > #{self}.length) {
@@ -606,12 +606,25 @@ class Array < `Array`
606
606
  def last(count = undefined)
607
607
  %x{
608
608
  var length = #{self}.length;
609
-
609
+
610
+ if (count === nil || typeof(count) == 'string') {
611
+ #{ raise TypeError, "no implicit conversion to integer" };
612
+ }
613
+
614
+ if (typeof(count) == 'object') {
615
+ if (typeof(count['$to_int']) == 'function') {
616
+ count = count['$to_int']();
617
+ }
618
+ else {
619
+ #{ raise TypeError, "no implicit conversion to integer" };
620
+ }
621
+ }
622
+
610
623
  if (count == null) {
611
624
  return length === 0 ? nil : #{self}[length - 1];
612
625
  }
613
626
  else if (count < 0) {
614
- #{ raise "negative count given" };
627
+ #{ raise ArgumentError, "negative count given" };
615
628
  }
616
629
 
617
630
  if (count > length) {
@@ -705,16 +718,12 @@ class Array < `Array`
705
718
  }
706
719
  end
707
720
 
708
- alias_native :reverse, :reverse
709
-
710
- def reverse!
711
- %x{
712
- #{self}.splice(0);
713
- #{self}.push.apply(#{self}, #{reverse});
714
- return #{self};
715
- }
721
+ def reverse
722
+ `#{self}.slice(0).reverse()`
716
723
  end
717
724
 
725
+ alias_native :reverse!, :reverse
726
+
718
727
  def reverse_each(&block)
719
728
  reverse.each &block
720
729
 
@@ -11,10 +11,11 @@ class BasicObject
11
11
  var func = #{self}['$' + symbol]
12
12
 
13
13
  if (func) {
14
- if (block !== nil) { args.push(block); }
14
+ if (block !== nil) { func._p = block; }
15
15
  return func.apply(#{self}, args);
16
16
  }
17
17
 
18
+ if (block !== nil) { #{self}.$method_missing._p = block; }
18
19
  return #{self}.$method_missing.apply(#{self}, [symbol].concat(args));
19
20
  }
20
21
  end
data/opal/opal/boolean.rb CHANGED
@@ -31,3 +31,6 @@ class Boolean < `Boolean`
31
31
  `(#{self} == true) ? 'true' : 'false'`
32
32
  end
33
33
  end
34
+
35
+ TrueClass = Boolean
36
+ FalseClass = Boolean
@@ -0,0 +1,57 @@
1
+ (function() {
2
+ // quick exit if not insde browser
3
+ if (typeof(window) === 'undefined' || typeof(document) === 'undefined') {
4
+ return;
5
+ }
6
+
7
+ function findRubyScripts() {
8
+ var all = document.getElementsByTagName('script');
9
+ for (var i = 0, script; i < all.length; i++) {
10
+ script = all[i];
11
+ if (script.type === 'text/ruby') {
12
+ if (script.src) {
13
+ request(script.src, function(result) {
14
+ runRuby(result);
15
+ });
16
+ }
17
+ else {
18
+ runRuby(script.innerHTML);
19
+ }
20
+ }
21
+ else if (script.type === 'text/erb') {
22
+ runERB(script.innerHTML);
23
+ }
24
+ }
25
+ }
26
+
27
+ function runRuby(source) {
28
+ var js = Opal.Opal.Parser.$new().$parse(source);
29
+ eval(js);
30
+ }
31
+
32
+ function request(url, callback) {
33
+ var xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
34
+ xhr.open('GET', url, true);
35
+ if ('overrideMimeType' in xhr) {
36
+ xhr.overrideMimeType('text/plain');
37
+ }
38
+ xhr.onreadystatechange = function() {
39
+ if (xhr.readyState === 4) {
40
+ if (xhr.status === 0 || xhr.status === 200) {
41
+ callback(xhr.responseText);
42
+ }
43
+ else {
44
+ throw new Error('Could not load ruby at: ' + url);
45
+ }
46
+ }
47
+ };
48
+ xhr.send(null);
49
+ }
50
+
51
+ if (window.addEventListener) {
52
+ window.addEventListener('DOMContentLoaded', findRubyScripts, false);
53
+ }
54
+ else {
55
+ window.attachEvent('onload', findRubyScripts);
56
+ }
57
+ })();