opal 0.4.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://secure.travis-ci.org/opal/opal.png?branch=master)](http://travis-ci.org/opal/opal)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/opal.png)](http://badge.fury.io/rb/opal)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/opal/opal.png)](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
|
+
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/opal/opal/trend.png)](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];
|