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