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
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: fdf74450cbd2b81a0d8ba44700ef6e0e77b5ca45
|
|
4
|
+
data.tar.gz: 01e6a0e881a43bdaa1eb4db93c0e1989ca1d4568
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 90d5d6913908ef1d38f69d029d6033fbcd0d2214035a3cf34ebe5c5d8725e2bd37689009dbbd28e99ca27f9069cfe09b44445a0a3710e3d0e71f0d1ce00dd72b
|
|
7
|
+
data.tar.gz: bca3fd06513433d71ff656a473acf3269caa301a55589fdccea45cc463d9f865b6d558bbc1f427552f46586172f6f053cf6396cb5bbe193aa2e5b113783d0a86
|
data/.gitignore
CHANGED
data/.gitmodules
ADDED
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Contributing
|
|
2
2
|
|
|
3
|
+
This is the issue tracker for Opal. If you have a more general question about
|
|
4
|
+
using opal (or related libraries) then use the
|
|
5
|
+
[google group for opal](http://groups.google.com/forum/#!forum/opalrb), or the
|
|
6
|
+
[#opal](http://webchat.freenode.net/?channels=opal) irc channel on
|
|
7
|
+
FreeNode.
|
|
8
|
+
|
|
9
|
+
## Contributing
|
|
10
|
+
|
|
11
|
+
* Before opening a new issue, search for previous discussions including closed
|
|
12
|
+
ones. At comments there if a similar issue is found.
|
|
13
|
+
|
|
14
|
+
* Before sending pull requests make sure all tests run and pass (see below).
|
|
15
|
+
|
|
16
|
+
* Make sure to use a similar coding style to the rest of the code base. In ruby
|
|
17
|
+
and javascript code we use 2 spaces (no tabs).
|
|
18
|
+
|
|
3
19
|
## Quick Start
|
|
4
20
|
|
|
5
21
|
Clone repo:
|
|
@@ -14,13 +30,23 @@ Get dependencies:
|
|
|
14
30
|
$ bundle
|
|
15
31
|
```
|
|
16
32
|
|
|
17
|
-
## Tests
|
|
33
|
+
## Running Tests
|
|
34
|
+
|
|
35
|
+
### Runtime
|
|
36
|
+
|
|
37
|
+
Some opal specific tests are found inside `spec/`, but the majority of our
|
|
38
|
+
runtime tests now come from rubyspec. Rubyspec is included as a git submodule.
|
|
39
|
+
To get our latest referenced checkout, just run:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
$ git submodule update --init
|
|
43
|
+
```
|
|
18
44
|
|
|
19
45
|
You need phantomjs installed to run tests. To build opal, its dependencies
|
|
20
46
|
and all specs, run:
|
|
21
47
|
|
|
22
48
|
```
|
|
23
|
-
$ rake
|
|
49
|
+
$ bundle exec rake mspec
|
|
24
50
|
```
|
|
25
51
|
|
|
26
52
|
You can alternatively run tests in a browser using:
|
|
@@ -30,3 +56,21 @@ $ rackup
|
|
|
30
56
|
```
|
|
31
57
|
|
|
32
58
|
And then opening `http://127.0.0.1:9292` in a web browser.
|
|
59
|
+
|
|
60
|
+
### Gem/lib tests
|
|
61
|
+
|
|
62
|
+
We also include some tests for running under your standard ruby implementation
|
|
63
|
+
which are in `mri_spec/`. To run tests tests using rake, use:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
$ bundle exec rake mri_spec
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### All tests
|
|
70
|
+
|
|
71
|
+
To run all the tests together (which you should do while contributing), run:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
$ bundle exec rake
|
|
75
|
+
```
|
|
76
|
+
|
data/Gemfile
CHANGED
|
@@ -1,2 +1,19 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
gemspec
|
|
3
|
+
|
|
4
|
+
gem 'opal-sprockets', :github => 'opal/opal-sprockets'
|
|
5
|
+
|
|
6
|
+
# Stick with older racc until
|
|
7
|
+
# https://github.com/tenderlove/racc/issues/32
|
|
8
|
+
# is solved.
|
|
9
|
+
gem 'racc', '< 1.4.10' if RUBY_VERSION.to_f < 1.9
|
|
10
|
+
|
|
11
|
+
platform :rbx do
|
|
12
|
+
gem 'rubysl'
|
|
13
|
+
gem 'rubysl-openssl'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
group :repl do
|
|
17
|
+
gem 'therubyracer', :require => 'v8', :platform => :mri
|
|
18
|
+
gem 'therubyrhino', :platform => :jruby
|
|
19
|
+
end
|
data/README.md
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
[](http://travis-ci.org/opal/opal)
|
|
4
4
|
[](http://badge.fury.io/rb/opal)
|
|
5
|
+
[](https://codeclimate.com/github/opal/opal)
|
|
5
6
|
|
|
6
|
-
Opal is a ruby to javascript source-to-source compiler. It also has an
|
|
7
|
+
Opal is a ruby to javascript source-to-source compiler. It also has an
|
|
7
8
|
implementation of the ruby corelib.
|
|
8
9
|
|
|
9
10
|
Opal is [hosted on github](http://github.com/opal/opal), and there
|
|
@@ -15,11 +16,11 @@ See the website, [http://opalrb.org](http://opalrb.org).
|
|
|
15
16
|
|
|
16
17
|
### Compiling ruby code
|
|
17
18
|
|
|
18
|
-
`Opal.
|
|
19
|
+
`Opal.compile` is a simple interface to just compile a string of ruby into a
|
|
19
20
|
string of javascript code.
|
|
20
21
|
|
|
21
22
|
```ruby
|
|
22
|
-
Opal.
|
|
23
|
+
Opal.compile("puts 'wow'") # => "(function() { ... })()"
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
Running this by itself is not enough, you need the opal runtime/corelib.
|
|
@@ -54,11 +55,15 @@ First, install dependencies:
|
|
|
54
55
|
|
|
55
56
|
$ bundle install
|
|
56
57
|
|
|
58
|
+
Rubyspecs must be cloned as a gitsubmodule:
|
|
59
|
+
|
|
60
|
+
$ git submodule update --init
|
|
61
|
+
|
|
57
62
|
Tests can be run with phantomjs using:
|
|
58
63
|
|
|
59
64
|
$ rake
|
|
60
65
|
|
|
61
|
-
Alternatively, you can just load up a rack instance using `rackup`, and
|
|
66
|
+
Alternatively, you can just load up a rack instance using `rackup spec/config.ru`, and
|
|
62
67
|
visit `http://localhost:9292/` in any web browser.
|
|
63
68
|
|
|
64
69
|
## Code Overview
|
|
@@ -112,3 +117,7 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
112
117
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
113
118
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
114
119
|
THE SOFTWARE.
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
[](https://bitdeli.com/free "Bitdeli Badge")
|
|
123
|
+
|
data/Rakefile
CHANGED
|
@@ -2,79 +2,24 @@ require 'bundler'
|
|
|
2
2
|
Bundler.require
|
|
3
3
|
Bundler::GemHelper.install_tasks
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
mspec_process_call sexp, level
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
class RunSpec
|
|
29
|
-
def initialize(file=nil)
|
|
30
|
-
Opal::Processor.arity_check_enabled = true
|
|
31
|
-
|
|
32
|
-
ENV['OPAL_SPEC'] = file.nil? ? ["#{Dir.pwd}/spec/"].join(',') : file.join(',')
|
|
33
|
-
|
|
34
|
-
build_specs
|
|
35
|
-
|
|
36
|
-
server = fork do
|
|
37
|
-
app = Rack::Builder.app do
|
|
38
|
-
use Rack::ShowExceptions
|
|
39
|
-
run Rack::Directory.new('.')
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
Rack::Server.start(:app => app, :Port => 9999, :AccessLog => [],
|
|
43
|
-
:Logger => WEBrick::Log.new("/dev/null"))
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
system "phantomjs \"spec/ospec/sprockets.js\" \"http://localhost:9999/spec/index.html\""
|
|
47
|
-
success = $?.success?
|
|
48
|
-
|
|
49
|
-
exit 1 unless success
|
|
50
|
-
|
|
51
|
-
rescue => e
|
|
52
|
-
puts e.message
|
|
53
|
-
ensure
|
|
54
|
-
Process.kill(:SIGINT, server)
|
|
55
|
-
Process.wait
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def build_specs
|
|
59
|
-
env = Opal::Environment.new
|
|
60
|
-
env.append_path 'spec'
|
|
61
|
-
env.use_gem 'mspec'
|
|
62
|
-
|
|
63
|
-
FileUtils.mkdir_p 'build'
|
|
64
|
-
puts " * build/specs.js"
|
|
65
|
-
|
|
66
|
-
specs = uglify(env['ospec/main'].to_s)
|
|
67
|
-
File.open('build/specs.js', 'w+') { |o| o << specs }
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Only if OPAL_UGLIFY is set
|
|
71
|
-
def uglify(str)
|
|
72
|
-
if ENV['OPAL_UGLIFY']
|
|
73
|
-
require 'uglifier'
|
|
74
|
-
puts " * uglifying"
|
|
75
|
-
Uglifier.compile(str)
|
|
76
|
-
else
|
|
77
|
-
str
|
|
5
|
+
import 'tasks/mspec.rake'
|
|
6
|
+
|
|
7
|
+
namespace :github do
|
|
8
|
+
desc "Upload assets to github"
|
|
9
|
+
task :upload_assets do
|
|
10
|
+
require 'octokit'
|
|
11
|
+
# https://github.com/octokit/octokit.rb#oauth-access-tokens
|
|
12
|
+
token_path = '.github_access_token'
|
|
13
|
+
File.exist?(token_path) or raise ArgumentError, "Please create a personal access token (https://github.com/settings/tokens/new) and paste it inside #{token_path.inspect}"
|
|
14
|
+
token = File.read(token_path).strip
|
|
15
|
+
client = Octokit::Client.new :access_token => token
|
|
16
|
+
tag_name = ENV['TAG'] || raise(ArgumentError, 'missing the TAG env variable (e.g. TAG=v0.4.4)')
|
|
17
|
+
release = client.releases('opal/opal').find{|r| p(r.id); p(r).tag_name == tag_name}
|
|
18
|
+
release_url = "https://api.github.com/repos/opal/opal/releases/#{release.id}"
|
|
19
|
+
%w[opal opal-parser].each do |name|
|
|
20
|
+
client.upload_asset release_url, "build/#{name}.js", :content_type => 'application/x-javascript'
|
|
21
|
+
client.upload_asset release_url, "build/#{name}.min.js", :content_type => 'application/x-javascript'
|
|
22
|
+
client.upload_asset release_url, "build/#{name}.min.js.gz", :content_type => 'application/octet-stream'
|
|
78
23
|
end
|
|
79
24
|
end
|
|
80
25
|
end
|
|
@@ -94,59 +39,17 @@ end
|
|
|
94
39
|
|
|
95
40
|
desc "Build specs to build/specs.js and build/specs.min.js"
|
|
96
41
|
task :build_specs do
|
|
97
|
-
require 'uglifier'
|
|
98
|
-
|
|
99
42
|
Opal::Processor.arity_check_enabled = true
|
|
100
43
|
ENV['OPAL_SPEC'] = ["#{Dir.pwd}/spec/"].join(',')
|
|
101
44
|
|
|
102
|
-
env =
|
|
103
|
-
env.
|
|
104
|
-
env.use_gem 'mspec'
|
|
105
|
-
|
|
106
|
-
FileUtils.mkdir_p 'build'
|
|
107
|
-
|
|
108
|
-
puts " * build/specs.js"
|
|
109
|
-
specs = env['ospec/main'].to_s
|
|
110
|
-
|
|
111
|
-
puts " * build/specs.min.js"
|
|
112
|
-
# min = Uglifier.compile(specs)
|
|
113
|
-
|
|
114
|
-
File.open('build/specs.js', 'w+') { |o| o << specs }
|
|
115
|
-
# File.open('build/specs.min.js', 'w+') { |o| o << min }
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
desc "Run task with spec:dir:file helper"
|
|
119
|
-
namespace :spec do
|
|
120
|
-
task 'dirs' do
|
|
121
|
-
end
|
|
122
|
-
rule '' do |task|
|
|
123
|
-
|
|
124
|
-
#build path for spec files\dirs.
|
|
125
|
-
#Example:
|
|
126
|
-
#spec:core => spec/core/
|
|
127
|
-
#spec:core:array:allocate => spec/core/array/allocate_spec.rb
|
|
128
|
-
def path(dirs)
|
|
129
|
-
path = "#{Dir.pwd}"
|
|
130
|
-
dirs.each do |dir|
|
|
131
|
-
base = path + "/#{dir}"
|
|
132
|
-
if Dir.exists?(base)
|
|
133
|
-
path = base
|
|
134
|
-
else
|
|
135
|
-
path = Dir.glob("#{base}_spec.rb")
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
path = [path].flatten
|
|
139
|
-
raise ArgumentError, "File or Dir with task #{dirs.join('/')} not found." if path.empty?
|
|
140
|
-
path
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
RunSpec.new(path(task.name.split(":")))
|
|
144
|
-
end
|
|
45
|
+
env = SpecEnvironment.new
|
|
46
|
+
env.build
|
|
145
47
|
end
|
|
146
48
|
|
|
147
49
|
desc "Build opal.js and opal-parser.js to build/"
|
|
148
50
|
task :dist do
|
|
149
51
|
Opal::Processor.arity_check_enabled = false
|
|
52
|
+
Opal::Processor.const_missing_enabled = false
|
|
150
53
|
|
|
151
54
|
env = Opal::Environment.new
|
|
152
55
|
|
|
@@ -173,7 +76,7 @@ end
|
|
|
173
76
|
|
|
174
77
|
desc "Rebuild grammar.rb for opal parser"
|
|
175
78
|
task :racc do
|
|
176
|
-
%x(racc -l lib/opal/grammar.y -o lib/opal/grammar.rb)
|
|
79
|
+
%x(racc -l lib/opal/parser/grammar.y -o lib/opal/parser/grammar.rb)
|
|
177
80
|
end
|
|
178
81
|
|
|
179
82
|
# Used for uglifying source to minify
|
data/bin/opal
CHANGED
|
@@ -5,6 +5,15 @@ options = Opal::CLIOptions.new
|
|
|
5
5
|
options.parse!
|
|
6
6
|
|
|
7
7
|
require 'opal/cli'
|
|
8
|
-
cli = Opal::CLI.new ARGV.first, options.options
|
|
9
|
-
cli.run
|
|
10
8
|
|
|
9
|
+
if ARGV.empty? and !options.options[:evals]
|
|
10
|
+
p options
|
|
11
|
+
else
|
|
12
|
+
cli = Opal::CLI.new options.options.merge(:filename => ARGV.first)
|
|
13
|
+
begin
|
|
14
|
+
cli.run
|
|
15
|
+
rescue Opal::CLI::MissingNode => e
|
|
16
|
+
$stderr.puts e.message
|
|
17
|
+
exit 127
|
|
18
|
+
end
|
|
19
|
+
end
|
data/bin/opal-repl
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'opal'
|
|
4
|
+
|
|
5
|
+
module Opal
|
|
6
|
+
class V8Context
|
|
7
|
+
def initialize
|
|
8
|
+
@builder = Opal::Builder.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run(filename = nil)
|
|
12
|
+
return if @v8
|
|
13
|
+
|
|
14
|
+
begin
|
|
15
|
+
require 'v8'
|
|
16
|
+
rescue LoadError
|
|
17
|
+
abort 'therubyracer must be installed'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@v8 = V8::Context.new
|
|
21
|
+
@v8['console'] = self
|
|
22
|
+
@v8.eval @builder.build 'opal'
|
|
23
|
+
|
|
24
|
+
if filename
|
|
25
|
+
if File.exist? filename
|
|
26
|
+
eval_ruby File.read(filename)
|
|
27
|
+
else
|
|
28
|
+
fail "file does not exist: #{filename}"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
run_repl
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def log(*str)
|
|
36
|
+
puts(*str)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def run_repl
|
|
40
|
+
require 'readline'
|
|
41
|
+
|
|
42
|
+
loop do
|
|
43
|
+
# on SIGINT lets just return from the loop..
|
|
44
|
+
trap("SIGINT") { finish; return }
|
|
45
|
+
line = Readline.readline '>> ', true
|
|
46
|
+
|
|
47
|
+
# if we type exit, then we need to close down context
|
|
48
|
+
if line == "exit" or line.nil?
|
|
49
|
+
break
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
puts "=> #{eval_ruby line}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
finish
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def eval_ruby(str)
|
|
59
|
+
code = @builder.build_str str, :irb => true, :const_missing => true
|
|
60
|
+
@v8.eval "var $_result = #{code} ($_result == null ? 'nil' : $_result.$inspect());"
|
|
61
|
+
rescue => e
|
|
62
|
+
puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def finish
|
|
66
|
+
@v8 = nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
Opal::V8Context.new.run ARGV.first
|
data/corelib/array.rb
CHANGED
|
@@ -12,102 +12,80 @@ class Array
|
|
|
12
12
|
self.class.new(*args)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def self.new(size =
|
|
16
|
-
|
|
15
|
+
def self.new(size = nil, obj = nil, &block)
|
|
16
|
+
if `arguments.length > 2`
|
|
17
|
+
raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..2)"
|
|
18
|
+
end
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
if `arguments.length === 0`
|
|
21
|
+
return []
|
|
22
|
+
end
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
if `arguments.length === 1`
|
|
25
|
+
if Array === size
|
|
26
|
+
return size.to_a
|
|
27
|
+
elsif size.respond_to? :to_ary
|
|
28
|
+
return size.to_ary
|
|
29
|
+
end
|
|
30
|
+
end
|
|
23
31
|
|
|
24
|
-
|
|
25
|
-
obj = arguments[1],
|
|
26
|
-
arr = [];
|
|
32
|
+
size = Opal.coerce_to size, Integer, :to_int
|
|
27
33
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return size;
|
|
32
|
-
return size['$to_ary']();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (typeof(arguments[0]) == 'number')
|
|
37
|
-
size = arguments[0];
|
|
38
|
-
else {
|
|
39
|
-
if (#{`arguments[0]`.respond_to? :to_int}) {
|
|
40
|
-
size = arguments[0]['$to_int']();
|
|
41
|
-
if (typeof(size) == 'number') {
|
|
42
|
-
if (size % 1 !== 0) {
|
|
43
|
-
#{raise TypeError.new("can't convert to Integer. Array#new")};
|
|
44
|
-
}
|
|
45
|
-
} else {
|
|
46
|
-
#{raise TypeError.new("can't convert to Integer. Array#new")};
|
|
47
|
-
}
|
|
48
|
-
} else {
|
|
49
|
-
#{raise TypeError.new("can't convert to Integer. Array#new")};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (size < 0) {
|
|
54
|
-
#{raise ArgumentError.new("negative array size")};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (obj == undefined) {
|
|
58
|
-
obj = nil;
|
|
59
|
-
}
|
|
34
|
+
if `size < 0`
|
|
35
|
+
raise ArgumentError, "negative array size"
|
|
36
|
+
end
|
|
60
37
|
|
|
38
|
+
%x{
|
|
39
|
+
var result = [];
|
|
61
40
|
|
|
62
|
-
if (block === nil)
|
|
41
|
+
if (block === nil) {
|
|
63
42
|
for (var i = 0; i < size; i++) {
|
|
64
|
-
|
|
43
|
+
result.push(obj);
|
|
65
44
|
}
|
|
45
|
+
}
|
|
66
46
|
else {
|
|
67
47
|
for (var i = 0, value; i < size; i++) {
|
|
68
48
|
value = block(i);
|
|
49
|
+
|
|
69
50
|
if (value === $breaker) {
|
|
70
51
|
return $breaker.$v;
|
|
71
52
|
}
|
|
72
|
-
|
|
53
|
+
|
|
54
|
+
result[i] = value;
|
|
73
55
|
}
|
|
74
56
|
}
|
|
75
57
|
|
|
76
|
-
return
|
|
58
|
+
return result;
|
|
77
59
|
}
|
|
78
60
|
end
|
|
79
61
|
|
|
80
62
|
def self.try_convert(obj)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return obj;
|
|
84
|
-
}
|
|
63
|
+
return obj if Array === obj
|
|
64
|
+
return obj.to_ary if obj.respond_to? :to_ary
|
|
85
65
|
|
|
86
|
-
|
|
87
|
-
}
|
|
66
|
+
nil
|
|
88
67
|
end
|
|
89
68
|
|
|
90
69
|
def &(other)
|
|
70
|
+
if Array === other
|
|
71
|
+
other = other.to_a
|
|
72
|
+
else
|
|
73
|
+
other = Opal.coerce_to other, Array, :to_ary
|
|
74
|
+
end
|
|
75
|
+
|
|
91
76
|
%x{
|
|
92
77
|
var result = [],
|
|
93
78
|
seen = {};
|
|
94
79
|
|
|
95
|
-
for (var i = 0, length =
|
|
96
|
-
var item =
|
|
97
|
-
if (item._isString) {
|
|
98
|
-
item = item.toString();
|
|
99
|
-
}
|
|
80
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
81
|
+
var item = self[i];
|
|
100
82
|
|
|
101
83
|
if (!seen[item]) {
|
|
102
84
|
for (var j = 0, length2 = other.length; j < length2; j++) {
|
|
103
85
|
var item2 = other[j];
|
|
104
|
-
if (item2._isString) {
|
|
105
|
-
item2 = item2.toString();
|
|
106
|
-
}
|
|
107
86
|
|
|
108
|
-
if (
|
|
87
|
+
if (!seen[item2] && #{`item` == `item2`}) {
|
|
109
88
|
seen[item] = true;
|
|
110
|
-
|
|
111
89
|
result.push(item);
|
|
112
90
|
}
|
|
113
91
|
}
|
|
@@ -119,15 +97,23 @@ class Array
|
|
|
119
97
|
end
|
|
120
98
|
|
|
121
99
|
def *(other)
|
|
122
|
-
|
|
123
|
-
if (typeof(other) === 'string') {
|
|
124
|
-
return #{self}.join(other);
|
|
125
|
-
}
|
|
100
|
+
return `self.join(#{other.to_str})` if other.respond_to? :to_str
|
|
126
101
|
|
|
102
|
+
unless other.respond_to? :to_int
|
|
103
|
+
raise TypeError, "no implicit conversion of #{other.class} into Integer"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
other = Opal.coerce_to other, Integer, :to_int
|
|
107
|
+
|
|
108
|
+
if `other < 0`
|
|
109
|
+
raise ArgumentError, "negative argument"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
%x{
|
|
127
113
|
var result = [];
|
|
128
114
|
|
|
129
115
|
for (var i = 0; i < other; i++) {
|
|
130
|
-
result = result.concat(
|
|
116
|
+
result = result.concat(self);
|
|
131
117
|
}
|
|
132
118
|
|
|
133
119
|
return result;
|
|
@@ -135,75 +121,73 @@ class Array
|
|
|
135
121
|
end
|
|
136
122
|
|
|
137
123
|
def +(other)
|
|
138
|
-
|
|
139
|
-
|
|
124
|
+
if Array === other
|
|
125
|
+
other = other.to_a
|
|
126
|
+
else
|
|
127
|
+
other = Opal.coerce_to other, Array, :to_ary
|
|
128
|
+
end
|
|
140
129
|
|
|
141
|
-
|
|
142
|
-
if (#{other.respond_to?(:to_ary)}) {
|
|
143
|
-
arr = other['$to_ary']();
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
#{raise TypeError.new("can't convert to Array. Array#+") };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return #{self}.concat(arr);
|
|
151
|
-
}
|
|
130
|
+
`self.concat(other)`
|
|
152
131
|
end
|
|
153
132
|
|
|
154
133
|
def -(other)
|
|
134
|
+
if Array === other
|
|
135
|
+
other = other.to_a
|
|
136
|
+
else
|
|
137
|
+
other = Opal.coerce_to other, Array, :to_ary
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
return [] if `self.length === 0`
|
|
141
|
+
return clone if `other.length === 0`
|
|
142
|
+
|
|
155
143
|
%x{
|
|
156
|
-
var
|
|
157
|
-
b = #{other},
|
|
158
|
-
tmp = [],
|
|
144
|
+
var seen = {},
|
|
159
145
|
result = [];
|
|
160
146
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
b = b['$to_ary']();
|
|
164
|
-
} else {
|
|
165
|
-
#{raise TypeError.new("can't convert to Array. Array#-") };
|
|
166
|
-
}
|
|
167
|
-
}else if ((typeof(b) != "object")) {
|
|
168
|
-
#{raise TypeError.new("can't convert to Array. Array#-") };
|
|
147
|
+
for (var i = 0, length = other.length; i < length; i++) {
|
|
148
|
+
seen[other[i]] = true;
|
|
169
149
|
}
|
|
170
150
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (b.length == 0)
|
|
174
|
-
return a;
|
|
151
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
152
|
+
var item = self[i];
|
|
175
153
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
for(var i = 0, length = a.length; i < length; i++) {
|
|
180
|
-
if (!tmp[a[i]]) {
|
|
181
|
-
result.push(a[i]);
|
|
154
|
+
if (!seen[item]) {
|
|
155
|
+
result.push(item);
|
|
182
156
|
}
|
|
183
|
-
|
|
157
|
+
}
|
|
184
158
|
|
|
185
159
|
return result;
|
|
186
160
|
}
|
|
187
161
|
end
|
|
188
162
|
|
|
189
163
|
def <<(object)
|
|
190
|
-
|
|
164
|
+
`self.push(object);`
|
|
191
165
|
|
|
192
166
|
self
|
|
193
167
|
end
|
|
194
168
|
|
|
195
169
|
def <=>(other)
|
|
170
|
+
if Array === other
|
|
171
|
+
other = other.to_a
|
|
172
|
+
elsif other.respond_to? :to_ary
|
|
173
|
+
other = other.to_ary
|
|
174
|
+
else
|
|
175
|
+
return
|
|
176
|
+
end
|
|
177
|
+
|
|
196
178
|
%x{
|
|
197
|
-
if (#{
|
|
179
|
+
if (#{hash} === #{other.hash}) {
|
|
198
180
|
return 0;
|
|
199
181
|
}
|
|
200
182
|
|
|
201
|
-
if (
|
|
202
|
-
return (
|
|
183
|
+
if (self.length != other.length) {
|
|
184
|
+
return (self.length > other.length) ? 1 : -1;
|
|
203
185
|
}
|
|
204
186
|
|
|
205
|
-
for (var i = 0, length =
|
|
206
|
-
|
|
187
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
188
|
+
var tmp = #{`self[i]` <=> `other[i]`};
|
|
189
|
+
|
|
190
|
+
if (tmp !== 0) {
|
|
207
191
|
return tmp;
|
|
208
192
|
}
|
|
209
193
|
}
|
|
@@ -213,33 +197,35 @@ class Array
|
|
|
213
197
|
end
|
|
214
198
|
|
|
215
199
|
def ==(other)
|
|
200
|
+
return false unless Array === other
|
|
201
|
+
|
|
202
|
+
other = other.to_a
|
|
203
|
+
|
|
216
204
|
%x{
|
|
217
|
-
if (
|
|
205
|
+
if (self.length !== other.length) {
|
|
218
206
|
return false;
|
|
219
207
|
}
|
|
220
208
|
|
|
221
|
-
for (var i = 0, length =
|
|
222
|
-
|
|
223
|
-
|
|
209
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
210
|
+
var a = self[i],
|
|
211
|
+
b = other[i];
|
|
224
212
|
|
|
225
|
-
if (
|
|
213
|
+
if (a._isArray && b._isArray && (a === self)) {
|
|
226
214
|
continue;
|
|
227
215
|
}
|
|
228
216
|
|
|
229
|
-
if (!(#{`
|
|
217
|
+
if (!(#{`a` == `b`})) {
|
|
230
218
|
return false;
|
|
231
219
|
}
|
|
232
|
-
|
|
233
220
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
return true;
|
|
237
221
|
}
|
|
222
|
+
|
|
223
|
+
true
|
|
238
224
|
end
|
|
239
225
|
|
|
240
226
|
def [](index, length = undefined)
|
|
241
227
|
%x{
|
|
242
|
-
var size =
|
|
228
|
+
var size = self.length;
|
|
243
229
|
|
|
244
230
|
if (typeof index !== 'number' && !index._isNumber) {
|
|
245
231
|
if (index._isRange) {
|
|
@@ -256,7 +242,7 @@ class Array
|
|
|
256
242
|
}
|
|
257
243
|
|
|
258
244
|
if (!exclude) length += 1;
|
|
259
|
-
return
|
|
245
|
+
return self.slice(index, length);
|
|
260
246
|
}
|
|
261
247
|
else {
|
|
262
248
|
#{ raise "bad arg for Array#[]" };
|
|
@@ -272,34 +258,76 @@ class Array
|
|
|
272
258
|
return nil;
|
|
273
259
|
}
|
|
274
260
|
|
|
275
|
-
return
|
|
261
|
+
return self.slice(index, index + length);
|
|
276
262
|
}
|
|
277
263
|
else {
|
|
278
264
|
if (index >= size || index < 0) {
|
|
279
265
|
return nil;
|
|
280
266
|
}
|
|
281
267
|
|
|
282
|
-
return
|
|
268
|
+
return self[index];
|
|
283
269
|
}
|
|
284
270
|
}
|
|
285
271
|
end
|
|
286
272
|
|
|
287
|
-
def []=(index, value)
|
|
273
|
+
def []=(index, value, extra = undefined)
|
|
288
274
|
%x{
|
|
289
|
-
var size =
|
|
275
|
+
var size = self.length;
|
|
276
|
+
|
|
277
|
+
if (typeof index !== 'number' && !index._isNumber) {
|
|
278
|
+
if (index._isRange) {
|
|
279
|
+
var exclude = index.exclude;
|
|
280
|
+
extra = value;
|
|
281
|
+
value = index.end;
|
|
282
|
+
index = index.begin;
|
|
283
|
+
|
|
284
|
+
if (value < 0) {
|
|
285
|
+
value += size;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (!exclude) value += 1;
|
|
289
|
+
|
|
290
|
+
value = value - index;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
#{raise ArgumentError};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
290
296
|
|
|
291
297
|
if (index < 0) {
|
|
292
298
|
index += size;
|
|
293
299
|
}
|
|
294
300
|
|
|
295
|
-
|
|
301
|
+
if (extra != null) {
|
|
302
|
+
if (value < 0) {
|
|
303
|
+
#{raise IndexError};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (index > size) {
|
|
307
|
+
for (var i = size; index > i; i++) {
|
|
308
|
+
self[i] = nil;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
self.splice.apply(self, [index, value].concat(extra));
|
|
313
|
+
|
|
314
|
+
return extra;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (index > size) {
|
|
318
|
+
for (var i = size; i < index; i++) {
|
|
319
|
+
self[i] = nil;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return self[index] = value;
|
|
296
324
|
}
|
|
297
325
|
end
|
|
298
326
|
|
|
299
327
|
def assoc(object)
|
|
300
328
|
%x{
|
|
301
|
-
for (var i = 0, length =
|
|
302
|
-
if (item =
|
|
329
|
+
for (var i = 0, length = self.length, item; i < length; i++) {
|
|
330
|
+
if (item = self[i], item.length && #{`item[0]` == object}) {
|
|
303
331
|
return item;
|
|
304
332
|
}
|
|
305
333
|
}
|
|
@@ -309,36 +337,68 @@ class Array
|
|
|
309
337
|
end
|
|
310
338
|
|
|
311
339
|
def at(index)
|
|
340
|
+
index = Opal.coerce_to index, Integer, :to_int
|
|
341
|
+
|
|
312
342
|
%x{
|
|
313
343
|
if (index < 0) {
|
|
314
|
-
index +=
|
|
344
|
+
index += self.length;
|
|
315
345
|
}
|
|
316
346
|
|
|
317
|
-
if (index < 0 || index >=
|
|
347
|
+
if (index < 0 || index >= self.length) {
|
|
318
348
|
return nil;
|
|
319
349
|
}
|
|
320
350
|
|
|
321
|
-
return
|
|
351
|
+
return self[index];
|
|
322
352
|
}
|
|
323
353
|
end
|
|
324
354
|
|
|
355
|
+
def cycle(n = nil, &block)
|
|
356
|
+
return if `self.length === 0 || n === 0`
|
|
357
|
+
return enum_for :cycle, n unless block
|
|
358
|
+
|
|
359
|
+
if `n === nil`
|
|
360
|
+
while true
|
|
361
|
+
if `#{(value = each(&block))} !== self`
|
|
362
|
+
return value
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
else
|
|
366
|
+
cycles = Opal.coerce_to n, Integer, :to_int
|
|
367
|
+
|
|
368
|
+
unless Integer === cycles
|
|
369
|
+
raise TypeError, "can't convert #{n.class} into Integer (#{n.class}#to_int gives #{cycles.class}"
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
while cycles > 0
|
|
373
|
+
each(&block)
|
|
374
|
+
|
|
375
|
+
cycles -= 1
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
self
|
|
380
|
+
end
|
|
381
|
+
|
|
325
382
|
def clear
|
|
326
|
-
|
|
383
|
+
`self.splice(0, self.length)`
|
|
327
384
|
|
|
328
385
|
self
|
|
329
386
|
end
|
|
330
387
|
|
|
331
388
|
def clone
|
|
332
|
-
|
|
389
|
+
`self.slice()`
|
|
333
390
|
end
|
|
334
391
|
|
|
335
392
|
def collect(&block)
|
|
393
|
+
return enum_for :collect unless block_given?
|
|
394
|
+
|
|
336
395
|
%x{
|
|
337
396
|
var result = [];
|
|
338
397
|
|
|
398
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
399
|
+
var value = Opal.$yield1(block, self[i]);
|
|
339
400
|
|
|
340
|
-
|
|
341
|
-
if ((value = block(#{self}[i])) === $breaker) {
|
|
401
|
+
if (value === $breaker) {
|
|
342
402
|
return $breaker.$v;
|
|
343
403
|
}
|
|
344
404
|
|
|
@@ -350,13 +410,17 @@ class Array
|
|
|
350
410
|
end
|
|
351
411
|
|
|
352
412
|
def collect!(&block)
|
|
413
|
+
return enum_for :collect! unless block_given?
|
|
414
|
+
|
|
353
415
|
%x{
|
|
354
|
-
for (var i = 0, length =
|
|
355
|
-
|
|
416
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
417
|
+
var value = Opal.$yield1(block, self[i]);
|
|
418
|
+
|
|
419
|
+
if (value === $breaker) {
|
|
356
420
|
return $breaker.$v;
|
|
357
421
|
}
|
|
358
422
|
|
|
359
|
-
|
|
423
|
+
self[i] = value;
|
|
360
424
|
}
|
|
361
425
|
}
|
|
362
426
|
|
|
@@ -367,8 +431,8 @@ class Array
|
|
|
367
431
|
%x{
|
|
368
432
|
var result = [];
|
|
369
433
|
|
|
370
|
-
for (var i = 0, length =
|
|
371
|
-
if ((item =
|
|
434
|
+
for (var i = 0, length = self.length, item; i < length; i++) {
|
|
435
|
+
if ((item = self[i]) !== nil) {
|
|
372
436
|
result.push(item);
|
|
373
437
|
}
|
|
374
438
|
}
|
|
@@ -379,93 +443,77 @@ class Array
|
|
|
379
443
|
|
|
380
444
|
def compact!
|
|
381
445
|
%x{
|
|
382
|
-
var original =
|
|
446
|
+
var original = self.length;
|
|
383
447
|
|
|
384
|
-
for (var i = 0, length =
|
|
385
|
-
if (
|
|
386
|
-
|
|
448
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
449
|
+
if (self[i] === nil) {
|
|
450
|
+
self.splice(i, 1);
|
|
387
451
|
|
|
388
452
|
length--;
|
|
389
453
|
i--;
|
|
390
454
|
}
|
|
391
455
|
}
|
|
392
456
|
|
|
393
|
-
return
|
|
457
|
+
return self.length === original ? nil : self;
|
|
394
458
|
}
|
|
395
459
|
end
|
|
396
460
|
|
|
397
461
|
def concat(other)
|
|
398
462
|
%x{
|
|
399
463
|
for (var i = 0, length = other.length; i < length; i++) {
|
|
400
|
-
|
|
464
|
+
self.push(other[i]);
|
|
401
465
|
}
|
|
402
466
|
}
|
|
403
467
|
|
|
404
468
|
self
|
|
405
469
|
end
|
|
406
470
|
|
|
407
|
-
def count(object = undefined)
|
|
408
|
-
%x{
|
|
409
|
-
if (object == null) {
|
|
410
|
-
return #{self}.length;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
var result = 0;
|
|
414
|
-
|
|
415
|
-
for (var i = 0, length = #{self}.length; i < length; i++) {
|
|
416
|
-
if (#{`#{self}[i]` == object}) {
|
|
417
|
-
result++;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
return result;
|
|
422
|
-
}
|
|
423
|
-
end
|
|
424
|
-
|
|
425
471
|
def delete(object)
|
|
426
472
|
%x{
|
|
427
|
-
var original =
|
|
473
|
+
var original = self.length;
|
|
428
474
|
|
|
429
475
|
for (var i = 0, length = original; i < length; i++) {
|
|
430
|
-
if (#{
|
|
431
|
-
|
|
476
|
+
if (#{`self[i]` == object}) {
|
|
477
|
+
self.splice(i, 1);
|
|
432
478
|
|
|
433
479
|
length--;
|
|
434
480
|
i--;
|
|
435
481
|
}
|
|
436
482
|
}
|
|
437
483
|
|
|
438
|
-
return
|
|
484
|
+
return self.length === original ? nil : object;
|
|
439
485
|
}
|
|
440
486
|
end
|
|
441
487
|
|
|
442
488
|
def delete_at(index)
|
|
443
489
|
%x{
|
|
444
490
|
if (index < 0) {
|
|
445
|
-
index +=
|
|
491
|
+
index += self.length;
|
|
446
492
|
}
|
|
447
493
|
|
|
448
|
-
if (index < 0 || index >=
|
|
494
|
+
if (index < 0 || index >= self.length) {
|
|
449
495
|
return nil;
|
|
450
496
|
}
|
|
451
497
|
|
|
452
|
-
var result =
|
|
498
|
+
var result = self[index];
|
|
453
499
|
|
|
454
|
-
|
|
500
|
+
self.splice(index, 1);
|
|
455
501
|
|
|
456
502
|
return result;
|
|
457
503
|
}
|
|
458
504
|
end
|
|
459
505
|
|
|
460
506
|
def delete_if(&block)
|
|
507
|
+
return enum_for :delete_if unless block_given?
|
|
508
|
+
|
|
461
509
|
%x{
|
|
462
|
-
for (var i = 0, length =
|
|
463
|
-
if ((value = block(
|
|
510
|
+
for (var i = 0, length = self.length, value; i < length; i++) {
|
|
511
|
+
if ((value = block(self[i])) === $breaker) {
|
|
464
512
|
return $breaker.$v;
|
|
465
513
|
}
|
|
466
514
|
|
|
467
515
|
if (value !== false && value !== nil) {
|
|
468
|
-
|
|
516
|
+
self.splice(i, 1);
|
|
469
517
|
|
|
470
518
|
length--;
|
|
471
519
|
i--;
|
|
@@ -477,7 +525,13 @@ class Array
|
|
|
477
525
|
end
|
|
478
526
|
|
|
479
527
|
def drop(number)
|
|
480
|
-
|
|
528
|
+
%x{
|
|
529
|
+
if (number < 0) {
|
|
530
|
+
#{raise ArgumentError}
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
return self.slice(number);
|
|
534
|
+
}
|
|
481
535
|
end
|
|
482
536
|
|
|
483
537
|
alias dup clone
|
|
@@ -486,16 +540,11 @@ class Array
|
|
|
486
540
|
return enum_for :each unless block_given?
|
|
487
541
|
|
|
488
542
|
%x{
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
el = #{self}[i];
|
|
492
|
-
if (!el._isArray) el = [el];
|
|
543
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
544
|
+
var value = $opal.$yield1(block, self[i]);
|
|
493
545
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
} else {
|
|
497
|
-
for (var i = 0, length = #{self}.length; i < length; i++) {
|
|
498
|
-
if (block(#{self}[i]) === $breaker) return $breaker.$v;
|
|
546
|
+
if (value == $breaker) {
|
|
547
|
+
return $breaker.$v;
|
|
499
548
|
}
|
|
500
549
|
}
|
|
501
550
|
}
|
|
@@ -504,15 +553,23 @@ class Array
|
|
|
504
553
|
end
|
|
505
554
|
|
|
506
555
|
def each_index(&block)
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
556
|
+
return enum_for :each_index unless block_given?
|
|
557
|
+
|
|
558
|
+
%x{
|
|
559
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
560
|
+
var value = $opal.$yield1(block, i);
|
|
561
|
+
|
|
562
|
+
if (value === $breaker) {
|
|
563
|
+
return $breaker.$v;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
510
567
|
|
|
511
568
|
self
|
|
512
569
|
end
|
|
513
570
|
|
|
514
571
|
def empty?
|
|
515
|
-
|
|
572
|
+
`self.length === 0`
|
|
516
573
|
end
|
|
517
574
|
|
|
518
575
|
def fetch(index, defaults = undefined, &block)
|
|
@@ -520,38 +577,110 @@ class Array
|
|
|
520
577
|
var original = index;
|
|
521
578
|
|
|
522
579
|
if (index < 0) {
|
|
523
|
-
index +=
|
|
580
|
+
index += self.length;
|
|
524
581
|
}
|
|
525
582
|
|
|
526
|
-
if (index >= 0 && index <
|
|
527
|
-
return
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
if (defaults != null) {
|
|
531
|
-
return defaults;
|
|
583
|
+
if (index >= 0 && index < self.length) {
|
|
584
|
+
return self[index];
|
|
532
585
|
}
|
|
533
586
|
|
|
534
587
|
if (block !== nil) {
|
|
535
588
|
return block(original);
|
|
536
589
|
}
|
|
537
590
|
|
|
591
|
+
if (defaults != null) {
|
|
592
|
+
return defaults;
|
|
593
|
+
}
|
|
594
|
+
|
|
538
595
|
#{ raise IndexError, "Array#fetch" };
|
|
539
596
|
}
|
|
540
597
|
end
|
|
541
598
|
|
|
542
|
-
def fill(
|
|
543
|
-
|
|
544
|
-
if
|
|
545
|
-
|
|
546
|
-
|
|
599
|
+
def fill(*args, &block)
|
|
600
|
+
if block
|
|
601
|
+
if `args.length > 2`
|
|
602
|
+
raise ArgumentError, "wrong number of arguments (#{args.length} for 0..2)"
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
one, two = args
|
|
606
|
+
else
|
|
607
|
+
if `args.length == 0`
|
|
608
|
+
raise ArgumentError, "wrong number of arguments (0 for 1..3)"
|
|
609
|
+
elsif `args.length > 3`
|
|
610
|
+
raise ArgumentError, "wrong number of arguments (#{args.length} for 1..3)"
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
obj, one, two = args
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
if Range === one
|
|
617
|
+
raise TypeError, "length invalid with range" if two
|
|
618
|
+
|
|
619
|
+
left = Opal.coerce_to one.begin, Integer, :to_int
|
|
620
|
+
`left += #@length` if `left < 0`
|
|
621
|
+
raise RangeError, "#{one.inspect} out of range" if `left < 0`
|
|
622
|
+
|
|
623
|
+
right = Opal.coerce_to one.end, Integer, :to_int
|
|
624
|
+
`right += #@length` if `right < 0`
|
|
625
|
+
`right += 1` unless one.exclude_end?
|
|
626
|
+
|
|
627
|
+
return self if `right <= left`
|
|
628
|
+
elsif one
|
|
629
|
+
left = Opal.coerce_to one, Integer, :to_int
|
|
630
|
+
`left += #@length` if `left < 0`
|
|
631
|
+
left = 0 if `left < 0`
|
|
632
|
+
|
|
633
|
+
if two
|
|
634
|
+
right = Opal.coerce_to two, Integer, :to_int
|
|
635
|
+
|
|
636
|
+
return self if `right == 0`
|
|
637
|
+
|
|
638
|
+
`right += left`
|
|
639
|
+
else
|
|
640
|
+
right = @length
|
|
641
|
+
end
|
|
642
|
+
else
|
|
643
|
+
left = 0
|
|
644
|
+
right = @length
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
if `right > 2147483648`
|
|
648
|
+
raise RangeError, "bignum too big to convert into `long'"
|
|
649
|
+
elsif `right >= 536870910`
|
|
650
|
+
raise ArgumentError, "argument too big"
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
if `left > #@length`
|
|
654
|
+
%x{
|
|
655
|
+
for (var i = #@length; i < right; i++) {
|
|
656
|
+
self[i] = nil;
|
|
547
657
|
}
|
|
548
658
|
}
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
659
|
+
end
|
|
660
|
+
|
|
661
|
+
if `right > #@length`
|
|
662
|
+
@length = right
|
|
663
|
+
end
|
|
664
|
+
|
|
665
|
+
if block
|
|
666
|
+
%x{
|
|
667
|
+
for (var length = #@length; left < right; left++) {
|
|
668
|
+
var value = block(left);
|
|
669
|
+
|
|
670
|
+
if (value === $breaker) {
|
|
671
|
+
return $breaker.$v;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
self[left] = value;
|
|
552
675
|
}
|
|
553
676
|
}
|
|
554
|
-
|
|
677
|
+
else
|
|
678
|
+
%x{
|
|
679
|
+
for (var length = #@length; left < right; left++) {
|
|
680
|
+
self[left] = #{obj};
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
end
|
|
555
684
|
|
|
556
685
|
self
|
|
557
686
|
end
|
|
@@ -559,10 +688,15 @@ class Array
|
|
|
559
688
|
def first(count = undefined)
|
|
560
689
|
%x{
|
|
561
690
|
if (count != null) {
|
|
562
|
-
|
|
691
|
+
|
|
692
|
+
if (count < 0) {
|
|
693
|
+
#{raise ArgumentError};
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
return self.slice(0, count);
|
|
563
697
|
}
|
|
564
698
|
|
|
565
|
-
return
|
|
699
|
+
return self.length === 0 ? nil : self[0];
|
|
566
700
|
}
|
|
567
701
|
end
|
|
568
702
|
|
|
@@ -570,10 +704,12 @@ class Array
|
|
|
570
704
|
%x{
|
|
571
705
|
var result = [];
|
|
572
706
|
|
|
573
|
-
for (var i = 0, length =
|
|
574
|
-
item =
|
|
707
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
708
|
+
var item = self[i];
|
|
709
|
+
|
|
710
|
+
if (#{`item`.respond_to?(:to_ary)}) {
|
|
711
|
+
item = #{`item`.to_ary};
|
|
575
712
|
|
|
576
|
-
if (item._isArray) {
|
|
577
713
|
if (level == null) {
|
|
578
714
|
result = result.concat(#{`item`.flatten});
|
|
579
715
|
}
|
|
@@ -595,21 +731,34 @@ class Array
|
|
|
595
731
|
|
|
596
732
|
def flatten!(level = undefined)
|
|
597
733
|
%x{
|
|
598
|
-
var
|
|
599
|
-
#{replace flatten level};
|
|
734
|
+
var flattened = #{flatten level};
|
|
600
735
|
|
|
601
|
-
|
|
736
|
+
if (self.length == flattened.length) {
|
|
737
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
738
|
+
if (self[i] !== flattened[i]) {
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
if (i == length) {
|
|
744
|
+
return nil;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
#{replace `flattened`};
|
|
602
749
|
}
|
|
750
|
+
|
|
751
|
+
self
|
|
603
752
|
end
|
|
604
753
|
|
|
605
754
|
def hash
|
|
606
|
-
|
|
755
|
+
`self._id || (self._id = Opal.uid())`
|
|
607
756
|
end
|
|
608
757
|
|
|
609
758
|
def include?(member)
|
|
610
759
|
%x{
|
|
611
|
-
for (var i = 0, length =
|
|
612
|
-
if (#{
|
|
760
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
761
|
+
if (#{`self[i]` == member}) {
|
|
613
762
|
return true;
|
|
614
763
|
}
|
|
615
764
|
}
|
|
@@ -621,15 +770,15 @@ class Array
|
|
|
621
770
|
def index(object=undefined, &block)
|
|
622
771
|
%x{
|
|
623
772
|
if (object != null) {
|
|
624
|
-
for (var i = 0, length =
|
|
625
|
-
if (#{
|
|
773
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
774
|
+
if (#{`self[i]` == object}) {
|
|
626
775
|
return i;
|
|
627
776
|
}
|
|
628
777
|
}
|
|
629
778
|
}
|
|
630
779
|
else if (block !== nil) {
|
|
631
|
-
for (var i = 0, length =
|
|
632
|
-
if ((value = block(
|
|
780
|
+
for (var i = 0, length = self.length, value; i < length; i++) {
|
|
781
|
+
if ((value = block(self[i])) === $breaker) {
|
|
633
782
|
return $breaker.$v;
|
|
634
783
|
}
|
|
635
784
|
|
|
@@ -638,6 +787,9 @@ class Array
|
|
|
638
787
|
}
|
|
639
788
|
}
|
|
640
789
|
}
|
|
790
|
+
else {
|
|
791
|
+
return #{enum_for :index};
|
|
792
|
+
}
|
|
641
793
|
|
|
642
794
|
return nil;
|
|
643
795
|
}
|
|
@@ -647,19 +799,19 @@ class Array
|
|
|
647
799
|
%x{
|
|
648
800
|
if (objects.length > 0) {
|
|
649
801
|
if (index < 0) {
|
|
650
|
-
index +=
|
|
802
|
+
index += self.length + 1;
|
|
651
803
|
|
|
652
804
|
if (index < 0) {
|
|
653
805
|
#{ raise IndexError, "#{index} is out of bounds" };
|
|
654
806
|
}
|
|
655
807
|
}
|
|
656
|
-
if (index >
|
|
657
|
-
for (var i =
|
|
658
|
-
|
|
808
|
+
if (index > self.length) {
|
|
809
|
+
for (var i = self.length; i < index; i++) {
|
|
810
|
+
self.push(nil);
|
|
659
811
|
}
|
|
660
812
|
}
|
|
661
813
|
|
|
662
|
-
|
|
814
|
+
self.splice.apply(self, [index, 0].concat(objects));
|
|
663
815
|
}
|
|
664
816
|
}
|
|
665
817
|
|
|
@@ -672,7 +824,7 @@ class Array
|
|
|
672
824
|
|
|
673
825
|
inspect = [];
|
|
674
826
|
object_id = #{object_id};
|
|
675
|
-
length =
|
|
827
|
+
length = self.length;
|
|
676
828
|
|
|
677
829
|
for (i = 0; i < length; i++) {
|
|
678
830
|
el = #{self[`i`]};
|
|
@@ -690,8 +842,8 @@ class Array
|
|
|
690
842
|
%x{
|
|
691
843
|
var result = [];
|
|
692
844
|
|
|
693
|
-
for (var i = 0, length =
|
|
694
|
-
result.push(#{
|
|
845
|
+
for (var i = 0, length = self.length; i < length; i++) {
|
|
846
|
+
result.push(#{`self[i]`.to_s});
|
|
695
847
|
}
|
|
696
848
|
|
|
697
849
|
return result.join(sep);
|
|
@@ -699,14 +851,16 @@ class Array
|
|
|
699
851
|
end
|
|
700
852
|
|
|
701
853
|
def keep_if(&block)
|
|
854
|
+
return enum_for :keep_if unless block_given?
|
|
855
|
+
|
|
702
856
|
%x{
|
|
703
|
-
for (var i = 0, length =
|
|
704
|
-
if ((value = block(
|
|
857
|
+
for (var i = 0, length = self.length, value; i < length; i++) {
|
|
858
|
+
if ((value = block(self[i])) === $breaker) {
|
|
705
859
|
return $breaker.$v;
|
|
706
860
|
}
|
|
707
861
|
|
|
708
862
|
if (value === false || value === nil) {
|
|
709
|
-
|
|
863
|
+
self.splice(i, 1);
|
|
710
864
|
|
|
711
865
|
length--;
|
|
712
866
|
i--;
|
|
@@ -719,7 +873,7 @@ class Array
|
|
|
719
873
|
|
|
720
874
|
def last(count = undefined)
|
|
721
875
|
%x{
|
|
722
|
-
var length =
|
|
876
|
+
var length = self.length;
|
|
723
877
|
|
|
724
878
|
if (count === nil || typeof(count) == 'string') {
|
|
725
879
|
#{ raise TypeError, "no implicit conversion to integer" };
|
|
@@ -735,7 +889,7 @@ class Array
|
|
|
735
889
|
}
|
|
736
890
|
|
|
737
891
|
if (count == null) {
|
|
738
|
-
return length === 0 ? nil :
|
|
892
|
+
return length === 0 ? nil : self[length - 1];
|
|
739
893
|
}
|
|
740
894
|
else if (count < 0) {
|
|
741
895
|
#{ raise ArgumentError, "negative count given" };
|
|
@@ -745,12 +899,12 @@ class Array
|
|
|
745
899
|
count = length;
|
|
746
900
|
}
|
|
747
901
|
|
|
748
|
-
return
|
|
902
|
+
return self.slice(length - count, length);
|
|
749
903
|
}
|
|
750
904
|
end
|
|
751
905
|
|
|
752
906
|
def length
|
|
753
|
-
|
|
907
|
+
`self.length`
|
|
754
908
|
end
|
|
755
909
|
|
|
756
910
|
alias map collect
|
|
@@ -759,24 +913,24 @@ class Array
|
|
|
759
913
|
|
|
760
914
|
def pop(count = undefined)
|
|
761
915
|
%x{
|
|
762
|
-
var length =
|
|
916
|
+
var length = self.length;
|
|
763
917
|
|
|
764
918
|
if (count == null) {
|
|
765
|
-
return length === 0 ? nil :
|
|
919
|
+
return length === 0 ? nil : self.pop();
|
|
766
920
|
}
|
|
767
921
|
|
|
768
922
|
if (count < 0) {
|
|
769
|
-
#{ raise "negative count given" };
|
|
923
|
+
#{ raise ArgumentError, "negative count given" };
|
|
770
924
|
}
|
|
771
925
|
|
|
772
|
-
return count > length ?
|
|
926
|
+
return count > length ? self.splice(0, self.length) : self.splice(length - count, length);
|
|
773
927
|
}
|
|
774
928
|
end
|
|
775
929
|
|
|
776
930
|
def push(*objects)
|
|
777
931
|
%x{
|
|
778
932
|
for (var i = 0, length = objects.length; i < length; i++) {
|
|
779
|
-
|
|
933
|
+
self.push(objects[i]);
|
|
780
934
|
}
|
|
781
935
|
}
|
|
782
936
|
|
|
@@ -785,8 +939,8 @@ class Array
|
|
|
785
939
|
|
|
786
940
|
def rassoc(object)
|
|
787
941
|
%x{
|
|
788
|
-
for (var i = 0, length =
|
|
789
|
-
item =
|
|
942
|
+
for (var i = 0, length = self.length, item; i < length; i++) {
|
|
943
|
+
item = self[i];
|
|
790
944
|
|
|
791
945
|
if (item.length && item[1] !== undefined) {
|
|
792
946
|
if (#{`item[1]` == object}) {
|
|
@@ -800,16 +954,18 @@ class Array
|
|
|
800
954
|
end
|
|
801
955
|
|
|
802
956
|
def reject(&block)
|
|
957
|
+
return enum_for :reject unless block_given?
|
|
958
|
+
|
|
803
959
|
%x{
|
|
804
960
|
var result = [];
|
|
805
961
|
|
|
806
|
-
for (var i = 0, length =
|
|
807
|
-
if ((value = block(
|
|
962
|
+
for (var i = 0, length = self.length, value; i < length; i++) {
|
|
963
|
+
if ((value = block(self[i])) === $breaker) {
|
|
808
964
|
return $breaker.$v;
|
|
809
965
|
}
|
|
810
966
|
|
|
811
967
|
if (value === false || value === nil) {
|
|
812
|
-
result.push(
|
|
968
|
+
result.push(self[i]);
|
|
813
969
|
}
|
|
814
970
|
}
|
|
815
971
|
return result;
|
|
@@ -817,40 +973,51 @@ class Array
|
|
|
817
973
|
end
|
|
818
974
|
|
|
819
975
|
def reject!(&block)
|
|
976
|
+
return enum_for :reject! unless block_given?
|
|
977
|
+
|
|
820
978
|
%x{
|
|
821
|
-
var original =
|
|
979
|
+
var original = self.length;
|
|
822
980
|
#{ delete_if &block };
|
|
823
|
-
return
|
|
981
|
+
return self.length === original ? nil : self;
|
|
824
982
|
}
|
|
825
983
|
end
|
|
826
984
|
|
|
827
985
|
def replace(other)
|
|
828
986
|
%x{
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
return #{self};
|
|
987
|
+
self.splice(0, self.length);
|
|
988
|
+
self.push.apply(self, other);
|
|
832
989
|
}
|
|
990
|
+
|
|
991
|
+
self
|
|
833
992
|
end
|
|
834
993
|
|
|
835
994
|
def reverse
|
|
836
|
-
|
|
995
|
+
`self.slice(0).reverse()`
|
|
837
996
|
end
|
|
838
997
|
|
|
839
998
|
def reverse!
|
|
840
|
-
|
|
999
|
+
`self.reverse()`
|
|
841
1000
|
end
|
|
842
1001
|
|
|
843
1002
|
def reverse_each(&block)
|
|
844
|
-
|
|
1003
|
+
return enum_for :reverse_each unless block_given?
|
|
845
1004
|
|
|
1005
|
+
reverse.each &block
|
|
846
1006
|
self
|
|
847
1007
|
end
|
|
848
1008
|
|
|
849
1009
|
def rindex(object = undefined, &block)
|
|
850
1010
|
%x{
|
|
851
|
-
if (
|
|
852
|
-
for (var i =
|
|
853
|
-
if (
|
|
1011
|
+
if (object != null) {
|
|
1012
|
+
for (var i = self.length - 1; i >= 0; i--) {
|
|
1013
|
+
if (#{`self[i]` == `object`}) {
|
|
1014
|
+
return i;
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
else if (block !== nil) {
|
|
1019
|
+
for (var i = self.length - 1, value; i >= 0; i--) {
|
|
1020
|
+
if ((value = block(self[i])) === $breaker) {
|
|
854
1021
|
return $breaker.$v;
|
|
855
1022
|
}
|
|
856
1023
|
|
|
@@ -859,24 +1026,35 @@ class Array
|
|
|
859
1026
|
}
|
|
860
1027
|
}
|
|
861
1028
|
}
|
|
862
|
-
else {
|
|
863
|
-
|
|
864
|
-
if (#{`#{self}[i]` == `object`}) {
|
|
865
|
-
return i;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
1029
|
+
else if (object == null) {
|
|
1030
|
+
return #{enum_for :rindex};
|
|
868
1031
|
}
|
|
869
1032
|
|
|
870
1033
|
return nil;
|
|
871
1034
|
}
|
|
872
1035
|
end
|
|
873
1036
|
|
|
1037
|
+
def sample(n = nil)
|
|
1038
|
+
return nil if !n && empty?
|
|
1039
|
+
return [] if n && empty?
|
|
1040
|
+
|
|
1041
|
+
if n
|
|
1042
|
+
(1 .. n).map {
|
|
1043
|
+
self[rand(length)]
|
|
1044
|
+
}
|
|
1045
|
+
else
|
|
1046
|
+
self[rand(length)]
|
|
1047
|
+
end
|
|
1048
|
+
end
|
|
1049
|
+
|
|
874
1050
|
def select(&block)
|
|
1051
|
+
return enum_for :select unless block_given?
|
|
1052
|
+
|
|
875
1053
|
%x{
|
|
876
1054
|
var result = [];
|
|
877
1055
|
|
|
878
|
-
for (var i = 0, length =
|
|
879
|
-
item =
|
|
1056
|
+
for (var i = 0, length = self.length, item, value; i < length; i++) {
|
|
1057
|
+
item = self[i];
|
|
880
1058
|
|
|
881
1059
|
if ((value = block(item)) === $breaker) {
|
|
882
1060
|
return $breaker.$v;
|
|
@@ -892,143 +1070,136 @@ class Array
|
|
|
892
1070
|
end
|
|
893
1071
|
|
|
894
1072
|
def select!(&block)
|
|
1073
|
+
return enum_for :select! unless block_given?
|
|
1074
|
+
|
|
895
1075
|
%x{
|
|
896
|
-
var original =
|
|
1076
|
+
var original = self.length;
|
|
897
1077
|
#{ keep_if &block };
|
|
898
|
-
return
|
|
1078
|
+
return self.length === original ? nil : self;
|
|
899
1079
|
}
|
|
900
1080
|
end
|
|
901
1081
|
|
|
902
1082
|
def shift(count = undefined)
|
|
903
1083
|
%x{
|
|
904
|
-
if (
|
|
1084
|
+
if (self.length === 0) {
|
|
905
1085
|
return nil;
|
|
906
1086
|
}
|
|
907
1087
|
|
|
908
|
-
return count == null ?
|
|
1088
|
+
return count == null ? self.shift() : self.splice(0, count)
|
|
909
1089
|
}
|
|
910
1090
|
end
|
|
911
1091
|
|
|
912
1092
|
alias size length
|
|
913
1093
|
|
|
914
1094
|
def shuffle
|
|
1095
|
+
clone.shuffle!
|
|
1096
|
+
end
|
|
1097
|
+
|
|
1098
|
+
def shuffle!
|
|
915
1099
|
%x{
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
#{self}[i] = #{self}[j];
|
|
920
|
-
#{self}[j] = tmp;
|
|
921
|
-
}
|
|
1100
|
+
for (var i = self.length - 1; i > 0; i--) {
|
|
1101
|
+
var tmp = self[i],
|
|
1102
|
+
j = Math.floor(Math.random() * (i + 1));
|
|
922
1103
|
|
|
923
|
-
|
|
1104
|
+
self[i] = self[j];
|
|
1105
|
+
self[j] = tmp;
|
|
1106
|
+
}
|
|
924
1107
|
}
|
|
1108
|
+
|
|
1109
|
+
self
|
|
925
1110
|
end
|
|
926
1111
|
|
|
927
|
-
alias slice
|
|
1112
|
+
alias slice []
|
|
928
1113
|
|
|
929
1114
|
def slice!(index, length = undefined)
|
|
930
1115
|
%x{
|
|
931
1116
|
if (index < 0) {
|
|
932
|
-
index +=
|
|
1117
|
+
index += self.length;
|
|
933
1118
|
}
|
|
934
1119
|
|
|
935
1120
|
if (length != null) {
|
|
936
|
-
return
|
|
1121
|
+
return self.splice(index, length);
|
|
937
1122
|
}
|
|
938
1123
|
|
|
939
|
-
if (index < 0 || index >=
|
|
1124
|
+
if (index < 0 || index >= self.length) {
|
|
940
1125
|
return nil;
|
|
941
1126
|
}
|
|
942
1127
|
|
|
943
|
-
return
|
|
1128
|
+
return self.splice(index, 1)[0];
|
|
944
1129
|
}
|
|
945
1130
|
end
|
|
946
1131
|
|
|
947
1132
|
def sort(&block)
|
|
1133
|
+
return self unless `self.length > 1`
|
|
1134
|
+
|
|
948
1135
|
%x{
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
1136
|
+
if (!#{block_given?}) {
|
|
1137
|
+
block = function(a, b) {
|
|
1138
|
+
return #{`a` <=> `b`};
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
952
1141
|
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
var
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
if (result === nil) {
|
|
960
|
-
t_arg_error = true;
|
|
961
|
-
}
|
|
962
|
-
if ((result != null) && #{ `result`.respond_to? :<=> }) {
|
|
963
|
-
result = result['$<=>'](0);
|
|
1142
|
+
try {
|
|
1143
|
+
return self.slice().sort(function(x, y) {
|
|
1144
|
+
var ret = block(x, y);
|
|
1145
|
+
|
|
1146
|
+
if (ret === $breaker) {
|
|
1147
|
+
throw $breaker;
|
|
964
1148
|
}
|
|
965
|
-
if (
|
|
966
|
-
|
|
1149
|
+
else if (ret === nil) {
|
|
1150
|
+
#{raise ArgumentError, "comparison of #{`x`.inspect} with #{`y`.inspect} failed"};
|
|
967
1151
|
}
|
|
968
|
-
return result;
|
|
969
|
-
});
|
|
970
|
-
|
|
971
|
-
if (t_break.length > 0)
|
|
972
|
-
return t_break[0];
|
|
973
|
-
if (t_arg_error)
|
|
974
|
-
#{raise ArgumentError, "Array#sort"};
|
|
975
1152
|
|
|
976
|
-
|
|
1153
|
+
return #{`ret` > 0} ? 1 : (#{`ret` < 0} ? -1 : 0);
|
|
1154
|
+
});
|
|
977
1155
|
}
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
t_arg_error = true;
|
|
1156
|
+
catch (e) {
|
|
1157
|
+
if (e === $breaker) {
|
|
1158
|
+
return $breaker.$v;
|
|
982
1159
|
}
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
var result = a['$<=>'](b);
|
|
986
|
-
if (result === nil) {
|
|
987
|
-
t_arg_error = true;
|
|
988
|
-
}
|
|
989
|
-
return result;
|
|
1160
|
+
else {
|
|
1161
|
+
throw e;
|
|
990
1162
|
}
|
|
991
|
-
|
|
992
|
-
return 1;
|
|
993
|
-
if (a < b)
|
|
994
|
-
return -1;
|
|
995
|
-
return 0;
|
|
996
|
-
});
|
|
997
|
-
|
|
998
|
-
if (t_arg_error)
|
|
999
|
-
#{raise ArgumentError, "Array#sort"};
|
|
1000
|
-
|
|
1001
|
-
return result;
|
|
1163
|
+
}
|
|
1002
1164
|
}
|
|
1003
1165
|
end
|
|
1004
1166
|
|
|
1005
1167
|
def sort!(&block)
|
|
1006
1168
|
%x{
|
|
1007
1169
|
var result;
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
result = #{self
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1170
|
+
|
|
1171
|
+
if (#{block_given?}) {
|
|
1172
|
+
result = #{`self.slice()`.sort(&block)};
|
|
1173
|
+
}
|
|
1174
|
+
else {
|
|
1175
|
+
result = #{`self.slice()`.sort};
|
|
1013
1176
|
}
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1177
|
+
|
|
1178
|
+
self.length = 0;
|
|
1179
|
+
for(var i = 0, length = result.length; i < length; i++) {
|
|
1180
|
+
self.push(result[i]);
|
|
1017
1181
|
}
|
|
1018
|
-
|
|
1182
|
+
|
|
1183
|
+
return self;
|
|
1019
1184
|
}
|
|
1020
1185
|
end
|
|
1021
1186
|
|
|
1022
1187
|
def take(count)
|
|
1023
|
-
|
|
1188
|
+
%x{
|
|
1189
|
+
if (count < 0) {
|
|
1190
|
+
#{raise ArgumentError};
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
return self.slice(0, count);
|
|
1194
|
+
}
|
|
1024
1195
|
end
|
|
1025
1196
|
|
|
1026
1197
|
def take_while(&block)
|
|
1027
1198
|
%x{
|
|
1028
1199
|
var result = [];
|
|
1029
1200
|
|
|
1030
|
-
for (var i = 0, length =
|
|
1031
|
-
item =
|
|
1201
|
+
for (var i = 0, length = self.length, item, value; i < length; i++) {
|
|
1202
|
+
item = self[i];
|
|
1032
1203
|
|
|
1033
1204
|
if ((value = block(item)) === $breaker) {
|
|
1034
1205
|
return $breaker.$v;
|
|
@@ -1055,11 +1226,11 @@ class Array
|
|
|
1055
1226
|
%x{
|
|
1056
1227
|
var result = [], obj
|
|
1057
1228
|
|
|
1058
|
-
for (var i = 0, len =
|
|
1059
|
-
obj =
|
|
1229
|
+
for (var i = 0, len = self.length; i < len; i++) {
|
|
1230
|
+
obj = self[i];
|
|
1060
1231
|
|
|
1061
|
-
if (obj
|
|
1062
|
-
result.push(#{
|
|
1232
|
+
if (#{`obj`.respond_to? :to_n}) {
|
|
1233
|
+
result.push(#{`obj`.to_n});
|
|
1063
1234
|
}
|
|
1064
1235
|
else {
|
|
1065
1236
|
result.push(obj);
|
|
@@ -1070,69 +1241,96 @@ class Array
|
|
|
1070
1241
|
}
|
|
1071
1242
|
end
|
|
1072
1243
|
|
|
1073
|
-
|
|
1074
1244
|
alias to_s inspect
|
|
1075
1245
|
|
|
1246
|
+
def transpose
|
|
1247
|
+
return [] if empty?
|
|
1248
|
+
|
|
1249
|
+
result = []
|
|
1250
|
+
max = nil
|
|
1251
|
+
|
|
1252
|
+
each {|row|
|
|
1253
|
+
if Array === row
|
|
1254
|
+
row = row.to_a
|
|
1255
|
+
else
|
|
1256
|
+
row = Opal.coerce_to row, Array, :to_ary
|
|
1257
|
+
end
|
|
1258
|
+
|
|
1259
|
+
max ||= `row.length`
|
|
1260
|
+
|
|
1261
|
+
if `row.length` != max
|
|
1262
|
+
raise IndexError, "element size differs (#{`row.length`} should be #{max}"
|
|
1263
|
+
end
|
|
1264
|
+
|
|
1265
|
+
`row.length`.times {|i|
|
|
1266
|
+
entry = (result[i] ||= [])
|
|
1267
|
+
entry << row.at(i)
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
result
|
|
1272
|
+
end
|
|
1273
|
+
|
|
1076
1274
|
def uniq
|
|
1077
1275
|
%x{
|
|
1078
1276
|
var result = [],
|
|
1079
1277
|
seen = {};
|
|
1080
|
-
|
|
1081
|
-
for (var i = 0, length =
|
|
1082
|
-
item =
|
|
1278
|
+
|
|
1279
|
+
for (var i = 0, length = self.length, item, hash; i < length; i++) {
|
|
1280
|
+
item = self[i];
|
|
1083
1281
|
hash = item;
|
|
1084
|
-
|
|
1282
|
+
|
|
1085
1283
|
if (!seen[hash]) {
|
|
1086
1284
|
seen[hash] = true;
|
|
1087
|
-
|
|
1285
|
+
|
|
1088
1286
|
result.push(item);
|
|
1089
1287
|
}
|
|
1090
1288
|
}
|
|
1091
|
-
|
|
1289
|
+
|
|
1092
1290
|
return result;
|
|
1093
1291
|
}
|
|
1094
1292
|
end
|
|
1095
1293
|
|
|
1096
1294
|
def uniq!
|
|
1097
1295
|
%x{
|
|
1098
|
-
var original =
|
|
1296
|
+
var original = self.length,
|
|
1099
1297
|
seen = {};
|
|
1100
1298
|
|
|
1101
1299
|
for (var i = 0, length = original, item, hash; i < length; i++) {
|
|
1102
|
-
item =
|
|
1300
|
+
item = self[i];
|
|
1103
1301
|
hash = item;
|
|
1104
1302
|
|
|
1105
1303
|
if (!seen[hash]) {
|
|
1106
1304
|
seen[hash] = true;
|
|
1107
1305
|
}
|
|
1108
1306
|
else {
|
|
1109
|
-
|
|
1307
|
+
self.splice(i, 1);
|
|
1110
1308
|
|
|
1111
1309
|
length--;
|
|
1112
1310
|
i--;
|
|
1113
1311
|
}
|
|
1114
1312
|
}
|
|
1115
1313
|
|
|
1116
|
-
return
|
|
1314
|
+
return self.length === original ? nil : self;
|
|
1117
1315
|
}
|
|
1118
1316
|
end
|
|
1119
1317
|
|
|
1120
1318
|
def unshift(*objects)
|
|
1121
1319
|
%x{
|
|
1122
1320
|
for (var i = objects.length - 1; i >= 0; i--) {
|
|
1123
|
-
|
|
1321
|
+
self.unshift(objects[i]);
|
|
1124
1322
|
}
|
|
1125
|
-
|
|
1126
|
-
return #{self};
|
|
1127
1323
|
}
|
|
1324
|
+
|
|
1325
|
+
self
|
|
1128
1326
|
end
|
|
1129
1327
|
|
|
1130
1328
|
def zip(*others, &block)
|
|
1131
1329
|
%x{
|
|
1132
|
-
var result = [], size =
|
|
1330
|
+
var result = [], size = self.length, part, o;
|
|
1133
1331
|
|
|
1134
1332
|
for (var i = 0; i < size; i++) {
|
|
1135
|
-
part = [
|
|
1333
|
+
part = [self[i]];
|
|
1136
1334
|
|
|
1137
1335
|
for (var j = 0, jj = others.length; j < jj; j++) {
|
|
1138
1336
|
o = others[j][i];
|