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.
- data/.gitignore +5 -10
- data/LICENSE +75 -0
- data/README.md +55 -3
- data/Rakefile +62 -139
- data/bin/opal +7 -10
- data/gems/core/README.md +5 -0
- data/gems/core/Rakefile +7 -0
- data/gems/core/core.gemspec +13 -0
- data/gems/core/lib/core.rb +33 -0
- data/gems/core/lib/core/array.rb +1470 -0
- data/gems/core/lib/core/basic_object.rb +15 -0
- data/gems/core/lib/core/class.rb +31 -0
- data/gems/core/lib/core/dir.rb +26 -0
- data/gems/core/lib/core/error.rb +43 -0
- data/gems/core/lib/core/false_class.rb +21 -0
- data/gems/core/lib/core/file.rb +54 -0
- data/gems/core/lib/core/hash.rb +725 -0
- data/gems/core/lib/core/kernel.rb +240 -0
- data/gems/core/lib/core/module.rb +98 -0
- data/gems/core/lib/core/nil_class.rb +41 -0
- data/gems/core/lib/core/numeric.rb +370 -0
- data/gems/core/lib/core/proc.rb +11 -0
- data/gems/core/lib/core/range.rb +17 -0
- data/gems/core/lib/core/regexp.rb +18 -0
- data/gems/core/lib/core/string.rb +328 -0
- data/gems/core/lib/core/symbol.rb +15 -0
- data/gems/core/lib/core/top_self.rb +8 -0
- data/gems/core/lib/core/true_class.rb +20 -0
- data/gems/core/lib/core/vm.rb +16 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
- data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
- data/gems/core/spec/core/array/compact_spec.rb +41 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
- data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
- data/gems/core/spec/core/array/join_spec.rb +6 -0
- data/gems/core/spec/core/array/last_spec.rb +51 -0
- data/gems/core/spec/core/array/length_spec.rb +6 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
- data/gems/core/spec/core/array/reverse_spec.rb +6 -0
- data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
- data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
- data/gems/core/spec/core/string/sub_spec.rb +24 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
- data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
- data/gems/core/spec/language/block_spec.rb +38 -0
- data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
- data/gems/core/spec/language/case_spec.rb +103 -0
- data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
- data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
- data/gems/core/spec/language/file_spec.rb +13 -0
- data/gems/core/spec/language/fixtures/block.rb +21 -0
- data/gems/core/spec/language/fixtures/super.rb +293 -0
- data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
- data/gems/core/spec/language/metaclass_spec.rb +21 -0
- data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
- data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
- data/gems/core/spec/language/regexp_spec.rb +26 -0
- data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
- data/gems/core/spec/language/super_spec.rb +32 -0
- data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
- data/gems/core/spec/language/variables_spec.rb +155 -0
- data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
- data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
- data/gems/core_fs/README.md +19 -0
- data/gems/dev/Rakefile +5 -0
- data/gems/dev/lib/dev.js +99 -0
- data/gems/dev/lib/dev/generator.js +1264 -0
- data/gems/dev/lib/dev/parser.js +979 -0
- data/gems/dev/lib/dev/ruby_parser.js +1088 -0
- data/gems/dev/lib/dev/ruby_parser.y +1267 -0
- data/gems/dev/lib/dev/string_scanner.js +38 -0
- data/gems/dev/tools/racc2js/README.md +39 -0
- data/gems/dev/tools/racc2js/math_parser.js +222 -0
- data/gems/dev/tools/racc2js/math_parser.rb +133 -0
- data/gems/dev/tools/racc2js/math_parser.y +28 -0
- data/gems/dev/tools/racc2js/parser.js +218 -0
- data/gems/dev/tools/racc2js/racc2js.rb +153 -0
- data/gems/json/README.md +4 -0
- data/gems/json/json.gemspec +14 -0
- data/gems/json/lib/json.rb +64 -0
- data/gems/json/lib/json/ext.rb +51 -0
- data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
- data/gems/ospec/README.md +0 -0
- data/gems/ospec/lib/ospec.rb +6 -0
- data/gems/ospec/lib/ospec/autorun.rb +3 -0
- data/gems/ospec/lib/ospec/dsl.rb +15 -0
- data/gems/ospec/lib/ospec/example.rb +11 -0
- data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
- data/gems/ospec/lib/ospec/example/errors.rb +17 -0
- data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
- data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
- data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
- data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
- data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
- data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
- data/gems/ospec/lib/ospec/expectations.rb +19 -0
- data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
- data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
- data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
- data/gems/ospec/lib/ospec/matchers.rb +24 -0
- data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
- data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
- data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
- data/gems/ospec/lib/ospec/runner.rb +40 -0
- data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
- data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
- data/gems/ospec/lib/ospec/runner/options.rb +36 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
- data/gems/ospec/ospec.gemspec +0 -0
- data/gems/rquery/README.md +9 -0
- data/gems/rquery/lib/rquery.rb +10 -0
- data/gems/rquery/lib/rquery/ajax.rb +4 -0
- data/gems/rquery/lib/rquery/css.rb +96 -0
- data/gems/rquery/lib/rquery/document.rb +25 -0
- data/gems/rquery/lib/rquery/element.rb +292 -0
- data/gems/rquery/lib/rquery/event.rb +108 -0
- data/gems/rquery/lib/rquery/jquery.js +8177 -0
- data/gems/rquery/lib/rquery/request.rb +138 -0
- data/gems/rquery/lib/rquery/response.rb +49 -0
- data/gems/rquery/rquery.gemspec +16 -0
- data/lib/opal.js +1597 -0
- data/lib/opal.rb +6 -69
- data/lib/opal/builder.rb +115 -0
- data/lib/opal/bundle.rb +131 -0
- data/lib/opal/command.rb +11 -0
- data/lib/opal/context.rb +69 -0
- data/lib/opal/context/console.rb +12 -0
- data/lib/opal/context/file_system.rb +19 -0
- data/lib/opal/context/loader.rb +117 -0
- data/lib/opal/gem.rb +153 -0
- data/lib/opal/ruby/nodes.rb +1302 -0
- data/lib/opal/ruby/parser.rb +780 -0
- data/lib/opal/ruby/ruby_parser.rb +5170 -0
- data/lib/opal/ruby/ruby_parser.y +1298 -0
- data/opal.gemspec +11 -256
- metadata +179 -240
- data/.gitmodules +0 -6
- data/Opalfile +0 -384
- data/VERSION +0 -1
- data/demos/apps/browser_demo/index.html +0 -11
- data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
- data/demos/apps/simple_opal/Opalfile +0 -13
- data/demos/apps/simple_opal/index.html +0 -11
- data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
- data/demos/apps/simple_opal/lib/main_window.rb +0 -146
- data/demos/browser/request/index.html +0 -52
- data/demos/browser/request/request.rb +0 -48
- data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
- data/gen/browser/__PROJECT_NAME__/index.html +0 -11
- data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
- data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
- data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
- data/lib/opal/builders/base.rb +0 -50
- data/lib/opal/builders/css.rb +0 -46
- data/lib/opal/builders/javascript.rb +0 -44
- data/lib/opal/builders/opal.rb +0 -79
- data/lib/opal/builders/ruby.rb +0 -50
- data/lib/opal/builders/ruby/generate.rb +0 -1851
- data/lib/opal/builders/ruby/nodes.rb +0 -210
- data/lib/opal/builders/ruby/ruby.rb +0 -916
- data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
- data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
- data/lib/opal/models/build_item.rb +0 -104
- data/lib/opal/models/hash_struct.rb +0 -40
- data/lib/opal/models/project.rb +0 -252
- data/lib/opal/models/struct_accessors.rb +0 -58
- data/lib/opal/models/target.rb +0 -176
- data/lib/opal/opal/build.rb +0 -169
- data/lib/opal/opal/env/console.rb +0 -66
- data/lib/opal/opal/env/fs.rb +0 -98
- data/lib/opal/opal/env/object.rb +0 -48
- data/lib/opal/opal/environment.rb +0 -139
- data/lib/opal/opal/gen.rb +0 -62
- data/lib/opal/opal/opal.rb +0 -75
- data/lib/opal/opal/repl.rb +0 -38
- data/lib/opal/opalfile/dsl.rb +0 -62
- data/lib/opal/opalfile/opalfile.rb +0 -133
- data/lib/opal/opalfile/task.rb +0 -96
- data/lib/opal/opalfile/task_manager.rb +0 -63
- data/lib/opal/opalfile/task_scope.rb +0 -52
- data/lib/opal/rack/app_server.rb +0 -119
- data/lib/opal/rake/opal_task.rb +0 -34
- data/opals/opal/README.md +0 -37
- data/opals/opal/browser/Opalfile +0 -11
- data/opals/opal/browser/README.md +0 -146
- data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
- data/opals/opal/browser/lib/browser.rb +0 -118
- data/opals/opal/browser/lib/browser/builder.rb +0 -41
- data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
- data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
- data/opals/opal/browser/lib/browser/document.rb +0 -146
- data/opals/opal/browser/lib/browser/element.rb +0 -487
- data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
- data/opals/opal/browser/lib/browser/element/css.rb +0 -290
- data/opals/opal/browser/lib/browser/element/form.rb +0 -146
- data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
- data/opals/opal/browser/lib/browser/event/event.rb +0 -177
- data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
- data/opals/opal/browser/lib/browser/geometry.rb +0 -97
- data/opals/opal/browser/lib/browser/json.rb +0 -32
- data/opals/opal/browser/lib/browser/request/request.rb +0 -201
- data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
- data/opals/opal/browser/lib/browser/string.rb +0 -42
- data/opals/opal/browser/lib/browser/touch.rb +0 -37
- data/opals/opal/browser/lib/browser/vml_context.js +0 -33
- data/opals/opal/browser/lib/browser/window.rb +0 -36
- data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
- data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
- data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
- data/opals/opal/browser/spec/element/body_spec.rb +0 -11
- data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
- data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
- data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
- data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
- data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
- data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
- data/opals/opal/browser/spec/element/show_spec.rb +0 -31
- data/opals/opal/browser/spec/element/style_spec.rb +0 -69
- data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
- data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
- data/opals/opal/browser/spec/spec_helper.rb +0 -1
- data/opals/opal/opal/Opalfile +0 -14
- data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
- data/opals/opal/opal/spec/fixtures/super.rb +0 -70
- data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
- data/opals/opal/opal/spec/language/block_spec.rb +0 -18
- data/opals/opal/opal/spec/language/case_spec.rb +0 -103
- data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
- data/opals/opal/opal/spec/language/super_spec.rb +0 -26
- data/opals/opal/runtime/Opalfile +0 -78
- data/opals/opal/runtime/README.md +0 -12
- data/opals/opal/runtime/docs/debugging.md +0 -51
- data/opals/opal/runtime/lib/array.rb +0 -1516
- data/opals/opal/runtime/lib/basic_object.rb +0 -49
- data/opals/opal/runtime/lib/class.rb +0 -54
- data/opals/opal/runtime/lib/dir.rb +0 -36
- data/opals/opal/runtime/lib/error.rb +0 -49
- data/opals/opal/runtime/lib/false_class.rb +0 -52
- data/opals/opal/runtime/lib/file.rb +0 -79
- data/opals/opal/runtime/lib/hash.rb +0 -791
- data/opals/opal/runtime/lib/io.rb +0 -39
- data/opals/opal/runtime/lib/kernel.rb +0 -288
- data/opals/opal/runtime/lib/match_data.rb +0 -36
- data/opals/opal/runtime/lib/module.rb +0 -109
- data/opals/opal/runtime/lib/nil_class.rb +0 -69
- data/opals/opal/runtime/lib/number.rb +0 -398
- data/opals/opal/runtime/lib/proc.rb +0 -77
- data/opals/opal/runtime/lib/range.rb +0 -63
- data/opals/opal/runtime/lib/regexp.rb +0 -111
- data/opals/opal/runtime/lib/ruby.rb +0 -30
- data/opals/opal/runtime/lib/string.rb +0 -328
- data/opals/opal/runtime/lib/symbol.rb +0 -40
- data/opals/opal/runtime/lib/top_self.rb +0 -33
- data/opals/opal/runtime/lib/true_class.rb +0 -45
- data/opals/opal/runtime/runtime/browser.js +0 -287
- data/opals/opal/runtime/runtime/debug.js +0 -180
- data/opals/opal/runtime/runtime/opal.js +0 -1008
- data/opals/opal/runtime/runtime/post_opal.js +0 -1
- data/opals/opal/runtime/runtime/pre_opal.js +0 -2
- data/opals/opal/runtime/runtime/server_side.js +0 -50
- data/opals/opal/spec/LICENSE.txt +0 -26
- data/opals/opal/spec/Opalfile +0 -5
- data/opals/opal/spec/bin/spec.rb +0 -43
- data/opals/opal/spec/lib/spec.rb +0 -33
- data/opals/opal/spec/lib/spec/dsl.rb +0 -41
- data/opals/opal/spec/lib/spec/example.rb +0 -35
- data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
- data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
- data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
- data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
- data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
- data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
- data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
- data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
- data/opals/opal/spec/lib/spec/expectations.rb +0 -46
- data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
- data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
- data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
- data/opals/opal/spec/lib/spec/matchers.rb +0 -50
- data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
- data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
- data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
- data/opals/opal/spec/lib/spec/runner.rb +0 -48
- data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
- data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
- data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
- data/opals/opal/spec/resources/index.html +0 -25
- data/opals/opal/spec/resources/spec.css +0 -132
- data/spec/cherry_kit/iseq_spec.rb +0 -38
- data/spec/spec_helper.rb +0 -16
- data/spec/vienna_spec.rb +0 -7
- data/yard/index.html +0 -43
- 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);
|