opal 1.7.4 → 1.8.0.alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +9 -9
- data/.rubocop/todo.yml +2 -2
- data/.rubocop.yml +17 -10
- data/.rubocop_todo.yml +311 -0
- data/CHANGELOG.md +1 -15
- data/UNRELEASED.md +78 -1
- data/benchmark-ips/bm_block_vs_yield.rb +3 -0
- data/benchmark-ips/bm_slice_or_not.rb +53 -0
- data/docs/bridging.md +112 -0
- data/docs/compiled_ruby.md +10 -10
- data/docs/getting_started.md +18 -22
- data/lib/opal/cli_runners/chrome.rb +1 -5
- data/lib/opal/cli_runners/chrome_cdp_interface.rb +1 -0
- data/lib/opal/cli_runners/firefox_cdp_interface.rb +1 -0
- data/lib/opal/compiler.rb +33 -1
- data/lib/opal/nodes/args/extract_kwoptarg.rb +2 -1
- data/lib/opal/nodes/call.rb +1 -1
- data/lib/opal/nodes/call_special.rb +71 -47
- data/lib/opal/nodes/hash.rb +14 -30
- data/lib/opal/nodes/if.rb +37 -29
- data/lib/opal/nodes/literal.rb +5 -1
- data/lib/opal/nodes/x_string.rb +13 -0
- data/lib/opal/parser/patch.rb +1 -0
- data/lib/opal/rewriters/for_rewriter.rb +36 -24
- data/lib/opal/simple_server.rb +2 -2
- data/lib/opal/source_map/file.rb +1 -1
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array/pack.rb +1 -0
- data/opal/corelib/array.rb +71 -43
- data/opal/corelib/basic_object.rb +1 -0
- data/opal/corelib/binding.rb +2 -0
- data/opal/corelib/boolean.rb +1 -0
- data/opal/corelib/class.rb +2 -0
- data/opal/corelib/comparable.rb +1 -0
- data/opal/corelib/complex.rb +2 -0
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/dir.rb +2 -0
- data/opal/corelib/enumerable.rb +3 -2
- data/opal/corelib/enumerator/arithmetic_sequence.rb +2 -0
- data/opal/corelib/enumerator/chain.rb +1 -0
- data/opal/corelib/enumerator/generator.rb +1 -0
- data/opal/corelib/enumerator/lazy.rb +1 -0
- data/opal/corelib/enumerator/yielder.rb +2 -0
- data/opal/corelib/enumerator.rb +1 -0
- data/opal/corelib/error/errno.rb +2 -0
- data/opal/corelib/error.rb +12 -0
- data/opal/corelib/file.rb +1 -0
- data/opal/corelib/hash.rb +197 -504
- data/opal/corelib/helpers.rb +1 -0
- data/opal/corelib/io.rb +2 -0
- data/opal/corelib/irb.rb +2 -0
- data/opal/corelib/kernel/format.rb +1 -0
- data/opal/corelib/kernel.rb +70 -14
- data/opal/corelib/main.rb +2 -0
- data/opal/corelib/marshal/read_buffer.rb +2 -0
- data/opal/corelib/marshal/write_buffer.rb +2 -0
- data/opal/corelib/math/polyfills.rb +2 -0
- data/opal/corelib/math.rb +1 -0
- data/opal/corelib/method.rb +2 -0
- data/opal/corelib/module.rb +1 -0
- data/opal/corelib/nil.rb +3 -1
- data/opal/corelib/number.rb +2 -0
- data/opal/corelib/numeric.rb +2 -0
- data/opal/corelib/object_space.rb +1 -0
- data/opal/corelib/pack_unpack/format_string_parser.rb +2 -0
- data/opal/corelib/proc.rb +30 -28
- data/opal/corelib/process.rb +2 -0
- data/opal/corelib/random/formatter.rb +2 -0
- data/opal/corelib/random/math_random.js.rb +2 -0
- data/opal/corelib/random/mersenne_twister.rb +2 -0
- data/opal/corelib/random/seedrandom.js.rb +2 -0
- data/opal/corelib/random.rb +1 -0
- data/opal/corelib/range.rb +34 -12
- data/opal/corelib/rational.rb +2 -0
- data/opal/corelib/regexp.rb +1 -0
- data/opal/corelib/runtime.js +187 -231
- data/opal/corelib/set.rb +2 -0
- data/opal/corelib/string/encoding.rb +3 -0
- data/opal/corelib/string/unpack.rb +2 -0
- data/opal/corelib/string.rb +20 -12
- data/opal/corelib/struct.rb +3 -1
- data/opal/corelib/time.rb +1 -0
- data/opal/corelib/trace_point.rb +2 -0
- data/opal/corelib/unsupported.rb +2 -0
- data/opal/corelib/variables.rb +2 -0
- data/opal.gemspec +2 -2
- data/spec/filters/bugs/array.rb +0 -2
- data/spec/filters/bugs/enumerable.rb +0 -3
- data/spec/filters/bugs/hash.rb +0 -13
- data/spec/filters/bugs/kernel.rb +0 -38
- data/spec/filters/bugs/range.rb +0 -1
- data/spec/filters/bugs/ruby-32.rb +0 -2
- data/spec/filters/bugs/string.rb +0 -1
- data/spec/filters/bugs/struct.rb +1 -5
- data/spec/filters/unsupported/hash.rb +1 -0
- data/spec/lib/compiler_spec.rb +24 -17
- data/spec/mspec-opal/formatters.rb +2 -0
- data/spec/mspec-opal/runner.rb +2 -0
- data/spec/opal/core/array/dup_spec.rb +2 -0
- data/spec/opal/core/exception_spec.rb +2 -0
- data/spec/opal/core/hash/internals_spec.rb +154 -206
- data/spec/opal/core/hash_spec.rb +2 -0
- data/spec/opal/core/iterable_props_spec.rb +2 -0
- data/spec/opal/core/kernel/at_exit_spec.rb +2 -0
- data/spec/opal/core/kernel/respond_to_spec.rb +2 -0
- data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +2 -0
- data/spec/opal/core/language/safe_navigator_spec.rb +2 -0
- data/spec/opal/core/language/xstring_send_spec.rb +15 -0
- data/spec/opal/core/language/xstring_spec.rb +2 -0
- data/spec/opal/core/language_spec.rb +2 -0
- data/spec/opal/core/module_spec.rb +44 -0
- data/spec/opal/core/number/to_i_spec.rb +2 -0
- data/spec/opal/core/object_id_spec.rb +2 -0
- data/spec/opal/core/regexp/match_spec.rb +2 -0
- data/spec/opal/core/runtime/bridged_classes_spec.rb +38 -0
- data/spec/opal/core/runtime/constants_spec.rb +2 -0
- data/spec/opal/core/runtime/eval_spec.rb +2 -0
- data/spec/opal/core/runtime/exit_spec.rb +2 -0
- data/spec/opal/core/runtime/is_a_spec.rb +2 -0
- data/spec/opal/core/runtime/loaded_spec.rb +2 -0
- data/spec/opal/core/runtime/method_missing_spec.rb +2 -0
- data/spec/opal/core/runtime/rescue_spec.rb +2 -0
- data/spec/opal/core/runtime/string_spec.rb +2 -0
- data/spec/opal/core/runtime/truthy_spec.rb +2 -0
- data/spec/opal/core/runtime_spec.rb +2 -6
- data/spec/opal/core/string/to_sym_spec.rb +2 -0
- data/spec/opal/stdlib/js_spec.rb +2 -0
- data/spec/opal/stdlib/native/alias_native_spec.rb +2 -0
- data/spec/opal/stdlib/native/array_spec.rb +2 -0
- data/spec/opal/stdlib/native/date_spec.rb +2 -0
- data/spec/opal/stdlib/native/each_spec.rb +2 -0
- data/spec/opal/stdlib/native/element_reference_spec.rb +2 -0
- data/spec/opal/stdlib/native/exposure_spec.rb +2 -0
- data/spec/opal/stdlib/native/ext_spec.rb +2 -0
- data/spec/opal/stdlib/native/hash_spec.rb +30 -2
- data/spec/opal/stdlib/native/initialize_spec.rb +2 -0
- data/spec/opal/stdlib/native/method_missing_spec.rb +2 -0
- data/spec/opal/stdlib/native/native_alias_spec.rb +2 -0
- data/spec/opal/stdlib/native/native_class_spec.rb +2 -0
- data/spec/opal/stdlib/native/native_module_spec.rb +2 -0
- data/spec/opal/stdlib/native/native_reader_spec.rb +2 -0
- data/spec/opal/stdlib/native/native_writer_spec.rb +2 -0
- data/spec/opal/stdlib/native/new_spec.rb +2 -0
- data/spec/opal/stdlib/native/struct_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- data/stdlib/await.rb +1 -0
- data/stdlib/base64.rb +2 -0
- data/stdlib/bigdecimal/bignumber.js.rb +2 -0
- data/stdlib/bigdecimal/util.rb +1 -0
- data/stdlib/bigdecimal.rb +2 -0
- data/stdlib/buffer/array.rb +2 -0
- data/stdlib/buffer/view.rb +2 -0
- data/stdlib/buffer.rb +2 -0
- data/stdlib/cgi.rb +14 -0
- data/stdlib/console.rb +2 -0
- data/stdlib/date/date_time.rb +2 -0
- data/stdlib/date.rb +2 -0
- data/stdlib/delegate.rb +2 -0
- data/stdlib/deno/base.rb +2 -0
- data/stdlib/deno/file.rb +2 -0
- data/stdlib/erb.rb +2 -0
- data/stdlib/gjs/io.rb +2 -0
- data/stdlib/gjs/kernel.rb +2 -0
- data/stdlib/headless_browser/base.rb +2 -0
- data/stdlib/headless_browser/file.rb +1 -0
- data/stdlib/headless_browser.rb +1 -0
- data/stdlib/js.rb +2 -0
- data/stdlib/json.rb +9 -15
- data/stdlib/logger.rb +2 -0
- data/stdlib/nashorn/file.rb +2 -0
- data/stdlib/nashorn/io.rb +2 -0
- data/stdlib/native.rb +48 -48
- data/stdlib/nodejs/base.rb +2 -0
- data/stdlib/nodejs/dir.rb +2 -0
- data/stdlib/nodejs/env.rb +2 -0
- data/stdlib/nodejs/file.rb +2 -0
- data/stdlib/nodejs/fileutils.rb +2 -0
- data/stdlib/nodejs/io.rb +2 -0
- data/stdlib/nodejs/js-yaml-3-6-1.js +1 -1
- data/stdlib/nodejs/kernel.rb +2 -0
- data/stdlib/nodejs/open-uri.rb +2 -0
- data/stdlib/nodejs/pathname.rb +2 -0
- data/stdlib/nodejs/require.rb +2 -0
- data/stdlib/nodejs/yaml.rb +9 -3
- data/stdlib/opal/miniracer.rb +2 -0
- data/stdlib/opal-parser.rb +8 -1
- data/stdlib/opal-platform.rb +2 -0
- data/stdlib/opal-replutils.rb +2 -0
- data/stdlib/open-uri.rb +4 -1
- data/stdlib/ostruct.rb +4 -2
- data/stdlib/pathname.rb +2 -0
- data/stdlib/pp.rb +1 -0
- data/stdlib/promise/v2.rb +2 -0
- data/stdlib/quickjs/io.rb +2 -0
- data/stdlib/quickjs/kernel.rb +2 -0
- data/stdlib/quickjs.rb +2 -0
- data/stdlib/securerandom.rb +2 -0
- data/stdlib/strscan.rb +2 -0
- data/stdlib/time.rb +2 -0
- data/stdlib/uri.rb +1 -0
- data/tasks/performance/optimization_status.rb +2 -0
- data/tasks/testing.rake +1 -0
- data/test/nodejs/test_await.rb +1 -0
- data/test/nodejs/test_dir.rb +2 -0
- data/test/nodejs/test_error.rb +2 -0
- data/test/nodejs/test_file.rb +2 -0
- data/test/nodejs/test_string.rb +2 -0
- data/test/nodejs/test_yaml.rb +20 -0
- metadata +22 -13
- data/spec/filters/bugs/openstruct.rb +0 -8
data/opal/corelib/helpers.rb
CHANGED
data/opal/corelib/io.rb
CHANGED
data/opal/corelib/irb.rb
CHANGED
data/opal/corelib/kernel.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props, jsid
|
2
2
|
# use_strict: true
|
3
|
+
# backtick_javascript: true
|
3
4
|
|
4
5
|
module ::Kernel
|
5
6
|
def =~(obj)
|
@@ -385,30 +386,55 @@ module ::Kernel
|
|
385
386
|
}
|
386
387
|
end
|
387
388
|
|
388
|
-
def Integer(value, base = undefined)
|
389
|
+
def Integer(value, base = undefined, exception: true)
|
389
390
|
%x{
|
390
391
|
var i, str, base_digits;
|
391
392
|
|
393
|
+
exception = $truthy(#{exception});
|
394
|
+
|
392
395
|
if (!value.$$is_string) {
|
393
396
|
if (base !== undefined) {
|
394
|
-
|
397
|
+
if (exception) {
|
398
|
+
#{::Kernel.raise ::ArgumentError, 'base specified for non string value'}
|
399
|
+
} else {
|
400
|
+
return nil;
|
401
|
+
}
|
395
402
|
}
|
396
403
|
if (value === nil) {
|
397
|
-
|
404
|
+
if (exception) {
|
405
|
+
#{::Kernel.raise ::TypeError, "can't convert nil into Integer"}
|
406
|
+
} else {
|
407
|
+
return nil;
|
408
|
+
}
|
398
409
|
}
|
399
410
|
if (value.$$is_number) {
|
400
411
|
if (value === Infinity || value === -Infinity || isNaN(value)) {
|
401
|
-
|
412
|
+
if (exception) {
|
413
|
+
#{::Kernel.raise ::FloatDomainError, value}
|
414
|
+
} else {
|
415
|
+
return nil;
|
416
|
+
}
|
402
417
|
}
|
403
418
|
return Math.floor(value);
|
404
419
|
}
|
405
420
|
if (#{value.respond_to?(:to_int)}) {
|
406
421
|
i = #{value.to_int};
|
407
|
-
if (i
|
422
|
+
if (Opal.is_a(i, #{::Integer})) {
|
408
423
|
return i;
|
409
424
|
}
|
410
425
|
}
|
411
|
-
|
426
|
+
if (#{value.respond_to?(:to_i)}) {
|
427
|
+
i = #{value.to_i};
|
428
|
+
if (Opal.is_a(i, #{::Integer})) {
|
429
|
+
return i;
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
if (exception) {
|
434
|
+
#{::Kernel.raise ::TypeError, "can't convert #{value.class} into Integer"}
|
435
|
+
} else {
|
436
|
+
return nil;
|
437
|
+
}
|
412
438
|
}
|
413
439
|
|
414
440
|
if (value === "0") {
|
@@ -420,7 +446,11 @@ module ::Kernel
|
|
420
446
|
} else {
|
421
447
|
base = $coerce_to(base, #{::Integer}, 'to_int');
|
422
448
|
if (base === 1 || base < 0 || base > 36) {
|
423
|
-
|
449
|
+
if (exception) {
|
450
|
+
#{::Kernel.raise ::ArgumentError, "invalid radix #{base}"}
|
451
|
+
} else {
|
452
|
+
return nil;
|
453
|
+
}
|
424
454
|
}
|
425
455
|
}
|
426
456
|
|
@@ -456,7 +486,11 @@ module ::Kernel
|
|
456
486
|
}
|
457
487
|
// no-break
|
458
488
|
}
|
459
|
-
|
489
|
+
if (exception) {
|
490
|
+
#{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
|
491
|
+
} else {
|
492
|
+
return nil;
|
493
|
+
}
|
460
494
|
});
|
461
495
|
|
462
496
|
base = (base === 0 ? 10 : base);
|
@@ -464,25 +498,39 @@ module ::Kernel
|
|
464
498
|
base_digits = '0-' + (base <= 10 ? base - 1 : '9a-' + String.fromCharCode(97 + (base - 11)));
|
465
499
|
|
466
500
|
if (!(new RegExp('^\\s*[+-]?[' + base_digits + ']+\\s*$')).test(str)) {
|
467
|
-
|
501
|
+
if (exception) {
|
502
|
+
#{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
|
503
|
+
} else {
|
504
|
+
return nil;
|
505
|
+
}
|
468
506
|
}
|
469
507
|
|
470
508
|
i = parseInt(str, base);
|
471
509
|
|
472
510
|
if (isNaN(i)) {
|
473
|
-
|
511
|
+
if (exception) {
|
512
|
+
#{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
|
513
|
+
} else {
|
514
|
+
return nil;
|
515
|
+
}
|
474
516
|
}
|
475
517
|
|
476
518
|
return i;
|
477
519
|
}
|
478
520
|
end
|
479
521
|
|
480
|
-
def Float(value)
|
522
|
+
def Float(value, exception: true)
|
481
523
|
%x{
|
482
524
|
var str;
|
483
525
|
|
526
|
+
exception = $truthy(#{exception});
|
527
|
+
|
484
528
|
if (value === nil) {
|
485
|
-
|
529
|
+
if (exception) {
|
530
|
+
#{::Kernel.raise ::TypeError, "can't convert nil into Float"}
|
531
|
+
} else {
|
532
|
+
return nil;
|
533
|
+
}
|
486
534
|
}
|
487
535
|
|
488
536
|
if (value.$$is_string) {
|
@@ -496,13 +544,21 @@ module ::Kernel
|
|
496
544
|
}
|
497
545
|
|
498
546
|
if (!/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/.test(str)) {
|
499
|
-
|
547
|
+
if (exception) {
|
548
|
+
#{::Kernel.raise ::ArgumentError, "invalid value for Float(): \"#{value}\""}
|
549
|
+
} else {
|
550
|
+
return nil;
|
551
|
+
}
|
500
552
|
}
|
501
553
|
|
502
554
|
return parseFloat(str);
|
503
555
|
}
|
504
556
|
|
505
|
-
|
557
|
+
if (exception) {
|
558
|
+
return #{::Opal.coerce_to!(value, ::Float, :to_f)};
|
559
|
+
} else {
|
560
|
+
return $coerce_to(value, #{::Float}, 'to_f');
|
561
|
+
}
|
506
562
|
}
|
507
563
|
end
|
508
564
|
|
data/opal/corelib/main.rb
CHANGED
data/opal/corelib/math.rb
CHANGED
data/opal/corelib/method.rb
CHANGED
data/opal/corelib/module.rb
CHANGED
data/opal/corelib/nil.rb
CHANGED
data/opal/corelib/number.rb
CHANGED
data/opal/corelib/numeric.rb
CHANGED
data/opal/corelib/proc.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# helpers: slice
|
2
|
+
# backtick_javascript: true
|
2
3
|
|
3
4
|
class ::Proc < `Function`
|
4
5
|
`Opal.prop(self.$$prototype, '$$is_proc', true)`
|
@@ -12,44 +13,45 @@ class ::Proc < `Function`
|
|
12
13
|
block
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
if (
|
18
|
-
self.$$p = block;
|
19
|
-
}
|
20
|
-
|
21
|
-
var result, $brk = self.$$brk, $ret = self.$$ret;
|
22
|
-
|
23
|
-
if ($brk || ($ret && self.$$is_lambda)) {
|
16
|
+
%x{
|
17
|
+
function $call_lambda(self, args) {
|
18
|
+
if (self.$$ret) {
|
24
19
|
try {
|
25
|
-
|
26
|
-
result = self.apply(null, args);
|
27
|
-
}
|
28
|
-
else {
|
29
|
-
result = Opal.yieldX(self, args);
|
30
|
-
}
|
20
|
+
return self.apply(null, args);
|
31
21
|
} catch (err) {
|
32
|
-
if (err ===
|
33
|
-
return err.$v;
|
34
|
-
}
|
35
|
-
else if (self.$$is_lambda && err === $ret) {
|
22
|
+
if (err === self.$$ret) {
|
36
23
|
return err.$v;
|
37
|
-
}
|
38
|
-
else {
|
24
|
+
} else {
|
39
25
|
throw err;
|
40
26
|
}
|
41
27
|
}
|
28
|
+
} else {
|
29
|
+
return self.apply(null, args);
|
42
30
|
}
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
31
|
+
}
|
32
|
+
|
33
|
+
function $call_proc(self, args) {
|
34
|
+
if (self.$$brk) {
|
35
|
+
try {
|
36
|
+
return Opal.yieldX(self, args);
|
37
|
+
} catch (err) {
|
38
|
+
if (err === self.$$brk) {
|
39
|
+
return err.$v;
|
40
|
+
} else {
|
41
|
+
throw err;
|
42
|
+
}
|
49
43
|
}
|
44
|
+
} else {
|
45
|
+
return Opal.yieldX(self, args);
|
50
46
|
}
|
47
|
+
}
|
48
|
+
}
|
51
49
|
|
52
|
-
|
50
|
+
def call(*args, &block)
|
51
|
+
%x{
|
52
|
+
if (block !== nil) self.$$p = block;
|
53
|
+
if (self.$$is_lambda) return $call_lambda(self, args);
|
54
|
+
return $call_proc(self, args);
|
53
55
|
}
|
54
56
|
end
|
55
57
|
|
data/opal/corelib/process.rb
CHANGED
data/opal/corelib/random.rb
CHANGED
data/opal/corelib/range.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# backtick_javascript: true
|
2
|
+
|
1
3
|
require 'corelib/enumerable'
|
2
4
|
|
3
5
|
class ::Range
|
@@ -145,19 +147,39 @@ class ::Range
|
|
145
147
|
end
|
146
148
|
|
147
149
|
def size
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
150
|
+
%x{
|
151
|
+
var b = this.begin, e = this.end;
|
152
|
+
|
153
|
+
// If begin is Numeric
|
154
|
+
if (#{::Numeric === `b`}) {
|
155
|
+
// If end is Numeric
|
156
|
+
if (#{::Numeric === `e`}) {
|
157
|
+
// Calculating size based on whether range is exclusive or inclusive
|
158
|
+
var size = #{`e` - `b`};
|
159
|
+
if (size < 0) {
|
160
|
+
return 0;
|
161
|
+
}
|
162
|
+
if (!this.excl) {
|
163
|
+
size += 1;
|
164
|
+
}
|
165
|
+
return (#{::Float === `b`} || #{::Float === `e`}) ? Math.floor(size) : size;
|
166
|
+
}
|
167
|
+
// If end is nil
|
168
|
+
else if (e === nil) {
|
169
|
+
return Infinity;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
// If begin is nil
|
173
|
+
else if (b === nil) {
|
174
|
+
// If end is Numeric
|
175
|
+
if (#{::Numeric === `e`}) {
|
176
|
+
return Infinity;
|
177
|
+
}
|
178
|
+
}
|
159
179
|
|
160
|
-
|
180
|
+
// If neither begin nor end is Numeric
|
181
|
+
return nil;
|
182
|
+
}
|
161
183
|
end
|
162
184
|
|
163
185
|
def step(n = undefined)
|
data/opal/corelib/rational.rb
CHANGED