opal 0.4.4 → 0.5.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 +7 -0
- data/.gitignore +1 -0
- data/.gitmodules +3 -0
- data/.travis.yml +8 -0
- data/CONTRIBUTING.md +46 -2
- data/Gemfile +17 -0
- data/README.md +13 -4
- data/Rakefile +22 -119
- data/bin/opal +11 -2
- data/bin/opal-repl +71 -0
- data/corelib/array.rb +554 -356
- data/corelib/basic_object.rb +22 -18
- data/corelib/boolean.rb +15 -6
- data/corelib/class.rb +12 -6
- data/corelib/comparable.rb +40 -9
- data/corelib/encoding.rb +164 -0
- data/corelib/enumerable.rb +532 -300
- data/corelib/enumerator.rb +31 -6
- data/corelib/error.rb +14 -3
- data/corelib/hash.rb +108 -97
- data/corelib/io.rb +30 -0
- data/corelib/kernel.rb +151 -82
- data/corelib/main.rb +7 -0
- data/corelib/match_data.rb +118 -0
- data/corelib/method.rb +58 -0
- data/corelib/module.rb +145 -77
- data/corelib/native.rb +144 -22
- data/corelib/nil_class.rb +2 -0
- data/corelib/numeric.rb +259 -61
- data/corelib/opal.rb +43 -28
- data/corelib/proc.rb +21 -9
- data/corelib/range.rb +42 -23
- data/corelib/regexp.rb +51 -9
- data/corelib/runtime.js +470 -129
- data/corelib/string.rb +170 -246
- data/corelib/struct.rb +13 -1
- data/corelib/time.rb +414 -43
- data/doc/compiler.md +42 -0
- data/doc/compiler_options.md +5 -0
- data/doc/examples/node_http_server.rb +49 -0
- data/doc/external_libraries.md +9 -0
- data/doc/generated_javascript.md +272 -0
- data/doc/home.md +17 -0
- data/doc/method_missing.md +58 -0
- data/doc/static_applications.md +60 -0
- data/doc/using_ruby_from_javascript.md +18 -0
- data/doc/using_sprockets.md +65 -0
- data/lib/opal.rb +18 -15
- data/lib/opal/builder.rb +26 -9
- data/lib/opal/cli.rb +143 -90
- data/lib/opal/cli_options.rb +19 -13
- data/lib/opal/compiler.rb +307 -0
- data/lib/opal/erb.rb +3 -3
- data/lib/opal/fragment.rb +34 -0
- data/lib/opal/nodes.rb +25 -0
- data/lib/opal/nodes/arglist.rb +56 -0
- data/lib/opal/nodes/array.rb +54 -0
- data/lib/opal/nodes/base.rb +150 -0
- data/lib/opal/nodes/base_scope.rb +11 -0
- data/lib/opal/nodes/call.rb +195 -0
- data/lib/opal/nodes/call_special.rb +153 -0
- data/lib/opal/nodes/case.rb +96 -0
- data/lib/opal/nodes/class.rb +43 -0
- data/lib/opal/nodes/constants.rb +91 -0
- data/lib/opal/nodes/def.rb +157 -0
- data/lib/opal/nodes/defined.rb +113 -0
- data/lib/opal/nodes/definitions.rb +182 -0
- data/lib/opal/nodes/hash.rb +67 -0
- data/lib/opal/nodes/helpers.rb +105 -0
- data/lib/opal/nodes/if.rb +60 -0
- data/lib/opal/nodes/iter.rb +118 -0
- data/lib/opal/nodes/literal.rb +193 -0
- data/lib/opal/nodes/logic.rb +211 -0
- data/lib/opal/nodes/masgn.rb +62 -0
- data/lib/opal/nodes/module.rb +46 -0
- data/lib/opal/nodes/rescue.rb +134 -0
- data/lib/opal/nodes/singleton_class.rb +26 -0
- data/lib/opal/nodes/super.rb +97 -0
- data/lib/opal/nodes/top.rb +63 -0
- data/lib/opal/nodes/variables.rb +155 -0
- data/lib/opal/nodes/while.rb +65 -0
- data/lib/opal/nodes/yield.rb +84 -0
- data/lib/opal/parser.rb +294 -2169
- data/lib/opal/parser/grammar.rb +5326 -0
- data/lib/opal/{grammar.y → parser/grammar.y} +180 -113
- data/lib/opal/parser/keywords.rb +64 -0
- data/lib/opal/{lexer.rb → parser/lexer.rb} +278 -327
- data/lib/opal/{lexer_scope.rb → parser/parser_scope.rb} +2 -5
- data/lib/opal/parser/sexp.rb +63 -0
- data/lib/opal/source_map.rb +6 -5
- data/lib/opal/target_scope.rb +15 -17
- data/lib/opal/version.rb +1 -1
- data/mri_spec/cli_spec.rb +67 -6
- data/opal.gemspec +4 -4
- data/spec/config.ru +2 -1
- data/spec/corelib/enumerable/all_break_spec.rb +5 -0
- data/spec/corelib/enumerable/any_break_spec.rb +5 -0
- data/spec/corelib/enumerable/collect_break_spec.rb +13 -0
- data/spec/corelib/enumerable/count_break_spec.rb +5 -0
- data/spec/corelib/enumerable/detect_break_spec.rb +5 -0
- data/spec/corelib/enumerable/drop_while_break_spec.rb +5 -0
- data/spec/corelib/enumerable/each_slice_break.rb +6 -0
- data/spec/corelib/enumerable/each_with_index_break_spec.rb +5 -0
- data/spec/corelib/enumerable/each_with_object_break_spec.rb +5 -0
- data/spec/corelib/enumerable/find_all_break_spec.rb +5 -0
- data/spec/corelib/enumerable/find_index_break_spec.rb +5 -0
- data/spec/corelib/enumerable/grep_break_spec.rb +5 -0
- data/spec/corelib/enumerable/max_break_spec.rb +5 -0
- data/spec/corelib/enumerable/max_by_break_spec.rb +5 -0
- data/spec/corelib/enumerable/min_break_spec.rb +5 -0
- data/spec/corelib/enumerable/min_by_break_spec.rb +5 -0
- data/spec/corelib/enumerable/none_break_spec.rb +5 -0
- data/spec/corelib/enumerable/one_break_spec.rb +5 -0
- data/spec/corelib/enumerable/reduce_break_spec.rb +5 -0
- data/spec/corelib/enumerable/take_while_break_spec.rb +5 -0
- data/spec/{rubyspec → corelib}/fixtures/class.rb +0 -0
- data/spec/{rubyspec → corelib}/fixtures/class_variables.rb +0 -0
- data/spec/{rubyspec → corelib}/fixtures/constants.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/Array_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/block_given_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/class_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/define_singleton_method_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/equal_value_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/extend_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/format_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/freeze_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/instance_eval_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/instance_variable_defined_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/instance_variable_get_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/instance_variable_set_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/loop_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/match_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/method_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/methods_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/nil_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/p_spec.rb +8 -6
- data/spec/{opal → corelib}/kernel/printf_spec.rb +4 -2
- data/spec/{opal → corelib}/kernel/proc_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/rand_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/respond_to_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/kernel/send_spec.rb +0 -0
- data/spec/{opal → corelib}/kernel/sprintf_spec.rb +0 -0
- data/spec/corelib/kernel/warn_spec.rb +83 -0
- data/spec/{rubyspec → corelib}/language/block_spec.rb +17 -18
- data/spec/{rubyspec → corelib}/language/fixtures/array.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/block.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/break.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/ensure.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/literal_lambda.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/metaclass.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/module.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/next.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/return.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/send.rb +1 -1
- data/spec/{rubyspec → corelib}/language/fixtures/send_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/super.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/variables.rb +0 -0
- data/spec/{rubyspec → corelib}/language/fixtures/yield.rb +0 -0
- data/spec/{rubyspec → corelib}/language/numbers_spec.rb +0 -2
- data/spec/{rubyspec → corelib}/language/predefined_spec.rb +0 -0
- data/spec/{rubyspec → corelib}/language/proc_spec.rb +0 -2
- data/spec/{rubyspec → corelib}/language/regexp_spec.rb +0 -0
- data/spec/{rubyspec → corelib}/language/send_spec.rb +6 -7
- data/spec/{rubyspec → corelib}/language/string_spec.rb +0 -0
- data/spec/{rubyspec → corelib}/language/symbol_spec.rb +0 -0
- data/spec/{rubyspec → corelib}/language/variables_spec.rb +1 -2
- data/spec/{rubyspec → corelib}/language/versions/array_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/block_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/break_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/case_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/hash_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/literal_lambda_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/not_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/send_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/symbol_1.9.rb +0 -0
- data/spec/{rubyspec → corelib}/language/versions/variables_1.9.rb +1 -1
- data/spec/corelib/module/alias_method_spec.rb +28 -0
- data/spec/{opal → corelib}/module/ancestors_spec.rb +0 -0
- data/spec/{opal → corelib}/module/append_features_spec.rb +0 -0
- data/spec/corelib/module/attr_accessor_spec.rb +26 -0
- data/spec/{rubyspec/core → corelib}/module/const_defined_spec.rb +1 -2
- data/spec/{rubyspec/core → corelib}/module/const_get_spec.rb +1 -2
- data/spec/{rubyspec/core → corelib}/module/const_missing_spec.rb +1 -2
- data/spec/{rubyspec/core → corelib}/module/const_set_spec.rb +1 -2
- data/spec/{opal → corelib}/module/constants_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/module/fixtures/classes.rb +0 -0
- data/spec/{rubyspec/core → corelib}/module/method_defined_spec.rb +0 -1
- data/spec/{opal → corelib}/module/module_function_spec.rb +0 -2
- data/spec/corelib/module/name_spec.rb +52 -0
- data/spec/{rubyspec/core → corelib}/module/public_method_defined_spec.rb +0 -1
- data/spec/{rubyspec/core → corelib}/module/remove_const_spec.rb +0 -1
- data/spec/{rubyspec/core → corelib}/module/undef_method_spec.rb +0 -1
- data/spec/{opal → corelib}/native/alias_native_spec.rb +7 -0
- data/spec/{opal → corelib}/native/each_spec.rb +2 -5
- data/spec/{opal → corelib}/native/element_reference_spec.rb +0 -0
- data/spec/{rubyspec/core/hash/to_native_spec.rb → corelib/native/ext_spec.rb} +0 -0
- data/spec/corelib/native/initialize_spec.rb +17 -0
- data/spec/{opal → corelib}/native/method_missing_spec.rb +0 -0
- data/spec/corelib/native/new_spec.rb +6 -0
- data/spec/{rubyspec/core → corelib}/numeric/abs_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/bit_and_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/bit_or_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/bit_xor_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/ceil_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/chr_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/comparison_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/complement_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/divide_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/downto_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/eql_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/equal_value_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/even_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/exponent_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/floor_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/gt_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/gte_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/integer_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/left_shift_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/lt_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/lte_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/magnitude_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/minus_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/modulo_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/multiply_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/next_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/odd_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/ord_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/plus_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/pred_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/right_shift_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/step_spec.rb +0 -3
- data/spec/{rubyspec/core → corelib}/numeric/succ_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/times_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/to_f_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/to_i_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/to_json_spec.rb +0 -0
- data/spec/corelib/numeric/to_s_spec.rb +26 -0
- data/spec/{rubyspec/core → corelib}/numeric/uminus_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/upto_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/numeric/zero_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/proc/call_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/proc/element_reference_spec.rb +0 -0
- data/spec/{opal → corelib}/proc/proc_tricks_spec.rb +0 -0
- data/spec/corelib/runtime/begin_spec.rb +39 -0
- data/spec/{opal → corelib}/runtime/block_send_spec.rb +0 -0
- data/spec/{opal/language → corelib/runtime}/block_spec.rb +10 -0
- data/spec/corelib/runtime/bridged_classes_spec.rb +64 -0
- data/spec/{opal → corelib/runtime}/constants_spec.rb +0 -0
- data/spec/{opal → corelib}/runtime/eval_spec.rb +0 -0
- data/spec/{opal → corelib}/runtime/main_methods_spec.rb +0 -0
- data/spec/{opal → corelib/runtime}/method_missing_spec.rb +0 -0
- data/spec/corelib/runtime/method_spec.rb +31 -0
- data/spec/corelib/runtime/paren_spec.rb +14 -0
- data/spec/{opal/language → corelib/runtime}/rescue_spec.rb +11 -0
- data/spec/{opal/language → corelib/runtime}/return_spec.rb +0 -0
- data/spec/{opal → corelib}/runtime/send_spec.rb +0 -0
- data/spec/{opal/language → corelib/runtime}/singleton_class_spec.rb +0 -0
- data/spec/{opal/language → corelib/runtime}/super_spec.rb +113 -0
- data/spec/{opal/language → corelib/runtime}/variables_spec.rb +0 -0
- data/spec/{opal → corelib}/source_map_spec.rb +3 -3
- data/spec/{rubyspec/core → corelib}/string/chop_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/chr_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/clone_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/comparison_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/dup_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/element_reference_spec.rb +0 -1
- data/spec/{rubyspec/core → corelib}/string/fixtures/classes.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/format_spec.rb +0 -0
- data/spec/{opal → corelib}/string/freeze_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/gsub_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/lines_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/ljust_spec.rb +0 -1
- data/spec/{rubyspec/core → corelib}/string/lstrip_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/match_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/next_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/ord_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/partition_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/rindex_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/rjust_spec.rb +0 -1
- data/spec/{rubyspec/core → corelib}/string/rstrip_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/scan_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/slice_spec.rb +1 -2
- data/spec/{rubyspec/core → corelib}/string/split_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/strip_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/sub_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/succ_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/sum_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/to_f_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/to_i_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/tr_s_spec.rb +0 -0
- data/spec/{rubyspec/core → corelib}/string/tr_spec.rb +0 -0
- data/spec/filters/bugs/array.rb +236 -4
- data/spec/filters/bugs/basic_object.rb +4 -0
- data/spec/filters/bugs/class.rb +4 -0
- data/spec/filters/bugs/enumerable.rb +58 -0
- data/spec/filters/bugs/enumerator.rb +6 -0
- data/spec/filters/bugs/hash.rb +146 -0
- data/spec/filters/bugs/kernel.rb +10 -0
- data/spec/filters/bugs/language.rb +366 -0
- data/spec/filters/bugs/module.rb +14 -0
- data/spec/filters/bugs/regexp.rb +7 -0
- data/spec/filters/bugs/set.rb +7 -0
- data/spec/filters/bugs/{singleton/instance.rb → singleton.rb} +3 -1
- data/spec/filters/bugs/string.rb +37 -0
- data/spec/filters/bugs/stringscanner.rb +18 -0
- data/spec/filters/bugs/struct.rb +11 -0
- data/spec/filters/bugs/symbol.rb +5 -0
- data/spec/filters/bugs/time.rb +28 -0
- data/spec/filters/bugs/unknown.rb +11 -0
- data/spec/filters/unsupported/array_subclasses.rb +32 -0
- data/spec/filters/unsupported/encoding.rb +14 -0
- data/spec/filters/unsupported/float.rb +4 -0
- data/spec/filters/unsupported/frozen.rb +57 -0
- data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
- data/spec/filters/unsupported/immutable_strings.rb +6 -0
- data/spec/filters/unsupported/mutable_strings.rb +49 -0
- data/spec/filters/unsupported/private_methods.rb +26 -0
- data/spec/filters/{mspec → unsupported}/ruby_exe.rb +0 -0
- data/spec/filters/unsupported/string_subclasses.rb +8 -0
- data/spec/filters/unsupported/tainted.rb +46 -0
- data/spec/filters/unsupported/time.rb +21 -0
- data/spec/filters/unsupported/trusted.rb +26 -0
- data/spec/opal/{parser → compiler}/irb_spec.rb +9 -9
- data/spec/{parser → opal/parser}/alias_spec.rb +0 -0
- data/spec/{parser → opal/parser}/and_spec.rb +0 -0
- data/spec/{parser → opal/parser}/array_spec.rb +0 -0
- data/spec/{parser → opal/parser}/attrasgn_spec.rb +0 -0
- data/spec/{parser → opal/parser}/begin_spec.rb +0 -0
- data/spec/{parser → opal/parser}/block_spec.rb +0 -0
- data/spec/{parser → opal/parser}/break_spec.rb +0 -0
- data/spec/{parser → opal/parser}/call_spec.rb +33 -8
- data/spec/{parser → opal/parser}/class_spec.rb +0 -0
- data/spec/{parser → opal/parser}/const_spec.rb +0 -0
- data/spec/{parser → opal/parser}/cvar_spec.rb +0 -0
- data/spec/{parser → opal/parser}/def_spec.rb +17 -17
- data/spec/{parser → opal/parser}/false_spec.rb +0 -0
- data/spec/{parser → opal/parser}/file_spec.rb +0 -0
- data/spec/{parser → opal/parser}/gvar_spec.rb +0 -0
- data/spec/{parser → opal/parser}/hash_spec.rb +0 -0
- data/spec/opal/parser/heredoc_spec.rb +30 -0
- data/spec/{parser → opal/parser}/iasgn_spec.rb +0 -0
- data/spec/{parser → opal/parser}/if_spec.rb +0 -0
- data/spec/{parser → opal/parser}/int_spec.rb +0 -0
- data/spec/opal/parser/iter_spec.rb +59 -0
- data/spec/{parser → opal/parser}/ivar_spec.rb +0 -0
- data/spec/opal/parser/lambda_spec.rb +64 -0
- data/spec/{parser → opal/parser}/lasgn_spec.rb +0 -0
- data/spec/{parser → opal/parser}/line_spec.rb +0 -0
- data/spec/{parser → opal/parser}/lvar_spec.rb +6 -6
- data/spec/{parser → opal/parser}/masgn_spec.rb +0 -0
- data/spec/{parser → opal/parser}/module_spec.rb +0 -0
- data/spec/{parser → opal/parser}/nil_spec.rb +0 -0
- data/spec/{parser → opal/parser}/not_spec.rb +0 -0
- data/spec/{parser → opal/parser}/nth_ref_spec.rb +0 -0
- data/spec/{parser → opal/parser}/op_asgn1_spec.rb +0 -0
- data/spec/{parser → opal/parser}/op_asgn2_spec.rb +0 -0
- data/spec/{parser → opal/parser}/or_spec.rb +0 -0
- data/spec/{parser → opal/parser}/parse_spec.rb +17 -17
- data/spec/{parser → opal/parser}/regexp_spec.rb +0 -0
- data/spec/{parser → opal/parser}/return_spec.rb +0 -0
- data/spec/{parser → opal/parser}/sclass_spec.rb +0 -0
- data/spec/{parser → opal/parser}/self_spec.rb +0 -0
- data/spec/{parser → opal/parser}/str_spec.rb +1 -12
- data/spec/{parser → opal/parser}/string_spec.rb +0 -0
- data/spec/opal/parser/super_spec.rb +20 -0
- data/spec/{parser → opal/parser}/true_spec.rb +0 -0
- data/spec/{parser → opal/parser}/undef_spec.rb +0 -0
- data/spec/{parser → opal/parser}/unless_spec.rb +0 -0
- data/spec/{parser → opal/parser}/while_spec.rb +0 -0
- data/spec/{parser → opal/parser}/xstr_spec.rb +2 -2
- data/spec/{parser → opal/parser}/yield_spec.rb +0 -0
- data/spec/ospec/main.rb.erb +1 -13
- data/spec/ospec/mspec_fixes.rb +87 -0
- data/spec/ospec/runner.rb +188 -0
- data/spec/rubyspecs +351 -0
- data/spec/spec_helper.rb +8 -198
- data/spec/{opal → stdlib}/erb/erb_spec.rb +3 -3
- data/spec/{opal → stdlib}/erb/inline_block.opalerb +0 -0
- data/spec/{opal → stdlib}/erb/quoted.opalerb +0 -0
- data/spec/{opal → stdlib}/erb/simple.opalerb +0 -0
- data/spec/stdlib/json/ext_spec.rb +48 -0
- data/spec/{opal → stdlib}/json/parse_spec.rb +0 -0
- data/spec/stdlib/template/paths_spec.rb +10 -0
- data/stdlib/delegate.rb +29 -0
- data/stdlib/dir.rb +5 -0
- data/stdlib/file.rb +7 -0
- data/stdlib/json.rb +82 -27
- data/stdlib/opal-parser.rb +46 -0
- data/stdlib/opal-source-maps.js.erb +1 -1
- data/stdlib/pathname.rb +31 -0
- data/stdlib/{racc.rb → racc/parser.rb} +0 -0
- data/stdlib/securerandom.rb +12 -0
- data/stdlib/set.rb +89 -0
- data/stdlib/stringio.rb +12 -4
- data/stdlib/strscan.rb +19 -0
- data/stdlib/template.rb +4 -0
- data/stdlib/thread.rb +20 -0
- data/tasks/mspec.rake +147 -0
- metadata +650 -1266
- data/lib/opal/core_ext.rb +0 -5
- data/lib/opal/grammar.rb +0 -5137
- data/lib/opal/grammar_helpers.rb +0 -364
- data/lib/opal/require_parser.rb +0 -77
- data/spec/filters/bugs/alias.rb +0 -6
- data/spec/filters/bugs/ancestors.rb +0 -4
- data/spec/filters/bugs/array/combination.rb +0 -11
- data/spec/filters/bugs/array/count.rb +0 -3
- data/spec/filters/bugs/array/delete_if.rb +0 -3
- data/spec/filters/bugs/array/drop.rb +0 -3
- data/spec/filters/bugs/array/drop_while.rb +0 -5
- data/spec/filters/bugs/array/eql.rb +0 -3
- data/spec/filters/bugs/array/flatten.rb +0 -9
- data/spec/filters/bugs/array/minus.rb +0 -5
- data/spec/filters/bugs/array/multipliy.rb +0 -9
- data/spec/filters/bugs/array/new.rb +0 -3
- data/spec/filters/bugs/array/pop.rb +0 -6
- data/spec/filters/bugs/array/rassoc.rb +0 -4
- data/spec/filters/bugs/array/rindex.rb +0 -6
- data/spec/filters/bugs/array/select.rb +0 -3
- data/spec/filters/bugs/array/shift.rb +0 -7
- data/spec/filters/bugs/array/shuffle.rb +0 -11
- data/spec/filters/bugs/array/slice.rb +0 -7
- data/spec/filters/bugs/array/take.rb +0 -3
- data/spec/filters/bugs/array/to_a.rb +0 -3
- data/spec/filters/bugs/array/try_convert.rb +0 -7
- data/spec/filters/bugs/array/uniq.rb +0 -10
- data/spec/filters/bugs/array/zip.rb +0 -4
- data/spec/filters/bugs/array_delete.rb +0 -4
- data/spec/filters/bugs/array_fetch.rb +0 -3
- data/spec/filters/bugs/array_first.rb +0 -3
- data/spec/filters/bugs/array_flatten.rb +0 -14
- data/spec/filters/bugs/array_intersection.rb +0 -5
- data/spec/filters/bugs/array_join.rb +0 -6
- data/spec/filters/bugs/break.rb +0 -10
- data/spec/filters/bugs/case.rb +0 -4
- data/spec/filters/bugs/coerce_integer.rb +0 -9
- data/spec/filters/bugs/enumerable_sort_by.rb +0 -3
- data/spec/filters/bugs/kernel/instance_variables.rb +0 -3
- data/spec/filters/bugs/kernel/rand.rb +0 -4
- data/spec/filters/bugs/language/array.rb +0 -3
- data/spec/filters/bugs/language/block.rb +0 -6
- data/spec/filters/bugs/language/break.rb +0 -3
- data/spec/filters/bugs/language/class.rb +0 -12
- data/spec/filters/bugs/language/class_variables.rb +0 -12
- data/spec/filters/bugs/language/def.rb +0 -27
- data/spec/filters/bugs/language/defined.rb +0 -3
- data/spec/filters/bugs/language/ensure.rb +0 -4
- data/spec/filters/bugs/language/execution.rb +0 -4
- data/spec/filters/bugs/language/for.rb +0 -18
- data/spec/filters/bugs/language/if.rb +0 -13
- data/spec/filters/bugs/language/loop.rb +0 -4
- data/spec/filters/bugs/language/metaclass.rb +0 -14
- data/spec/filters/bugs/language/module.rb +0 -6
- data/spec/filters/bugs/language/next.rb +0 -3
- data/spec/filters/bugs/language/or.rb +0 -3
- data/spec/filters/bugs/language/order.rb +0 -4
- data/spec/filters/bugs/language/precedence.rb +0 -10
- data/spec/filters/bugs/language/proc.rb +0 -24
- data/spec/filters/bugs/language/redo.rb +0 -5
- data/spec/filters/bugs/language/rescue.rb +0 -9
- data/spec/filters/bugs/language/retry.rb +0 -5
- data/spec/filters/bugs/language/send.rb +0 -10
- data/spec/filters/bugs/language/super.rb +0 -9
- data/spec/filters/bugs/language/until.rb +0 -8
- data/spec/filters/bugs/language/variables.rb +0 -37
- data/spec/filters/bugs/language/while.rb +0 -6
- data/spec/filters/bugs/language/yield.rb +0 -5
- data/spec/filters/bugs/module/class_variables.rb +0 -6
- data/spec/filters/bugs/module/method_defined.rb +0 -6
- data/spec/filters/bugs/public_methods.rb +0 -4
- data/spec/filters/bugs/return.rb +0 -7
- data/spec/filters/bugs/source_map.rb +0 -3
- data/spec/filters/bugs/string/center.rb +0 -4
- data/spec/filters/bugs/string/lines.rb +0 -3
- data/spec/filters/mspec/mocks.rb +0 -3
- data/spec/filters/mspec/should_receive.rb +0 -5
- data/spec/filters/parser/block_args.rb +0 -51
- data/spec/mspec/guards/block_device.rb +0 -0
- data/spec/mspec/guards/endian.rb +0 -0
- data/spec/mspec/helpers/environment.rb +0 -0
- data/spec/mspec/helpers/language_version.rb +0 -0
- data/spec/mspec/helpers/tmp.rb +0 -0
- data/spec/opal/array/element_reference_spec.rb +0 -206
- data/spec/opal/array/equal_value_spec.rb +0 -19
- data/spec/opal/array/fill_spec.rb +0 -26
- data/spec/opal/array/reduce_spec.rb +0 -31
- data/spec/opal/array/to_json_spec.rb +0 -9
- data/spec/opal/basic_object/send_spec.rb +0 -28
- data/spec/opal/boolean/singleton_class_spec.rb +0 -9
- data/spec/opal/boolean/to_json_spec.rb +0 -11
- data/spec/opal/browser/local_storage_spec.rb +0 -55
- data/spec/opal/class/constants_spec.rb +0 -7
- data/spec/opal/class/extend_spec.rb +0 -47
- data/spec/opal/class/instance_methods_spec.rb +0 -13
- data/spec/opal/class/last_value_spec.rb +0 -67
- data/spec/opal/class/proc_methods_spec.rb +0 -23
- data/spec/opal/class/singleton_methods_spec.rb +0 -41
- data/spec/opal/hash/allocate_spec.rb +0 -16
- data/spec/opal/hash/new_spec.rb +0 -10
- data/spec/opal/hash/to_s_spec.rb +0 -9
- data/spec/opal/kernel/to_json_spec.rb +0 -7
- data/spec/opal/module/alias_method_spec.rb +0 -10
- data/spec/opal/module/attr_accessor_spec.rb +0 -8
- data/spec/opal/native/new_spec.rb +0 -19
- data/spec/opal/native/nil_spec.rb +0 -14
- data/spec/opal/nil/to_json_spec.rb +0 -7
- data/spec/opal/numeric/equal_spec.rb +0 -9
- data/spec/opal/runtime2/call_spec.rb +0 -16
- data/spec/opal/runtime2/class_hierarchy_spec.rb +0 -21
- data/spec/opal/runtime2/defined_spec.rb +0 -11
- data/spec/opal/runtime2/super_spec.rb +0 -16
- data/spec/opal/string/to_json_spec.rb +0 -8
- data/spec/parser/iter_spec.rb +0 -59
- data/spec/parser/lambda_spec.rb +0 -64
- data/spec/parser/parser_spec.rb +0 -41
- data/spec/parser/strscan/check_spec.rb +0 -13
- data/spec/parser/strscan/get_byte_spec.rb +0 -29
- data/spec/parser/strscan/scan_spec.rb +0 -33
- data/spec/parser/strscan/skip_spec.rb +0 -40
- data/spec/parser/super_spec.rb +0 -20
- data/spec/rubyspec/core/array/allocate_spec.rb +0 -19
- data/spec/rubyspec/core/array/append_spec.rb +0 -43
- data/spec/rubyspec/core/array/array_spec.rb +0 -7
- data/spec/rubyspec/core/array/assoc_spec.rb +0 -40
- data/spec/rubyspec/core/array/at_spec.rb +0 -56
- data/spec/rubyspec/core/array/choice_spec.rb +0 -20
- data/spec/rubyspec/core/array/clear_spec.rb +0 -61
- data/spec/rubyspec/core/array/clone_spec.rb +0 -15
- data/spec/rubyspec/core/array/collect_spec.rb +0 -53
- data/spec/rubyspec/core/array/combination_spec.rb +0 -55
- data/spec/rubyspec/core/array/compact_spec.rb +0 -111
- data/spec/rubyspec/core/array/comparison_spec.rb +0 -16
- data/spec/rubyspec/core/array/concat_spec.rb +0 -19
- data/spec/rubyspec/core/array/constructor_spec.rb +0 -24
- data/spec/rubyspec/core/array/count_spec.rb +0 -17
- data/spec/rubyspec/core/array/delete_at_spec.rb +0 -71
- data/spec/rubyspec/core/array/delete_if_spec.rb +0 -71
- data/spec/rubyspec/core/array/delete_spec.rb +0 -104
- data/spec/rubyspec/core/array/drop_spec.rb +0 -29
- data/spec/rubyspec/core/array/drop_while_spec.rb +0 -17
- data/spec/rubyspec/core/array/dup_spec.rb +0 -15
- data/spec/rubyspec/core/array/each_index_spec.rb +0 -40
- data/spec/rubyspec/core/array/each_spec.rb +0 -30
- data/spec/rubyspec/core/array/empty_spec.rb +0 -10
- data/spec/rubyspec/core/array/eql_spec.rb +0 -14
- data/spec/rubyspec/core/array/fetch_spec.rb +0 -52
- data/spec/rubyspec/core/array/find_index_spec.rb +0 -8
- data/spec/rubyspec/core/array/first_spec.rb +0 -89
- data/spec/rubyspec/core/array/fixtures/classes.rb +0 -538
- data/spec/rubyspec/core/array/flatten_spec.rb +0 -232
- data/spec/rubyspec/core/array/frozen_spec.rb +0 -32
- data/spec/rubyspec/core/array/include_spec.rb +0 -33
- data/spec/rubyspec/core/array/index_spec.rb +0 -6
- data/spec/rubyspec/core/array/insert_spec.rb +0 -90
- data/spec/rubyspec/core/array/inspect_spec.rb +0 -7
- data/spec/rubyspec/core/array/intersection_spec.rb +0 -78
- data/spec/rubyspec/core/array/join_spec.rb +0 -34
- data/spec/rubyspec/core/array/keep_if_spec.rb +0 -12
- data/spec/rubyspec/core/array/last_spec.rb +0 -88
- data/spec/rubyspec/core/array/length_spec.rb +0 -7
- data/spec/rubyspec/core/array/map_spec.rb +0 -11
- data/spec/rubyspec/core/array/max_spec.rb +0 -32
- data/spec/rubyspec/core/array/min_spec.rb +0 -32
- data/spec/rubyspec/core/array/minus_spec.rb +0 -89
- data/spec/rubyspec/core/array/multiply_spec.rb +0 -143
- data/spec/rubyspec/core/array/new_spec.rb +0 -137
- data/spec/rubyspec/core/array/ntimes_spec.rb +0 -26
- data/spec/rubyspec/core/array/plus_spec.rb +0 -64
- data/spec/rubyspec/core/array/pop_spec.rb +0 -196
- data/spec/rubyspec/core/array/push_spec.rb +0 -44
- data/spec/rubyspec/core/array/rassoc_spec.rb +0 -38
- data/spec/rubyspec/core/array/reject_spec.rb +0 -134
- data/spec/rubyspec/core/array/replace_spec.rb +0 -7
- data/spec/rubyspec/core/array/reverse_each_spec.rb +0 -37
- data/spec/rubyspec/core/array/reverse_spec.rb +0 -58
- data/spec/rubyspec/core/array/rindex_spec.rb +0 -71
- data/spec/rubyspec/core/array/select_spec.rb +0 -36
- data/spec/rubyspec/core/array/shared/collect.rb +0 -7
- data/spec/rubyspec/core/array/shared/enumeratorize.rb +0 -12
- data/spec/rubyspec/core/array/shared/eql.rb +0 -95
- data/spec/rubyspec/core/array/shared/index.rb +0 -37
- data/spec/rubyspec/core/array/shared/inspect.rb +0 -3
- data/spec/rubyspec/core/array/shared/join.rb +0 -7
- data/spec/rubyspec/core/array/shared/keep_if.rb +0 -3
- data/spec/rubyspec/core/array/shared/length.rb +0 -3
- data/spec/rubyspec/core/array/shared/replace.rb +0 -3
- data/spec/rubyspec/core/array/shared/slice.rb +0 -3
- data/spec/rubyspec/core/array/shift_spec.rb +0 -160
- data/spec/rubyspec/core/array/shuffle_spec.rb +0 -87
- data/spec/rubyspec/core/array/size_spec.rb +0 -7
- data/spec/rubyspec/core/array/slice_spec.rb +0 -166
- data/spec/rubyspec/core/array/sort_spec.rb +0 -271
- data/spec/rubyspec/core/array/take_spec.rb +0 -29
- data/spec/rubyspec/core/array/take_while_spec.rb +0 -17
- data/spec/rubyspec/core/array/to_a_spec.rb +0 -24
- data/spec/rubyspec/core/array/to_ary_spec.rb +0 -20
- data/spec/rubyspec/core/array/try_convert_spec.rb +0 -52
- data/spec/rubyspec/core/array/uniq_spec.rb +0 -167
- data/spec/rubyspec/core/array/unshift_spec.rb +0 -64
- data/spec/rubyspec/core/array/zip_spec.rb +0 -55
- data/spec/rubyspec/core/class/fixtures/classes.rb +0 -9
- data/spec/rubyspec/core/class/new_spec.rb +0 -113
- data/spec/rubyspec/core/enumerable/all_spec.rb +0 -130
- data/spec/rubyspec/core/enumerable/any_spec.rb +0 -150
- data/spec/rubyspec/core/enumerable/collect_spec.rb +0 -39
- data/spec/rubyspec/core/enumerable/count_spec.rb +0 -45
- data/spec/rubyspec/core/enumerable/detect_spec.rb +0 -48
- data/spec/rubyspec/core/enumerable/drop_spec.rb +0 -20
- data/spec/rubyspec/core/enumerable/drop_while_spec.rb +0 -18
- data/spec/rubyspec/core/enumerable/each_slice_spec.rb +0 -25
- data/spec/rubyspec/core/enumerable/each_with_index_spec.rb +0 -14
- data/spec/rubyspec/core/enumerable/each_with_object_spec.rb +0 -20
- data/spec/rubyspec/core/enumerable/entries_spec.rb +0 -9
- data/spec/rubyspec/core/enumerable/find_all_spec.rb +0 -16
- data/spec/rubyspec/core/enumerable/find_index_spec.rb +0 -44
- data/spec/rubyspec/core/enumerable/find_spec.rb +0 -56
- data/spec/rubyspec/core/enumerable/first_spec.rb +0 -43
- data/spec/rubyspec/core/enumerable/fixtures/classes.rb +0 -240
- data/spec/rubyspec/core/enumerable/grep_spec.rb +0 -24
- data/spec/rubyspec/core/enumerable/group_by_spec.rb +0 -16
- data/spec/rubyspec/core/enumerable/none_spec.rb +0 -68
- data/spec/rubyspec/core/enumerable/select_spec.rb +0 -16
- data/spec/rubyspec/core/enumerable/sort_by_spec.rb +0 -31
- data/spec/rubyspec/core/enumerable/take_spec.rb +0 -43
- data/spec/rubyspec/core/enumerable/to_a_spec.rb +0 -9
- data/spec/rubyspec/core/enumerator/each_spec.rb +0 -11
- data/spec/rubyspec/core/enumerator/new_spec.rb +0 -17
- data/spec/rubyspec/core/enumerator/next_spec.rb +0 -25
- data/spec/rubyspec/core/enumerator/rewind_spec.rb +0 -28
- data/spec/rubyspec/core/false/and_spec.rb +0 -11
- data/spec/rubyspec/core/false/inspect_spec.rb +0 -7
- data/spec/rubyspec/core/false/or_spec.rb +0 -11
- data/spec/rubyspec/core/false/to_s_spec.rb +0 -7
- data/spec/rubyspec/core/false/xor_spec.rb +0 -11
- data/spec/rubyspec/core/hash/allocate_spec.rb +0 -13
- data/spec/rubyspec/core/hash/assoc_spec.rb +0 -25
- data/spec/rubyspec/core/hash/clear_spec.rb +0 -19
- data/spec/rubyspec/core/hash/clone_spec.rb +0 -10
- data/spec/rubyspec/core/hash/constructor_spec.rb +0 -13
- data/spec/rubyspec/core/hash/default_proc_spec.rb +0 -20
- data/spec/rubyspec/core/hash/default_spec.rb +0 -17
- data/spec/rubyspec/core/hash/delete_if_spec.rb +0 -13
- data/spec/rubyspec/core/hash/delete_spec.rb +0 -11
- data/spec/rubyspec/core/hash/dup_spec.rb +0 -10
- data/spec/rubyspec/core/hash/each_key_spec.rb +0 -15
- data/spec/rubyspec/core/hash/each_pair_spec.rb +0 -30
- data/spec/rubyspec/core/hash/each_spec.rb +0 -36
- data/spec/rubyspec/core/hash/each_value_spec.rb +0 -15
- data/spec/rubyspec/core/hash/element_reference_spec.rb +0 -41
- data/spec/rubyspec/core/hash/element_set_spec.rb +0 -7
- data/spec/rubyspec/core/hash/empty_spec.rb +0 -10
- data/spec/rubyspec/core/hash/fetch_spec.rb +0 -24
- data/spec/rubyspec/core/hash/flatten_spec.rb +0 -46
- data/spec/rubyspec/core/hash/has_key_spec.rb +0 -24
- data/spec/rubyspec/core/hash/has_value_spec.rb +0 -12
- data/spec/rubyspec/core/hash/include_spec.rb +0 -24
- data/spec/rubyspec/core/hash/index_spec.rb +0 -13
- data/spec/rubyspec/core/hash/indexes_spec.rb +0 -9
- data/spec/rubyspec/core/hash/indices_spec.rb +0 -9
- data/spec/rubyspec/core/hash/invert_spec.rb +0 -12
- data/spec/rubyspec/core/hash/keep_if_spec.rb +0 -18
- data/spec/rubyspec/core/hash/key_spec.rb +0 -24
- data/spec/rubyspec/core/hash/keys_spec.rb +0 -10
- data/spec/rubyspec/core/hash/length_spec.rb +0 -10
- data/spec/rubyspec/core/hash/member_spec.rb +0 -24
- data/spec/rubyspec/core/hash/merge_spec.rb +0 -37
- data/spec/rubyspec/core/hash/new_spec.rb +0 -19
- data/spec/rubyspec/core/hash/rassoc_spec.rb +0 -34
- data/spec/rubyspec/core/hash/reject_spec.rb +0 -18
- data/spec/rubyspec/core/hash/replace_spec.rb +0 -7
- data/spec/rubyspec/core/hash/select_spec.rb +0 -52
- data/spec/rubyspec/core/hash/shift_spec.rb +0 -19
- data/spec/rubyspec/core/hash/size_spec.rb +0 -10
- data/spec/rubyspec/core/hash/to_a_spec.rb +0 -13
- data/spec/rubyspec/core/hash/to_json_spec.rb +0 -11
- data/spec/rubyspec/core/hash/update_spec.rb +0 -17
- data/spec/rubyspec/core/hash/value_spec.rb +0 -12
- data/spec/rubyspec/core/hash/values_at_spec.rb +0 -9
- data/spec/rubyspec/core/hash/values_spec.rb +0 -7
- data/spec/rubyspec/core/kernel/eql_spec.rb +0 -15
- data/spec/rubyspec/core/kernel/equal_spec.rb +0 -12
- data/spec/rubyspec/core/kernel/tap_spec.rb +0 -10
- data/spec/rubyspec/core/kernel/to_s_spec.rb +0 -5
- data/spec/rubyspec/core/matchdata/to_a_spec.rb +0 -5
- data/spec/rubyspec/core/nil/and_spec.rb +0 -11
- data/spec/rubyspec/core/nil/dup_spec.rb +0 -7
- data/spec/rubyspec/core/nil/inspect_spec.rb +0 -7
- data/spec/rubyspec/core/nil/nil_spec.rb +0 -7
- data/spec/rubyspec/core/nil/or_spec.rb +0 -11
- data/spec/rubyspec/core/nil/to_a_spec.rb +0 -7
- data/spec/rubyspec/core/nil/to_f_spec.rb +0 -11
- data/spec/rubyspec/core/nil/to_h_spec.rb +0 -10
- data/spec/rubyspec/core/nil/to_i_spec.rb +0 -11
- data/spec/rubyspec/core/nil/to_s_spec.rb +0 -7
- data/spec/rubyspec/core/nil/xor_spec.rb +0 -11
- data/spec/rubyspec/core/numeric/to_s_spec.rb +0 -8
- data/spec/rubyspec/core/range/begin_spec.rb +0 -9
- data/spec/rubyspec/core/range/case_compare_spec.rb +0 -15
- data/spec/rubyspec/core/range/end_spec.rb +0 -9
- data/spec/rubyspec/core/regexp/match_spec.rb +0 -95
- data/spec/rubyspec/core/string/capitalize_spec.rb +0 -10
- data/spec/rubyspec/core/string/casecmp_spec.rb +0 -16
- data/spec/rubyspec/core/string/center_spec.rb +0 -49
- data/spec/rubyspec/core/string/chomp_spec.rb +0 -48
- data/spec/rubyspec/core/string/downcase_spec.rb +0 -6
- data/spec/rubyspec/core/string/empty_spec.rb +0 -7
- data/spec/rubyspec/core/string/end_with_spec.rb +0 -16
- data/spec/rubyspec/core/string/include_spec.rb +0 -6
- data/spec/rubyspec/core/string/index_spec.rb +0 -405
- data/spec/rubyspec/core/string/intern_spec.rb +0 -9
- data/spec/rubyspec/core/string/length_spec.rb +0 -9
- data/spec/rubyspec/core/string/reverse_spec.rb +0 -7
- data/spec/rubyspec/core/string/size_spec.rb +0 -9
- data/spec/rubyspec/core/string/start_with_spec.rb +0 -12
- data/spec/rubyspec/core/string/swapcase_spec.rb +0 -13
- data/spec/rubyspec/core/string/to_a_spec.rb +0 -9
- data/spec/rubyspec/core/string/to_s_spec.rb +0 -6
- data/spec/rubyspec/core/string/to_str_spec.rb +0 -6
- data/spec/rubyspec/core/string/to_sym_spec.rb +0 -9
- data/spec/rubyspec/core/string/upcase_spec.rb +0 -6
- data/spec/rubyspec/core/struct/fixtures/classes.rb +0 -26
- data/spec/rubyspec/core/struct/initialize_spec.rb +0 -11
- data/spec/rubyspec/core/struct/new_spec.rb +0 -24
- data/spec/rubyspec/core/symbol/to_proc_spec.rb +0 -12
- data/spec/rubyspec/core/time/at_spec.rb +0 -7
- data/spec/rubyspec/core/time/day_spec.rb +0 -5
- data/spec/rubyspec/core/time/friday_spec.rb +0 -9
- data/spec/rubyspec/core/time/hour_spec.rb +0 -5
- data/spec/rubyspec/core/time/min_spec.rb +0 -5
- data/spec/rubyspec/core/time/monday_spec.rb +0 -9
- data/spec/rubyspec/core/time/month_spec.rb +0 -5
- data/spec/rubyspec/core/time/now_spec.rb +0 -5
- data/spec/rubyspec/core/time/saturday_spec.rb +0 -9
- data/spec/rubyspec/core/true/and_spec.rb +0 -11
- data/spec/rubyspec/core/true/inspect_spec.rb +0 -7
- data/spec/rubyspec/core/true/or_spec.rb +0 -11
- data/spec/rubyspec/core/true/to_s_spec.rb +0 -7
- data/spec/rubyspec/core/true/xor_spec.rb +0 -11
- data/spec/rubyspec/language/alias_spec.rb +0 -160
- data/spec/rubyspec/language/and_spec.rb +0 -66
- data/spec/rubyspec/language/array_spec.rb +0 -117
- data/spec/rubyspec/language/break_spec.rb +0 -332
- data/spec/rubyspec/language/case_spec.rb +0 -310
- data/spec/rubyspec/language/class_spec.rb +0 -190
- data/spec/rubyspec/language/class_variable_spec.rb +0 -56
- data/spec/rubyspec/language/def_spec.rb +0 -551
- data/spec/rubyspec/language/defined_spec.rb +0 -107
- data/spec/rubyspec/language/ensure_spec.rb +0 -104
- data/spec/rubyspec/language/execution_spec.rb +0 -15
- data/spec/rubyspec/language/for_spec.rb +0 -192
- data/spec/rubyspec/language/hash_spec.rb +0 -65
- data/spec/rubyspec/language/if_spec.rb +0 -356
- data/spec/rubyspec/language/literal_lambda_spec.rb +0 -1
- data/spec/rubyspec/language/loop_spec.rb +0 -67
- data/spec/rubyspec/language/metaclass_spec.rb +0 -159
- data/spec/rubyspec/language/module_spec.rb +0 -56
- data/spec/rubyspec/language/next_spec.rb +0 -469
- data/spec/rubyspec/language/not_spec.rb +0 -55
- data/spec/rubyspec/language/or_spec.rb +0 -90
- data/spec/rubyspec/language/order_spec.rb +0 -77
- data/spec/rubyspec/language/precedence_spec.rb +0 -483
- data/spec/rubyspec/language/redo_spec.rb +0 -65
- data/spec/rubyspec/language/rescue_spec.rb +0 -121
- data/spec/rubyspec/language/retry_spec.rb +0 -56
- data/spec/rubyspec/language/return_spec.rb +0 -281
- data/spec/rubyspec/language/singleton_class_spec.rb +0 -32
- data/spec/rubyspec/language/super_spec.rb +0 -284
- data/spec/rubyspec/language/undef_spec.rb +0 -16
- data/spec/rubyspec/language/unless_spec.rb +0 -45
- data/spec/rubyspec/language/until_spec.rb +0 -234
- data/spec/rubyspec/language/while_spec.rb +0 -238
- data/spec/rubyspec/language/yield_spec.rb +0 -128
- data/spec/rubyspec/library/date/new_spec.rb +0 -10
- data/spec/rubyspec/library/date/to_s_spec.rb +0 -7
- data/spec/rubyspec/library/date/today_spec.rb +0 -7
- data/spec/rubyspec/library/erb/util/html_escape_spec.rb +0 -10
- data/spec/rubyspec/library/observer/add_observer_spec.rb +0 -31
- data/spec/rubyspec/library/observer/count_observers_spec.rb +0 -33
- data/spec/rubyspec/library/observer/delete_observer_spec.rb +0 -19
- data/spec/rubyspec/library/observer/delete_observers_spec.rb +0 -19
- data/spec/rubyspec/library/observer/fixtures/classes.rb +0 -25
- data/spec/rubyspec/library/observer/notify_observers_spec.rb +0 -31
- data/spec/rubyspec/library/rbconfig/config_spec.rb +0 -47
- data/spec/rubyspec/library/singleton/clone_spec.rb +0 -8
- data/spec/rubyspec/library/singleton/dup_spec.rb +0 -8
- data/spec/rubyspec/library/singleton/fixtures/classes.rb +0 -18
- data/spec/rubyspec/library/singleton/instance_spec.rb +0 -30
- data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +0 -29
- data/spec/rubyspec/library/stringscanner/pos_spec.rb +0 -20
- data/spec/rubyspec/spec_helper.rb +0 -96
- data/stdlib/fileutils.rb +0 -0
- data/stdlib/iconv.rb +0 -0
- data/stdlib/opal-browser/local_storage.rb +0 -27
- data/stdlib/opal-browser/script_loader.rb +0 -35
- data/stdlib/opal-parser.js.erb +0 -13
- data/stdlib/yaml.rb +0 -0
data/corelib/opal.rb
CHANGED
|
@@ -13,13 +13,17 @@ require 'enumerator'
|
|
|
13
13
|
require 'array'
|
|
14
14
|
require 'hash'
|
|
15
15
|
require 'string'
|
|
16
|
+
require 'match_data'
|
|
17
|
+
require 'encoding'
|
|
16
18
|
require 'numeric'
|
|
17
19
|
require 'proc'
|
|
20
|
+
require 'method'
|
|
18
21
|
require 'range'
|
|
19
22
|
require 'time'
|
|
20
23
|
require 'struct'
|
|
21
24
|
require 'native'
|
|
22
25
|
require 'io'
|
|
26
|
+
require 'main'
|
|
23
27
|
|
|
24
28
|
# regexp matches
|
|
25
29
|
$& = $~ = $` = $' = nil
|
|
@@ -31,32 +35,9 @@ $: = []
|
|
|
31
35
|
$/ = "\n"
|
|
32
36
|
$, = " "
|
|
33
37
|
|
|
34
|
-
# native global
|
|
35
|
-
$$ = $global = Native(`Opal.global`)
|
|
36
|
-
|
|
37
38
|
ARGV = []
|
|
38
39
|
ARGF = Object.new
|
|
39
40
|
ENV = {}
|
|
40
|
-
TRUE = true
|
|
41
|
-
FALSE = false
|
|
42
|
-
NIL = nil
|
|
43
|
-
|
|
44
|
-
STDERR = $stderr = IO.new
|
|
45
|
-
STDIN = $stdin = IO.new
|
|
46
|
-
STDOUT = $stdout = IO.new
|
|
47
|
-
|
|
48
|
-
def $stdout.puts(*strs)
|
|
49
|
-
%x{
|
|
50
|
-
for (var i = 0; i < strs.length; i++) {
|
|
51
|
-
if(strs[i] instanceof Array) {
|
|
52
|
-
#{ puts(*`strs[i]`) }
|
|
53
|
-
} else {
|
|
54
|
-
$opal.puts(#{ `strs[i]`.to_s });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
nil
|
|
59
|
-
end
|
|
60
41
|
|
|
61
42
|
RUBY_PLATFORM = 'opal'
|
|
62
43
|
RUBY_ENGINE = 'opal'
|
|
@@ -64,10 +45,44 @@ RUBY_VERSION = '1.9.3'
|
|
|
64
45
|
RUBY_ENGINE_VERSION = '0.4.4'
|
|
65
46
|
RUBY_RELEASE_DATE = '2013-08-13'
|
|
66
47
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
48
|
+
module Opal
|
|
49
|
+
def self.coerce_to(object, type, method)
|
|
50
|
+
return object if type === object
|
|
51
|
+
|
|
52
|
+
unless object.respond_to? method
|
|
53
|
+
raise TypeError, "no implicit conversion of #{object.class} into #{type}"
|
|
54
|
+
end
|
|
70
55
|
|
|
71
|
-
|
|
72
|
-
|
|
56
|
+
object.__send__ method
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.truthy?(value)
|
|
60
|
+
if value
|
|
61
|
+
true
|
|
62
|
+
else
|
|
63
|
+
false
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.falsy?(value)
|
|
68
|
+
if value
|
|
69
|
+
false
|
|
70
|
+
else
|
|
71
|
+
true
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.destructure(args)
|
|
76
|
+
%x{
|
|
77
|
+
if (args.length == 1) {
|
|
78
|
+
return args[0];
|
|
79
|
+
}
|
|
80
|
+
else if (args._isArray) {
|
|
81
|
+
return args;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
return $slice.call(args);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
end
|
|
73
88
|
end
|
data/corelib/proc.rb
CHANGED
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
class Proc
|
|
2
2
|
`def._isProc = true`
|
|
3
|
-
`def.is_lambda =
|
|
3
|
+
`def.is_lambda = false`
|
|
4
4
|
|
|
5
5
|
def self.new(&block)
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
unless block
|
|
7
|
+
raise ArgumentError, "tried to create a Proc object without a block"
|
|
8
|
+
end
|
|
9
|
+
|
|
8
10
|
block
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
def call(*args)
|
|
13
|
+
def call(*args, &block)
|
|
12
14
|
%x{
|
|
13
|
-
|
|
15
|
+
if (block !== nil) {
|
|
16
|
+
self._p = block;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var result;
|
|
20
|
+
|
|
21
|
+
if (self.is_lambda) {
|
|
22
|
+
result = self.apply(null, args);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
result = Opal.$yieldX(self, args);
|
|
26
|
+
}
|
|
14
27
|
|
|
15
28
|
if (result === $breaker) {
|
|
16
29
|
return $breaker.$v;
|
|
@@ -29,16 +42,15 @@ class Proc
|
|
|
29
42
|
def lambda?
|
|
30
43
|
# This method should tell the user if the proc tricks are unavailable,
|
|
31
44
|
# (see Proc#lambda? on ruby docs to find out more).
|
|
32
|
-
|
|
45
|
+
`!!self.is_lambda`
|
|
33
46
|
end
|
|
34
47
|
|
|
48
|
+
# FIXME: this should support the various splats and optional arguments
|
|
35
49
|
def arity
|
|
36
|
-
|
|
50
|
+
`self.length`
|
|
37
51
|
end
|
|
38
52
|
|
|
39
53
|
def to_n
|
|
40
54
|
self
|
|
41
55
|
end
|
|
42
56
|
end
|
|
43
|
-
|
|
44
|
-
class Method < Proc; end
|
data/corelib/range.rb
CHANGED
|
@@ -4,22 +4,21 @@ class Range
|
|
|
4
4
|
%x{
|
|
5
5
|
Range._proto._isRange = true;
|
|
6
6
|
|
|
7
|
-
Opal.range = function(
|
|
7
|
+
Opal.range = function(first, last, exc) {
|
|
8
8
|
var range = new Range._alloc;
|
|
9
|
-
range.begin =
|
|
10
|
-
range.end =
|
|
9
|
+
range.begin = first;
|
|
10
|
+
range.end = last;
|
|
11
11
|
range.exclude = exc;
|
|
12
12
|
|
|
13
13
|
return range;
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
attr_reader :begin
|
|
18
|
-
attr_reader :end
|
|
17
|
+
attr_reader :begin, :end
|
|
19
18
|
|
|
20
|
-
def initialize(
|
|
21
|
-
@begin =
|
|
22
|
-
@end =
|
|
19
|
+
def initialize(first, last, exclude = false)
|
|
20
|
+
@begin = first
|
|
21
|
+
@end = last
|
|
23
22
|
@exclude = exclude
|
|
24
23
|
end
|
|
25
24
|
|
|
@@ -29,33 +28,36 @@ class Range
|
|
|
29
28
|
return false;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
return
|
|
31
|
+
return self.exclude === other.exclude &&
|
|
32
|
+
self.begin == other.begin &&
|
|
33
|
+
self.end == other.end;
|
|
33
34
|
}
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
# FIXME: currently hardcoded to assume range holds numerics
|
|
37
38
|
def ===(obj)
|
|
38
|
-
|
|
39
|
+
include?(obj)
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def cover?(value)
|
|
42
|
-
|
|
43
|
+
@begin <= value && (@exclude ? value < @end : value <= @end)
|
|
43
44
|
end
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
self.end
|
|
47
|
-
end
|
|
46
|
+
alias last end
|
|
48
47
|
|
|
49
48
|
def each(&block)
|
|
50
|
-
|
|
49
|
+
return enum_for :each unless block_given?
|
|
50
|
+
|
|
51
|
+
current = @begin
|
|
52
|
+
last = @end
|
|
51
53
|
|
|
52
|
-
while current
|
|
54
|
+
while current < last
|
|
53
55
|
yield current
|
|
54
56
|
|
|
55
57
|
current = current.succ
|
|
56
58
|
end
|
|
57
59
|
|
|
58
|
-
yield current
|
|
60
|
+
yield current if !@exclude && current == last
|
|
59
61
|
|
|
60
62
|
self
|
|
61
63
|
end
|
|
@@ -63,21 +65,38 @@ class Range
|
|
|
63
65
|
def eql?(other)
|
|
64
66
|
return false unless Range === other
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
@exclude === other.exclude_end? &&
|
|
69
|
+
@begin.eql?(other.begin) &&
|
|
70
|
+
@end.eql?(other.end)
|
|
67
71
|
end
|
|
68
72
|
|
|
69
73
|
def exclude_end?
|
|
70
|
-
|
|
74
|
+
@exclude
|
|
71
75
|
end
|
|
72
76
|
|
|
77
|
+
alias first begin
|
|
78
|
+
|
|
73
79
|
# FIXME: currently hardcoded to assume range holds numerics
|
|
74
80
|
def include?(obj)
|
|
75
|
-
|
|
81
|
+
cover?(obj)
|
|
76
82
|
end
|
|
77
83
|
|
|
78
|
-
|
|
84
|
+
# FIXME: currently hardcoded to assume range holds numerics
|
|
85
|
+
def max
|
|
86
|
+
if block_given?
|
|
87
|
+
super
|
|
88
|
+
else
|
|
89
|
+
`#@exclude ? #@end - 1 : #@end`
|
|
90
|
+
end
|
|
91
|
+
end
|
|
79
92
|
|
|
80
|
-
|
|
93
|
+
def min
|
|
94
|
+
if block_given?
|
|
95
|
+
super
|
|
96
|
+
else
|
|
97
|
+
@begin
|
|
98
|
+
end
|
|
99
|
+
end
|
|
81
100
|
|
|
82
101
|
alias member? include?
|
|
83
102
|
|
|
@@ -86,7 +105,7 @@ class Range
|
|
|
86
105
|
end
|
|
87
106
|
|
|
88
107
|
def to_s
|
|
89
|
-
`#{
|
|
108
|
+
`#{@begin.inspect} + (#@exclude ? '...' : '..') + #{@end.inspect}`
|
|
90
109
|
end
|
|
91
110
|
|
|
92
111
|
alias inspect to_s
|
data/corelib/regexp.rb
CHANGED
|
@@ -5,21 +5,48 @@ class Regexp
|
|
|
5
5
|
`string.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\^\\$\\|]/g, '\\\\$&')`
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
+
def self.union(*parts)
|
|
9
|
+
`new RegExp(parts.join(''))`
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
def self.new(regexp, options = undefined)
|
|
9
|
-
`
|
|
13
|
+
`new RegExp(regexp, options)`
|
|
10
14
|
end
|
|
11
15
|
|
|
12
16
|
def ==(other)
|
|
13
|
-
`other.constructor == RegExp &&
|
|
17
|
+
`other.constructor == RegExp && self.toString() === other.toString()`
|
|
14
18
|
end
|
|
15
19
|
|
|
16
20
|
def ===(str)
|
|
17
|
-
|
|
21
|
+
if `str._isString == null` && str.respond_to?(:to_str)
|
|
22
|
+
str = str.to_str
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if `str._isString == null`
|
|
26
|
+
return false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
`self.test(str)`
|
|
18
30
|
end
|
|
19
31
|
|
|
20
32
|
def =~(string)
|
|
33
|
+
if `string === nil`
|
|
34
|
+
$~ = $` = $' = nil
|
|
35
|
+
|
|
36
|
+
return
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if `string._isString == null`
|
|
40
|
+
unless string.respond_to? :to_str
|
|
41
|
+
raise TypeError, "no implicit conversion of #{string.class} into String"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
string = string.to_str
|
|
45
|
+
end
|
|
46
|
+
|
|
21
47
|
%x{
|
|
22
|
-
var re =
|
|
48
|
+
var re = self;
|
|
49
|
+
|
|
23
50
|
if (re.global) {
|
|
24
51
|
// should we clear it afterwards too?
|
|
25
52
|
re.lastIndex = 0;
|
|
@@ -45,18 +72,33 @@ class Regexp
|
|
|
45
72
|
alias eql? ==
|
|
46
73
|
|
|
47
74
|
def inspect
|
|
48
|
-
|
|
75
|
+
`self.toString()`
|
|
49
76
|
end
|
|
50
77
|
|
|
51
78
|
def match(string, pos = undefined)
|
|
79
|
+
if `string === nil`
|
|
80
|
+
$~ = $` = $' = nil
|
|
81
|
+
|
|
82
|
+
return
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if `string._isString == null`
|
|
86
|
+
unless string.respond_to? :to_str
|
|
87
|
+
raise TypeError, "no implicit conversion of #{string.class} into String"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
string = string.to_str
|
|
91
|
+
end
|
|
92
|
+
|
|
52
93
|
%x{
|
|
53
|
-
var re =
|
|
94
|
+
var re = self;
|
|
95
|
+
|
|
54
96
|
if (re.global) {
|
|
55
97
|
// should we clear it afterwards too?
|
|
56
98
|
re.lastIndex = 0;
|
|
57
99
|
}
|
|
58
100
|
else {
|
|
59
|
-
re = new RegExp(re.source, 'g' + (
|
|
101
|
+
re = new RegExp(re.source, 'g' + (re.multiline ? 'm' : '') + (re.ignoreCase ? 'i' : ''));
|
|
60
102
|
}
|
|
61
103
|
|
|
62
104
|
var result = re.exec(string);
|
|
@@ -71,12 +113,12 @@ class Regexp
|
|
|
71
113
|
end
|
|
72
114
|
|
|
73
115
|
def source
|
|
74
|
-
|
|
116
|
+
`self.source`
|
|
75
117
|
end
|
|
76
118
|
|
|
77
119
|
alias to_s source
|
|
78
120
|
|
|
79
121
|
def to_n
|
|
80
|
-
|
|
122
|
+
`self.valueOf()`
|
|
81
123
|
end
|
|
82
124
|
end
|
data/corelib/runtime.js
CHANGED
|
@@ -2,21 +2,36 @@
|
|
|
2
2
|
// The Opal object that is exposed globally
|
|
3
3
|
var Opal = this.Opal = {};
|
|
4
4
|
|
|
5
|
-
//
|
|
5
|
+
// The actual class for BasicObject
|
|
6
|
+
var RubyBasicObject;
|
|
7
|
+
|
|
8
|
+
// The actual Object class
|
|
9
|
+
var RubyObject;
|
|
10
|
+
|
|
11
|
+
// The actual Module class
|
|
12
|
+
var RubyModule;
|
|
13
|
+
|
|
14
|
+
// The actual Class class
|
|
15
|
+
var RubyClass;
|
|
16
|
+
|
|
17
|
+
// Constructor for instances of BasicObject
|
|
6
18
|
function BasicObject(){}
|
|
7
19
|
|
|
8
|
-
//
|
|
20
|
+
// Constructor for instances of Object
|
|
9
21
|
function Object(){}
|
|
10
22
|
|
|
11
|
-
// Class
|
|
23
|
+
// Constructor for instances of Class
|
|
12
24
|
function Class(){}
|
|
13
25
|
|
|
14
|
-
// Module
|
|
26
|
+
// Constructor for instances of Module
|
|
15
27
|
function Module(){}
|
|
16
28
|
|
|
17
|
-
//
|
|
29
|
+
// Constructor for instances of NilClass (nil)
|
|
18
30
|
function NilClass(){}
|
|
19
31
|
|
|
32
|
+
// All bridged classes - keep track to donate methods from Object
|
|
33
|
+
var bridged_classes = [];
|
|
34
|
+
|
|
20
35
|
// TopScope is used for inheriting constants from the top scope
|
|
21
36
|
var TopScope = function(){};
|
|
22
37
|
|
|
@@ -26,6 +41,8 @@
|
|
|
26
41
|
// To inherit scopes
|
|
27
42
|
Opal.constructor = TopScope;
|
|
28
43
|
|
|
44
|
+
Opal.constants = [];
|
|
45
|
+
|
|
29
46
|
// This is a useful reference to global object inside ruby files
|
|
30
47
|
Opal.global = this;
|
|
31
48
|
|
|
@@ -57,44 +74,94 @@
|
|
|
57
74
|
var const_scope = const_alloc.prototype = new base.constructor();
|
|
58
75
|
klass._scope = const_scope;
|
|
59
76
|
const_scope.base = klass;
|
|
77
|
+
klass._base_module = base.base;
|
|
60
78
|
const_scope.constructor = const_alloc;
|
|
79
|
+
const_scope.constants = [];
|
|
61
80
|
|
|
62
81
|
if (id) {
|
|
82
|
+
klass._orig_scope = base;
|
|
63
83
|
base[id] = base.constructor[id] = klass;
|
|
84
|
+
base.constants.push(id);
|
|
64
85
|
}
|
|
65
86
|
}
|
|
66
87
|
|
|
88
|
+
Opal.create_scope = create_scope;
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* A `class Foo; end` expression in ruby is compiled to call this runtime
|
|
92
|
+
* method which either returns an existing class of the given name, or creates
|
|
93
|
+
* a new class in the given `base` scope.
|
|
94
|
+
*
|
|
95
|
+
* If a constant with the given name exists, then we check to make sure that
|
|
96
|
+
* it is a class and also that the superclasses match. If either of these
|
|
97
|
+
* fail, then we raise a `TypeError`. Note, superklass may be null if one was
|
|
98
|
+
* not specified in the ruby code.
|
|
99
|
+
*
|
|
100
|
+
* We pass a constructor to this method of the form `function ClassName() {}`
|
|
101
|
+
* simply so that classes show up with nicely formatted names inside debuggers
|
|
102
|
+
* in the web browser (or node/sprockets).
|
|
103
|
+
*
|
|
104
|
+
* The `base` is the current `self` value where the class is being created
|
|
105
|
+
* from. We use this to get the scope for where the class should be created.
|
|
106
|
+
* If `base` is an object (not a class/module), we simple get its class and
|
|
107
|
+
* use that as the base instead.
|
|
108
|
+
*
|
|
109
|
+
* @param [Object] base where the class is being created
|
|
110
|
+
* @param [Class] superklass superclass of the new class (may be null)
|
|
111
|
+
* @param [String] id the name of the class to be created
|
|
112
|
+
* @param [Function] constructor function to use as constructor
|
|
113
|
+
* @return [Class] new or existing ruby class
|
|
114
|
+
*/
|
|
67
115
|
Opal.klass = function(base, superklass, id, constructor) {
|
|
68
|
-
var klass;
|
|
69
116
|
|
|
117
|
+
// If base is an object, use its class
|
|
70
118
|
if (!base._isClass) {
|
|
71
119
|
base = base._klass;
|
|
72
120
|
}
|
|
73
121
|
|
|
122
|
+
// Not specifying a superclass means we can assume it to be Object
|
|
74
123
|
if (superklass === null) {
|
|
75
|
-
superklass =
|
|
124
|
+
superklass = RubyObject;
|
|
76
125
|
}
|
|
77
126
|
|
|
78
|
-
|
|
79
|
-
|
|
127
|
+
var klass = base._scope[id];
|
|
128
|
+
|
|
129
|
+
// If a constant exists in the scope, then we must use that
|
|
130
|
+
if ($hasOwn.call(base._scope, id) && klass._orig_scope === base._scope) {
|
|
80
131
|
|
|
132
|
+
// Make sure the existing constant is a class, or raise error
|
|
81
133
|
if (!klass._isClass) {
|
|
82
134
|
throw Opal.TypeError.$new(id + " is not a class");
|
|
83
135
|
}
|
|
84
136
|
|
|
85
|
-
|
|
137
|
+
// Make sure existing class has same superclass
|
|
138
|
+
if (superklass !== klass._super && superklass !== RubyObject) {
|
|
86
139
|
throw Opal.TypeError.$new("superclass mismatch for class " + id);
|
|
87
140
|
}
|
|
88
141
|
}
|
|
142
|
+
else if (typeof(superklass) === 'function') {
|
|
143
|
+
// passed native constructor as superklass, so bridge it as ruby class
|
|
144
|
+
return bridge_class(id, superklass);
|
|
145
|
+
}
|
|
89
146
|
else {
|
|
147
|
+
// if class doesnt exist, create a new one with given superclass
|
|
90
148
|
klass = boot_class(superklass, constructor);
|
|
91
149
|
|
|
92
|
-
|
|
150
|
+
// name class using base (e.g. Foo or Foo::Baz)
|
|
151
|
+
klass._name = id;
|
|
93
152
|
|
|
94
|
-
|
|
153
|
+
// every class gets its own constant scope, inherited from current scope
|
|
154
|
+
create_scope(base._scope, klass, id);
|
|
95
155
|
|
|
156
|
+
// Name new class directly onto current scope (Opal.Foo.Baz = klass)
|
|
96
157
|
base[id] = base._scope[id] = klass;
|
|
97
158
|
|
|
159
|
+
// Copy all parent constants to child, unless parent is Object
|
|
160
|
+
if (superklass !== RubyObject && superklass !== RubyBasicObject) {
|
|
161
|
+
Opal.donate_constants(superklass, klass);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// call .inherited() hook with new class on the superclass
|
|
98
165
|
if (superklass.$inherited) {
|
|
99
166
|
superklass.$inherited(klass);
|
|
100
167
|
}
|
|
@@ -103,34 +170,99 @@
|
|
|
103
170
|
return klass;
|
|
104
171
|
};
|
|
105
172
|
|
|
173
|
+
// Create generic class with given superclass.
|
|
174
|
+
var boot_class = Opal.boot = function(superklass, constructor) {
|
|
175
|
+
// instances
|
|
176
|
+
var ctor = function() {};
|
|
177
|
+
ctor.prototype = superklass._proto;
|
|
178
|
+
|
|
179
|
+
constructor.prototype = new ctor();
|
|
180
|
+
|
|
181
|
+
constructor.prototype.constructor = constructor;
|
|
182
|
+
|
|
183
|
+
return boot_class_meta(superklass, constructor);
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
// class itself
|
|
187
|
+
function boot_class_meta(superklass, constructor) {
|
|
188
|
+
var mtor = function() {};
|
|
189
|
+
mtor.prototype = superklass.constructor.prototype;
|
|
190
|
+
|
|
191
|
+
function OpalClass() {};
|
|
192
|
+
OpalClass.prototype = new mtor();
|
|
193
|
+
|
|
194
|
+
var klass = new OpalClass();
|
|
195
|
+
|
|
196
|
+
klass._id = unique_id++;
|
|
197
|
+
klass._alloc = constructor;
|
|
198
|
+
klass._isClass = true;
|
|
199
|
+
klass.constructor = OpalClass;
|
|
200
|
+
klass._super = superklass;
|
|
201
|
+
klass._methods = [];
|
|
202
|
+
klass.__inc__ = [];
|
|
203
|
+
klass.__parent = superklass;
|
|
204
|
+
klass._proto = constructor.prototype;
|
|
205
|
+
|
|
206
|
+
constructor.prototype._klass = klass;
|
|
207
|
+
|
|
208
|
+
return klass;
|
|
209
|
+
}
|
|
210
|
+
|
|
106
211
|
// Define new module (or return existing module)
|
|
107
|
-
Opal.module = function(base, id
|
|
108
|
-
var
|
|
212
|
+
Opal.module = function(base, id) {
|
|
213
|
+
var module;
|
|
109
214
|
|
|
110
215
|
if (!base._isClass) {
|
|
111
216
|
base = base._klass;
|
|
112
217
|
}
|
|
113
218
|
|
|
114
219
|
if ($hasOwn.call(base._scope, id)) {
|
|
115
|
-
|
|
220
|
+
module = base._scope[id];
|
|
116
221
|
|
|
117
|
-
if (!
|
|
222
|
+
if (!module.__mod__ && module !== RubyObject) {
|
|
118
223
|
throw Opal.TypeError.$new(id + " is not a module")
|
|
119
224
|
}
|
|
120
225
|
}
|
|
121
226
|
else {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
klass._mod$ = true;
|
|
227
|
+
module = boot_module()
|
|
228
|
+
module._name = id;
|
|
125
229
|
|
|
126
|
-
|
|
230
|
+
create_scope(base._scope, module, id);
|
|
127
231
|
|
|
128
|
-
|
|
232
|
+
// Name new module directly onto current scope (Opal.Foo.Baz = module)
|
|
233
|
+
base[id] = base._scope[id] = module;
|
|
129
234
|
}
|
|
130
235
|
|
|
131
|
-
return
|
|
236
|
+
return module;
|
|
132
237
|
};
|
|
133
238
|
|
|
239
|
+
/*
|
|
240
|
+
* Internal function to create a new module instance. This simply sets up
|
|
241
|
+
* the prototype hierarchy and method tables.
|
|
242
|
+
*/
|
|
243
|
+
function boot_module() {
|
|
244
|
+
var mtor = function() {};
|
|
245
|
+
mtor.prototype = RubyModule.constructor.prototype;
|
|
246
|
+
|
|
247
|
+
function OpalModule() {};
|
|
248
|
+
OpalModule.prototype = new mtor();
|
|
249
|
+
|
|
250
|
+
var module = new OpalModule();
|
|
251
|
+
|
|
252
|
+
module._id = unique_id++;
|
|
253
|
+
module._isClass = true;
|
|
254
|
+
module.constructor = OpalModule;
|
|
255
|
+
module._super = RubyModule;
|
|
256
|
+
module._methods = [];
|
|
257
|
+
module.__inc__ = [];
|
|
258
|
+
module.__parent = RubyModule;
|
|
259
|
+
module._proto = {};
|
|
260
|
+
module.__mod__ = true;
|
|
261
|
+
module.__dep__ = [];
|
|
262
|
+
|
|
263
|
+
return module;
|
|
264
|
+
}
|
|
265
|
+
|
|
134
266
|
// Boot a base class (makes instances).
|
|
135
267
|
var boot_defclass = function(id, constructor, superklass) {
|
|
136
268
|
if (superklass) {
|
|
@@ -140,106 +272,170 @@
|
|
|
140
272
|
constructor.prototype = new ctor();
|
|
141
273
|
}
|
|
142
274
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
prototype.constructor = constructor;
|
|
275
|
+
constructor.prototype.constructor = constructor;
|
|
146
276
|
|
|
147
277
|
return constructor;
|
|
148
278
|
};
|
|
149
279
|
|
|
150
280
|
// Boot the actual (meta?) classes of core classes
|
|
151
|
-
var boot_makemeta = function(id,
|
|
152
|
-
function RubyClass() {
|
|
153
|
-
this._id = unique_id++;
|
|
154
|
-
};
|
|
281
|
+
var boot_makemeta = function(id, constructor, superklass) {
|
|
155
282
|
|
|
156
|
-
var
|
|
157
|
-
|
|
283
|
+
var mtor = function() {};
|
|
284
|
+
mtor.prototype = superklass.prototype;
|
|
158
285
|
|
|
159
|
-
|
|
286
|
+
function OpalClass() {};
|
|
287
|
+
OpalClass.prototype = new mtor();
|
|
160
288
|
|
|
161
|
-
var
|
|
162
|
-
prototype._alloc = klass;
|
|
163
|
-
prototype._isClass = true;
|
|
164
|
-
prototype._name = id;
|
|
165
|
-
prototype._super = superklass;
|
|
166
|
-
prototype.constructor = RubyClass;
|
|
167
|
-
prototype._methods = [];
|
|
289
|
+
var klass = new OpalClass();
|
|
168
290
|
|
|
169
|
-
|
|
170
|
-
klass.
|
|
171
|
-
|
|
291
|
+
klass._id = unique_id++;
|
|
292
|
+
klass._alloc = constructor;
|
|
293
|
+
klass._isClass = true;
|
|
294
|
+
klass._name = id;
|
|
295
|
+
klass._super = superklass;
|
|
296
|
+
klass.constructor = OpalClass;
|
|
297
|
+
klass._methods = [];
|
|
298
|
+
klass.__inc__ = [];
|
|
299
|
+
klass.__parent = superklass;
|
|
300
|
+
klass._proto = constructor.prototype;
|
|
172
301
|
|
|
173
|
-
|
|
302
|
+
constructor.prototype._klass = klass;
|
|
174
303
|
|
|
175
|
-
|
|
176
|
-
|
|
304
|
+
Opal[id] = klass;
|
|
305
|
+
Opal.constants.push(id);
|
|
177
306
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// instances
|
|
181
|
-
var ctor = function() {};
|
|
182
|
-
ctor.prototype = superklass._proto;
|
|
307
|
+
return klass;
|
|
308
|
+
};
|
|
183
309
|
|
|
184
|
-
|
|
185
|
-
|
|
310
|
+
/*
|
|
311
|
+
* For performance, some core ruby classes are toll-free bridged to their
|
|
312
|
+
* native javascript counterparts (e.g. a ruby Array is a javascript Array).
|
|
313
|
+
*
|
|
314
|
+
* This method is used to setup a native constructor (e.g. Array), to have
|
|
315
|
+
* its prototype act like a normal ruby class. Firstly, a new ruby class is
|
|
316
|
+
* created using the native constructor so that its prototype is set as the
|
|
317
|
+
* target for th new class. Note: all bridged classes are set to inherit
|
|
318
|
+
* from Object.
|
|
319
|
+
*
|
|
320
|
+
* Bridged classes are tracked in `bridged_classes` array so that methods
|
|
321
|
+
* defined on Object can be "donated" to all bridged classes. This allows
|
|
322
|
+
* us to fake the inheritance of a native prototype from our Object
|
|
323
|
+
* prototype.
|
|
324
|
+
*
|
|
325
|
+
* Example:
|
|
326
|
+
*
|
|
327
|
+
* bridge_class("Proc", Function);
|
|
328
|
+
*
|
|
329
|
+
* @param [String] name the name of the ruby class to create
|
|
330
|
+
* @param [Function] constructor native javascript constructor to use
|
|
331
|
+
* @return [Class] returns new ruby class
|
|
332
|
+
*/
|
|
333
|
+
function bridge_class(name, constructor) {
|
|
334
|
+
var klass = boot_class_meta(RubyObject, constructor);
|
|
186
335
|
|
|
187
|
-
|
|
336
|
+
klass._name = name;
|
|
188
337
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
this._id = unique_id++;
|
|
192
|
-
};
|
|
338
|
+
create_scope(Opal, klass, name);
|
|
339
|
+
bridged_classes.push(klass);
|
|
193
340
|
|
|
194
|
-
var
|
|
195
|
-
mtor.prototype = superklass.constructor.prototype;
|
|
341
|
+
var object_methods = RubyBasicObject._methods.concat(RubyObject._methods);
|
|
196
342
|
|
|
197
|
-
|
|
343
|
+
for (var i = 0, len = object_methods.length; i < len; i++) {
|
|
344
|
+
var meth = object_methods[i];
|
|
345
|
+
constructor.prototype[meth] = RubyObject._proto[meth];
|
|
346
|
+
}
|
|
198
347
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
prototype._isClass = true;
|
|
202
|
-
prototype.constructor = OpalClass;
|
|
203
|
-
prototype._super = superklass;
|
|
204
|
-
prototype._methods = [];
|
|
348
|
+
return klass;
|
|
349
|
+
};
|
|
205
350
|
|
|
206
|
-
|
|
207
|
-
|
|
351
|
+
/*
|
|
352
|
+
* constant assign
|
|
353
|
+
*/
|
|
354
|
+
Opal.casgn = function(base_module, name, value) {
|
|
355
|
+
var scope = base_module._scope;
|
|
208
356
|
|
|
209
|
-
|
|
357
|
+
if (value._isClass && value._name === nil) {
|
|
358
|
+
value._name = name;
|
|
359
|
+
}
|
|
210
360
|
|
|
211
|
-
|
|
361
|
+
if (value._isClass) {
|
|
362
|
+
value._base_module = base_module;
|
|
363
|
+
}
|
|
212
364
|
|
|
213
|
-
|
|
365
|
+
scope.constants.push(name);
|
|
366
|
+
return scope[name] = value;
|
|
214
367
|
};
|
|
215
368
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
constructor.constructor = Class;
|
|
224
|
-
constructor._methods = [];
|
|
369
|
+
/*
|
|
370
|
+
* constant decl
|
|
371
|
+
*/
|
|
372
|
+
Opal.cdecl = function(base_scope, name, value) {
|
|
373
|
+
base_scope.constants.push(name);
|
|
374
|
+
return base_scope[name] = value;
|
|
375
|
+
};
|
|
225
376
|
|
|
226
|
-
|
|
377
|
+
/*
|
|
378
|
+
* constant get
|
|
379
|
+
*/
|
|
380
|
+
Opal.cget = function(base_scope, path) {
|
|
381
|
+
if (path == null) {
|
|
382
|
+
path = base_scope;
|
|
383
|
+
base_scope = Opal.Object;
|
|
384
|
+
}
|
|
227
385
|
|
|
228
|
-
var
|
|
386
|
+
var result = base_scope;
|
|
229
387
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
388
|
+
path = path.split('::');
|
|
389
|
+
while (path.length != 0) {
|
|
390
|
+
result = result.$const_get(path.shift());
|
|
233
391
|
}
|
|
234
392
|
|
|
235
|
-
|
|
236
|
-
|
|
393
|
+
return result;
|
|
394
|
+
}
|
|
237
395
|
|
|
238
|
-
|
|
396
|
+
/*
|
|
397
|
+
* When a source module is included into the target module, we must also copy
|
|
398
|
+
* its constants to the target.
|
|
399
|
+
*/
|
|
400
|
+
Opal.donate_constants = function(source_mod, target_mod) {
|
|
401
|
+
var source_constants = source_mod._scope.constants,
|
|
402
|
+
target_scope = target_mod._scope,
|
|
403
|
+
target_constants = target_scope.constants;
|
|
404
|
+
|
|
405
|
+
for (var i = 0, length = source_constants.length; i < length; i++) {
|
|
406
|
+
target_constants.push(source_constants[i]);
|
|
407
|
+
target_scope[source_constants[i]] = source_mod._scope[source_constants[i]];
|
|
408
|
+
}
|
|
239
409
|
};
|
|
240
410
|
|
|
241
|
-
|
|
242
|
-
|
|
411
|
+
/*
|
|
412
|
+
* Methods stubs are used to facilitate method_missing in opal. A stub is a
|
|
413
|
+
* placeholder function which just calls `method_missing` on the receiver.
|
|
414
|
+
* If no method with the given name is actually defined on an object, then it
|
|
415
|
+
* is obvious to say that the stub will be called instead, and then in turn
|
|
416
|
+
* method_missing will be called.
|
|
417
|
+
*
|
|
418
|
+
* When a file in ruby gets compiled to javascript, it includes a call to
|
|
419
|
+
* this function which adds stubs for every method name in the compiled file.
|
|
420
|
+
* It should then be safe to assume that method_missing will work for any
|
|
421
|
+
* method call detected.
|
|
422
|
+
*
|
|
423
|
+
* Method stubs are added to the BasicObject prototype, which every other
|
|
424
|
+
* ruby object inherits, so all objects should handle method missing. A stub
|
|
425
|
+
* is only added if the given property name (method name) is not already
|
|
426
|
+
* defined.
|
|
427
|
+
*
|
|
428
|
+
* Note: all ruby methods have a `$` prefix in javascript, so all stubs will
|
|
429
|
+
* have this prefix as well (to make this method more performant).
|
|
430
|
+
*
|
|
431
|
+
* Opal.add_stubs(["$foo", "$bar", "$baz="]);
|
|
432
|
+
*
|
|
433
|
+
* All stub functions will have a private `rb_stub` property set to true so
|
|
434
|
+
* that other internal methods can detect if a method is just a stub or not.
|
|
435
|
+
* `Kernel#respond_to?` uses this property to detect a methods presence.
|
|
436
|
+
*
|
|
437
|
+
* @param [Array] stubs an array of method stubs to add
|
|
438
|
+
*/
|
|
243
439
|
Opal.add_stubs = function(stubs) {
|
|
244
440
|
for (var i = 0, length = stubs.length; i < length; i++) {
|
|
245
441
|
var stub = stubs[i];
|
|
@@ -251,11 +447,22 @@
|
|
|
251
447
|
}
|
|
252
448
|
};
|
|
253
449
|
|
|
450
|
+
/*
|
|
451
|
+
* Actuall add a method_missing stub function to the given prototype for the
|
|
452
|
+
* given name.
|
|
453
|
+
*
|
|
454
|
+
* @param [Prototype] prototype the target prototype
|
|
455
|
+
* @param [String] stub stub name to add (e.g. "$foo")
|
|
456
|
+
*/
|
|
254
457
|
function add_stub_for(prototype, stub) {
|
|
255
458
|
function method_missing_stub() {
|
|
459
|
+
// Copy any given block onto the method_missing dispatcher
|
|
256
460
|
this.$method_missing._p = method_missing_stub._p;
|
|
461
|
+
|
|
462
|
+
// Set block property to null ready for the next call (stop false-positives)
|
|
257
463
|
method_missing_stub._p = null;
|
|
258
464
|
|
|
465
|
+
// call method missing with correct args (remove '$' prefix on method name)
|
|
259
466
|
return this.$method_missing.apply(this, [stub.slice(1)].concat($slice.call(arguments)));
|
|
260
467
|
}
|
|
261
468
|
|
|
@@ -263,6 +470,7 @@
|
|
|
263
470
|
prototype[stub] = method_missing_stub;
|
|
264
471
|
}
|
|
265
472
|
|
|
473
|
+
// Expose for other parts of Opal to use
|
|
266
474
|
Opal.add_stub_for = add_stub_for;
|
|
267
475
|
|
|
268
476
|
// Const missing dispatcher
|
|
@@ -272,29 +480,85 @@
|
|
|
272
480
|
|
|
273
481
|
// Arity count error dispatcher
|
|
274
482
|
Opal.ac = function(actual, expected, object, meth) {
|
|
275
|
-
var inspect = (
|
|
483
|
+
var inspect = (object._isClass ? object._name + '.' : object._klass._name + '#') + meth;
|
|
276
484
|
var msg = '[' + inspect + '] wrong number of arguments(' + actual + ' for ' + expected + ')';
|
|
277
485
|
throw Opal.ArgumentError.$new(msg);
|
|
278
486
|
};
|
|
279
487
|
|
|
280
488
|
// Super dispatcher
|
|
281
|
-
Opal.
|
|
489
|
+
Opal.find_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
|
|
282
490
|
var dispatcher;
|
|
283
491
|
|
|
284
492
|
if (defs) {
|
|
285
493
|
dispatcher = obj._isClass ? defs._super : obj._klass._proto;
|
|
286
494
|
}
|
|
287
495
|
else {
|
|
288
|
-
|
|
496
|
+
if (obj._isClass) {
|
|
497
|
+
dispatcher = obj._klass;
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
dispatcher = find_obj_super_dispatcher(obj, jsid, current_func);
|
|
501
|
+
}
|
|
289
502
|
}
|
|
290
503
|
|
|
291
504
|
dispatcher = dispatcher['$' + jsid];
|
|
292
505
|
dispatcher._p = iter;
|
|
293
506
|
|
|
294
|
-
return dispatcher
|
|
507
|
+
return dispatcher;
|
|
295
508
|
};
|
|
296
509
|
|
|
297
|
-
//
|
|
510
|
+
// Iter dispatcher for super in a block
|
|
511
|
+
Opal.find_iter_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
|
|
512
|
+
if (current_func._def) {
|
|
513
|
+
return Opal.find_super_dispatcher(obj, current_func._jsid, current_func, iter, defs);
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
return Opal.find_super_dispatcher(obj, jsid, current_func, iter, defs);
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
var find_obj_super_dispatcher = function(obj, jsid, current_func) {
|
|
521
|
+
var klass = obj.__meta__ || obj._klass;
|
|
522
|
+
|
|
523
|
+
while (klass) {
|
|
524
|
+
if (klass._proto['$' + jsid] === current_func) {
|
|
525
|
+
// ok
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
klass = klass.__parent;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// if we arent in a class, we couldnt find current?
|
|
533
|
+
if (!klass) {
|
|
534
|
+
throw new Error("could not find current class for super()");
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
klass = klass.__parent;
|
|
538
|
+
|
|
539
|
+
// else, let's find the next one
|
|
540
|
+
while (klass) {
|
|
541
|
+
var working = klass._proto['$' + jsid];
|
|
542
|
+
|
|
543
|
+
if (working && working !== current_func) {
|
|
544
|
+
// ok
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
klass = klass.__parent;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
return klass._proto;
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
/*
|
|
555
|
+
* Used to return as an expression. Sometimes, we can't simply return from
|
|
556
|
+
* a javascript function as if we were a method, as the return is used as
|
|
557
|
+
* an expression, or even inside a block which must "return" to the outer
|
|
558
|
+
* method. This helper simply throws an error which is then caught by the
|
|
559
|
+
* method. This approach is expensive, so it is only used when absolutely
|
|
560
|
+
* needed.
|
|
561
|
+
*/
|
|
298
562
|
Opal.$return = function(val) {
|
|
299
563
|
Opal.returner.$v = val;
|
|
300
564
|
throw Opal.returner;
|
|
@@ -321,15 +585,49 @@
|
|
|
321
585
|
|
|
322
586
|
// handles yield for > 1 yielded arg
|
|
323
587
|
Opal.$yieldX = function(block, args) {
|
|
588
|
+
if (typeof(block) !== "function") {
|
|
589
|
+
throw Opal.LocalJumpError.$new("no block given");
|
|
590
|
+
}
|
|
591
|
+
|
|
324
592
|
if (block.length > 1 && args.length == 1) {
|
|
325
593
|
if (args[0]._isArray) {
|
|
326
594
|
return block.apply(null, args[0]);
|
|
327
595
|
}
|
|
328
596
|
}
|
|
329
597
|
|
|
598
|
+
if (!args._isArray) {
|
|
599
|
+
args = $slice.call(args);
|
|
600
|
+
}
|
|
601
|
+
|
|
330
602
|
return block.apply(null, args);
|
|
331
603
|
};
|
|
332
604
|
|
|
605
|
+
Opal.is_a = function(object, klass) {
|
|
606
|
+
var search = object._klass;
|
|
607
|
+
|
|
608
|
+
while (search) {
|
|
609
|
+
if (search === klass) {
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
search = search._super;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Helper to convert the given object to an array
|
|
620
|
+
Opal.to_ary = function(value) {
|
|
621
|
+
if (value._isArray) {
|
|
622
|
+
return value;
|
|
623
|
+
}
|
|
624
|
+
else if (value.$to_ary && !value.$to_ary.rb_stub) {
|
|
625
|
+
return value.$to_ary();
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
return [value];
|
|
629
|
+
};
|
|
630
|
+
|
|
333
631
|
/*
|
|
334
632
|
Call a ruby method on a ruby object with some arguments:
|
|
335
633
|
|
|
@@ -372,7 +670,7 @@
|
|
|
372
670
|
* Donate methods for a class/module
|
|
373
671
|
*/
|
|
374
672
|
Opal.donate = function(klass, defined, indirect) {
|
|
375
|
-
var methods = klass._methods, included_in = klass.
|
|
673
|
+
var methods = klass._methods, included_in = klass.__dep__;
|
|
376
674
|
|
|
377
675
|
// if (!indirect) {
|
|
378
676
|
klass._methods = methods.concat(defined);
|
|
@@ -386,15 +684,57 @@
|
|
|
386
684
|
for (var j = 0, jj = defined.length; j < jj; j++) {
|
|
387
685
|
var method = defined[j];
|
|
388
686
|
dest[method] = klass._proto[method];
|
|
687
|
+
dest[method]._donated = true;
|
|
389
688
|
}
|
|
390
689
|
|
|
391
|
-
if (includee.
|
|
690
|
+
if (includee.__dep__) {
|
|
392
691
|
Opal.donate(includee, defined, true);
|
|
393
692
|
}
|
|
394
693
|
}
|
|
395
694
|
}
|
|
396
695
|
};
|
|
397
696
|
|
|
697
|
+
Opal.defn = function(obj, jsid, body) {
|
|
698
|
+
if (obj.__mod__) {
|
|
699
|
+
obj._proto[jsid] = body;
|
|
700
|
+
Opal.donate(obj, [jsid]);
|
|
701
|
+
}
|
|
702
|
+
else if (obj._isClass) {
|
|
703
|
+
obj._proto[jsid] = body;
|
|
704
|
+
|
|
705
|
+
if (obj === RubyBasicObject) {
|
|
706
|
+
define_basic_object_method(jsid, body);
|
|
707
|
+
}
|
|
708
|
+
else if (obj === RubyObject) {
|
|
709
|
+
Opal.donate(obj, [jsid]);
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
obj[jsid] = body;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
return nil;
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
/*
|
|
720
|
+
* Define a singleton method on the given object.
|
|
721
|
+
*/
|
|
722
|
+
Opal.defs = function(obj, jsid, body) {
|
|
723
|
+
if (obj._isClass || obj.__mod__) {
|
|
724
|
+
obj.constructor.prototype[jsid] = body;
|
|
725
|
+
}
|
|
726
|
+
else {
|
|
727
|
+
obj[jsid] = body;
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
function define_basic_object_method(jsid, body) {
|
|
732
|
+
RubyBasicObject._methods.push(jsid);
|
|
733
|
+
for (var i = 0, len = bridged_classes.length; i < len; i++) {
|
|
734
|
+
bridged_classes[i]._proto[jsid] = body;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
398
738
|
// Initialization
|
|
399
739
|
// --------------
|
|
400
740
|
|
|
@@ -405,47 +745,48 @@
|
|
|
405
745
|
boot_defclass('Class', Class, Module);
|
|
406
746
|
|
|
407
747
|
// Constructors for *classes* of core objects
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
748
|
+
RubyBasicObject = boot_makemeta('BasicObject', BasicObject, Class);
|
|
749
|
+
RubyObject = boot_makemeta('Object', Object, RubyBasicObject.constructor);
|
|
750
|
+
RubyModule = boot_makemeta('Module', Module, RubyObject.constructor);
|
|
751
|
+
RubyClass = boot_makemeta('Class', Class, RubyModule.constructor);
|
|
412
752
|
|
|
413
753
|
// Fix booted classes to use their metaclass
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
754
|
+
RubyBasicObject._klass = RubyClass;
|
|
755
|
+
RubyObject._klass = RubyClass;
|
|
756
|
+
RubyModule._klass = RubyClass;
|
|
757
|
+
RubyClass._klass = RubyClass;
|
|
418
758
|
|
|
419
759
|
// Fix superclasses of booted classes
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
//
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
760
|
+
RubyBasicObject._super = null;
|
|
761
|
+
RubyObject._super = RubyBasicObject;
|
|
762
|
+
RubyModule._super = RubyObject;
|
|
763
|
+
RubyClass._super = RubyModule;
|
|
764
|
+
|
|
765
|
+
// Internally, Object acts like a module as it is "included" into bridged
|
|
766
|
+
// classes. In other words, we donate methods from Object into our bridged
|
|
767
|
+
// classes as their prototypes don't inherit from our root Object, so they
|
|
768
|
+
// act like module includes.
|
|
769
|
+
RubyObject.__dep__ = bridged_classes;
|
|
770
|
+
|
|
771
|
+
Opal.base = RubyObject;
|
|
772
|
+
RubyBasicObject._scope = RubyObject._scope = Opal;
|
|
773
|
+
RubyBasicObject._orig_scope = RubyObject._orig_scope = Opal;
|
|
774
|
+
Opal.Kernel = RubyObject;
|
|
775
|
+
|
|
776
|
+
RubyModule._scope = RubyObject._scope;
|
|
777
|
+
RubyClass._scope = RubyObject._scope;
|
|
778
|
+
RubyModule._orig_scope = RubyObject._orig_scope;
|
|
779
|
+
RubyClass._orig_scope = RubyObject._orig_scope;
|
|
780
|
+
|
|
781
|
+
RubyObject._proto.toString = function() {
|
|
441
782
|
return this.$to_s();
|
|
442
783
|
};
|
|
443
784
|
|
|
444
|
-
|
|
785
|
+
RubyClass._proto._defn = function(mid, body) { this._proto[mid] = body; };
|
|
445
786
|
|
|
446
|
-
Opal.top = new
|
|
787
|
+
Opal.top = new RubyObject._alloc();
|
|
447
788
|
|
|
448
|
-
Opal.klass(
|
|
789
|
+
Opal.klass(RubyObject, RubyObject, 'NilClass', NilClass);
|
|
449
790
|
|
|
450
791
|
var nil = Opal.nil = new NilClass;
|
|
451
792
|
nil.call = nil.apply = function() { throw Opal.LocalJumpError.$new('no block given'); };
|