opal 0.10.0 → 0.11.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 (734) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.rspec +1 -2
  6. data/.travis.yml +42 -20
  7. data/.yardopts +3 -1
  8. data/CHANGELOG.md +164 -1
  9. data/Gemfile +16 -9
  10. data/HACKING.md +4 -2
  11. data/README.md +11 -11
  12. data/Rakefile +1 -1
  13. data/appveyor.yml +29 -0
  14. data/benchmark/bm_constant_lookup_big.rb +799 -0
  15. data/benchmark/bm_constant_lookup_small.rb +59 -0
  16. data/benchmark/bm_module_definition_big.rb +400 -0
  17. data/benchmark/bm_module_definition_small.rb +30 -0
  18. data/benchmark-ips/bm_case.rb +33 -0
  19. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  20. data/benchmark-ips/bm_is_number.rb +29 -0
  21. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  22. data/bin +1 -0
  23. data/docs/compiled_ruby.md +16 -14
  24. data/docs/faq.md +3 -3
  25. data/docs/headless_chrome.md +105 -0
  26. data/docs/rspec.md +4 -20
  27. data/docs/unsupported_features.md +6 -4
  28. data/examples/rack/Gemfile +1 -0
  29. data/examples/rack/Gemfile.lock +11 -7
  30. data/examples/rack/app/application.rb +14 -3
  31. data/examples/rack/app/user.rb +2 -0
  32. data/examples/rack/config.ru +1 -1
  33. data/examples/rack/index.html.erb +1 -0
  34. data/examples/sinatra/Gemfile +1 -1
  35. data/examples/sinatra/Gemfile.lock +8 -11
  36. data/examples/sinatra/app/application.rb +2 -0
  37. data/{bin → exe}/opal +4 -2
  38. data/{bin → exe}/opal-repl +23 -1
  39. data/lib/opal/ast/builder.rb +13 -0
  40. data/lib/opal/ast/node.rb +30 -0
  41. data/lib/opal/builder.rb +82 -17
  42. data/lib/opal/builder_processors.rb +9 -7
  43. data/lib/opal/cli.rb +45 -59
  44. data/lib/opal/cli_options.rb +19 -12
  45. data/lib/opal/cli_runners/applescript.rb +3 -4
  46. data/lib/opal/cli_runners/chrome.js +135 -0
  47. data/lib/opal/cli_runners/chrome.rb +100 -0
  48. data/lib/opal/cli_runners/nashorn.rb +1 -1
  49. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface +1 -0
  50. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +18 -0
  51. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +843 -0
  52. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +326 -0
  53. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +11 -0
  54. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +39 -0
  55. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +84 -0
  56. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +289 -0
  57. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/defaults.js +4 -0
  58. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +245 -0
  59. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +23 -0
  60. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +13303 -0
  61. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +32 -0
  62. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +128 -0
  63. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +55 -0
  64. data/lib/opal/cli_runners/node_modules/commander/Readme.md +195 -0
  65. data/lib/opal/cli_runners/node_modules/commander/index.js +851 -0
  66. data/lib/opal/cli_runners/node_modules/commander/package.json +92 -0
  67. data/{stdlib/nodejs/node_modules/js-yaml/node_modules/argparse → lib/opal/cli_runners/node_modules/ultron}/LICENSE +7 -6
  68. data/lib/opal/cli_runners/node_modules/ultron/index.js +138 -0
  69. data/lib/opal/cli_runners/node_modules/ultron/package.json +112 -0
  70. data/{stdlib/nodejs/node_modules/js-yaml → lib/opal/cli_runners/node_modules/ws}/LICENSE +6 -6
  71. data/lib/opal/cli_runners/node_modules/ws/README.md +259 -0
  72. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +33 -0
  73. data/lib/opal/cli_runners/node_modules/ws/index.js +15 -0
  74. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +56 -0
  75. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +15 -0
  76. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +28 -0
  77. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +158 -0
  78. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +69 -0
  79. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +339 -0
  80. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +520 -0
  81. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +438 -0
  82. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +9 -0
  83. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +17 -0
  84. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +705 -0
  85. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +336 -0
  86. data/lib/opal/cli_runners/node_modules/ws/package.json +122 -0
  87. data/lib/opal/cli_runners/nodejs.rb +4 -2
  88. data/lib/opal/cli_runners/package.json +5 -0
  89. data/lib/opal/cli_runners/server.rb +1 -1
  90. data/lib/opal/cli_runners.rb +2 -1
  91. data/lib/opal/compiler.rb +136 -95
  92. data/lib/opal/config.rb +114 -36
  93. data/lib/opal/deprecations.rb +18 -0
  94. data/lib/opal/eof_content.rb +36 -0
  95. data/lib/opal/erb.rb +1 -0
  96. data/lib/opal/errors.rb +1 -0
  97. data/lib/opal/fragment.rb +1 -0
  98. data/lib/opal/nodes/arglist.rb +2 -1
  99. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  100. data/lib/opal/nodes/args/kwarg.rb +9 -7
  101. data/lib/opal/nodes/args/kwoptarg.rb +13 -8
  102. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  103. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  104. data/lib/opal/nodes/args/normarg.rb +6 -7
  105. data/lib/opal/nodes/args/optarg.rb +5 -7
  106. data/lib/opal/nodes/args/post_args.rb +6 -5
  107. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  108. data/lib/opal/nodes/args/restarg.rb +7 -7
  109. data/lib/opal/nodes/array.rb +1 -0
  110. data/lib/opal/nodes/base.rb +24 -3
  111. data/lib/opal/nodes/call.rb +168 -155
  112. data/lib/opal/nodes/call_special.rb +37 -214
  113. data/lib/opal/nodes/case.rb +36 -22
  114. data/lib/opal/nodes/class.rb +4 -3
  115. data/lib/opal/nodes/constants.rb +28 -48
  116. data/lib/opal/nodes/csend.rb +25 -0
  117. data/lib/opal/nodes/def.rb +57 -17
  118. data/lib/opal/nodes/defined.rb +170 -60
  119. data/lib/opal/nodes/definitions.rb +42 -133
  120. data/lib/opal/nodes/defs.rb +29 -0
  121. data/lib/opal/nodes/hash.rb +12 -35
  122. data/lib/opal/nodes/helpers.rb +31 -62
  123. data/lib/opal/nodes/if.rb +21 -32
  124. data/lib/opal/nodes/inline_args.rb +12 -13
  125. data/lib/opal/nodes/iter.rb +61 -36
  126. data/lib/opal/nodes/literal.rb +206 -114
  127. data/lib/opal/nodes/logic.rb +39 -57
  128. data/lib/opal/nodes/masgn.rb +20 -18
  129. data/lib/opal/nodes/module.rb +10 -11
  130. data/lib/opal/nodes/node_with_args.rb +15 -18
  131. data/lib/opal/nodes/rescue.rb +37 -70
  132. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  133. data/lib/opal/nodes/scope.rb +10 -5
  134. data/lib/opal/nodes/singleton_class.rb +4 -3
  135. data/lib/opal/nodes/super.rb +112 -88
  136. data/lib/opal/nodes/top.rb +7 -2
  137. data/lib/opal/nodes/variables.rb +57 -35
  138. data/lib/opal/nodes/while.rb +11 -1
  139. data/lib/opal/nodes/yield.rb +1 -17
  140. data/lib/opal/nodes.rb +3 -1
  141. data/lib/opal/parser.rb +29 -766
  142. data/lib/opal/path_reader.rb +22 -5
  143. data/lib/opal/paths.rb +10 -4
  144. data/lib/opal/regexp_anchors.rb +1 -0
  145. data/lib/opal/rewriter.rb +64 -0
  146. data/lib/opal/rewriters/base.rb +63 -0
  147. data/lib/opal/rewriters/binary_operator_assignment.rb +141 -0
  148. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  149. data/lib/opal/rewriters/break_finder.rb +34 -0
  150. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  151. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  152. data/lib/opal/rewriters/for_rewriter.rb +93 -0
  153. data/lib/opal/rewriters/hashes/key_duplicates_rewriter.rb +58 -0
  154. data/lib/opal/rewriters/js_reserved_words.rb +108 -0
  155. data/lib/opal/rewriters/logical_operator_assignment.rb +154 -0
  156. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  157. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  158. data/lib/opal/server.rb +4 -0
  159. data/lib/opal/simple_server.rb +101 -0
  160. data/lib/opal/source_map.rb +1 -1
  161. data/lib/opal/util.rb +6 -6
  162. data/lib/opal/version.rb +2 -1
  163. data/lib/opal.rb +7 -1
  164. data/lib/tilt/opal.rb +1 -0
  165. data/opal/README.md +1 -1
  166. data/opal/corelib/array.rb +184 -107
  167. data/opal/corelib/basic_object.rb +6 -6
  168. data/opal/corelib/boolean.rb +11 -3
  169. data/opal/corelib/class.rb +14 -11
  170. data/opal/corelib/comparable.rb +16 -0
  171. data/opal/corelib/complex.rb +5 -1
  172. data/opal/corelib/constants.rb +3 -3
  173. data/opal/corelib/enumerable.rb +176 -11
  174. data/opal/corelib/error.rb +35 -17
  175. data/opal/corelib/file.rb +114 -176
  176. data/opal/corelib/hash.rb +226 -13
  177. data/opal/corelib/helpers.rb +12 -15
  178. data/opal/corelib/io.rb +3 -2
  179. data/opal/corelib/kernel.rb +68 -32
  180. data/opal/corelib/marshal/read_buffer.rb +288 -150
  181. data/opal/corelib/marshal/write_buffer.rb +27 -2
  182. data/opal/corelib/method.rb +33 -13
  183. data/opal/corelib/module.rb +134 -82
  184. data/opal/corelib/nil.rb +11 -3
  185. data/opal/corelib/number.rb +220 -34
  186. data/opal/corelib/numeric.rb +3 -11
  187. data/opal/corelib/process.rb +44 -4
  188. data/opal/corelib/random/seedrandom.js.rb +15 -0
  189. data/opal/corelib/random.rb +117 -0
  190. data/opal/corelib/range.rb +147 -24
  191. data/opal/corelib/regexp.rb +82 -13
  192. data/opal/corelib/runtime.js +623 -397
  193. data/opal/corelib/string/encoding.rb +67 -31
  194. data/opal/corelib/string/inheritance.rb +1 -1
  195. data/opal/corelib/string.rb +40 -9
  196. data/opal/corelib/struct.rb +18 -3
  197. data/opal/corelib/time.rb +3 -3
  198. data/opal/corelib/variables.rb +1 -1
  199. data/opal/opal.rb +1 -0
  200. data/opal.gemspec +32 -29
  201. data/stdlib/base64.rb +4 -2
  202. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  203. data/stdlib/buffer/array.rb +4 -2
  204. data/stdlib/date.rb +64 -31
  205. data/stdlib/headless_chrome.rb +11 -0
  206. data/stdlib/json.rb +16 -4
  207. data/stdlib/nashorn/file.rb +15 -0
  208. data/stdlib/native.rb +21 -12
  209. data/stdlib/nodejs/dir.rb +1 -1
  210. data/stdlib/nodejs/file.rb +77 -23
  211. data/stdlib/nodejs/io.rb +30 -1
  212. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  213. data/stdlib/nodejs/kernel.rb +3 -1
  214. data/stdlib/nodejs/package.json +0 -1
  215. data/stdlib/nodejs/stacktrace.rb +179 -0
  216. data/stdlib/nodejs/yaml.rb +2 -1
  217. data/stdlib/opal/platform.rb +6 -14
  218. data/stdlib/opal-builder.rb +1 -0
  219. data/stdlib/opal-platform.rb +15 -0
  220. data/stdlib/pathname.rb +1 -1
  221. data/stdlib/rbconfig.rb +1 -1
  222. data/stdlib/securerandom.rb +1 -1
  223. data/stdlib/strscan.rb +15 -1
  224. data/stdlib/yaml.rb +1 -1
  225. data/tasks/benchmarking.rake +9 -0
  226. data/tasks/building.rake +24 -20
  227. data/tasks/linting.rake +24 -13
  228. data/tasks/testing/mspec_special_calls.rb +44 -15
  229. data/tasks/testing/opal_rspec_smoketest.Gemfile +6 -0
  230. data/tasks/testing.rake +351 -202
  231. metadata +135 -915
  232. data/lib/opal/cli_runners/phantom.js +0 -70
  233. data/lib/opal/cli_runners/phantomjs.rb +0 -28
  234. data/lib/opal/hike_path_finder.rb +0 -18
  235. data/lib/opal/nodes/for.rb +0 -48
  236. data/lib/opal/parser/grammar.rb +0 -6157
  237. data/lib/opal/parser/grammar.y +0 -2011
  238. data/lib/opal/parser/keywords.rb +0 -66
  239. data/lib/opal/parser/lexer.rb +0 -1352
  240. data/lib/opal/parser/parser_scope.rb +0 -28
  241. data/lib/opal/parser/sexp.rb +0 -90
  242. data/lib/opal/sprockets/environment.rb +0 -23
  243. data/lib/opal/sprockets/erb.rb +0 -23
  244. data/lib/opal/sprockets/path_reader.rb +0 -36
  245. data/lib/opal/sprockets/processor.rb +0 -145
  246. data/lib/opal/sprockets/server.rb +0 -133
  247. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  248. data/lib/opal/sprockets/source_map_server.rb +0 -115
  249. data/lib/opal/sprockets.rb +0 -91
  250. data/spec/README.md +0 -10
  251. data/spec/filters/bugs/array.rb +0 -12
  252. data/spec/filters/bugs/basicobject.rb +0 -16
  253. data/spec/filters/bugs/bigdecimal.rb +0 -160
  254. data/spec/filters/bugs/class.rb +0 -10
  255. data/spec/filters/bugs/compiler_opal.rb +0 -5
  256. data/spec/filters/bugs/complex.rb +0 -3
  257. data/spec/filters/bugs/date.rb +0 -94
  258. data/spec/filters/bugs/enumerable.rb +0 -50
  259. data/spec/filters/bugs/enumerator.rb +0 -42
  260. data/spec/filters/bugs/exception.rb +0 -58
  261. data/spec/filters/bugs/float.rb +0 -33
  262. data/spec/filters/bugs/hash.rb +0 -11
  263. data/spec/filters/bugs/inheritance.rb +0 -5
  264. data/spec/filters/bugs/integer.rb +0 -28
  265. data/spec/filters/bugs/kernel.rb +0 -297
  266. data/spec/filters/bugs/language.rb +0 -275
  267. data/spec/filters/bugs/language_opal.rb +0 -88
  268. data/spec/filters/bugs/marshal.rb +0 -43
  269. data/spec/filters/bugs/method.rb +0 -84
  270. data/spec/filters/bugs/module.rb +0 -196
  271. data/spec/filters/bugs/numeric.rb +0 -127
  272. data/spec/filters/bugs/pathname.rb +0 -5
  273. data/spec/filters/bugs/proc.rb +0 -36
  274. data/spec/filters/bugs/range.rb +0 -144
  275. data/spec/filters/bugs/rational.rb +0 -4
  276. data/spec/filters/bugs/regexp.rb +0 -196
  277. data/spec/filters/bugs/set.rb +0 -42
  278. data/spec/filters/bugs/singleton.rb +0 -6
  279. data/spec/filters/bugs/string.rb +0 -101
  280. data/spec/filters/bugs/stringscanner.rb +0 -79
  281. data/spec/filters/bugs/struct.rb +0 -4
  282. data/spec/filters/bugs/time.rb +0 -29
  283. data/spec/filters/bugs/unboundmethod.rb +0 -27
  284. data/spec/filters/unsupported/array.rb +0 -163
  285. data/spec/filters/unsupported/basicobject.rb +0 -14
  286. data/spec/filters/unsupported/bignum.rb +0 -52
  287. data/spec/filters/unsupported/class.rb +0 -4
  288. data/spec/filters/unsupported/delegator.rb +0 -5
  289. data/spec/filters/unsupported/enumerable.rb +0 -11
  290. data/spec/filters/unsupported/enumerator.rb +0 -13
  291. data/spec/filters/unsupported/fixnum.rb +0 -14
  292. data/spec/filters/unsupported/float.rb +0 -43
  293. data/spec/filters/unsupported/freeze.rb +0 -53
  294. data/spec/filters/unsupported/hash.rb +0 -51
  295. data/spec/filters/unsupported/integer.rb +0 -3
  296. data/spec/filters/unsupported/kernel.rb +0 -31
  297. data/spec/filters/unsupported/language.rb +0 -17
  298. data/spec/filters/unsupported/marshal.rb +0 -46
  299. data/spec/filters/unsupported/matchdata.rb +0 -30
  300. data/spec/filters/unsupported/math.rb +0 -3
  301. data/spec/filters/unsupported/module.rb +0 -8
  302. data/spec/filters/unsupported/pathname.rb +0 -3
  303. data/spec/filters/unsupported/privacy.rb +0 -147
  304. data/spec/filters/unsupported/proc.rb +0 -3
  305. data/spec/filters/unsupported/regexp.rb +0 -59
  306. data/spec/filters/unsupported/set.rb +0 -4
  307. data/spec/filters/unsupported/singleton.rb +0 -6
  308. data/spec/filters/unsupported/string.rb +0 -537
  309. data/spec/filters/unsupported/struct.rb +0 -6
  310. data/spec/filters/unsupported/symbol.rb +0 -19
  311. data/spec/filters/unsupported/taint.rb +0 -15
  312. data/spec/filters/unsupported/thread.rb +0 -7
  313. data/spec/filters/unsupported/time.rb +0 -202
  314. data/spec/lib/builder_processors_spec.rb +0 -27
  315. data/spec/lib/builder_spec.rb +0 -72
  316. data/spec/lib/cli_runners/phantomjs_spec.rb +0 -39
  317. data/spec/lib/cli_spec.rb +0 -211
  318. data/spec/lib/compiler/call_spec.rb +0 -700
  319. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  320. data/spec/lib/compiler_spec.rb +0 -285
  321. data/spec/lib/config_spec.rb +0 -13
  322. data/spec/lib/dependency_resolver_spec.rb +0 -40
  323. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +0 -4
  324. data/spec/lib/fixtures/file_with_directives.js +0 -2
  325. data/spec/lib/fixtures/jst_file.js.jst +0 -1
  326. data/spec/lib/fixtures/no_requires.rb +0 -1
  327. data/spec/lib/fixtures/opal_file.rb +0 -2
  328. data/spec/lib/fixtures/require_tree_test.rb +0 -3
  329. data/spec/lib/fixtures/required_file.js +0 -1
  330. data/spec/lib/fixtures/required_tree_test/required_file1.rb +0 -1
  331. data/spec/lib/fixtures/required_tree_test/required_file2.rb +0 -1
  332. data/spec/lib/fixtures/requires.rb +0 -7
  333. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +0 -1
  334. data/spec/lib/fixtures/source_map.rb +0 -1
  335. data/spec/lib/fixtures/sprockets_file.js.rb +0 -3
  336. data/spec/lib/fixtures/sprockets_require_tree_test.rb +0 -3
  337. data/spec/lib/hike_path_finder_spec.rb +0 -23
  338. data/spec/lib/lexer_spec.rb +0 -110
  339. data/spec/lib/parser/alias_spec.rb +0 -26
  340. data/spec/lib/parser/and_spec.rb +0 -13
  341. data/spec/lib/parser/aref_spec.rb +0 -10
  342. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  343. data/spec/lib/parser/begin_spec.rb +0 -42
  344. data/spec/lib/parser/block_spec.rb +0 -12
  345. data/spec/lib/parser/break_spec.rb +0 -17
  346. data/spec/lib/parser/call_spec.rb +0 -201
  347. data/spec/lib/parser/class_spec.rb +0 -35
  348. data/spec/lib/parser/comments_spec.rb +0 -11
  349. data/spec/lib/parser/def_spec.rb +0 -109
  350. data/spec/lib/parser/if_spec.rb +0 -26
  351. data/spec/lib/parser/iter_spec.rb +0 -59
  352. data/spec/lib/parser/lambda_spec.rb +0 -219
  353. data/spec/lib/parser/literal_spec.rb +0 -118
  354. data/spec/lib/parser/masgn_spec.rb +0 -37
  355. data/spec/lib/parser/module_spec.rb +0 -27
  356. data/spec/lib/parser/not_spec.rb +0 -21
  357. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  358. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  359. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  360. data/spec/lib/parser/or_spec.rb +0 -13
  361. data/spec/lib/parser/return_spec.rb +0 -22
  362. data/spec/lib/parser/sclass_spec.rb +0 -21
  363. data/spec/lib/parser/string_spec.rb +0 -286
  364. data/spec/lib/parser/super_spec.rb +0 -20
  365. data/spec/lib/parser/unary_spec.rb +0 -52
  366. data/spec/lib/parser/undef_spec.rb +0 -19
  367. data/spec/lib/parser/unless_spec.rb +0 -13
  368. data/spec/lib/parser/variables_spec.rb +0 -116
  369. data/spec/lib/parser/while_spec.rb +0 -15
  370. data/spec/lib/parser/yield_spec.rb +0 -20
  371. data/spec/lib/path_reader_spec.rb +0 -36
  372. data/spec/lib/paths_spec.rb +0 -18
  373. data/spec/lib/shared/path_finder_shared.rb +0 -19
  374. data/spec/lib/shared/path_reader_shared.rb +0 -31
  375. data/spec/lib/spec_helper.rb +0 -16
  376. data/spec/lib/sprockets/erb_spec.rb +0 -38
  377. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  378. data/spec/lib/sprockets/processor_spec.rb +0 -79
  379. data/spec/lib/sprockets/server_spec.rb +0 -102
  380. data/spec/lib/sprockets_spec.rb +0 -32
  381. data/spec/lib/tilt/opal_spec.rb +0 -37
  382. data/spec/mspec-opal/formatters.rb +0 -188
  383. data/spec/mspec-opal/runner.rb +0 -193
  384. data/spec/opal/compiler/irb_spec.rb +0 -44
  385. data/spec/opal/core/arity_spec.rb +0 -142
  386. data/spec/opal/core/array/intersection_spec.rb +0 -38
  387. data/spec/opal/core/array/minus_spec.rb +0 -38
  388. data/spec/opal/core/array/select_spec.rb +0 -14
  389. data/spec/opal/core/array/set_range_to_array_spec.rb +0 -7
  390. data/spec/opal/core/array/union_spec.rb +0 -38
  391. data/spec/opal/core/array/uniq_spec.rb +0 -49
  392. data/spec/opal/core/date_spec.rb +0 -177
  393. data/spec/opal/core/enumerable/all_break_spec.rb +0 -5
  394. data/spec/opal/core/enumerable/any_break_spec.rb +0 -5
  395. data/spec/opal/core/enumerable/collect_break_spec.rb +0 -13
  396. data/spec/opal/core/enumerable/count_break_spec.rb +0 -5
  397. data/spec/opal/core/enumerable/detect_break_spec.rb +0 -5
  398. data/spec/opal/core/enumerable/drop_while_break_spec.rb +0 -5
  399. data/spec/opal/core/enumerable/each_slice_break.rb +0 -6
  400. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +0 -5
  401. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +0 -5
  402. data/spec/opal/core/enumerable/find_all_break_spec.rb +0 -5
  403. data/spec/opal/core/enumerable/find_index_break_spec.rb +0 -5
  404. data/spec/opal/core/enumerable/grep_break_spec.rb +0 -5
  405. data/spec/opal/core/enumerable/max_break_spec.rb +0 -5
  406. data/spec/opal/core/enumerable/max_by_break_spec.rb +0 -5
  407. data/spec/opal/core/enumerable/min_break_spec.rb +0 -5
  408. data/spec/opal/core/enumerable/min_by_break_spec.rb +0 -5
  409. data/spec/opal/core/enumerable/none_break_spec.rb +0 -5
  410. data/spec/opal/core/enumerable/one_break_spec.rb +0 -5
  411. data/spec/opal/core/enumerable/reduce_break_spec.rb +0 -5
  412. data/spec/opal/core/enumerable/take_while_break_spec.rb +0 -5
  413. data/spec/opal/core/enumerator/with_index_spec.rb +0 -6
  414. data/spec/opal/core/exception_spec.rb +0 -20
  415. data/spec/opal/core/fixtures/class.rb +0 -124
  416. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  417. data/spec/opal/core/fixtures/constants.rb +0 -33
  418. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +0 -1
  419. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +0 -1
  420. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +0 -1
  421. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +0 -1
  422. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +0 -1
  423. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +0 -1
  424. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +0 -1
  425. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +0 -1
  426. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +0 -1
  427. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +0 -1
  428. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +0 -1
  429. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +0 -3
  430. data/spec/opal/core/hash/has_value_spec.rb +0 -13
  431. data/spec/opal/core/hash/internals_spec.rb +0 -332
  432. data/spec/opal/core/helpers_spec.rb +0 -14
  433. data/spec/opal/core/kernel/Array_spec.rb +0 -10
  434. data/spec/opal/core/kernel/at_exit_spec.rb +0 -70
  435. data/spec/opal/core/kernel/block_given_spec.rb +0 -30
  436. data/spec/opal/core/kernel/class_spec.rb +0 -6
  437. data/spec/opal/core/kernel/define_singleton_method_spec.rb +0 -21
  438. data/spec/opal/core/kernel/equal_value_spec.rb +0 -12
  439. data/spec/opal/core/kernel/extend_spec.rb +0 -21
  440. data/spec/opal/core/kernel/format_spec.rb +0 -122
  441. data/spec/opal/core/kernel/freeze_spec.rb +0 -15
  442. data/spec/opal/core/kernel/instance_eval_spec.rb +0 -28
  443. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +0 -15
  444. data/spec/opal/core/kernel/instance_variable_get_spec.rb +0 -14
  445. data/spec/opal/core/kernel/instance_variable_set_spec.rb +0 -10
  446. data/spec/opal/core/kernel/instance_variables_spec.rb +0 -110
  447. data/spec/opal/core/kernel/loop_spec.rb +0 -23
  448. data/spec/opal/core/kernel/match_spec.rb +0 -5
  449. data/spec/opal/core/kernel/method_spec.rb +0 -31
  450. data/spec/opal/core/kernel/methods_spec.rb +0 -25
  451. data/spec/opal/core/kernel/nil_spec.rb +0 -7
  452. data/spec/opal/core/kernel/p_spec.rb +0 -15
  453. data/spec/opal/core/kernel/printf_spec.rb +0 -11
  454. data/spec/opal/core/kernel/proc_spec.rb +0 -13
  455. data/spec/opal/core/kernel/raise_spec.rb +0 -13
  456. data/spec/opal/core/kernel/rand_spec.rb +0 -23
  457. data/spec/opal/core/kernel/require_tree_spec.rb +0 -18
  458. data/spec/opal/core/kernel/respond_to_spec.rb +0 -41
  459. data/spec/opal/core/kernel/send_spec.rb +0 -56
  460. data/spec/opal/core/kernel/sprintf_spec.rb +0 -5
  461. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +0 -19
  462. data/spec/opal/core/language/block_spec.rb +0 -538
  463. data/spec/opal/core/language/class_spec.rb +0 -55
  464. data/spec/opal/core/language/equal_spec.rb +0 -8
  465. data/spec/opal/core/language/fixtures/array.rb +0 -11
  466. data/spec/opal/core/language/fixtures/block.rb +0 -57
  467. data/spec/opal/core/language/fixtures/break.rb +0 -240
  468. data/spec/opal/core/language/fixtures/ensure.rb +0 -72
  469. data/spec/opal/core/language/fixtures/literal_lambda.rb +0 -7
  470. data/spec/opal/core/language/fixtures/metaclass.rb +0 -33
  471. data/spec/opal/core/language/fixtures/module.rb +0 -24
  472. data/spec/opal/core/language/fixtures/next.rb +0 -128
  473. data/spec/opal/core/language/fixtures/return.rb +0 -118
  474. data/spec/opal/core/language/fixtures/send.rb +0 -111
  475. data/spec/opal/core/language/fixtures/send_1.9.rb +0 -22
  476. data/spec/opal/core/language/fixtures/super.rb +0 -308
  477. data/spec/opal/core/language/fixtures/variables.rb +0 -58
  478. data/spec/opal/core/language/fixtures/yield.rb +0 -28
  479. data/spec/opal/core/language/heredoc_spec.rb +0 -42
  480. data/spec/opal/core/language/keyword_arguments_spec.rb +0 -11
  481. data/spec/opal/core/language/predefined_spec.rb +0 -138
  482. data/spec/opal/core/language/proc_spec.rb +0 -263
  483. data/spec/opal/core/language/regexp_spec.rb +0 -20
  484. data/spec/opal/core/language/rescue_spec.rb +0 -18
  485. data/spec/opal/core/language/send_spec.rb +0 -230
  486. data/spec/opal/core/language/string_spec.rb +0 -44
  487. data/spec/opal/core/language/ternary_operator_spec.rb +0 -20
  488. data/spec/opal/core/language/variables_spec.rb +0 -1366
  489. data/spec/opal/core/language/versions/array_1.9.rb +0 -39
  490. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  491. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  492. data/spec/opal/core/language/versions/case_1.9.rb +0 -20
  493. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -62
  494. data/spec/opal/core/language/versions/hash_1_9_spec.rb +0 -23
  495. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +0 -143
  496. data/spec/opal/core/language/versions/not_1.9.rb +0 -22
  497. data/spec/opal/core/language/versions/send_1.9.rb +0 -241
  498. data/spec/opal/core/language/versions/symbol_1.9.rb +0 -15
  499. data/spec/opal/core/language/versions/variables_1.9.rb +0 -8
  500. data/spec/opal/core/language_spec.rb +0 -45
  501. data/spec/opal/core/marshal/dump_spec.rb +0 -53
  502. data/spec/opal/core/marshal/load_spec.rb +0 -7
  503. data/spec/opal/core/method/to_proc_spec.rb +0 -28
  504. data/spec/opal/core/module/alias_method_spec.rb +0 -28
  505. data/spec/opal/core/module/ancestors_spec.rb +0 -11
  506. data/spec/opal/core/module/append_features_spec.rb +0 -14
  507. data/spec/opal/core/module/attr_accessor_spec.rb +0 -26
  508. data/spec/opal/core/module/const_defined_spec.rb +0 -84
  509. data/spec/opal/core/module/const_get_spec.rb +0 -85
  510. data/spec/opal/core/module/const_missing_spec.rb +0 -17
  511. data/spec/opal/core/module/const_set_spec.rb +0 -64
  512. data/spec/opal/core/module/constants_spec.rb +0 -49
  513. data/spec/opal/core/module/fixtures/classes.rb +0 -444
  514. data/spec/opal/core/module/method_defined_spec.rb +0 -48
  515. data/spec/opal/core/module/method_lookup_spec.rb +0 -13
  516. data/spec/opal/core/module/module_function_spec.rb +0 -25
  517. data/spec/opal/core/module/name_spec.rb +0 -41
  518. data/spec/opal/core/module/public_method_defined_spec.rb +0 -18
  519. data/spec/opal/core/module/remove_const_spec.rb +0 -22
  520. data/spec/opal/core/module/undef_method_spec.rb +0 -66
  521. data/spec/opal/core/numeric/bit_and_spec.rb +0 -7
  522. data/spec/opal/core/numeric/bit_or_spec.rb +0 -8
  523. data/spec/opal/core/numeric/bit_xor_spec.rb +0 -6
  524. data/spec/opal/core/numeric/ceil_spec.rb +0 -8
  525. data/spec/opal/core/numeric/chr_spec.rb +0 -8
  526. data/spec/opal/core/numeric/comparison_spec.rb +0 -24
  527. data/spec/opal/core/numeric/complement_spec.rb +0 -8
  528. data/spec/opal/core/numeric/divide_spec.rb +0 -10
  529. data/spec/opal/core/numeric/eql_spec.rb +0 -9
  530. data/spec/opal/core/numeric/exponent_spec.rb +0 -33
  531. data/spec/opal/core/numeric/floor_spec.rb +0 -8
  532. data/spec/opal/core/numeric/gt_spec.rb +0 -11
  533. data/spec/opal/core/numeric/gte_spec.rb +0 -12
  534. data/spec/opal/core/numeric/integer_spec.rb +0 -9
  535. data/spec/opal/core/numeric/left_shift_spec.rb +0 -21
  536. data/spec/opal/core/numeric/lt_spec.rb +0 -11
  537. data/spec/opal/core/numeric/lte_spec.rb +0 -12
  538. data/spec/opal/core/numeric/minus_spec.rb +0 -8
  539. data/spec/opal/core/numeric/modulo_spec.rb +0 -19
  540. data/spec/opal/core/numeric/multiply_spec.rb +0 -9
  541. data/spec/opal/core/numeric/next_spec.rb +0 -9
  542. data/spec/opal/core/numeric/ord_spec.rb +0 -9
  543. data/spec/opal/core/numeric/plus_spec.rb +0 -8
  544. data/spec/opal/core/numeric/pred_spec.rb +0 -7
  545. data/spec/opal/core/numeric/right_shift_spec.rb +0 -25
  546. data/spec/opal/core/numeric/step_spec.rb +0 -11
  547. data/spec/opal/core/numeric/succ_spec.rb +0 -9
  548. data/spec/opal/core/numeric/times_spec.rb +0 -36
  549. data/spec/opal/core/numeric/to_f_spec.rb +0 -7
  550. data/spec/opal/core/numeric/to_i_spec.rb +0 -7
  551. data/spec/opal/core/numeric/to_json_spec.rb +0 -8
  552. data/spec/opal/core/numeric/to_s_spec.rb +0 -26
  553. data/spec/opal/core/numeric/uminus_spec.rb +0 -9
  554. data/spec/opal/core/numeric/upto_spec.rb +0 -19
  555. data/spec/opal/core/numeric/zero_spec.rb +0 -7
  556. data/spec/opal/core/object_id_spec.rb +0 -56
  557. data/spec/opal/core/proc/call_spec.rb +0 -21
  558. data/spec/opal/core/proc/element_reference_spec.rb +0 -21
  559. data/spec/opal/core/proc/proc_tricks_spec.rb +0 -7
  560. data/spec/opal/core/runtime/begin_spec.rb +0 -39
  561. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  562. data/spec/opal/core/runtime/block_spec.rb +0 -23
  563. data/spec/opal/core/runtime/bridged_classes_spec.rb +0 -123
  564. data/spec/opal/core/runtime/constants_spec.rb +0 -13
  565. data/spec/opal/core/runtime/donate_spec.rb +0 -53
  566. data/spec/opal/core/runtime/eval_spec.rb +0 -5
  567. data/spec/opal/core/runtime/main_methods_spec.rb +0 -27
  568. data/spec/opal/core/runtime/method_missing_spec.rb +0 -68
  569. data/spec/opal/core/runtime/method_spec.rb +0 -31
  570. data/spec/opal/core/runtime/operator_call_spec.rb +0 -13
  571. data/spec/opal/core/runtime/paren_spec.rb +0 -14
  572. data/spec/opal/core/runtime/rescue_spec.rb +0 -71
  573. data/spec/opal/core/runtime/return_spec.rb +0 -38
  574. data/spec/opal/core/runtime/send_spec.rb +0 -34
  575. data/spec/opal/core/runtime/singleton_class_spec.rb +0 -13
  576. data/spec/opal/core/runtime/super_spec.rb +0 -223
  577. data/spec/opal/core/runtime/truthy_spec.rb +0 -63
  578. data/spec/opal/core/runtime/variables_spec.rb +0 -20
  579. data/spec/opal/core/runtime_spec.rb +0 -58
  580. data/spec/opal/core/source_map_spec.rb +0 -49
  581. data/spec/opal/core/string_spec.rb +0 -32
  582. data/spec/opal/javascript_api_spec.rb +0 -16
  583. data/spec/opal/stdlib/erb/erb_spec.rb +0 -30
  584. data/spec/opal/stdlib/erb/inline_block.opalerb +0 -3
  585. data/spec/opal/stdlib/erb/quoted.opalerb +0 -1
  586. data/spec/opal/stdlib/erb/simple.opalerb +0 -1
  587. data/spec/opal/stdlib/js_spec.rb +0 -66
  588. data/spec/opal/stdlib/json/ext_spec.rb +0 -48
  589. data/spec/opal/stdlib/json/parse_spec.rb +0 -33
  590. data/spec/opal/stdlib/native/alias_native_spec.rb +0 -27
  591. data/spec/opal/stdlib/native/array_spec.rb +0 -11
  592. data/spec/opal/stdlib/native/each_spec.rb +0 -13
  593. data/spec/opal/stdlib/native/element_reference_spec.rb +0 -16
  594. data/spec/opal/stdlib/native/exposure_spec.rb +0 -33
  595. data/spec/opal/stdlib/native/ext_spec.rb +0 -19
  596. data/spec/opal/stdlib/native/hash_spec.rb +0 -51
  597. data/spec/opal/stdlib/native/initialize_spec.rb +0 -17
  598. data/spec/opal/stdlib/native/method_missing_spec.rb +0 -51
  599. data/spec/opal/stdlib/native/native_alias_spec.rb +0 -19
  600. data/spec/opal/stdlib/native/native_class_spec.rb +0 -18
  601. data/spec/opal/stdlib/native/native_module_spec.rb +0 -13
  602. data/spec/opal/stdlib/native/native_reader_spec.rb +0 -22
  603. data/spec/opal/stdlib/native/native_writer_spec.rb +0 -30
  604. data/spec/opal/stdlib/native/new_spec.rb +0 -92
  605. data/spec/opal/stdlib/native/struct_spec.rb +0 -12
  606. data/spec/opal/stdlib/promise/always_spec.rb +0 -49
  607. data/spec/opal/stdlib/promise/error_spec.rb +0 -15
  608. data/spec/opal/stdlib/promise/rescue_spec.rb +0 -53
  609. data/spec/opal/stdlib/promise/then_spec.rb +0 -79
  610. data/spec/opal/stdlib/promise/trace_spec.rb +0 -51
  611. data/spec/opal/stdlib/promise/value_spec.rb +0 -15
  612. data/spec/opal/stdlib/promise/when_spec.rb +0 -34
  613. data/spec/opal/stdlib/source_map_spec.rb +0 -8
  614. data/spec/opal/stdlib/strscan/scan_spec.rb +0 -11
  615. data/spec/opal/stdlib/template/paths_spec.rb +0 -10
  616. data/spec/opal/stdlib/thread/mutex_spec.rb +0 -40
  617. data/spec/opal/stdlib/thread/thread_queue_spec.rb +0 -32
  618. data/spec/opal/stdlib/thread/thread_spec.rb +0 -60
  619. data/spec/ruby_specs +0 -121
  620. data/spec/spec_helper.rb +0 -26
  621. data/spec/support/match_helpers.rb +0 -57
  622. data/spec/support/mspec_rspec_adapter.rb +0 -33
  623. data/spec/support/parser_helpers.rb +0 -37
  624. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  625. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  626. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  627. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  628. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  629. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  630. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  631. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  632. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  633. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  634. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  635. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  636. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  637. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  638. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  639. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  640. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  641. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  642. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  643. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  644. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  645. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  646. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  647. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  648. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  649. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  650. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  651. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  652. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  653. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  654. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  655. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  656. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  657. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  658. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  659. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  660. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  661. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  662. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  663. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  664. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  665. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  666. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  667. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  668. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  669. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  670. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  671. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  672. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  673. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  674. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  675. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  676. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  677. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  678. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  679. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  680. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  681. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  682. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  683. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  684. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  685. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  686. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  687. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  688. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  689. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  690. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  691. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  692. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  693. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  694. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  695. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  696. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  697. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  698. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  699. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  700. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  701. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  702. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  703. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  704. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  705. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  706. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  707. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  708. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  709. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  710. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  711. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  712. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  713. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  714. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  715. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  716. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  717. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  718. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  719. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  720. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  721. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  722. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  723. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  724. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  725. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
  726. data/stdlib/phantomjs.rb +0 -17
  727. data/tasks/testing/sprockets-phantomjs.js +0 -54
  728. data/test/nodejs/test_dir.rb +0 -17
  729. data/test/nodejs/test_file.rb +0 -30
  730. data/test/opal/test_keyword.rb +0 -590
  731. data/test/opal/unsupported_and_bugs.rb +0 -30
  732. /data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  733. /data/{bin → exe}/opal-build +0 -0
  734. /data/{bin → exe}/opal-mspec +0 -0
@@ -13,6 +13,24 @@
13
13
  // The way the code is digested before going through Yardoc is a secret kept
14
14
  // in the docs repo (https://github.com/opal/docs/tree/master).
15
15
 
16
+ var global_object = this, console;
17
+
18
+ // Detect the global object
19
+ if (typeof(global) !== 'undefined') { global_object = global; }
20
+ if (typeof(window) !== 'undefined') { global_object = window; }
21
+
22
+ // Setup a dummy console object if missing
23
+ if (typeof(global_object.console) === 'object') {
24
+ console = global_object.console;
25
+ } else if (global_object.console == null) {
26
+ console = global_object.console = {};
27
+ } else {
28
+ console = {};
29
+ }
30
+
31
+ if (!('log' in console)) { console.log = function () {}; }
32
+ if (!('warn' in console)) { console.warn = console.log; }
33
+
16
34
  if (typeof(this.Opal) !== 'undefined') {
17
35
  console.warn('Opal already loaded. Loading twice can cause troubles, please fix your setup.');
18
36
  return this.Opal;
@@ -52,31 +70,21 @@
52
70
  var Opal = this.Opal = {};
53
71
 
54
72
  // All bridged classes - keep track to donate methods from Object
55
- var bridges = {};
56
-
57
- // TopScope is used for inheriting constants from the top scope
58
- var TopScope = function(){};
59
-
60
- // Opal just acts as the top scope
61
- TopScope.prototype = Opal;
62
-
63
- // To inherit scopes
64
- Opal.constructor = TopScope;
65
-
66
- // List top scope constants
67
- Opal.constants = [];
73
+ var BridgedClasses = {};
68
74
 
69
75
  // This is a useful reference to global object inside ruby files
70
- Opal.global = this;
76
+ Opal.global = global_object;
77
+ global_object.Opal = Opal;
71
78
 
72
79
  // Configure runtime behavior with regards to require and unsupported fearures
73
80
  Opal.config = {
74
- missing_require_severity: 'error', // error, warning, ignore
75
- unsupported_features_severity: 'warning' // error, warning, ignore
81
+ missing_require_severity: 'error', // error, warning, ignore
82
+ unsupported_features_severity: 'warning', // error, warning, ignore
83
+ enable_stack_trace: true // true, false
76
84
  }
77
85
 
78
86
  // Minify common function calls
79
- var $hasOwn = Opal.hasOwnProperty;
87
+ var $hasOwn = Object.hasOwnProperty;
80
88
  var $slice = Opal.slice = Array.prototype.slice;
81
89
 
82
90
  // Nil object id is always 4
@@ -92,14 +100,17 @@
92
100
  return unique_id;
93
101
  };
94
102
 
95
- // Table holds all class variables
96
- Opal.cvars = {};
103
+ // Retrieve or assign the id of an object
104
+ Opal.id = function(obj) {
105
+ if (obj.$$is_number) return (obj * 2)+1;
106
+ return obj.$$id || (obj.$$id = Opal.uid());
107
+ };
97
108
 
98
109
  // Globals table
99
110
  Opal.gvars = {};
100
111
 
101
112
  // Exit function, this should be replaced by platform specific implementation
102
- // (See nodejs and phantom for examples)
113
+ // (See nodejs and chrome for examples)
103
114
  Opal.exit = function(status) { if (Opal.gvars.DEBUG) console.log('Exited with status '+status); };
104
115
 
105
116
  // keeps track of exceptions for $!
@@ -111,135 +122,229 @@
111
122
  Opal.gvars["!"] = Opal.exceptions.pop() || nil;
112
123
  }
113
124
 
125
+ // Inspect any kind of object, including non Ruby ones
126
+ Opal.inspect = function(obj) {
127
+ if (obj === undefined) {
128
+ return "undefined";
129
+ }
130
+ else if (obj === null) {
131
+ return "null";
132
+ }
133
+ else if (!obj.$$class) {
134
+ return obj.toString();
135
+ }
136
+ else {
137
+ return obj.$inspect();
138
+ }
139
+ }
140
+
141
+
142
+ // Truth
143
+ // -----
144
+
145
+ Opal.truthy = function(val) {
146
+ return (val !== nil && val != null && (!val.$$is_boolean || val == true));
147
+ };
148
+
149
+ Opal.falsy = function(val) {
150
+ return (val === nil || val == null || (val.$$is_boolean && val == false))
151
+ };
152
+
114
153
 
115
154
  // Constants
116
155
  // ---------
117
-
118
- // Get a constant on the given scope. Every class and module in Opal has a
119
- // scope used to store, and inherit, constants. For example, the top level
120
- // `Object` in ruby has a scope accessible as `Opal.Object.$$scope`.
121
- //
122
- // To get the `Array` class using this scope, you could use:
123
- //
124
- // Opal.Object.$$scope.get("Array")
125
156
  //
126
- // If a constant with the given name cannot be found, then a dispatch to the
127
- // class/module's `#const_method` is called, which by default will raise an
128
- // error.
157
+ // For future reference:
158
+ // - The Rails autoloading guide (http://guides.rubyonrails.org/v5.0/autoloading_and_reloading_constants.html)
159
+ // - @ConradIrwin's 2012 post on “Everything you ever wanted to know about constant lookup in Ruby” (http://cirw.in/blog/constant-lookup.html)
129
160
  //
130
- // @param name [String] the name of the constant to lookup
131
- // @return [Object]
132
- //
133
- Opal.get = function(name) {
134
- var constant = this[name];
161
+ // Legend of MRI concepts/names:
162
+ // - constant reference (cref): the module/class that acts as a namespace
163
+ // - nesting: the namespaces wrapping the current scope, e.g. nesting inside
164
+ // `module A; module B::C; end; end` is `[B::C, A]`
165
+
166
+ // Get the cosntant in the scope of the current cref
167
+ function const_get_name(cref, name) {
168
+ if (cref) return cref.$$const[name];
169
+ }
135
170
 
136
- if (constant == null) {
137
- return this.base.$const_get(name);
171
+ // Walk up the nesting array looking for the constant
172
+ function const_lookup_nesting(nesting, name) {
173
+ var i, ii, result, constant;
174
+
175
+ if (nesting.length === 0) return;
176
+
177
+ // If the nesting is not empty the constant is looked up in its elements
178
+ // and in order. The ancestors of those elements are ignored.
179
+ for (i = 0, ii = nesting.length; i < ii; i++) {
180
+ constant = nesting[i].$$const[name];
181
+ if (constant != null) return constant;
138
182
  }
183
+ }
139
184
 
140
- return constant;
141
- };
185
+ // Walk up the ancestors chain looking for the constant
186
+ function const_lookup_ancestors(cref, name) {
187
+ var i, ii, result, ancestors;
142
188
 
143
- // Create a new constants scope for the given class with the given
144
- // base. Constants are looked up through their parents, so the base
145
- // scope will be the outer scope of the new klass.
146
- //
147
- // @param base_scope [$$scope] the scope in which the new scope should be created
148
- // @param klass [Class]
149
- // @param id [String, null] the name of the newly created scope
150
- //
151
- Opal.create_scope = function(base_scope, klass, id) {
152
- var const_alloc = function() {};
153
- var const_scope = const_alloc.prototype = new base_scope.constructor();
189
+ if (cref == null) return;
154
190
 
155
- klass.$$scope = const_scope;
156
- klass.$$base_module = base_scope.base;
191
+ ancestors = Opal.ancestors(cref);
157
192
 
158
- const_scope.base = klass;
159
- const_scope.constructor = const_alloc;
160
- const_scope.constants = [];
193
+ for (i = 0, ii = ancestors.length; i < ii; i++) {
194
+ if (ancestors[i].$$const && $hasOwn.call(ancestors[i].$$const, name)) {
195
+ return ancestors[i].$$const[name];
196
+ }
197
+ }
198
+ }
161
199
 
162
- if (id) {
163
- Opal.cdecl(base_scope, id, klass);
164
- const_alloc.displayName = id+"_scope_alloc";
200
+ // Walk up Object's ancestors chain looking for the constant,
201
+ // but only if cref is missing or a module.
202
+ function const_lookup_Object(cref, name) {
203
+ if (cref == null || cref.$$is_module) {
204
+ return const_lookup_ancestors(_Object, name);
165
205
  }
206
+ }
207
+
208
+ // Call const_missing if nothing else worked
209
+ function const_missing(cref, name, skip_missing) {
210
+ if (!skip_missing) {
211
+ return (cref || _Object).$const_missing(name);
212
+ }
213
+ }
214
+
215
+ // Look for the constant just in the current cref or call `#const_missing`
216
+ Opal.const_get_local = function(cref, name, skip_missing) {
217
+ var result;
218
+
219
+ if (cref == null) return;
220
+
221
+ if (cref === '::') cref = _Object;
222
+
223
+ if (!cref.$$is_a_module) {
224
+ throw new Opal.TypeError(cref.toString() + " is not a class/module");
225
+ }
226
+
227
+ result = const_get_name(cref, name); if (result != null) return result;
228
+ result = const_missing(cref, name, skip_missing); if (result != null) return result;
229
+ }
230
+
231
+ // Look for the constant relative to a cref or call `#const_missing` (when the
232
+ // constant is prefixed by `::`).
233
+ Opal.const_get_qualified = function(cref, name, skip_missing) {
234
+ var result, cache, cached, current_version = Opal.const_cache_version;
235
+
236
+ if (cref == null) return;
237
+
238
+ if (cref === '::') cref = _Object;
239
+
240
+ if (!cref.$$is_a_module) {
241
+ throw new Opal.TypeError(cref.toString() + " is not a class/module");
242
+ }
243
+
244
+ if ((cache = cref.$$const_cache) == null) {
245
+ cache = cref.$$const_cache = Object.create(null);
246
+ }
247
+ cached = cache[name];
248
+
249
+ if (cached == null || cached[0] !== current_version) {
250
+ ((result = const_get_name(cref, name)) != null) ||
251
+ ((result = const_lookup_ancestors(cref, name)) != null);
252
+ cache[name] = [current_version, result];
253
+ } else {
254
+ result = cached[1];
255
+ }
256
+
257
+ return result != null ? result : const_missing(cref, name, skip_missing);
166
258
  };
167
259
 
168
- // Constant assignment, see also `Opal.cdecl`
169
- //
170
- // @param base_module [Module, Class] the constant namespace
171
- // @param name [String] the name of the constant
172
- // @param value [Object] the value of the constant
173
- //
174
- // @example Assigning a namespaced constant
175
- // self::FOO = 'bar'
176
- //
177
- // @example Assigning with Module#const_set
178
- // Foo.const_set :BAR, 123
179
- //
180
- Opal.casgn = function(base_module, name, value) {
181
- function update(klass, name) {
182
- klass.$$name = name;
260
+ // Initialize the top level constant cache generation counter
261
+ Opal.const_cache_version = 1;
183
262
 
184
- for (name in klass.$$scope) {
185
- var value = klass.$$scope[name];
263
+ // Look for the constant in the open using the current nesting and the nearest
264
+ // cref ancestors or call `#const_missing` (when the constant has no :: prefix).
265
+ Opal.const_get_relative = function(nesting, name, skip_missing) {
266
+ var cref = nesting[0], result, current_version = Opal.const_cache_version, cache, cached;
186
267
 
187
- if (value.$$name === nil && (value.$$is_class || value.$$is_module)) {
188
- update(value, name)
189
- }
190
- }
268
+ if ((cache = nesting.$$const_cache) == null) {
269
+ cache = nesting.$$const_cache = Object.create(null);
191
270
  }
271
+ cached = cache[name];
192
272
 
193
- var scope = base_module.$$scope;
273
+ if (cached == null || cached[0] !== current_version) {
274
+ ((result = const_get_name(cref, name)) != null) ||
275
+ ((result = const_lookup_nesting(nesting, name)) != null) ||
276
+ ((result = const_lookup_ancestors(cref, name)) != null) ||
277
+ ((result = const_lookup_Object(cref, name)) != null);
194
278
 
195
- if (value.$$is_class || value.$$is_module) {
196
- // Only checking _Object prevents setting a const on an anonymous class
197
- // that has a superclass that's not Object
198
- if (value.$$is_class || value.$$base_module === _Object) {
199
- value.$$base_module = base_module;
200
- }
279
+ cache[name] = [current_version, result];
280
+ } else {
281
+ result = cached[1];
282
+ }
201
283
 
202
- if (value.$$name === nil && value.$$base_module.$$name !== nil) {
203
- update(value, name);
204
- }
284
+ return result != null ? result : const_missing(cref, name, skip_missing);
285
+ };
286
+
287
+ // Register the constant on a cref and opportunistically set the name of
288
+ // unnamed classes/modules.
289
+ Opal.const_set = function(cref, name, value) {
290
+ if (cref == null || cref === '::') cref = _Object;
291
+
292
+ if (value.$$is_a_module) {
293
+ if (value.$$name == null || value.$$name === nil) value.$$name = name;
294
+ if (value.$$base_module == null) value.$$base_module = cref;
205
295
  }
206
296
 
207
- scope.constants.push(name);
208
- scope[name] = value;
297
+ cref.$$const = (cref.$$const || Object.create(null));
298
+ cref.$$const[name] = value;
299
+
300
+ Opal.const_cache_version++;
209
301
 
210
- // If we dynamically declare a constant in a module,
211
- // we should populate all the classes that include this module
212
- // with the same constant
213
- if (base_module.$$is_module && base_module.$$dep) {
214
- for (var i = 0; i < base_module.$$dep.length; i++) {
215
- var dep = base_module.$$dep[i];
216
- Opal.casgn(dep, name, value);
302
+ // Expose top level constants onto the Opal object
303
+ if (cref === _Object) Opal[name] = value;
304
+
305
+ return value;
306
+ };
307
+
308
+ // Get all the constants reachable from a given cref, by default will include
309
+ // inherited constants.
310
+ Opal.constants = function(cref, inherit) {
311
+ if (inherit == null) inherit = true;
312
+
313
+ var module, modules = [cref], module_constants, i, ii, constants = {}, constant;
314
+
315
+ if (inherit) modules = modules.concat(Opal.ancestors(cref));
316
+ if (inherit && cref.$$is_module) modules = modules.concat([Opal.Object]).concat(Opal.ancestors(Opal.Object));
317
+
318
+ for (i = 0, ii = modules.length; i < ii; i++) {
319
+ module = modules[i];
320
+
321
+ // Don not show Objects constants unless we're querying Object itself
322
+ if (cref !== _Object && module == _Object) break;
323
+
324
+ for (constant in module.$$const) {
325
+ constants[constant] = true;
217
326
  }
218
327
  }
219
328
 
220
- return value;
329
+ return Object.keys(constants);
221
330
  };
222
331
 
223
- // Constant declaration
224
- //
225
- // @example
226
- // FOO = :bar
227
- //
228
- // @param base_scope [$$scope] the current scope
229
- // @param name [String] the name of the constant
230
- // @param value [Object] the value of the constant
231
- Opal.cdecl = function(base_scope, name, value) {
232
- if ((value.$$is_class || value.$$is_module) && value.$$orig_scope == null) {
233
- value.$$name = name;
234
- value.$$orig_scope = base_scope;
235
- // Here we should explicitly set a base module
236
- // (a module where the constant was initially defined)
237
- value.$$base_module = base_scope.base;
238
- base_scope.constructor[name] = value;
332
+ // Remove a constant from a cref.
333
+ Opal.const_remove = function(cref, name) {
334
+ Opal.const_cache_version++;
335
+
336
+ if (cref.$$const[name] != null) {
337
+ var old = cref.$$const[name];
338
+ delete cref.$$const[name];
339
+ return old;
340
+ }
341
+
342
+ if (cref.$$autoload != null && cref.$$autoload[name] != null) {
343
+ delete cref.$$autoload[name];
344
+ return nil;
239
345
  }
240
346
 
241
- base_scope.constants.push(name);
242
- return base_scope[name] = value;
347
+ throw Opal.NameError.$new("constant "+cref+"::"+cref.$name()+" not defined");
243
348
  };
244
349
 
245
350
 
@@ -274,6 +379,10 @@
274
379
  Opal.klass = function(base, superclass, name, constructor) {
275
380
  var klass, bridged, alloc;
276
381
 
382
+ if (base == null) {
383
+ base = _Object;
384
+ }
385
+
277
386
  // If base is an object, use its class
278
387
  if (!base.$$is_class && !base.$$is_module) {
279
388
  base = base.$$class;
@@ -286,10 +395,10 @@
286
395
  }
287
396
 
288
397
  // Try to find the class in the current scope
289
- klass = base.$$scope[name];
398
+ klass = const_get_name(base, name);
290
399
 
291
400
  // If the class exists in the scope, then we must use that
292
- if (klass && klass.$$orig_scope === base.$$scope) {
401
+ if (klass) {
293
402
  // Make sure the existing constant is a class, or raise error
294
403
  if (!klass.$$is_class) {
295
404
  throw Opal.TypeError.$new(name + " is not a class");
@@ -324,8 +433,7 @@
324
433
  // the last included klass
325
434
  klass.$$parent = superclass;
326
435
 
327
- // Every class gets its own constant scope, inherited from current scope
328
- Opal.create_scope(base.$$scope, klass, name);
436
+ Opal.const_set(base, name, klass);
329
437
 
330
438
  // Name new class directly onto current scope (Opal.Foo.Baz = klass)
331
439
  base[name] = klass;
@@ -334,11 +442,6 @@
334
442
  Opal.bridge(klass, alloc);
335
443
  }
336
444
  else {
337
- // Copy all parent constants to child, unless parent is Object
338
- if (superclass !== _Object && superclass !== BasicObject) {
339
- Opal.donate_constants(superclass, klass);
340
- }
341
-
342
445
  // Call .inherited() hook with new class on the superclass
343
446
  if (superclass.$inherited) {
344
447
  superclass.$inherited(klass);
@@ -357,7 +460,7 @@
357
460
  Opal.boot_class_alloc = function(name, constructor, superclass) {
358
461
  if (superclass) {
359
462
  var alloc_proxy = function() {};
360
- alloc_proxy.prototype = superclass.$$proto || superclass.prototype;
463
+ alloc_proxy.prototype = superclass.$$proto || superclass.prototype;
361
464
  constructor.prototype = new alloc_proxy();
362
465
  }
363
466
 
@@ -370,6 +473,30 @@
370
473
  return constructor;
371
474
  };
372
475
 
476
+ Opal.setup_module_or_class = function(module) {
477
+ // @property $$id Each class/module is assigned a unique `id` that helps
478
+ // comparation and implementation of `#object_id`
479
+ module.$$id = Opal.uid();
480
+
481
+ // @property $$is_a_module Will be true for Module and its subclasses
482
+ // instances (namely: Class).
483
+ module.$$is_a_module = true;
484
+
485
+ // @property $$inc included modules
486
+ module.$$inc = [];
487
+
488
+ // initialize the name with nil
489
+ module.$$name = nil;
490
+
491
+ // Initialize the constants table
492
+ module.$$const = Object.create(null);
493
+
494
+ // @property $$cvars class variables defined in the current module
495
+ module.$$cvars = Object.create(null);
496
+ }
497
+
498
+
499
+
373
500
  // Adds common/required properties to class object (as in `Class.new`)
374
501
  //
375
502
  // @param name [String,null] The name of the class
@@ -398,16 +525,14 @@
398
525
  // The built class is the only instance of its singleton_class
399
526
  var klass = new singleton_class_alloc();
400
527
 
528
+ Opal.setup_module_or_class(klass);
529
+
401
530
  // @property $$alloc This is the constructor of instances of the current
402
531
  // class. Its prototype will be used for method lookup
403
532
  klass.$$alloc = alloc;
404
533
 
405
534
  klass.$$name = name || nil;
406
535
 
407
- // @property $$id Each class is assigned a unique `id` that helps
408
- // comparation and implementation of `#object_id`
409
- klass.$$id = Opal.uid();
410
-
411
536
  // Set a displayName for the singleton_class
412
537
  singleton_class_alloc.displayName = "#<Class:"+(name || ("#<Class:"+klass.$$id+">"))+">";
413
538
 
@@ -432,9 +557,6 @@
432
557
  // @property $$class Classes are instances of the class Class
433
558
  klass.$$class = Class;
434
559
 
435
- // @property $$inc included modules
436
- klass.$$inc = [];
437
-
438
560
  return klass;
439
561
  };
440
562
 
@@ -460,20 +582,25 @@
460
582
  Opal.module = function(base, name) {
461
583
  var module;
462
584
 
585
+ if (base == null) {
586
+ base = _Object;
587
+ }
588
+
463
589
  if (!base.$$is_class && !base.$$is_module) {
464
590
  base = base.$$class;
465
591
  }
466
592
 
467
- if ($hasOwn.call(base.$$scope, name)) {
468
- module = base.$$scope[name];
593
+ module = const_get_name(base, name);
594
+ if (module == null && base === _Object) module = const_lookup_ancestors(_Object, name);
469
595
 
596
+ if (module) {
470
597
  if (!module.$$is_module && module !== _Object) {
471
598
  throw Opal.TypeError.$new(name + " is not a module");
472
599
  }
473
600
  }
474
601
  else {
475
- module = Opal.module_allocate();
476
- Opal.create_scope(base.$$scope, module, name);
602
+ module = Opal.module_allocate(Module);
603
+ Opal.const_set(base, name, module);
477
604
  }
478
605
 
479
606
  return module;
@@ -496,20 +623,20 @@
496
623
  // Internal function to create a new module instance. This simply sets up
497
624
  // the prototype hierarchy and method tables.
498
625
  //
499
- Opal.module_allocate = function() {
626
+ Opal.module_allocate = function(superclass) {
500
627
  var mtor = function() {};
501
- mtor.prototype = Module_alloc.prototype;
628
+ mtor.prototype = superclass.$$alloc.prototype;
502
629
 
503
- function module_constructor() {}
630
+ var module_constructor = function() {};
504
631
  module_constructor.prototype = new mtor();
505
632
 
506
633
  var module = new module_constructor();
507
634
  var module_prototype = {};
508
- var superclass = Module;
509
635
 
510
- // @property $$id Each class is assigned a unique `id` that helps
511
- // comparation and implementation of `#object_id`
512
- module.$$id = Opal.uid();
636
+ Opal.setup_module_or_class(module);
637
+
638
+ // initialize dependency tracking
639
+ module.$$included_in = [];
513
640
 
514
641
  // Set the display name of the singleton prototype holder
515
642
  module_constructor.displayName = "#<Class:#<Module:"+module.$$id+">>"
@@ -540,18 +667,6 @@
540
667
  // the last included module
541
668
  module.$$parent = superclass;
542
669
 
543
- // @property $$inc included modules
544
- module.$$inc = [];
545
-
546
- // mark the object as a module
547
- module.$$is_module = true;
548
-
549
- // initialize dependency tracking
550
- module.$$dep = [];
551
-
552
- // initialize the name with nil
553
- module.$$name = nil;
554
-
555
670
  return module;
556
671
  };
557
672
 
@@ -604,12 +719,9 @@
604
719
  superclass = object === BasicObject ? Class : Opal.build_class_singleton_class(object.$$super);
605
720
 
606
721
  klass = Opal.setup_class_object(null, alloc, superclass.$$name, superclass.constructor);
607
- klass.$$super = superclass;
722
+ klass.$$super = superclass;
608
723
  klass.$$parent = superclass;
609
724
 
610
- // The singleton_class retains the same scope as the original class
611
- Opal.create_scope(object.$$scope, klass);
612
-
613
725
  klass.$$is_singleton = true;
614
726
  klass.$$singleton_of = object;
615
727
 
@@ -630,7 +742,6 @@
630
742
  klass.$$super = superclass;
631
743
  klass.$$parent = superclass;
632
744
  klass.$$class = superclass.$$class;
633
- klass.$$scope = superclass.$$scope;
634
745
  klass.$$proto = object;
635
746
 
636
747
  klass.$$is_singleton = true;
@@ -639,11 +750,62 @@
639
750
  return object.$$meta = klass;
640
751
  };
641
752
 
753
+ // Returns an object containing all pairs of names/values
754
+ // for all class variables defined in provided +module+
755
+ // and its ancestors.
756
+ //
757
+ // @param module [Module]
758
+ // @return [Object]
759
+ Opal.class_variables = function(module) {
760
+ var ancestors = Opal.ancestors(module),
761
+ i, length = ancestors.length,
762
+ result = {};
763
+
764
+ for (i = length - 1; i >= 0; i--) {
765
+ var ancestor = ancestors[i];
766
+
767
+ for (var cvar in ancestor.$$cvars) {
768
+ result[cvar] = ancestor.$$cvars[cvar];
769
+ }
770
+ }
771
+
772
+ return result;
773
+ }
774
+
775
+ // Sets class variable with specified +name+ to +value+
776
+ // in provided +module+
777
+ //
778
+ // @param module [Module]
779
+ // @param name [String]
780
+ // @param value [Object]
781
+ Opal.class_variable_set = function(module, name, value) {
782
+ var ancestors = Opal.ancestors(module),
783
+ i, length = ancestors.length;
784
+
785
+ for (i = length - 2; i >= 0; i--) {
786
+ var ancestor = ancestors[i];
787
+
788
+ if ($hasOwn.call(ancestor.$$cvars, name)) {
789
+ ancestor.$$cvars[name] = value;
790
+ return value;
791
+ }
792
+ }
793
+
794
+ module.$$cvars[name] = value;
795
+
796
+ return value;
797
+ }
798
+
642
799
  // Bridges a single method.
643
- Opal.bridge_method = function(target, from, name, body) {
800
+ //
801
+ // @param target [JS::Function] the constructor of the bridged class
802
+ // @param from [Module] the module/class we are importing the method from
803
+ // @param name [String] the method name in JS land (i.e. starting with $)
804
+ // @param body [JS::Function] the body of the method
805
+ Opal.bridge_method = function(target_constructor, from, name, body) {
644
806
  var ancestors, i, ancestor, length;
645
807
 
646
- ancestors = target.$$bridge.$ancestors();
808
+ ancestors = target_constructor.$$bridge.$ancestors();
647
809
 
648
810
  // order important here, we have to check for method presence in
649
811
  // ancestors from the bridged class to the last ancestor
@@ -659,45 +821,83 @@
659
821
  }
660
822
 
661
823
  if (ancestor === from) {
662
- target.prototype[name] = body
824
+ target_constructor.prototype[name] = body
663
825
  break;
664
826
  }
665
827
  }
666
-
667
828
  };
668
829
 
669
830
  // Bridges from *donator* to a *target*.
670
- Opal._bridge = function(target, donator) {
671
- var id, methods, method, i, bridged;
672
-
673
- if (typeof(target) === "function") {
674
- id = donator.$__id__();
675
- methods = donator.$instance_methods();
831
+ //
832
+ // @param target [Module] the potentially associated with bridged classes module
833
+ // @param donator [Module] the module/class source of the methods that should be bridged
834
+ Opal.bridge_methods = function(target, donator) {
835
+ var i,
836
+ bridged = BridgedClasses[target.$__id__()],
837
+ donator_id = donator.$__id__();
676
838
 
677
- for (i = methods.length - 1; i >= 0; i--) {
678
- method = '$' + methods[i];
839
+ if (bridged) {
840
+ BridgedClasses[donator_id] = bridged.slice();
679
841
 
680
- Opal.bridge_method(target, donator, method, donator.$$proto[method]);
842
+ for (i = bridged.length - 1; i >= 0; i--) {
843
+ Opal_bridge_methods_to_constructor(bridged[i], donator)
681
844
  }
845
+ }
846
+ };
682
847
 
683
- if (!bridges[id]) {
684
- bridges[id] = [];
685
- }
848
+ // Actually bridge methods to the bridged (shared) prototype.
849
+ function Opal_bridge_methods_to_constructor(target_constructor, donator) {
850
+ var i,
851
+ method,
852
+ methods = donator.$instance_methods();
686
853
 
687
- bridges[id].push(target);
854
+ for (i = methods.length - 1; i >= 0; i--) {
855
+ method = '$' + methods[i];
856
+ Opal.bridge_method(target_constructor, donator, method, donator.$$proto[method]);
688
857
  }
689
- else {
690
- bridged = bridges[target.$__id__()];
858
+ }
691
859
 
692
- if (bridged) {
693
- for (i = bridged.length - 1; i >= 0; i--) {
694
- Opal._bridge(bridged[i], donator);
695
- }
860
+ // Associate the target as a bridged class for the current "donator"
861
+ function Opal_add_bridged_constructor(target_constructor, donator) {
862
+ var donator_id = donator.$__id__();
863
+
864
+ if (!BridgedClasses[donator_id]) {
865
+ BridgedClasses[donator_id] = [];
866
+ }
867
+ BridgedClasses[donator_id].push(target_constructor);
868
+ }
869
+
870
+ // Walks the dependency tree detecting the presence of the base among its
871
+ // own dependencies.
872
+ //
873
+ // @param [Integer] base_id The id of the base module (eg. the "includer")
874
+ // @param [Array<Module>] deps The array of dependencies (eg. the included module, included.$$deps)
875
+ // @param [String] prop The property that holds dependencies (eg. "$$deps")
876
+ // @param [JS::Object] seen A JS object holding the cache of already visited objects
877
+ // @return [Boolean] true if a cyclic dependency is present
878
+ Opal.has_cyclic_dep = function has_cyclic_dep(base_id, deps, prop, seen) {
879
+ var i, dep_id, dep;
880
+
881
+ for (i = deps.length - 1; i >= 0; i--) {
882
+ dep = deps[i];
883
+ dep_id = dep.$$id;
884
+
885
+ if (seen[dep_id]) {
886
+ continue;
887
+ }
888
+ seen[dep_id] = true;
696
889
 
697
- bridges[donator.$__id__()] = bridged.slice();
890
+ if (dep_id === base_id) {
891
+ return true;
892
+ }
893
+
894
+ if (has_cyclic_dep(base_id, dep[prop], prop, seen)) {
895
+ return true;
698
896
  }
699
897
  }
700
- };
898
+
899
+ return false;
900
+ }
701
901
 
702
902
  // The actual inclusion of a module into a class.
703
903
  //
@@ -715,54 +915,45 @@
715
915
  // the required method.
716
916
  //
717
917
  // @param module [Module] the module to include
718
- // @param klass [Class] the target class to include module into
918
+ // @param includer [Module] the target class to include module into
719
919
  // @return [null]
720
- Opal.append_features = function(module, klass) {
920
+ Opal.append_features = function(module, includer) {
721
921
  var iclass, donator, prototype, methods, id, i;
722
922
 
723
923
  // check if this module is already included in the class
724
- for (i = klass.$$inc.length - 1; i >= 0; i--) {
725
- if (klass.$$inc[i] === module) {
924
+ for (i = includer.$$inc.length - 1; i >= 0; i--) {
925
+ if (includer.$$inc[i] === module) {
726
926
  return;
727
927
  }
728
928
  }
729
929
 
730
- klass.$$inc.push(module);
731
- module.$$dep.push(klass);
732
- Opal._bridge(klass, module);
930
+ // Check that the base module is not also a dependency, classes can't be
931
+ // dependencies so we have a special case for them.
932
+ if (!includer.$$is_class && Opal.has_cyclic_dep(includer.$$id, [module], '$$inc', {})) {
933
+ throw Opal.ArgumentError.$new('cyclic include detected')
934
+ }
935
+
936
+ Opal.const_cache_version++;
937
+ includer.$$inc.push(module);
938
+ module.$$included_in.push(includer);
939
+ Opal.bridge_methods(includer, module);
733
940
 
734
941
  // iclass
735
942
  iclass = {
736
943
  $$name: module.$$name,
737
944
  $$proto: module.$$proto,
738
- $$parent: klass.$$parent,
945
+ $$parent: includer.$$parent,
739
946
  $$module: module,
740
947
  $$iclass: true
741
948
  };
742
949
 
743
- klass.$$parent = iclass;
950
+ includer.$$parent = iclass;
744
951
 
745
- donator = module.$$proto;
746
- prototype = klass.$$proto;
747
- methods = module.$instance_methods();
952
+ methods = module.$instance_methods();
748
953
 
749
954
  for (i = methods.length - 1; i >= 0; i--) {
750
- id = '$' + methods[i];
751
-
752
- // if the target class already has a method of the same name defined
753
- // and that method was NOT donated, then it must be a method defined
754
- // by the class so we do not want to override it
755
- if ( prototype.hasOwnProperty(id) &&
756
- !prototype[id].$$donated &&
757
- !prototype[id].$$stub) {
758
- continue;
759
- }
760
-
761
- prototype[id] = donator[id];
762
- prototype[id].$$donated = module;
955
+ Opal.update_includer(module, includer, '$' + methods[i])
763
956
  }
764
-
765
- Opal.donate_constants(module, klass);
766
957
  };
767
958
 
768
959
  // Table that holds all methods that have been defined on all objects
@@ -808,7 +999,8 @@
808
999
  // order important here, we have to bridge from the last ancestor to the
809
1000
  // bridged class
810
1001
  for (var i = ancestors.length - 1; i >= 0; i--) {
811
- Opal._bridge(constructor, ancestors[i]);
1002
+ Opal_add_bridged_constructor(constructor, ancestors[i]);
1003
+ Opal_bridge_methods_to_constructor(constructor, ancestors[i]);
812
1004
  }
813
1005
 
814
1006
  for (var name in BasicObject_alloc.prototype) {
@@ -822,69 +1014,64 @@
822
1014
  return klass;
823
1015
  };
824
1016
 
825
- // When a source module is included into the target module, we must also copy
826
- // its constants to the target.
827
- //
828
- Opal.donate_constants = function(source_mod, target_mod) {
829
- var source_constants = source_mod.$$scope.constants,
830
- target_scope = target_mod.$$scope,
831
- target_constants = target_scope.constants;
832
-
833
- for (var i = 0, length = source_constants.length; i < length; i++) {
834
- target_constants.push(source_constants[i]);
835
- target_scope[source_constants[i]] = source_mod.$$scope[source_constants[i]];
836
- }
837
- };
838
-
839
- // Donate methods for a module.
840
- Opal.donate = function(module, jsid) {
841
- var included_in = module.$$dep,
842
- body = module.$$proto[jsid],
843
- i, length, includee, dest, current,
1017
+ // Update `jsid` method cache of all classes / modules including `module`.
1018
+ Opal.update_includer = function(module, includer, jsid) {
1019
+ var dest, current, body,
844
1020
  klass_includees, j, jj, current_owner_index, module_index;
845
1021
 
846
- if (!included_in) {
847
- return;
848
- }
849
-
850
- for (i = 0, length = included_in.length; i < length; i++) {
851
- includee = included_in[i];
852
- dest = includee.$$proto;
853
- current = dest[jsid];
1022
+ body = module.$$proto[jsid];
1023
+ dest = includer.$$proto;
1024
+ current = dest[jsid];
854
1025
 
855
- if (dest.hasOwnProperty(jsid) && !current.$$donated && !current.$$stub) {
856
- // target class has already defined the same method name - do nothing
857
- }
858
- else if (dest.hasOwnProperty(jsid) && !current.$$stub) {
859
- // target class includes another module that has defined this method
860
- klass_includees = includee.$$inc;
1026
+ if (dest.hasOwnProperty(jsid) && !current.$$donated && !current.$$stub) {
1027
+ // target class has already defined the same method name - do nothing
1028
+ }
1029
+ else if (dest.hasOwnProperty(jsid) && !current.$$stub) {
1030
+ // target class includes another module that has defined this method
1031
+ klass_includees = includer.$$inc;
861
1032
 
862
- for (j = 0, jj = klass_includees.length; j < jj; j++) {
863
- if (klass_includees[j] === current.$$donated) {
864
- current_owner_index = j;
865
- }
866
- if (klass_includees[j] === module) {
867
- module_index = j;
868
- }
1033
+ for (j = 0, jj = klass_includees.length; j < jj; j++) {
1034
+ if (klass_includees[j] === current.$$donated) {
1035
+ current_owner_index = j;
869
1036
  }
870
-
871
- // only redefine method on class if the module was included AFTER
872
- // the module which defined the current method body. Also make sure
873
- // a module can overwrite a method it defined before
874
- if (current_owner_index <= module_index) {
875
- dest[jsid] = body;
876
- dest[jsid].$$donated = module;
1037
+ if (klass_includees[j] === module) {
1038
+ module_index = j;
877
1039
  }
878
1040
  }
879
- else {
880
- // neither a class, or module included by class, has defined method
1041
+
1042
+ // only redefine method on class if the module was included AFTER
1043
+ // the module which defined the current method body. Also make sure
1044
+ // a module can overwrite a method it defined before
1045
+ if (current_owner_index <= module_index) {
881
1046
  dest[jsid] = body;
882
1047
  dest[jsid].$$donated = module;
883
1048
  }
1049
+ }
1050
+ else {
1051
+ // neither a class, or module included by class, has defined method
1052
+ dest[jsid] = body;
1053
+ dest[jsid].$$donated = module;
1054
+ }
884
1055
 
885
- if (includee.$$dep) {
886
- Opal.donate(includee, jsid);
887
- }
1056
+ // if the includer is a module, recursively update all of its includres.
1057
+ if (includer.$$included_in) {
1058
+ Opal.update_includers(includer, jsid);
1059
+ }
1060
+ };
1061
+
1062
+ // Update `jsid` method cache of all classes / modules including `module`.
1063
+ Opal.update_includers = function(module, jsid) {
1064
+ var i, ii, includee, included_in;
1065
+
1066
+ included_in = module.$$included_in;
1067
+
1068
+ if (!included_in) {
1069
+ return;
1070
+ }
1071
+
1072
+ for (i = 0, ii = included_in.length; i < ii; i++) {
1073
+ includee = included_in[i];
1074
+ Opal.update_includer(module, includee, jsid);
888
1075
  }
889
1076
  };
890
1077
 
@@ -892,14 +1079,14 @@
892
1079
  Opal.ancestors = function(module_or_class) {
893
1080
  var parent = module_or_class,
894
1081
  result = [],
895
- modules;
1082
+ modules, i, ii, j, jj;
896
1083
 
897
1084
  while (parent) {
898
1085
  result.push(parent);
899
- for (var i=0; i < parent.$$inc.length; i++) {
1086
+ for (i = parent.$$inc.length-1; i >= 0; i--) {
900
1087
  modules = Opal.ancestors(parent.$$inc[i]);
901
1088
 
902
- for(var j = 0; j < modules.length; j++) {
1089
+ for(j = 0, jj = modules.length; j < jj; j++) {
903
1090
  result.push(modules[j]);
904
1091
  }
905
1092
  }
@@ -952,19 +1139,23 @@
952
1139
  var subscriber, subscribers = Opal.stub_subscribers,
953
1140
  i, ilength = stubs.length,
954
1141
  j, jlength = subscribers.length,
955
- method_name, stub;
1142
+ method_name, stub,
1143
+ opal_stubs = Opal.stubs;
956
1144
 
957
1145
  for (i = 0; i < ilength; i++) {
958
1146
  method_name = stubs[i];
959
- // Save method name to populate other subscribers with this stub
960
- Opal.stubs[method_name] = true;
961
- stub = Opal.stub_for(method_name);
962
1147
 
963
- for (j = 0; j < jlength; j++) {
964
- subscriber = subscribers[j];
1148
+ if(!opal_stubs.hasOwnProperty(method_name)) {
1149
+ // Save method name to populate other subscribers with this stub
1150
+ opal_stubs[method_name] = true;
1151
+ stub = Opal.stub_for(method_name);
1152
+
1153
+ for (j = 0; j < jlength; j++) {
1154
+ subscriber = subscribers[j];
965
1155
 
966
- if (!(method_name in subscriber)) {
967
- subscriber[method_name] = stub;
1156
+ if (!(method_name in subscriber)) {
1157
+ subscriber[method_name] = stub;
1158
+ }
968
1159
  }
969
1160
  }
970
1161
  }
@@ -1045,11 +1236,11 @@
1045
1236
  var inspect = "`block in " + context + "'";
1046
1237
 
1047
1238
  throw Opal.ArgumentError.$new(inspect + ': wrong number of arguments (' + actual + ' for ' + expected + ')');
1048
- }
1239
+ };
1049
1240
 
1050
1241
  // Super dispatcher
1051
- Opal.find_super_dispatcher = function(obj, jsid, current_func, defcheck, defs) {
1052
- var dispatcher;
1242
+ Opal.find_super_dispatcher = function(obj, mid, current_func, defcheck, defs) {
1243
+ var dispatcher, super_method;
1053
1244
 
1054
1245
  if (defs) {
1055
1246
  if (obj.$$is_class || obj.$$is_module) {
@@ -1060,17 +1251,17 @@
1060
1251
  }
1061
1252
  }
1062
1253
  else {
1063
- dispatcher = Opal.find_obj_super_dispatcher(obj, jsid, current_func);
1254
+ dispatcher = Opal.find_obj_super_dispatcher(obj, mid, current_func);
1064
1255
  }
1065
1256
 
1066
- dispatcher = dispatcher['$' + jsid];
1257
+ super_method = dispatcher['$' + mid];
1067
1258
 
1068
- if (!defcheck && dispatcher.$$stub && Opal.Kernel.$method_missing === obj.$method_missing) {
1259
+ if (!defcheck && super_method.$$stub && Opal.Kernel.$method_missing === obj.$method_missing) {
1069
1260
  // method_missing hasn't been explicitly defined
1070
- throw Opal.NoMethodError.$new('super: no superclass method `'+jsid+"' for "+obj, jsid);
1261
+ throw Opal.NoMethodError.$new('super: no superclass method `'+mid+"' for "+obj, mid);
1071
1262
  }
1072
1263
 
1073
- return dispatcher;
1264
+ return super_method;
1074
1265
  };
1075
1266
 
1076
1267
  // Iter dispatcher for super in a block
@@ -1092,7 +1283,7 @@
1092
1283
  return Opal.find_super_dispatcher(obj, call_jsid, current_func, defcheck);
1093
1284
  };
1094
1285
 
1095
- Opal.find_obj_super_dispatcher = function(obj, jsid, current_func) {
1286
+ Opal.find_obj_super_dispatcher = function(obj, mid, current_func) {
1096
1287
  var klass = obj.$$meta || obj.$$class;
1097
1288
 
1098
1289
  // first we need to find the class/module current_func is located on
@@ -1102,8 +1293,7 @@
1102
1293
  throw new Error("could not find current class for super()");
1103
1294
  }
1104
1295
 
1105
- jsid = '$' + jsid;
1106
- return Opal.find_super_func(klass, jsid, current_func);
1296
+ return Opal.find_super_func(klass, '$' + mid, current_func);
1107
1297
  };
1108
1298
 
1109
1299
  Opal.find_owning_class = function(klass, current_func) {
@@ -1234,6 +1424,9 @@
1234
1424
  return result;
1235
1425
  }
1236
1426
  }
1427
+ else if (candidate === Opal.JS.Error) {
1428
+ return candidate;
1429
+ }
1237
1430
  else if (candidate['$==='](exception)) {
1238
1431
  return candidate;
1239
1432
  }
@@ -1243,19 +1436,15 @@
1243
1436
  };
1244
1437
 
1245
1438
  Opal.is_a = function(object, klass) {
1246
- if (object.$$meta === klass) {
1439
+ if (object.$$meta === klass || object.$$class === klass) {
1247
1440
  return true;
1248
1441
  }
1249
1442
 
1250
- var i, length, ancestors = Opal.ancestors(object.$$class);
1251
-
1252
- for (i = 0, length = ancestors.length; i < length; i++) {
1253
- if (ancestors[i] === klass) {
1254
- return true;
1255
- }
1443
+ if (object.$$is_number && klass.$$is_number_class) {
1444
+ return true;
1256
1445
  }
1257
1446
 
1258
- ancestors = Opal.ancestors(object.$$meta);
1447
+ var i, length, ancestors = Opal.ancestors(object.$$is_class ? Opal.get_singleton_class(object) : (object.$$meta || object.$$class));
1259
1448
 
1260
1449
  for (i = 0, length = ancestors.length; i < length; i++) {
1261
1450
  if (ancestors[i] === klass) {
@@ -1384,47 +1573,40 @@
1384
1573
  return Opal.hash2(keys, map);
1385
1574
  };
1386
1575
 
1387
- // Call a ruby method on a ruby object with some arguments:
1576
+ // Calls passed method on a ruby object with arguments and block:
1577
+ //
1578
+ // Can take a method or a method name.
1579
+ //
1580
+ // 1. When method name gets passed it invokes it by its name
1581
+ // and calls 'method_missing' when object doesn't have this method.
1582
+ // Used internally by Opal to invoke method that takes a block or a splat.
1583
+ // 2. When method (i.e. method body) gets passed, it doesn't trigger 'method_missing'
1584
+ // because it doesn't know the name of the actual method.
1585
+ // Used internally by Opal to invoke 'super'.
1388
1586
  //
1389
1587
  // @example
1390
1588
  // var my_array = [1, 2, 3, 4]
1391
- // Opal.send(my_array, 'length') # => 4
1392
- // Opal.send(my_array, 'reverse!') # => [4, 3, 2, 1]
1589
+ // Opal.send(my_array, 'length') # => 4
1590
+ // Opal.send(my_array, my_array.$length) # => 4
1393
1591
  //
1394
- // A missing method will be forwarded to the object via
1395
- // method_missing.
1592
+ // Opal.send(my_array, 'reverse!') # => [4, 3, 2, 1]
1593
+ // Opal.send(my_array, my_array['$reverse!']') # => [4, 3, 2, 1]
1396
1594
  //
1397
- // The result of either call with be returned.
1398
- //
1399
- // @param recv [Object] the ruby object
1400
- // @param mid [String] ruby method to call
1401
- // @return [Object] forwards the return value of the method (or of method_missing)
1402
- Opal.send = function(recv, mid) {
1403
- var args_ary = new Array(Math.max(arguments.length - 2, 0));
1404
- for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = arguments[i + 2]; }
1405
-
1406
- var func = recv['$' + mid];
1595
+ // @param recv [Object] ruby object
1596
+ // @param method [Function, String] method body or name of the method
1597
+ // @param args [Array] arguments that will be passed to the method call
1598
+ // @param block [Function] ruby block
1599
+ // @return [Object] returning value of the method call
1600
+ Opal.send = function(recv, method, args, block) {
1601
+ var body = (typeof(method) === 'string') ? recv['$'+method] : method;
1407
1602
 
1408
- if (func) {
1409
- return func.apply(recv, args_ary);
1603
+ if (body != null) {
1604
+ body.$$p = block;
1605
+ return body.apply(recv, args);
1410
1606
  }
1411
1607
 
1412
- return recv.$method_missing.apply(recv, [mid].concat(args_ary));
1413
- };
1414
-
1415
- Opal.block_send = function(recv, mid, block) {
1416
- var args_ary = new Array(Math.max(arguments.length - 3, 0));
1417
- for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = arguments[i + 3]; }
1418
-
1419
- var func = recv['$' + mid];
1420
-
1421
- if (func) {
1422
- func.$$p = block;
1423
- return func.apply(recv, args_ary);
1424
- }
1425
-
1426
- return recv.$method_missing.apply(recv, [mid].concat(args_ary));
1427
- };
1608
+ return recv.$method_missing.apply(recv, [method].concat(args));
1609
+ }
1428
1610
 
1429
1611
  // Used to define methods on an object. This is a helper method, used by the
1430
1612
  // compiled source to define methods on special case objects when the compiler
@@ -1462,29 +1644,41 @@
1462
1644
  // @param body [JS.Function] the literal JavaScript function used as method
1463
1645
  // @return [null]
1464
1646
  //
1647
+ Opal.def = function(obj, jsid, body) {
1648
+ // if instance_eval is invoked on a module/class, it sets inst_eval_mod
1649
+ if (!obj.$$eval && (obj.$$is_class || obj.$$is_module)) {
1650
+ Opal.defn(obj, jsid, body);
1651
+ }
1652
+ else {
1653
+ Opal.defs(obj, jsid, body);
1654
+ }
1655
+ };
1656
+
1657
+ // Define method on a module or class (see Opal.def).
1465
1658
  Opal.defn = function(obj, jsid, body) {
1466
1659
  obj.$$proto[jsid] = body;
1467
1660
  // for super dispatcher, etc.
1468
1661
  body.$$owner = obj;
1662
+ if (body.displayName == null) body.displayName = jsid.substr(1);
1469
1663
 
1664
+ // is it a module?
1470
1665
  if (obj.$$is_module) {
1471
- Opal.donate(obj, jsid);
1666
+ Opal.update_includers(obj, jsid);
1472
1667
 
1473
1668
  if (obj.$$module_function) {
1474
1669
  Opal.defs(obj, jsid, body);
1475
1670
  }
1476
1671
  }
1477
1672
 
1478
- if (obj.$__id__ && !obj.$__id__.$$stub) {
1479
- var bridged = bridges[obj.$__id__()];
1480
-
1481
- if (bridged) {
1482
- for (var i = bridged.length - 1; i >= 0; i--) {
1483
- Opal.bridge_method(bridged[i], obj, jsid, body);
1484
- }
1673
+ // is it a bridged class?
1674
+ var bridged = obj.$__id__ && !obj.$__id__.$$stub && BridgedClasses[obj.$__id__()];
1675
+ if (bridged) {
1676
+ for (var i = bridged.length - 1; i >= 0; i--) {
1677
+ Opal.bridge_method(bridged[i], obj, jsid, body);
1485
1678
  }
1486
1679
  }
1487
1680
 
1681
+ // method_added/singleton_method_added hooks
1488
1682
  var singleton_of = obj.$$singleton_of;
1489
1683
  if (obj.$method_added && !obj.$method_added.$$stub && !singleton_of) {
1490
1684
  obj.$method_added(jsid.substr(1));
@@ -1496,24 +1690,14 @@
1496
1690
  return nil;
1497
1691
  };
1498
1692
 
1499
- // Define a singleton method on the given object.
1693
+ // Define a singleton method on the given object (see Opal.def).
1500
1694
  Opal.defs = function(obj, jsid, body) {
1501
1695
  Opal.defn(Opal.get_singleton_class(obj), jsid, body)
1502
1696
  };
1503
1697
 
1504
- Opal.def = function(obj, jsid, body) {
1505
- // if instance_eval is invoked on a module/class, it sets inst_eval_mod
1506
- if (!obj.$$eval && (obj.$$is_class || obj.$$is_module)) {
1507
- Opal.defn(obj, jsid, body);
1508
- }
1509
- else {
1510
- Opal.defs(obj, jsid, body);
1511
- }
1512
- };
1513
-
1514
1698
  // Called from #remove_method.
1515
1699
  Opal.rdef = function(obj, jsid) {
1516
- // TODO: remove from bridges as well
1700
+ // TODO: remove from BridgedClasses as well
1517
1701
 
1518
1702
  if (!$hasOwn.call(obj.$$proto, jsid)) {
1519
1703
  throw Opal.NameError.$new("method '" + jsid.substr(1) + "' not defined in " + obj.$name());
@@ -1556,9 +1740,10 @@
1556
1740
  Opal.alias = function(obj, name, old) {
1557
1741
  var id = '$' + name,
1558
1742
  old_id = '$' + old,
1559
- body = obj.$$proto['$' + old];
1743
+ body = obj.$$proto['$' + old],
1744
+ alias;
1560
1745
 
1561
- // instance_eval is being run on a class/module, so that need to alias class methods
1746
+ // When running inside #instance_eval the alias refers to class methods.
1562
1747
  if (obj.$$eval) {
1563
1748
  return Opal.alias(Opal.get_singleton_class(obj), name, old);
1564
1749
  }
@@ -1576,7 +1761,35 @@
1576
1761
  }
1577
1762
  }
1578
1763
 
1579
- Opal.defn(obj, id, body);
1764
+ // If the body is itself an alias use the original body
1765
+ // to keep the max depth at 1.
1766
+ if (body.$$alias_of) body = body.$$alias_of;
1767
+
1768
+ // We need a wrapper because otherwise method $$owner and other properties
1769
+ // would be ovrewritten on the original body.
1770
+ alias = function() {
1771
+ var block = alias.$$p, args, i, ii;
1772
+
1773
+ args = new Array(arguments.length);
1774
+ for(i = 0, ii = arguments.length; i < ii; i++) {
1775
+ args[i] = arguments[i];
1776
+ }
1777
+
1778
+ if (block != null) { alias.$$p = null }
1779
+
1780
+ return Opal.send(this, body, args, block);
1781
+ };
1782
+
1783
+ // Try to make the browser pick the right name
1784
+ alias.displayName = name;
1785
+ alias.length = body.length;
1786
+ alias.$$arity = body.$$arity;
1787
+ alias.$$parameters = body.$$parameters;
1788
+ alias.$$source_location = body.$$source_location;
1789
+ alias.$$alias_of = body;
1790
+ alias.$$alias_name = name;
1791
+
1792
+ Opal.defn(obj, id, alias);
1580
1793
 
1581
1794
  return obj;
1582
1795
  };
@@ -1599,8 +1812,8 @@
1599
1812
  // ------
1600
1813
 
1601
1814
  Opal.hash_init = function(hash) {
1602
- hash.$$smap = {};
1603
- hash.$$map = {};
1815
+ hash.$$smap = Object.create(null);
1816
+ hash.$$map = Object.create(null);
1604
1817
  hash.$$keys = [];
1605
1818
  };
1606
1819
 
@@ -1608,11 +1821,11 @@
1608
1821
  to_hash.$$none = from_hash.$$none;
1609
1822
  to_hash.$$proc = from_hash.$$proc;
1610
1823
 
1611
- for (var i = 0, keys = from_hash.$$keys, length = keys.length, key, value; i < length; i++) {
1612
- key = from_hash.$$keys[i];
1824
+ for (var i = 0, keys = from_hash.$$keys, smap = from_hash.$$smap, len = keys.length, key, value; i < len; i++) {
1825
+ key = keys[i];
1613
1826
 
1614
1827
  if (key.$$is_string) {
1615
- value = from_hash.$$smap[key];
1828
+ value = smap[key];
1616
1829
  } else {
1617
1830
  value = key.value;
1618
1831
  key = key.key;
@@ -1624,16 +1837,17 @@
1624
1837
 
1625
1838
  Opal.hash_put = function(hash, key, value) {
1626
1839
  if (key.$$is_string) {
1627
- if (!hash.$$smap.hasOwnProperty(key)) {
1840
+ if (!$hasOwn.call(hash.$$smap, key)) {
1628
1841
  hash.$$keys.push(key);
1629
1842
  }
1630
1843
  hash.$$smap[key] = value;
1631
1844
  return;
1632
1845
  }
1633
1846
 
1634
- var key_hash = key.$hash(), bucket, last_bucket;
1847
+ var key_hash, bucket, last_bucket;
1848
+ key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash();
1635
1849
 
1636
- if (!hash.$$map.hasOwnProperty(key_hash)) {
1850
+ if (!$hasOwn.call(hash.$$map, key_hash)) {
1637
1851
  bucket = {key: key, key_hash: key_hash, value: value};
1638
1852
  hash.$$keys.push(bucket);
1639
1853
  hash.$$map[key_hash] = bucket;
@@ -1661,15 +1875,16 @@
1661
1875
 
1662
1876
  Opal.hash_get = function(hash, key) {
1663
1877
  if (key.$$is_string) {
1664
- if (hash.$$smap.hasOwnProperty(key)) {
1878
+ if ($hasOwn.call(hash.$$smap, key)) {
1665
1879
  return hash.$$smap[key];
1666
1880
  }
1667
1881
  return;
1668
1882
  }
1669
1883
 
1670
- var key_hash = key.$hash(), bucket;
1884
+ var key_hash, bucket;
1885
+ key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash();
1671
1886
 
1672
- if (hash.$$map.hasOwnProperty(key_hash)) {
1887
+ if ($hasOwn.call(hash.$$map, key_hash)) {
1673
1888
  bucket = hash.$$map[key_hash];
1674
1889
 
1675
1890
  while (bucket) {
@@ -1685,7 +1900,7 @@
1685
1900
  var i, keys = hash.$$keys, length = keys.length, value;
1686
1901
 
1687
1902
  if (key.$$is_string) {
1688
- if (!hash.$$smap.hasOwnProperty(key)) {
1903
+ if (!$hasOwn.call(hash.$$smap, key)) {
1689
1904
  return;
1690
1905
  }
1691
1906
 
@@ -1703,7 +1918,7 @@
1703
1918
 
1704
1919
  var key_hash = key.$hash();
1705
1920
 
1706
- if (!hash.$$map.hasOwnProperty(key_hash)) {
1921
+ if (!$hasOwn.call(hash.$$map, key_hash)) {
1707
1922
  return;
1708
1923
  }
1709
1924
 
@@ -1778,7 +1993,7 @@
1778
1993
 
1779
1994
  hash.$$keys[i].key_hash = key_hash;
1780
1995
 
1781
- if (!hash.$$map.hasOwnProperty(key_hash)) {
1996
+ if (!$hasOwn.call(hash.$$map, key_hash)) {
1782
1997
  hash.$$map[key_hash] = hash.$$keys[i];
1783
1998
  continue;
1784
1999
  }
@@ -1832,7 +2047,7 @@
1832
2047
  if (arguments_length === 1) {
1833
2048
  args = arguments[0];
1834
2049
  for (key in args) {
1835
- if (args.hasOwnProperty(key)) {
2050
+ if ($hasOwn.call(args, key)) {
1836
2051
  value = args[key];
1837
2052
 
1838
2053
  Opal.hash_put(hash, key, value);
@@ -1856,16 +2071,16 @@
1856
2071
  return hash;
1857
2072
  };
1858
2073
 
1859
- // hash2 is a faster creator for hashes that just use symbols and
2074
+ // A faster Hash creator for hashes that just use symbols and
1860
2075
  // strings as keys. The map and keys array can be constructed at
1861
2076
  // compile time, so they are just added here by the constructor
1862
- // function
2077
+ // function.
1863
2078
  //
1864
2079
  Opal.hash2 = function(keys, smap) {
1865
2080
  var hash = new Opal.Hash.$$alloc();
1866
2081
 
1867
2082
  hash.$$smap = smap;
1868
- hash.$$map = {};
2083
+ hash.$$map = Object.create(null);
1869
2084
  hash.$$keys = keys;
1870
2085
 
1871
2086
  return hash;
@@ -1878,11 +2093,14 @@
1878
2093
  var range = new Opal.Range.$$alloc();
1879
2094
  range.begin = first;
1880
2095
  range.end = last;
1881
- range.exclude = exc;
2096
+ range.excl = exc;
1882
2097
 
1883
2098
  return range;
1884
2099
  };
1885
2100
 
2101
+ // Get the ivar name for a given name.
2102
+ // Mostly adds a trailing $ to reserved names.
2103
+ //
1886
2104
  Opal.ivar = function(name) {
1887
2105
  if (
1888
2106
  // properties
@@ -1905,6 +2123,21 @@
1905
2123
  };
1906
2124
 
1907
2125
 
2126
+ // Regexps
2127
+ // -------
2128
+
2129
+ // Escape Regexp special chars letting the resulting string be used to build
2130
+ // a new Regexp.
2131
+ //
2132
+ Opal.escape_regexp = function(str) {
2133
+ return str.replace(/([-[\]\/{}()*+?.^$\\| ])/g, '\\$1')
2134
+ .replace(/[\n]/g, '\\n')
2135
+ .replace(/[\r]/g, '\\r')
2136
+ .replace(/[\f]/g, '\\f')
2137
+ .replace(/[\t]/g, '\\t');
2138
+ }
2139
+
2140
+
1908
2141
  // Require system
1909
2142
  // --------------
1910
2143
 
@@ -1920,6 +2153,7 @@
1920
2153
  path = Opal.current_dir.replace(/\/*$/, '/') + path;
1921
2154
  }
1922
2155
 
2156
+ path = path.replace(/^\.\//, '');
1923
2157
  path = path.replace(/\.(rb|opal|js)$/, '');
1924
2158
  parts = path.split(SEPARATOR);
1925
2159
 
@@ -1998,10 +2232,15 @@
1998
2232
  Opal.Module = Module = Opal.setup_class_object('Module', Module_alloc, 'Object', _Object.constructor);
1999
2233
  Opal.Class = Class = Opal.setup_class_object('Class', Class_alloc, 'Module', Module.constructor);
2000
2234
 
2001
- Opal.constants.push("BasicObject");
2002
- Opal.constants.push("Object");
2003
- Opal.constants.push("Module");
2004
- Opal.constants.push("Class");
2235
+ // BasicObject can reach itself, avoid const_set to skip the $$base_module logic
2236
+ BasicObject.$$const["BasicObject"] = BasicObject;
2237
+
2238
+ // Assign basic constants
2239
+ Opal.const_set(_Object, "BasicObject", BasicObject);
2240
+ Opal.const_set(_Object, "Object", _Object);
2241
+ Opal.const_set(_Object, "Module", Module);
2242
+ Opal.const_set(_Object, "Class", Class);
2243
+
2005
2244
 
2006
2245
  // Fix booted classes to use their metaclass
2007
2246
  BasicObject.$$class = Class;
@@ -2020,18 +2259,15 @@
2020
2259
  Module.$$parent = _Object;
2021
2260
  Class.$$parent = Module;
2022
2261
 
2023
- Opal.base = _Object;
2024
- BasicObject.$$scope = _Object.$$scope = Opal;
2025
- BasicObject.$$orig_scope = _Object.$$orig_scope = Opal;
2026
-
2027
- Module.$$scope = _Object.$$scope;
2028
- Module.$$orig_scope = _Object.$$orig_scope;
2029
- Class.$$scope = _Object.$$scope;
2030
- Class.$$orig_scope = _Object.$$orig_scope;
2031
-
2032
2262
  // Forward .toString() to #to_s
2033
2263
  _Object.$$proto.toString = function() {
2034
- return this.$to_s();
2264
+ var to_s = this.$to_s();
2265
+ if (to_s.$$is_string && typeof(to_s) === 'object') {
2266
+ // a string created using new String('string')
2267
+ return to_s.valueOf();
2268
+ } else {
2269
+ return to_s;
2270
+ }
2035
2271
  };
2036
2272
 
2037
2273
  // Make Kernel#require immediately available as it's needed to require all the
@@ -2051,13 +2287,3 @@
2051
2287
 
2052
2288
  TypeError.$$super = Error;
2053
2289
  }).call(this);
2054
-
2055
- if (typeof(global) !== 'undefined') {
2056
- global.Opal = this.Opal;
2057
- Opal.global = global;
2058
- }
2059
-
2060
- if (typeof(window) !== 'undefined') {
2061
- window.Opal = this.Opal;
2062
- Opal.global = window;
2063
- }