opal 0.2.2 → 0.3.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 (325) hide show
  1. data/.gitignore +5 -10
  2. data/LICENSE +75 -0
  3. data/README.md +55 -3
  4. data/Rakefile +62 -139
  5. data/bin/opal +7 -10
  6. data/gems/core/README.md +5 -0
  7. data/gems/core/Rakefile +7 -0
  8. data/gems/core/core.gemspec +13 -0
  9. data/gems/core/lib/core.rb +33 -0
  10. data/gems/core/lib/core/array.rb +1470 -0
  11. data/gems/core/lib/core/basic_object.rb +15 -0
  12. data/gems/core/lib/core/class.rb +31 -0
  13. data/gems/core/lib/core/dir.rb +26 -0
  14. data/gems/core/lib/core/error.rb +43 -0
  15. data/gems/core/lib/core/false_class.rb +21 -0
  16. data/gems/core/lib/core/file.rb +54 -0
  17. data/gems/core/lib/core/hash.rb +725 -0
  18. data/gems/core/lib/core/kernel.rb +240 -0
  19. data/gems/core/lib/core/module.rb +98 -0
  20. data/gems/core/lib/core/nil_class.rb +41 -0
  21. data/gems/core/lib/core/numeric.rb +370 -0
  22. data/gems/core/lib/core/proc.rb +11 -0
  23. data/gems/core/lib/core/range.rb +17 -0
  24. data/gems/core/lib/core/regexp.rb +18 -0
  25. data/gems/core/lib/core/string.rb +328 -0
  26. data/gems/core/lib/core/symbol.rb +15 -0
  27. data/gems/core/lib/core/top_self.rb +8 -0
  28. data/gems/core/lib/core/true_class.rb +20 -0
  29. data/gems/core/lib/core/vm.rb +16 -0
  30. data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
  31. data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
  32. data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
  33. data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
  34. data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
  35. data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
  36. data/gems/core/spec/core/array/compact_spec.rb +41 -0
  37. data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
  38. data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
  39. data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
  40. data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
  41. data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
  42. data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
  43. data/gems/core/spec/core/array/join_spec.rb +6 -0
  44. data/gems/core/spec/core/array/last_spec.rb +51 -0
  45. data/gems/core/spec/core/array/length_spec.rb +6 -0
  46. data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
  47. data/gems/core/spec/core/array/reverse_spec.rb +6 -0
  48. data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
  49. data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
  50. data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
  51. data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
  52. data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
  53. data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
  54. data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
  55. data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
  56. data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
  57. data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
  58. data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
  59. data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
  60. data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
  61. data/gems/core/spec/core/string/sub_spec.rb +24 -0
  62. data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
  63. data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
  64. data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
  65. data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
  66. data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
  67. data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
  68. data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
  69. data/gems/core/spec/language/block_spec.rb +38 -0
  70. data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
  71. data/gems/core/spec/language/case_spec.rb +103 -0
  72. data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
  73. data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
  74. data/gems/core/spec/language/file_spec.rb +13 -0
  75. data/gems/core/spec/language/fixtures/block.rb +21 -0
  76. data/gems/core/spec/language/fixtures/super.rb +293 -0
  77. data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
  78. data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
  79. data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
  80. data/gems/core/spec/language/metaclass_spec.rb +21 -0
  81. data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
  82. data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
  83. data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
  84. data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
  85. data/gems/core/spec/language/regexp_spec.rb +26 -0
  86. data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
  87. data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
  88. data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
  89. data/gems/core/spec/language/super_spec.rb +32 -0
  90. data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
  91. data/gems/core/spec/language/variables_spec.rb +155 -0
  92. data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
  93. data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
  94. data/gems/core_fs/README.md +19 -0
  95. data/gems/dev/Rakefile +5 -0
  96. data/gems/dev/lib/dev.js +99 -0
  97. data/gems/dev/lib/dev/generator.js +1264 -0
  98. data/gems/dev/lib/dev/parser.js +979 -0
  99. data/gems/dev/lib/dev/ruby_parser.js +1088 -0
  100. data/gems/dev/lib/dev/ruby_parser.y +1267 -0
  101. data/gems/dev/lib/dev/string_scanner.js +38 -0
  102. data/gems/dev/tools/racc2js/README.md +39 -0
  103. data/gems/dev/tools/racc2js/math_parser.js +222 -0
  104. data/gems/dev/tools/racc2js/math_parser.rb +133 -0
  105. data/gems/dev/tools/racc2js/math_parser.y +28 -0
  106. data/gems/dev/tools/racc2js/parser.js +218 -0
  107. data/gems/dev/tools/racc2js/racc2js.rb +153 -0
  108. data/gems/json/README.md +4 -0
  109. data/gems/json/json.gemspec +14 -0
  110. data/gems/json/lib/json.rb +64 -0
  111. data/gems/json/lib/json/ext.rb +51 -0
  112. data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
  113. data/gems/ospec/README.md +0 -0
  114. data/gems/ospec/lib/ospec.rb +6 -0
  115. data/gems/ospec/lib/ospec/autorun.rb +3 -0
  116. data/gems/ospec/lib/ospec/dsl.rb +15 -0
  117. data/gems/ospec/lib/ospec/example.rb +11 -0
  118. data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
  119. data/gems/ospec/lib/ospec/example/errors.rb +17 -0
  120. data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
  121. data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
  122. data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
  123. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
  124. data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
  125. data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
  126. data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
  127. data/gems/ospec/lib/ospec/expectations.rb +19 -0
  128. data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
  129. data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
  130. data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
  131. data/gems/ospec/lib/ospec/matchers.rb +24 -0
  132. data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
  133. data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
  134. data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
  135. data/gems/ospec/lib/ospec/runner.rb +40 -0
  136. data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
  137. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
  138. data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
  139. data/gems/ospec/lib/ospec/runner/options.rb +36 -0
  140. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
  141. data/gems/ospec/ospec.gemspec +0 -0
  142. data/gems/rquery/README.md +9 -0
  143. data/gems/rquery/lib/rquery.rb +10 -0
  144. data/gems/rquery/lib/rquery/ajax.rb +4 -0
  145. data/gems/rquery/lib/rquery/css.rb +96 -0
  146. data/gems/rquery/lib/rquery/document.rb +25 -0
  147. data/gems/rquery/lib/rquery/element.rb +292 -0
  148. data/gems/rquery/lib/rquery/event.rb +108 -0
  149. data/gems/rquery/lib/rquery/jquery.js +8177 -0
  150. data/gems/rquery/lib/rquery/request.rb +138 -0
  151. data/gems/rquery/lib/rquery/response.rb +49 -0
  152. data/gems/rquery/rquery.gemspec +16 -0
  153. data/lib/opal.js +1597 -0
  154. data/lib/opal.rb +6 -69
  155. data/lib/opal/builder.rb +115 -0
  156. data/lib/opal/bundle.rb +131 -0
  157. data/lib/opal/command.rb +11 -0
  158. data/lib/opal/context.rb +69 -0
  159. data/lib/opal/context/console.rb +12 -0
  160. data/lib/opal/context/file_system.rb +19 -0
  161. data/lib/opal/context/loader.rb +117 -0
  162. data/lib/opal/gem.rb +153 -0
  163. data/lib/opal/ruby/nodes.rb +1302 -0
  164. data/lib/opal/ruby/parser.rb +780 -0
  165. data/lib/opal/ruby/ruby_parser.rb +5170 -0
  166. data/lib/opal/ruby/ruby_parser.y +1298 -0
  167. data/opal.gemspec +11 -256
  168. metadata +179 -240
  169. data/.gitmodules +0 -6
  170. data/Opalfile +0 -384
  171. data/VERSION +0 -1
  172. data/demos/apps/browser_demo/index.html +0 -11
  173. data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
  174. data/demos/apps/simple_opal/Opalfile +0 -13
  175. data/demos/apps/simple_opal/index.html +0 -11
  176. data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
  177. data/demos/apps/simple_opal/lib/main_window.rb +0 -146
  178. data/demos/browser/request/index.html +0 -52
  179. data/demos/browser/request/request.rb +0 -48
  180. data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
  181. data/gen/browser/__PROJECT_NAME__/index.html +0 -11
  182. data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
  183. data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
  184. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
  185. data/lib/opal/builders/base.rb +0 -50
  186. data/lib/opal/builders/css.rb +0 -46
  187. data/lib/opal/builders/javascript.rb +0 -44
  188. data/lib/opal/builders/opal.rb +0 -79
  189. data/lib/opal/builders/ruby.rb +0 -50
  190. data/lib/opal/builders/ruby/generate.rb +0 -1851
  191. data/lib/opal/builders/ruby/nodes.rb +0 -210
  192. data/lib/opal/builders/ruby/ruby.rb +0 -916
  193. data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
  194. data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
  195. data/lib/opal/models/build_item.rb +0 -104
  196. data/lib/opal/models/hash_struct.rb +0 -40
  197. data/lib/opal/models/project.rb +0 -252
  198. data/lib/opal/models/struct_accessors.rb +0 -58
  199. data/lib/opal/models/target.rb +0 -176
  200. data/lib/opal/opal/build.rb +0 -169
  201. data/lib/opal/opal/env/console.rb +0 -66
  202. data/lib/opal/opal/env/fs.rb +0 -98
  203. data/lib/opal/opal/env/object.rb +0 -48
  204. data/lib/opal/opal/environment.rb +0 -139
  205. data/lib/opal/opal/gen.rb +0 -62
  206. data/lib/opal/opal/opal.rb +0 -75
  207. data/lib/opal/opal/repl.rb +0 -38
  208. data/lib/opal/opalfile/dsl.rb +0 -62
  209. data/lib/opal/opalfile/opalfile.rb +0 -133
  210. data/lib/opal/opalfile/task.rb +0 -96
  211. data/lib/opal/opalfile/task_manager.rb +0 -63
  212. data/lib/opal/opalfile/task_scope.rb +0 -52
  213. data/lib/opal/rack/app_server.rb +0 -119
  214. data/lib/opal/rake/opal_task.rb +0 -34
  215. data/opals/opal/README.md +0 -37
  216. data/opals/opal/browser/Opalfile +0 -11
  217. data/opals/opal/browser/README.md +0 -146
  218. data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
  219. data/opals/opal/browser/lib/browser.rb +0 -118
  220. data/opals/opal/browser/lib/browser/builder.rb +0 -41
  221. data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
  222. data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
  223. data/opals/opal/browser/lib/browser/document.rb +0 -146
  224. data/opals/opal/browser/lib/browser/element.rb +0 -487
  225. data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
  226. data/opals/opal/browser/lib/browser/element/css.rb +0 -290
  227. data/opals/opal/browser/lib/browser/element/form.rb +0 -146
  228. data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
  229. data/opals/opal/browser/lib/browser/event/event.rb +0 -177
  230. data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
  231. data/opals/opal/browser/lib/browser/geometry.rb +0 -97
  232. data/opals/opal/browser/lib/browser/json.rb +0 -32
  233. data/opals/opal/browser/lib/browser/request/request.rb +0 -201
  234. data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
  235. data/opals/opal/browser/lib/browser/string.rb +0 -42
  236. data/opals/opal/browser/lib/browser/touch.rb +0 -37
  237. data/opals/opal/browser/lib/browser/vml_context.js +0 -33
  238. data/opals/opal/browser/lib/browser/window.rb +0 -36
  239. data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
  240. data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
  241. data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
  242. data/opals/opal/browser/spec/element/body_spec.rb +0 -11
  243. data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
  244. data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
  245. data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
  246. data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
  247. data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
  248. data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
  249. data/opals/opal/browser/spec/element/show_spec.rb +0 -31
  250. data/opals/opal/browser/spec/element/style_spec.rb +0 -69
  251. data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
  252. data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
  253. data/opals/opal/browser/spec/spec_helper.rb +0 -1
  254. data/opals/opal/opal/Opalfile +0 -14
  255. data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
  256. data/opals/opal/opal/spec/fixtures/super.rb +0 -70
  257. data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
  258. data/opals/opal/opal/spec/language/block_spec.rb +0 -18
  259. data/opals/opal/opal/spec/language/case_spec.rb +0 -103
  260. data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
  261. data/opals/opal/opal/spec/language/super_spec.rb +0 -26
  262. data/opals/opal/runtime/Opalfile +0 -78
  263. data/opals/opal/runtime/README.md +0 -12
  264. data/opals/opal/runtime/docs/debugging.md +0 -51
  265. data/opals/opal/runtime/lib/array.rb +0 -1516
  266. data/opals/opal/runtime/lib/basic_object.rb +0 -49
  267. data/opals/opal/runtime/lib/class.rb +0 -54
  268. data/opals/opal/runtime/lib/dir.rb +0 -36
  269. data/opals/opal/runtime/lib/error.rb +0 -49
  270. data/opals/opal/runtime/lib/false_class.rb +0 -52
  271. data/opals/opal/runtime/lib/file.rb +0 -79
  272. data/opals/opal/runtime/lib/hash.rb +0 -791
  273. data/opals/opal/runtime/lib/io.rb +0 -39
  274. data/opals/opal/runtime/lib/kernel.rb +0 -288
  275. data/opals/opal/runtime/lib/match_data.rb +0 -36
  276. data/opals/opal/runtime/lib/module.rb +0 -109
  277. data/opals/opal/runtime/lib/nil_class.rb +0 -69
  278. data/opals/opal/runtime/lib/number.rb +0 -398
  279. data/opals/opal/runtime/lib/proc.rb +0 -77
  280. data/opals/opal/runtime/lib/range.rb +0 -63
  281. data/opals/opal/runtime/lib/regexp.rb +0 -111
  282. data/opals/opal/runtime/lib/ruby.rb +0 -30
  283. data/opals/opal/runtime/lib/string.rb +0 -328
  284. data/opals/opal/runtime/lib/symbol.rb +0 -40
  285. data/opals/opal/runtime/lib/top_self.rb +0 -33
  286. data/opals/opal/runtime/lib/true_class.rb +0 -45
  287. data/opals/opal/runtime/runtime/browser.js +0 -287
  288. data/opals/opal/runtime/runtime/debug.js +0 -180
  289. data/opals/opal/runtime/runtime/opal.js +0 -1008
  290. data/opals/opal/runtime/runtime/post_opal.js +0 -1
  291. data/opals/opal/runtime/runtime/pre_opal.js +0 -2
  292. data/opals/opal/runtime/runtime/server_side.js +0 -50
  293. data/opals/opal/spec/LICENSE.txt +0 -26
  294. data/opals/opal/spec/Opalfile +0 -5
  295. data/opals/opal/spec/bin/spec.rb +0 -43
  296. data/opals/opal/spec/lib/spec.rb +0 -33
  297. data/opals/opal/spec/lib/spec/dsl.rb +0 -41
  298. data/opals/opal/spec/lib/spec/example.rb +0 -35
  299. data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
  300. data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
  301. data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
  302. data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
  303. data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
  304. data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
  305. data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
  306. data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
  307. data/opals/opal/spec/lib/spec/expectations.rb +0 -46
  308. data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
  309. data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
  310. data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
  311. data/opals/opal/spec/lib/spec/matchers.rb +0 -50
  312. data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
  313. data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
  314. data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
  315. data/opals/opal/spec/lib/spec/runner.rb +0 -48
  316. data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
  317. data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
  318. data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
  319. data/opals/opal/spec/resources/index.html +0 -25
  320. data/opals/opal/spec/resources/spec.css +0 -132
  321. data/spec/cherry_kit/iseq_spec.rb +0 -38
  322. data/spec/spec_helper.rb +0 -16
  323. data/spec/vienna_spec.rb +0 -7
  324. data/yard/index.html +0 -43
  325. data/yard/style.css +0 -765
@@ -1,1008 +0,0 @@
1
- /*
2
- * vienna.js
3
- * vienna
4
- *
5
- * Created by Adam Beynon.
6
- * Copyright 2010 Adam Beynon.
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in
16
- * all copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- * THE SOFTWARE.
25
- */
26
-
27
-
28
- // lets just do this straight away, out of the way. Still need a way to log from
29
- // IE, Opera etc etc etc
30
- if (typeof console === 'undefined') {
31
- global.console = {} ;
32
- // console.info = console.warn = console.error = console.log = function(){};
33
- }
34
-
35
- // Core classes
36
- // exports.c_object = null;
37
- var class_basic_object = null,
38
- class_module = null,
39
- class_class = null,
40
- class_object = null,
41
- module_kernel = null,
42
- class_symbol = null,
43
- class_true_class = null,
44
- class_false_class = null,
45
- class_nil_class = null,
46
- class_proc = null,
47
- class_string = null,
48
- class_array = null,
49
- class_hash = null,
50
- class_number = null,
51
- class_regexp = null,
52
- class_range = null,
53
- class_exception = null;
54
-
55
- // top self
56
- exports.top_self = null;
57
-
58
- // Core object literals (in main window scope)
59
- global.vnNil = null;
60
- global.vnTrue = null;
61
- global.vnFalse = null;
62
-
63
- // flags for object/class types
64
- var T_CLASS = 1,
65
- T_MODULE = 2,
66
- T_OBJECT = 4,
67
- T_BOOLEAN = 8,
68
- T_STRING = 16,
69
- T_ARRAY = 32,
70
- T_NUMBER = 64,
71
- T_PROC = 128,
72
- T_SYMBOL = 256,
73
- T_HASH = 512,
74
- T_RANGE = 1024,
75
- T_ICLASS = 2048,
76
- FL_SINGLETON = 4096;
77
-
78
-
79
- // create a ruby proc from javascript func
80
-
81
-
82
-
83
- // hash from arguments vnH(key1, val1, key2, val2...)
84
- global.vnH = function() {
85
- var k, v, res = new class_hash.allocator();
86
- res.__keys__ = [];
87
- res.__assocs__ = {};
88
- res.__default__ = vnNil;
89
- for (var i = 0; i < arguments.length; i++) {
90
- k = arguments[i], v = arguments[i+1];
91
- i++;
92
- res.__keys__.push(k);
93
- res.__assocs__[k.hash()] = v;
94
- }
95
- return res;
96
- };
97
-
98
- // Regexp
99
- global.vnR = function(reg) {
100
- var res = new class_regexp.allocator();
101
- res.__reg__ = reg;
102
- return res;
103
- };
104
-
105
- var symbol_table = { };
106
-
107
- // For object_id's .. each object/class will get an object_id
108
- var hash_yield = 0;
109
-
110
- var yield_hash = function() {
111
- return hash_yield++;
112
- };
113
-
114
- if (!Array.prototype.indexOf) {
115
- Array.prototype.indexOf = function (obj) {
116
- for (var i = 0; i< this.length; i++) {
117
- if (this[i] == obj) return i;
118
- }
119
- return -1;
120
- };
121
- };
122
-
123
- // EntryPoint. Every time something causes ruby to be run, it must be done
124
- // through this function. This includes events, timers firing and the initial
125
- // main() code. This will capture possible errors and log them and their stack
126
- // trace to the terminal.
127
- //
128
- // @param [Function] func to run as main entry point
129
- // @return [Object] returns the result of the function
130
- //
131
- exports.entry_point = function(func) {
132
- return func();
133
- };
134
-
135
- // Base of every object or class object in vienna. Every object, string, number,
136
- // class, module, regexp, proc etc will be an instance of this, so const_set etc
137
- // are all on the prototype of this. This keeps a lot from needing to go into
138
- // global namespace, and keeps vienna export nice and clean.
139
- //
140
- // Update/Renaming scheme
141
- // ======================
142
- //
143
- // We are now going to use the native String/Number/Array prototypes, so we need
144
- // to make sure we avoid clashes. All ruby methods start with $, so all
145
- // definitions/usage functions will end with $. No
146
- // generated methods can end with $, so we avoid clashes. For example, the
147
- // methods/properties above become...
148
- //
149
- // .t$ - true literal
150
- // .f$ - false literal
151
- // .n$ - nil literal
152
- //
153
- // .r$ - ruby truthiness
154
- //
155
- // .h$() - make hash from args
156
- // .y$() - make symbol if not already exists
157
- //
158
- // .a$() - and test, takes a function as single param to make test
159
- // .o$() - or test, takes a function as single param to make test
160
- //
161
- // .O$ - T_OBJECT
162
- // .C$ - T_CLASS
163
- // .M$ - T_MODULE
164
- // .A$ - T_ARRAY
165
- //
166
- // .dc$() - define class
167
- // .dm$() - define method
168
- //
169
- var __boot_base_class = function() {
170
- this.id = yield_hash();
171
- };
172
-
173
- __boot_base_class.prototype.hash = function() {
174
- return this.id;
175
- };
176
-
177
- // convert ruby id to jsid - for methods
178
- __boot_base_class.prototype.mid2jsid = function(mid) {
179
- return ("$" + mid).replace(/=/g, '$e').replace(/\?/g, '$q');
180
- };
181
-
182
-
183
- __boot_base_class.prototype.define_class = function(sup, id, body, flag) {
184
-
185
- var klass, base = this;
186
-
187
- if (base.flags & T_OBJECT)
188
- base = base.isa;
189
-
190
- switch (flag) {
191
- // normal class
192
- case 0:
193
- if (sup === vnNil)
194
- sup = class_object;
195
-
196
- klass = define_class_under(base, id, sup);
197
- break;
198
- case 1:
199
- // throw "running class shift for " + id.class_name
200
- klass = id.singleton_class();
201
- // return;
202
- break;
203
- case 2:
204
- klass = define_module_under(base, id);
205
- break;
206
- default:
207
- throw "define_class: unknown flag: " + flag
208
- }
209
-
210
- return body.apply(klass);
211
-
212
- // return klass;
213
- };
214
-
215
- // get singleton class
216
- __boot_base_class.prototype.singleton_class = function() {
217
- var klass;
218
-
219
- // if (this.info & )
220
-
221
- if (this.info & FL_SINGLETON) {
222
- klass = this.isa;
223
- }
224
- else {
225
- // if we a re a class or module..
226
- if ((this.info & T_CLASS) || (this.info & T_MODULE)) {
227
- // if we have an __attached__, use it
228
- if (this.__attached__) {
229
- return this.__attached__;
230
- }
231
- // otherwise, create it
232
- else {
233
- var meta = __subclass(this.class_name, this.isa);
234
- meta.info = meta.info | FL_SINGLETON;
235
- this.__attached__ = this.isa = meta;
236
- meta.__attached__ = this;
237
- return meta;
238
- }
239
- }
240
- else {
241
- // object
242
- // console.log("need to make singleton class for: " + this.class_name);
243
-
244
- this.info = this.info | FL_SINGLETON;
245
- var meta = __subclass(this.class_name, this.isa);
246
- meta.info = meta.info | T_ICLASS;
247
- var old_super = this.isa;
248
- klass = this.isa = meta;
249
- meta.__instance__ = this;
250
- meta.constants = old_super.constants;
251
- // klass = this.isa;
252
- // var class_name = this.isa.class_name;
253
- // klass = make_metaclass(this, this.isa);
254
- }
255
-
256
- }
257
-
258
- return klass;
259
- };
260
-
261
- __boot_base_class.prototype.dm = function(m_id, body, singleton) {
262
- // console.log(m_id + " for ");
263
- // console.log(this.class_name);
264
-
265
- // hack for replacing mid_to_jsid
266
- var js_id = '$' + m_id;
267
-
268
- body.method_id = m_id;
269
- body.jsid = js_id;
270
- body.displayName = m_id;
271
- // register self as the current class for body (for super calls)
272
- body.opal_class = this;
273
-
274
- if (singleton) {
275
- if ((this.info & T_CLASS) || (this.info & T_MODULE)) {
276
- this.constructor.prototype[js_id] = body;
277
- this.constructor.prototype.method_table[js_id] = body;
278
- }
279
- else {
280
- // add method to singleton_object
281
- this[js_id] = body;
282
- // throw "need to add_method to singleton object"
283
- }
284
- }
285
- else {
286
- if ((this.info & T_CLASS) || (this.info & T_MODULE)) {
287
- if (this.info & FL_SINGLETON) {
288
- // console.log("need to define method for singleton.. " + m_id);
289
- this.__attached__.constructor.prototype[js_id] = body;
290
- this.__attached__.constructor.prototype.method_table[js_id] = body;
291
- }
292
- else {
293
- this.allocator.prototype[js_id] = body;
294
- this.allocator.prototype.method_table[js_id] = body;
295
- }
296
-
297
- if (this.info & T_ICLASS) {
298
- this.__instance__[js_id] = body;
299
- console.log("adding method " + m_id + " which is " + js_id);
300
- // console.log(this.__instance__);
301
- }
302
- }
303
- else {
304
- // console.log("need to make into singleton object for: " + this.$inspect() + " with method " + m_id);
305
- var cls = this.singleton_class();
306
- cls.allocator.prototype[js_id] = body;
307
- cls.allocator.prototype.method_table[js_id] = body;
308
- // i_class singleton will only ever have one instance: this.
309
- // cls.__instance__ = this;
310
- body.opal_class = cls;
311
- // cls.dm(m_id, body, singleton);
312
- // add method to singleton object
313
- this[js_id] = body;
314
- // console.log(this);
315
- // throw "need to add_method to object " + m_id
316
- }
317
- }
318
- return this.n;
319
- };
320
-
321
- __boot_base_class.prototype.const_set = function(id, val) {
322
-
323
- var base = this;
324
-
325
- if (base.info & T_OBJECT)
326
- base = base.isa;
327
-
328
- base.constants[id] = val;
329
- return val;
330
- };
331
-
332
- __boot_base_class.prototype.const_defined = function(id) {
333
- var base = this;
334
-
335
- if (base.info & T_OBJECT)
336
- base = base.isa;
337
-
338
- if (base.constants[id])
339
- return true;
340
-
341
- return false;
342
- };
343
-
344
- __boot_base_class.prototype.const_get = function(id) {
345
-
346
- var base = this;
347
-
348
- if (base.info & T_OBJECT)
349
- base = base.isa;
350
-
351
- if (base.constants[id])
352
- return base.constants[id];
353
-
354
- // need to go up through hierarchy
355
- var search = base.opal_parent, res;
356
- while (search) {
357
- res = search.const_get(id);
358
- if (res) {
359
- return res;
360
- }
361
- search = search.opal_parent;
362
- }
363
- // console.log("my parent is:");
364
- // console.log(base.opal_parent);
365
- // console.log(base.opal_parent.constants.Reporter);
366
-
367
- throw { toString: function() {
368
- return "NameError: uninitialized constant: " + id;
369
- }};
370
- };
371
-
372
- // ivar get
373
- __boot_base_class.prototype.ig = function(id) {
374
- if (this.hasOwnProperty(id))
375
- return this[id];
376
-
377
- return vnNil;
378
- };
379
-
380
- // ivar set
381
- __boot_base_class.prototype.is = function(id, val) {
382
- return this[id] = val;
383
- };
384
-
385
- __boot_base_class.prototype.include = function(module) {
386
-
387
- if (!this.included_modules)
388
- this.included_modules = [];
389
-
390
- if (this.included_modules.indexOf(module) != -1)
391
- return; // already included
392
-
393
- this.included_modules.push(module);
394
- module.included_in.push(this);
395
-
396
- // add each method from module into class's prototype
397
- for (method in module.allocator.prototype.method_table) {
398
- // if (!this.allocator.prototype.method_table[method])
399
- // if (!this.allocator.prototype.hasOwnProperty(method))
400
- this.allocator.prototype.method_table[method] = module.allocator.prototype.method_table[method];
401
- this.allocator.prototype[method] = module.allocator.prototype.method_table[method];
402
- }
403
-
404
- // console.log("checking include constants from " + module.class_name + " into " + this.class_name);
405
- for (var prop in module.constants) {
406
- if (module.constants.hasOwnProperty(prop) && !this.constants[prop]) {
407
- this.constants[prop] = module.constants[prop];
408
- }
409
- }
410
- };
411
-
412
- __boot_base_class.prototype.extend = function(module) {
413
- // add each method from module into class's prototype
414
- for (method in module.allocator.prototype.method_table) {
415
- // console.log("adding " +method);
416
- this.constructor.prototype.method_table[method] = module.allocator.prototype.method_table[method];
417
- this.constructor.prototype[method] = module.allocator.prototype.method_table[method];
418
- }
419
- };
420
-
421
- // RTEST - true. false and nil override this
422
- __boot_base_class.prototype.r = true;
423
-
424
- // ANDTEST
425
- __boot_base_class.prototype.a = function(lhs, rhs) {
426
- if (lhs.r)
427
- return rhs.apply(this);
428
-
429
- return lhs;
430
- };
431
-
432
- // ORTEST
433
- __boot_base_class.prototype.o = function(lhs, rhs) {
434
- if (lhs.r)
435
- return lhs;
436
-
437
- return rhs.apply(this);
438
- };
439
-
440
- // Handle yielding
441
- //
442
- // @param {Function} proc to yield
443
- // @param {Array} params to yield to proc
444
- //
445
- __boot_base_class.prototype.rbYield = function(proc, params) {
446
- // if we tried to yield, and we were not given a block..
447
- if (!proc) {
448
- throw {
449
- toString: function() {
450
- return "Yield: no block given";
451
- }
452
- };
453
- }
454
-
455
- // otherwise, yield it in the 'self' context it was created in.
456
- return proc.apply(proc.__self__, params);
457
- };
458
-
459
- // Handle while loops.
460
- //
461
- // @param {Function} expression wrapped in function to evaluate before each pass
462
- // @param {Function} body wrapped in function to evaluate as eash pass
463
- // @param {Boolean} should_redo - call the body once without reevaluating the
464
- // expression. This allows for 'redo' support. Default is false, we set
465
- // it to true ourselves by repplaying() the method.
466
- //
467
- // Example
468
- //
469
- // while true
470
- // puts 10
471
- // end
472
- //
473
- // self.rbWhile(function() {
474
- // return self.t;
475
- // }), function() {
476
- // self.puts(10);
477
- // };
478
- // })
479
- __boot_base_class.prototype.rbWhile = function(expression, body, should_redo) {
480
- try {
481
- // are we in a redo()? if so, apply body once first, then carry on
482
- if (should_redo) {
483
- body.apply(this);
484
- }
485
-
486
- while (expression.apply(this)) {
487
- body.apply(this);
488
- }
489
- // while_loop.apply(this);
490
- // default return nil if everything was ok
491
- return this.n;
492
- } catch (e) {
493
- // try and catch a break statement
494
- if (e.__keyword__ == 'break') {
495
- return e.opal_value || this.n;
496
- }
497
-
498
- // testing next.. this might not work too well...
499
- if (e.__keyword__ == 'next') {
500
- return arguments.callee.apply(this, [expression, body]);
501
- }
502
-
503
- if (e.__keyword__ == 'redo') {
504
- return arguments.callee.apply(this, [expression, body, true]);
505
- }
506
-
507
- // anything else, rethrow
508
- throw e;
509
- };
510
- };
511
-
512
- // redo keyword - no args ever
513
- __boot_base_class.prototype.rbRedo = function() {
514
- throw {
515
- toString: function() {
516
- return "uncaught redo";
517
- },
518
- __keyword__: 'redo'
519
- };
520
- };
521
-
522
- // break keyword (with possible args?)
523
- __boot_base_class.prototype.rbBreak = function(value) {
524
- throw {
525
- toString: function() {
526
- return "uncaught break";
527
- },
528
- __keyword__: 'break',
529
- opal_value: value == undefined ? this.n : value
530
- };
531
- };
532
-
533
- // next keyword
534
- __boot_base_class.prototype.rbNext = function(value) {
535
- throw {
536
- toString: function() {
537
- return "uncaught next";
538
- },
539
- __keyword__: 'next',
540
- opal_value: value || this.n
541
- };
542
- };
543
-
544
- // return keyword (only within a block) with args..
545
- __boot_base_class.prototype.rbReturn = function(value) {
546
- throw {
547
- toString: function() {
548
- return "uncaught rbReturn";
549
- },
550
- __keyword__: 'return',
551
- opal_value: value || this.n
552
- };
553
- };
554
-
555
- // ruby proc from function
556
- //
557
- // A proc/block/llambda are simply javascript functions. Everytime a block is
558
- // created in ruby, its current self, as in the self which the block should use
559
- // for evaluating, is stored by the function onto the property .__self__, so
560
- // that whenever the block is call()'d or yield()'d, it is apply()'d using this
561
- // self so that it evaluates in that given context. To evaluate the block in
562
- // another context, with, for exampke, instance_eval, we just apply() with our
563
- // own custom self. We never need to replace __self__, we just apply uysing a
564
- // different context.
565
- //
566
- // @param {Function} fun - the block implementation
567
- __boot_base_class.prototype.P = function(fun) {
568
- fun.__self__ = this;
569
- return fun;
570
- // var res = new class_proc.allocator();
571
- // res.__fun__ = fun;
572
- // return res;
573
- };
574
-
575
- // same as above, but lambda
576
- __boot_base_class.prototype.L = function(fun) {
577
- fun.__self__ = this;
578
- fun.__lambda__ = true;
579
- return fun;
580
- };
581
-
582
- // create a ruby symbol from javascript str. This checks the global sym table
583
- // first to make sure we only create one symbol per name (id).
584
- __boot_base_class.prototype.Y = function(str) {
585
- if (symbol_table.hasOwnProperty(str))
586
- return symbol_table[str];
587
-
588
- var res = new class_symbol.allocator();
589
- res.__ptr__ = str;
590
- symbol_table[str] = res;
591
- return res;
592
- };
593
-
594
- // ruby range
595
- __boot_base_class.prototype.R = function(start, end, exclusive) {
596
- var res = new class_range.allocator();
597
- res.__start__ = start;
598
- res.__end__ = end;
599
- res.__exclusive__ = exclusive;
600
- res.__real_end__ = exclusive ? end - 1 : end;
601
- return res;
602
- };
603
-
604
- // calling super
605
- //
606
- // @param {Function} func of current func calling super
607
- // @param {Array} args to pass to super implementation
608
- // @return {Object} return value from super call
609
- //
610
- // CURRENTLY ONLY SUPPORTS INSTANCE CLASSES
611
- //
612
- __boot_base_class.prototype.opal_super = function(func, args) {
613
- // get current imp's implementation
614
- var cur_class = func.opal_class;
615
- // for super, we just need the imp of the superclass's method. This will work
616
- // up the chain as opal_class is set to the class on which the method was
617
- // defines, so any method put in as a super class to this will have our super
618
- // method.
619
- var sup_class = cur_class.super_class;
620
-
621
- if (!sup_class) {
622
- throw "NativeError: no super class found from " + cur_class
623
- }
624
-
625
- var sup_func = sup_class.allocator.prototype[func.jsid];
626
-
627
- if (!sup_func) {
628
- throw "NativeError: no superclass method found for " + func.method_id;
629
- }
630
-
631
- // console.log("ok, going to call it");
632
- // console.log(sup_func);
633
- // console.log(args);
634
- // if all ok, call it
635
- var res = sup_func.apply(this, args);
636
- // console.log("res is:");
637
- // console.log(res);
638
- return res;
639
- };
640
-
641
- // ruby error from native error
642
- __boot_base_class.prototype.rbNativeError = function(err) {
643
- var res = class_exception.$new();
644
- res.is('@message', err.toString());
645
- return res;
646
- };
647
-
648
- __boot_base_class.prototype.TN = T_NUMBER;
649
- __boot_base_class.prototype.TS = T_STRING;
650
- __boot_base_class.prototype.TP = T_PROC;
651
- __boot_base_class.prototype.TA = T_ARRAY;
652
- __boot_base_class.prototype.TH = T_HASH;
653
-
654
- var define_class_under = function(base, id, super_class) {
655
-
656
- if (base.const_defined(id))
657
- return base.const_get(id);
658
-
659
- if (!super_class)
660
- super_class = class_object;
661
-
662
- var res = __subclass(id, super_class);
663
- // parent relationship
664
- res.constructor.prototype.opal_parent = base;
665
- base.const_set(id, res);
666
- return res;
667
- };
668
-
669
- // Define a toll-free bridged ruby class. This is used for mixing native JS
670
- // strings, arrays etc with ruby versions.
671
- //
672
- // Usage
673
- // =====
674
- //
675
- // class_string = define_bridged_class("String", String);
676
- //
677
- // This uses the String constructor. For now, every toll free will inherit from
678
- // object, and will be set as a constant in the Object:: namespace
679
- //
680
- var define_bridged_class = function(id, native_class) {
681
- var res = __subclass(id, class_object);
682
-
683
- var old_allocator = res.allocator.prototype;
684
- res.allocator = native_class;
685
-
686
- for (var prop in old_allocator) {
687
- native_class.prototype[prop] = old_allocator[prop];
688
- }
689
-
690
- class_object.const_set(id, res);
691
- return res;
692
- };
693
-
694
- var __subclass = exports.__subclass = function(id, super_class) {
695
- var cls = function() {
696
- this.id = yield_hash();
697
- };
698
-
699
- cls.prototype = new super_class.allocator();
700
- cls.prototype.method_table = {};
701
- cls.prototype.constructor = cls;
702
- cls.prototype.class_name = id;
703
- cls.prototype.super_class = super_class;
704
- cls.prototype.info = T_OBJECT;
705
-
706
- var meta = function() {
707
- this.id = yield_hash();
708
- }
709
-
710
- meta.prototype = new super_class.constructor();
711
- meta.prototype.method_table = {};
712
- meta.prototype.allocator = cls;
713
- meta.prototype.class_name = id;
714
- meta.prototype.super_class = super_class;
715
- meta.prototype.info = T_CLASS;
716
- meta.prototype.constructor = meta;
717
-
718
- // constants
719
- meta.prototype.constants = new super_class.constants_alloc();
720
- meta.prototype.constants_alloc = function() {};
721
- meta.prototype.constants_alloc.prototype = meta.prototype.constants;
722
-
723
- var res = new meta();
724
- cls.prototype.isa = res;
725
- return res;
726
- }
727
-
728
- var define_module_under = function(base, id) {
729
-
730
- if (base.const_defined(id))
731
- return base.const_get(id);
732
-
733
- var mod = define_class_under(base, id, class_module);
734
- mod.included_in = [];
735
- mod.info = T_MODULE;
736
- mod.allocator.prototype.info = T_MODULE;
737
- return mod;
738
- };
739
-
740
- var __boot_defclass = function(id, super_class) {
741
-
742
- var cls = function() {
743
- this.id = yield_hash();
744
- };
745
-
746
- if (super_class)
747
- cls.prototype = new super_class();
748
- else
749
- cls.prototype = new __boot_base_class();
750
-
751
- cls.prototype.method_table = {};
752
- cls.prototype.constructor = cls;
753
- cls.prototype.class_name = id;
754
- cls.prototype.super_class = super_class;
755
- cls.prototype.info = T_OBJECT;
756
- return cls;
757
- };
758
-
759
- var __boot_makemeta = function(klass, super_class) {
760
-
761
- var meta = function() {
762
- this.id = yield_hash();
763
- };
764
-
765
- meta.prototype = new super_class();
766
-
767
- meta.prototype.included_in = [];
768
- meta.prototype.method_table = {};
769
- meta.prototype.allocator = klass;
770
- meta.prototype.constructor = meta;
771
- meta.prototype.class_name = klass.prototype.class_name;
772
- meta.prototype.super_class = super_class;
773
- meta.prototype.info = T_CLASS;
774
-
775
- // constants etc
776
- if (klass === boot_basic_object) {
777
- meta.prototype.constants_alloc = function() {};
778
- meta.prototype.constants = meta.prototype.constants_alloc.prototype;
779
- } else {
780
- meta.prototype.constants = new super_class.prototype.constants_alloc();
781
- meta.prototype.constants_alloc = function() {};
782
- meta.prototype.constants_alloc.prototype = meta.prototype.constants;
783
- }
784
-
785
- var res = new meta();
786
- klass.prototype.isa = res;
787
- return res;
788
- };
789
-
790
- var __boot_defmetameta = function(klass, meta) {
791
- klass.isa = meta;
792
- };
793
-
794
- // ==============
795
- // = Initialize =
796
- // ==============
797
-
798
- var metaclass;
799
-
800
- var boot_basic_object = __boot_defclass("BasicObject", null);
801
- var boot_object = __boot_defclass("Object", boot_basic_object);
802
- var boot_module = __boot_defclass("Module", boot_object);
803
- var boot_class = __boot_defclass("Class", boot_module);
804
-
805
- class_basic_object = __boot_makemeta(boot_basic_object, boot_class);
806
- class_object = __boot_makemeta(boot_object, class_basic_object.constructor);
807
- class_module = __boot_makemeta(boot_module, class_object.constructor);
808
- class_class = __boot_makemeta(boot_class, class_module.constructor);
809
-
810
- __boot_defmetameta(class_basic_object, class_class);
811
- __boot_defmetameta(class_object, class_class);
812
- __boot_defmetameta(class_module, class_class);
813
- __boot_defmetameta(class_class, class_class);
814
-
815
- class_object.const_set("BasicObject", class_basic_object);
816
- class_object.const_set("Object", class_object);
817
- class_object.const_set("Class", class_class);
818
- class_object.const_set("Module", class_module);
819
-
820
- // Custom methods for modules to handle includes properly
821
- class_module.constructor.prototype.dm = function(m_id, body, sing){
822
-
823
- js_id = '$' + m_id;
824
-
825
- // super
826
- __boot_base_class.prototype.dm.apply(this, arguments);
827
-
828
- // go through each class we are included in and add new method to that as well
829
- for (var i = 0; i < this.included_in.length; i++) {
830
- this.included_in[i].allocator.prototype[js_id] = body;
831
- }
832
- };
833
-
834
- // and then fix again for class
835
- class_class.constructor.prototype.dm = class_object.constructor.prototype.dm;
836
-
837
-
838
- exports.Object = class_object;
839
- exports.top_self = new class_object.allocator();
840
-
841
- // Override Object.include so that we can also include each module into our
842
- // Natives String, Array, Number etc.
843
- class_object.include = function(module) {
844
- // super
845
- var res = __boot_base_class.prototype.include.apply(class_object, [module]);
846
-
847
- var natives = [class_string, class_number, class_array, class_regexp];
848
-
849
- // return res;
850
- for (var i = 0; i < natives.length; i++) {
851
- natives[i].include(module);
852
- }
853
-
854
- return res;
855
- };
856
-
857
- // When we define a method on object itself, we need to also set it on our
858
- // natives.
859
- class_object.dm = function() {
860
- // super
861
- var res = __boot_base_class.prototype.dm.apply(class_object, arguments);
862
-
863
- var natives = [class_string, class_number, class_array, class_regexp];
864
-
865
- // return res;
866
- for (var i = 0; i < natives.length; i++) {
867
- natives[i].dm.apply(natives[i], arguments);
868
- }
869
-
870
- return res;
871
- };
872
-
873
- // Proc class
874
- // class_proc = define_class_under(class_object, "Proc", class_object);
875
- // class_proc.allocator.prototype.info = T_OBJECT | T_PROC;
876
-
877
- class_proc = define_bridged_class("Proc", Function);
878
- class_proc.allocator.prototype.info = T_OBJECT | T_PROC;
879
- // Fix for Object's super_class being a proc and causing inifite recusrion in
880
- // super class chain Object->Proc->Object...etc
881
- class_object.allocator.prototype.super_class = undefined;
882
- class_object.super_class = undefined;
883
-
884
- // Range class
885
- class_range = define_class_under(class_object, "Range", class_object);
886
- class_range.allocator.prototype.info = T_OBJECT | T_RANGE;
887
-
888
- // True class
889
- class_true_class = define_class_under(class_object, "TrueClass", class_object);
890
- vnTrue = new class_true_class.allocator();
891
- vnTrue.info = vnTrue.info | FL_SINGLETON;
892
- __boot_base_class.prototype.t = vnTrue;
893
-
894
- // False class
895
- class_false_class = define_class_under(class_object, "FalseClass",class_object);
896
- vnFalse = new class_false_class.allocator();
897
- vnFalse.info = vnFalse.info | FL_SINGLETON;
898
- __boot_base_class.prototype.f = vnFalse;
899
-
900
- vnFalse.r = false;
901
-
902
- // Nil class
903
- class_nil_class = define_class_under(class_object, "NilClass", class_object);
904
- vnNil = new class_nil_class.allocator();
905
- vnNil.info = vnNil.info | FL_SINGLETON;
906
- __boot_base_class.prototype.n = vnNil;
907
-
908
- vnNil.r = false;
909
-
910
- // Hash
911
- class_hash = define_class_under(class_object, "Hash", class_object);
912
- class_hash.allocator.prototype.info = T_OBJECT | T_HASH;
913
-
914
- class_hash.allocator.prototype.hash_store = function(key, value) {
915
- var hash = key.hash();
916
- // if we dont have the hashed key, add it
917
- if (!this.__assocs__.hasOwnProperty(hash)) {
918
- this.__keys__.push(key);
919
- }
920
- // then in both cases reset the assoc
921
- return this.__assocs__[hash] = value;
922
- };
923
-
924
- class_hash.allocator.prototype.hash_delete = function(key) {
925
- var hash = key.hash();
926
-
927
- if (this.__assocs__[hash]) {
928
- var ret = this.__assocs__[hash];
929
- delete this.__assocs__[hash];
930
- this.__keys__.splice(this.__keys__.indexOf(key), 1);
931
- return ret;
932
- }
933
-
934
- return this.__default__;
935
- };
936
-
937
- class_hash.allocator.prototype.hash_fetch = function(key) {
938
- var hash = key.hash();
939
-
940
- if (this.__assocs__.hasOwnProperty(hash))
941
- return this.__assocs__[hash];
942
-
943
- // default return nil (should be overrideable)
944
- return this.__default__;
945
- };
946
-
947
- // Symbol class
948
- class_symbol = define_class_under(class_object, "Symbol", class_object);
949
-
950
- class_symbol.allocator.prototype.toString = function() {
951
- return ":" + this.__ptr__;
952
- };
953
-
954
- // Regexp
955
- class_regexp = define_class_under(class_object, "Regexp", class_object);
956
-
957
-
958
- // Exceptions
959
- class_exception = define_class_under(class_object, "Exception", class_object);
960
-
961
- class_exception.allocator.prototype.toString = function() {
962
- var message = this.ig('@message');
963
- if (message && message.r)
964
- return this.class_name + ": " + this.ig('@message').toString();
965
-
966
- return this.class_name;
967
- };
968
-
969
- class_exception.allocator.prototype.raise = function() {
970
- // console.log(this);
971
- throw this;
972
- };
973
-
974
- // Special Classes: We do these three (Array, String, Number) last so that we
975
- // have all our special runtime methods setup so we can add them to
976
- // Array.prototype, String.prototype and Number.prototype. Note: we could also
977
- // do RegExp....?
978
-
979
- // Number class
980
- class_number = define_bridged_class("Number", Number);
981
- class_number.allocator.prototype.info = T_OBJECT | T_NUMBER;
982
-
983
- class_number.allocator.prototype.hash = function() {
984
- return '$$num$$' + this;
985
- };
986
-
987
-
988
- // String class
989
- class_string = define_bridged_class("String", String);
990
- class_string.allocator.prototype.info = T_OBJECT | T_STRING;
991
-
992
- class_string.allocator.prototype.hash = function() {
993
- return this;
994
- };
995
-
996
-
997
- // Array class
998
- class_array = define_bridged_class("Array", Array);
999
- class_array.allocator.prototype.info = T_OBJECT | T_ARRAY;
1000
-
1001
- // Regexp class
1002
- class_regexp = define_bridged_class("Regexp", RegExp);
1003
- class_regexp.allocator.prototype.info = T_OBJECT;
1004
-
1005
-
1006
- // Kernel module
1007
- module_kernel = define_module_under(class_object, "Kernel");
1008
- class_object.include(module_kernel);