opal 0.9.0.beta2 → 0.9.0.rc1
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/.jshintrc +2 -1
- data/.travis.yml +8 -4
- data/CHANGELOG.md +270 -251
- data/CONTRIBUTING.md +41 -0
- data/README.md +8 -8
- data/Rakefile +1 -1
- data/lib/opal/cli.rb +1 -0
- data/lib/opal/cli_options.rb +2 -2
- data/lib/opal/cli_runners.rb +1 -0
- data/lib/opal/cli_runners/nashorn.rb +58 -0
- data/lib/opal/cli_runners/phantom.js +11 -9
- data/lib/opal/compiler.rb +2 -0
- data/lib/opal/erb.rb +2 -1
- data/lib/opal/nodes/def.rb +15 -6
- data/lib/opal/nodes/helpers.rb +1 -1
- data/lib/opal/nodes/literal.rb +1 -1
- data/lib/opal/nodes/masgn.rb +79 -29
- data/lib/opal/nodes/module.rb +1 -1
- data/lib/opal/nodes/top.rb +6 -2
- data/lib/opal/parser.rb +1 -0
- data/lib/opal/parser/grammar.rb +3160 -3083
- data/lib/opal/parser/grammar.y +39 -11
- data/lib/opal/parser/lexer.rb +15 -13
- data/lib/opal/parser/sexp.rb +5 -0
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +21 -6
- data/opal/corelib/basic_object.rb +17 -4
- data/opal/corelib/class.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/enumerator.rb +2 -0
- data/opal/corelib/hash.rb +50 -50
- data/opal/corelib/helpers.rb +1 -1
- data/opal/corelib/io.rb +9 -6
- data/opal/corelib/kernel.rb +37 -9
- data/opal/corelib/module.rb +6 -17
- data/opal/corelib/nil.rb +4 -0
- data/opal/corelib/number.rb +0 -4
- data/opal/corelib/runtime.js +637 -662
- data/opal/corelib/struct.rb +7 -3
- data/spec/filters/bugs/array.rb +4 -9
- data/spec/filters/bugs/basicobject.rb +1 -15
- data/spec/filters/bugs/date.rb +4 -26
- data/spec/filters/bugs/enumerable.rb +26 -1
- data/spec/filters/bugs/enumerator.rb +4 -4
- data/spec/filters/bugs/exception.rb +1 -7
- data/spec/filters/bugs/float.rb +14 -0
- data/spec/filters/bugs/hash.rb +0 -2
- data/spec/filters/bugs/integer.rb +1 -1
- data/spec/filters/bugs/kernel.rb +47 -66
- data/spec/filters/bugs/language.rb +1 -2
- data/spec/filters/bugs/module.rb +11 -14
- data/spec/filters/bugs/numeric.rb +3 -3
- data/spec/filters/bugs/proc.rb +0 -1
- data/spec/filters/bugs/range.rb +2 -3
- data/spec/filters/bugs/regexp.rb +15 -17
- data/spec/filters/bugs/set.rb +2 -2
- data/spec/filters/bugs/string.rb +29 -5
- data/spec/filters/bugs/{strscan.rb → stringscanner.rb} +9 -10
- data/spec/filters/bugs/struct.rb +0 -4
- data/spec/filters/bugs/time.rb +2 -3
- data/spec/filters/bugs/unboundmethod.rb +3 -0
- data/spec/filters/unsupported/freeze.rb +2 -1
- data/spec/filters/unsupported/taint.rb +2 -0
- data/spec/lib/parser/aref_spec.rb +10 -0
- data/spec/lib/parser/lambda_spec.rb +14 -0
- data/spec/lib/parser/op_asgn_spec.rb +17 -0
- data/spec/lib/parser/return_spec.rb +5 -0
- data/spec/lib/parser/unary_spec.rb +4 -0
- data/spec/lib/sprockets/erb_spec.rb +1 -1
- data/spec/mspec/opal/formatters.rb +159 -0
- data/{lib → spec}/mspec/opal/runner.rb +0 -160
- data/spec/opal/core/hash/internals_spec.rb +162 -162
- data/spec/opal/core/kernel/at_exit_spec.rb +70 -0
- data/spec/opal/core/kernel/extend_spec.rb +1 -1
- data/spec/opal/core/kernel/instance_variables_spec.rb +56 -0
- data/spec/opal/core/language/equal_spec.rb +8 -0
- data/spec/opal/core/language/predefined_spec.rb +1 -1
- data/spec/opal/core/language/ternary_operator_spec.rb +14 -0
- data/spec/opal/core/language/versions/{hash_1.9.rb → hash_1_9_spec.rb} +5 -0
- data/spec/opal/core/module/fixtures/classes.rb +11 -1
- data/spec/opal/core/module/method_lookup_spec.rb +13 -0
- data/spec/opal/core/runtime/super_spec.rb +10 -0
- data/spec/opal/stdlib/native/new_spec.rb +84 -0
- data/spec/opal/stdlib/strscan/scan_spec.rb +11 -0
- data/spec/rubyspecs +6 -9
- data/spec/spec_helper.rb +9 -21
- data/stdlib/date.rb +121 -1
- data/stdlib/js.rb +13 -5
- data/stdlib/json.rb +3 -3
- data/stdlib/nashorn.rb +5 -0
- data/stdlib/nashorn/file.rb +13 -0
- data/stdlib/nashorn/io.rb +2 -0
- data/stdlib/native.rb +12 -4
- data/stdlib/nodejs/io.rb +5 -2
- data/stdlib/opal/platform.rb +19 -0
- data/stdlib/phantomjs.rb +4 -0
- data/stdlib/strscan.rb +1 -1
- data/tasks/building.rake +2 -1
- data/tasks/testing.rake +29 -34
- data/tasks/testing/{phantomjs1-sprockets.js → sprockets-phantomjs.js} +2 -20
- data/vendored-minitest/minitest/test.rb +7 -15
- metadata +32 -9
- data/lib/mspec/opal/main.rb.erb +0 -9
data/lib/opal/parser/grammar.y
CHANGED
|
@@ -5,22 +5,22 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
|
5
5
|
kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
|
|
6
6
|
kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
|
|
7
7
|
kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
|
|
8
|
-
k__FILE__
|
|
8
|
+
k__FILE__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
|
|
9
9
|
tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
|
|
10
|
-
tREGEXP_END tUPLUS tUMINUS
|
|
10
|
+
tREGEXP_END tUPLUS tUMINUS tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
|
|
11
11
|
tOROP tMATCH tNMATCH tJSDOT tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
|
|
12
12
|
tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
|
|
13
|
-
|
|
13
|
+
tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
|
|
14
14
|
tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
|
|
15
15
|
tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
|
|
16
16
|
tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
|
|
17
17
|
tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG
|
|
18
|
-
tLBRACK2 tLBRACK tJSLBRACK tDSTAR
|
|
18
|
+
tLBRACK2 tLBRACK tJSLBRACK tDSTAR tLABEL_END tEQL
|
|
19
19
|
|
|
20
20
|
prechigh
|
|
21
21
|
right tBANG tTILDE tUPLUS
|
|
22
22
|
right tPOW
|
|
23
|
-
right
|
|
23
|
+
right tUMINUS
|
|
24
24
|
left tSTAR2 tDIVIDE tPERCENT
|
|
25
25
|
left tPLUS tMINUS
|
|
26
26
|
left tLSHFT tRSHFT
|
|
@@ -275,20 +275,33 @@ rule
|
|
|
275
275
|
result = val[0] << s(:splat, val[2])
|
|
276
276
|
}
|
|
277
277
|
| mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
|
|
278
|
+
{
|
|
279
|
+
result = (val[0] << s(:splat, val[2])).concat(val[4].children)
|
|
280
|
+
}
|
|
278
281
|
| mlhs_head tSTAR
|
|
279
282
|
{
|
|
280
283
|
result = val[0] << s(:splat)
|
|
281
284
|
}
|
|
282
285
|
| mlhs_head tSTAR tCOMMA mlhs_post
|
|
286
|
+
{
|
|
287
|
+
result = (val[0] << s(:splat)).concat(val[3].children)
|
|
288
|
+
}
|
|
283
289
|
| tSTAR mlhs_node
|
|
284
290
|
{
|
|
285
291
|
result = s(:array, s(:splat, val[1]))
|
|
286
292
|
}
|
|
293
|
+
| tSTAR mlhs_node tCOMMA mlhs_post
|
|
294
|
+
{
|
|
295
|
+
result = s(:array, s(:splat, val[1])).concat(val[3].children)
|
|
296
|
+
}
|
|
287
297
|
| tSTAR
|
|
288
298
|
{
|
|
289
299
|
result = s(:array, s(:splat))
|
|
290
300
|
}
|
|
291
301
|
| tSTAR tCOMMA mlhs_post
|
|
302
|
+
{
|
|
303
|
+
result = s(:array, s(:splat)).concat(val[2].children)
|
|
304
|
+
}
|
|
292
305
|
|
|
293
306
|
mlhs_item: mlhs_node
|
|
294
307
|
{
|
|
@@ -309,7 +322,13 @@ rule
|
|
|
309
322
|
}
|
|
310
323
|
|
|
311
324
|
mlhs_post: mlhs_item
|
|
325
|
+
{
|
|
326
|
+
result = s(:array, val[0])
|
|
327
|
+
}
|
|
312
328
|
| mlhs_post tCOMMA mlhs_item
|
|
329
|
+
{
|
|
330
|
+
result = val[0] << val[2]
|
|
331
|
+
}
|
|
313
332
|
|
|
314
333
|
mlhs_node: variable
|
|
315
334
|
{
|
|
@@ -590,9 +609,9 @@ rule
|
|
|
590
609
|
{
|
|
591
610
|
result = s(:defined, val[2])
|
|
592
611
|
}
|
|
593
|
-
| arg tEH arg tCOLON arg
|
|
612
|
+
| arg tEH { lexer.cond_push 1 } arg tCOLON { lexer.cond_pop } arg
|
|
594
613
|
{
|
|
595
|
-
result = new_if(val[1], val[0], val[
|
|
614
|
+
result = new_if(val[1], val[0], val[3], val[6])
|
|
596
615
|
}
|
|
597
616
|
| primary
|
|
598
617
|
|
|
@@ -619,6 +638,11 @@ rule
|
|
|
619
638
|
{
|
|
620
639
|
result = [s(:hash, *val[0])]
|
|
621
640
|
}
|
|
641
|
+
| args tCOMMA block_arg
|
|
642
|
+
{
|
|
643
|
+
result = val[0] << val[2]
|
|
644
|
+
}
|
|
645
|
+
|
|
622
646
|
|
|
623
647
|
paren_args: tLPAREN2 opt_call_args rparen
|
|
624
648
|
{
|
|
@@ -1397,19 +1421,19 @@ xstring_contents: none
|
|
|
1397
1421
|
{
|
|
1398
1422
|
result = new_float(val[0])
|
|
1399
1423
|
}
|
|
1400
|
-
| '-@NUM' tINTEGER =
|
|
1424
|
+
| '-@NUM' tINTEGER =tUMINUS
|
|
1401
1425
|
{
|
|
1402
1426
|
result = negate_num(new_int(val[1]))
|
|
1403
1427
|
}
|
|
1404
|
-
| '-@NUM' tFLOAT =
|
|
1428
|
+
| '-@NUM' tFLOAT =tUMINUS
|
|
1405
1429
|
{
|
|
1406
1430
|
result = negate_num(new_float(val[1]))
|
|
1407
1431
|
}
|
|
1408
|
-
| '+@NUM' tINTEGER
|
|
1432
|
+
| '+@NUM' tINTEGER
|
|
1409
1433
|
{
|
|
1410
1434
|
result = new_int(val[1])
|
|
1411
1435
|
}
|
|
1412
|
-
| '+@NUM' tFLOAT
|
|
1436
|
+
| '+@NUM' tFLOAT
|
|
1413
1437
|
{
|
|
1414
1438
|
result = new_float(val[1])
|
|
1415
1439
|
}
|
|
@@ -1745,6 +1769,10 @@ xstring_contents: none
|
|
|
1745
1769
|
{
|
|
1746
1770
|
result = [new_sym(val[0]), val[1]]
|
|
1747
1771
|
}
|
|
1772
|
+
| tSTRING_BEG string_contents tLABEL_END arg_value
|
|
1773
|
+
{
|
|
1774
|
+
result = [s(:sym, source(val[1]).to_sym), val[3]]
|
|
1775
|
+
}
|
|
1748
1776
|
|
|
1749
1777
|
operation: tIDENTIFIER
|
|
1750
1778
|
| tCONSTANT
|
data/lib/opal/parser/lexer.rb
CHANGED
|
@@ -206,6 +206,7 @@ module Opal
|
|
|
206
206
|
|
|
207
207
|
def new_op_asgn(value)
|
|
208
208
|
self.yylval = value
|
|
209
|
+
@lex_state = :expr_beg
|
|
209
210
|
:tOP_ASGN
|
|
210
211
|
end
|
|
211
212
|
|
|
@@ -360,7 +361,7 @@ module Opal
|
|
|
360
361
|
self.yylval = scan(/\w+/)
|
|
361
362
|
return :tREGEXP_END
|
|
362
363
|
end
|
|
363
|
-
return :tSTRING_END
|
|
364
|
+
return !cond? && scan(/:[^:]/) ? :tLABEL_END : :tSTRING_END
|
|
364
365
|
else
|
|
365
366
|
str_buffer << scanner.matched
|
|
366
367
|
str_parse[:nesting] -= 1
|
|
@@ -376,7 +377,7 @@ module Opal
|
|
|
376
377
|
@scanner = str_parse[:scanner]
|
|
377
378
|
end
|
|
378
379
|
|
|
379
|
-
return :tSTRING_END
|
|
380
|
+
return !cond? && scan(/:[^:]/) ? :tLABEL_END : :tSTRING_END
|
|
380
381
|
end
|
|
381
382
|
end
|
|
382
383
|
|
|
@@ -645,7 +646,7 @@ module Opal
|
|
|
645
646
|
token = parse_string
|
|
646
647
|
end
|
|
647
648
|
|
|
648
|
-
if token == :tSTRING_END or token == :tREGEXP_END
|
|
649
|
+
if token == :tSTRING_END or token == :tREGEXP_END or token == :tLABEL_END
|
|
649
650
|
self.strterm = nil
|
|
650
651
|
@lex_state = :expr_end
|
|
651
652
|
end
|
|
@@ -692,13 +693,11 @@ module Opal
|
|
|
692
693
|
|
|
693
694
|
elsif check(/\*/)
|
|
694
695
|
if scan(/\*\*\=/)
|
|
695
|
-
@lex_state = :expr_beg
|
|
696
696
|
return new_op_asgn('**')
|
|
697
697
|
elsif scan(/\*\*/)
|
|
698
698
|
self.set_arg_state
|
|
699
699
|
return :tPOW
|
|
700
700
|
elsif scan(/\*\=/)
|
|
701
|
-
@lex_state = :expr_beg
|
|
702
701
|
return new_op_asgn('*')
|
|
703
702
|
else
|
|
704
703
|
scan(/\*/)
|
|
@@ -803,7 +802,6 @@ module Opal
|
|
|
803
802
|
return :tANDOP
|
|
804
803
|
|
|
805
804
|
elsif scan(/\=/)
|
|
806
|
-
@lex_state = :expr_beg
|
|
807
805
|
return new_op_asgn('&')
|
|
808
806
|
end
|
|
809
807
|
|
|
@@ -823,6 +821,7 @@ module Opal
|
|
|
823
821
|
elsif scan(/\|/)
|
|
824
822
|
if scan(/\|/)
|
|
825
823
|
@lex_state = :expr_beg
|
|
824
|
+
|
|
826
825
|
if scan(/\=/)
|
|
827
826
|
return new_op_asgn('||')
|
|
828
827
|
end
|
|
@@ -875,7 +874,6 @@ module Opal
|
|
|
875
874
|
self.strterm = new_strterm(STR_REGEXP, '/', '/')
|
|
876
875
|
return :tREGEXP_BEG
|
|
877
876
|
elsif scan(/\=/)
|
|
878
|
-
@lex_state = :expr_beg
|
|
879
877
|
return new_op_asgn('/')
|
|
880
878
|
end
|
|
881
879
|
|
|
@@ -896,10 +894,11 @@ module Opal
|
|
|
896
894
|
|
|
897
895
|
elsif scan(/\%/)
|
|
898
896
|
if scan(/\=/)
|
|
899
|
-
@lex_state = :expr_beg
|
|
900
897
|
return new_op_asgn('%')
|
|
901
898
|
elsif check(/[^\s]/)
|
|
902
|
-
if @lex_state == :expr_beg or
|
|
899
|
+
if @lex_state == :expr_beg or
|
|
900
|
+
(@lex_state == :expr_arg && @space_seen) or
|
|
901
|
+
@lex_state == :expr_mid
|
|
903
902
|
start_word = scan(/./)
|
|
904
903
|
end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
|
|
905
904
|
self.strterm = new_strterm2(STR_DQUOTE, end_word, start_word)
|
|
@@ -1034,7 +1033,6 @@ module Opal
|
|
|
1034
1033
|
return :tSYMBEG
|
|
1035
1034
|
|
|
1036
1035
|
elsif scan(/\^\=/)
|
|
1037
|
-
@lex_state = :expr_beg
|
|
1038
1036
|
return new_op_asgn('^')
|
|
1039
1037
|
|
|
1040
1038
|
elsif scan(/\^/)
|
|
@@ -1043,7 +1041,6 @@ module Opal
|
|
|
1043
1041
|
|
|
1044
1042
|
elsif check(/</)
|
|
1045
1043
|
if scan(/<<\=/)
|
|
1046
|
-
@lex_state = :expr_beg
|
|
1047
1044
|
return new_op_asgn('<<')
|
|
1048
1045
|
|
|
1049
1046
|
elsif scan(/<</)
|
|
@@ -1132,14 +1129,17 @@ module Opal
|
|
|
1132
1129
|
end
|
|
1133
1130
|
|
|
1134
1131
|
if scan(/\=/)
|
|
1135
|
-
@lex_state = :expr_beg
|
|
1136
1132
|
return new_op_asgn(matched)
|
|
1137
1133
|
end
|
|
1138
1134
|
|
|
1139
1135
|
if spcarg?
|
|
1140
1136
|
@lex_state = :expr_mid
|
|
1141
1137
|
self.yylval = matched
|
|
1142
|
-
|
|
1138
|
+
if scanner.peek(1) =~ /\d/ and
|
|
1139
|
+
return utype == :tUMINUS ? '-@NUM' : '+@NUM'
|
|
1140
|
+
else
|
|
1141
|
+
return utype
|
|
1142
|
+
end
|
|
1143
1143
|
end
|
|
1144
1144
|
|
|
1145
1145
|
@lex_state = :expr_beg
|
|
@@ -1209,6 +1209,8 @@ module Opal
|
|
|
1209
1209
|
if @start_of_lambda
|
|
1210
1210
|
@start_of_lambda = false
|
|
1211
1211
|
@lex_state = :expr_beg
|
|
1212
|
+
cond_push 0
|
|
1213
|
+
cmdarg_push 0
|
|
1212
1214
|
return :tLAMBEG
|
|
1213
1215
|
|
|
1214
1216
|
elsif arg? or @lex_state == :expr_end
|
data/lib/opal/parser/sexp.rb
CHANGED
data/lib/opal/version.rb
CHANGED
data/opal/corelib/array.rb
CHANGED
|
@@ -220,6 +220,9 @@ class Array < `Array`
|
|
|
220
220
|
function _eqeq(array, other) {
|
|
221
221
|
var i, length, a, b;
|
|
222
222
|
|
|
223
|
+
if (array === other)
|
|
224
|
+
return true;
|
|
225
|
+
|
|
223
226
|
if (!other.$$is_array) {
|
|
224
227
|
if (#{Opal.respond_to? `other`, :to_ary}) {
|
|
225
228
|
return #{`other` == `array`};
|
|
@@ -228,7 +231,10 @@ class Array < `Array`
|
|
|
228
231
|
}
|
|
229
232
|
}
|
|
230
233
|
|
|
231
|
-
|
|
234
|
+
if (array.constructor !== Array)
|
|
235
|
+
array = array.literal;
|
|
236
|
+
if (other.constructor !== Array)
|
|
237
|
+
other = other.literal;
|
|
232
238
|
|
|
233
239
|
if (array.length !== other.length) {
|
|
234
240
|
return false;
|
|
@@ -2099,12 +2105,21 @@ class Array < `Array`
|
|
|
2099
2105
|
|
|
2100
2106
|
for (j = 0, jj = others.length; j < jj; j++) {
|
|
2101
2107
|
o = others[j];
|
|
2102
|
-
if (
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
)
|
|
2108
|
+
if (o.$$is_array) {
|
|
2109
|
+
continue;
|
|
2110
|
+
}
|
|
2111
|
+
if (o.$$is_enumerator) {
|
|
2112
|
+
if (o.$size() === Infinity) {
|
|
2113
|
+
others[j] = o.$take(size);
|
|
2114
|
+
} else {
|
|
2115
|
+
others[j] = o.$to_a();
|
|
2116
|
+
}
|
|
2117
|
+
continue;
|
|
2107
2118
|
}
|
|
2119
|
+
others[j] = #{(
|
|
2120
|
+
Opal.coerce_to?(`o`, Array, :to_ary) ||
|
|
2121
|
+
Opal.coerce_to!(`o`, Enumerator, :each)
|
|
2122
|
+
).to_a};
|
|
2108
2123
|
}
|
|
2109
2124
|
|
|
2110
2125
|
for (i = 0; i < size; i++) {
|
|
@@ -10,6 +10,8 @@ class BasicObject
|
|
|
10
10
|
self == other
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
alias equal? ==
|
|
14
|
+
|
|
13
15
|
def __id__
|
|
14
16
|
`self.$$id || (self.$$id = Opal.uid())`
|
|
15
17
|
end
|
|
@@ -44,8 +46,18 @@ class BasicObject
|
|
|
44
46
|
|
|
45
47
|
alias equal? ==
|
|
46
48
|
|
|
47
|
-
def instance_eval(&block)
|
|
48
|
-
|
|
49
|
+
def instance_eval(*args, &block)
|
|
50
|
+
if block.nil? && `!!Opal.compile`
|
|
51
|
+
Kernel.raise ArgumentError, "wrong number of arguments (0 for 1..3)" unless (1..3).cover? args.size
|
|
52
|
+
|
|
53
|
+
string, file, _lineno = *args
|
|
54
|
+
compiled = Opal.compile string, file: (file || '(eval)'), eval: true
|
|
55
|
+
wrapper = `function() {return eval(compiled)}`
|
|
56
|
+
|
|
57
|
+
block = Kernel.lambda { `wrapper.call(#{self})` }
|
|
58
|
+
elsif args.size > 0
|
|
59
|
+
Kernel.raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
|
|
60
|
+
end
|
|
49
61
|
|
|
50
62
|
%x{
|
|
51
63
|
var old = block.$$s,
|
|
@@ -53,8 +65,9 @@ class BasicObject
|
|
|
53
65
|
|
|
54
66
|
block.$$s = null;
|
|
55
67
|
|
|
56
|
-
//
|
|
57
|
-
//
|
|
68
|
+
// Need to pass $$eval so that method definitions know if this is
|
|
69
|
+
// being done on a class/module. Cannot be compiler driven since
|
|
70
|
+
// send(:instance_eval) needs to work.
|
|
58
71
|
if (self.$$is_class || self.$$is_module) {
|
|
59
72
|
self.$$eval = true;
|
|
60
73
|
try {
|
data/opal/corelib/class.rb
CHANGED
data/opal/corelib/constants.rb
CHANGED
data/opal/corelib/enumerator.rb
CHANGED
data/opal/corelib/hash.rb
CHANGED
|
@@ -93,16 +93,16 @@ class Hash
|
|
|
93
93
|
return false;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
if (self
|
|
96
|
+
if (self.$$keys.length !== other.$$keys.length) {
|
|
97
97
|
return false;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
for (var i = 0, keys = self
|
|
100
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, other_value; i < length; i++) {
|
|
101
101
|
key = keys[i];
|
|
102
102
|
|
|
103
103
|
if (key.$$is_string) {
|
|
104
|
-
value = self
|
|
105
|
-
other_value = other
|
|
104
|
+
value = self.$$smap[key];
|
|
105
|
+
other_value = other.$$smap[key];
|
|
106
106
|
} else {
|
|
107
107
|
value = key.value;
|
|
108
108
|
other_value = Opal.hash_get(other, key.key);
|
|
@@ -138,12 +138,12 @@ class Hash
|
|
|
138
138
|
|
|
139
139
|
def assoc(object)
|
|
140
140
|
%x{
|
|
141
|
-
for (var i = 0, keys = self
|
|
141
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
142
142
|
key = keys[i];
|
|
143
143
|
|
|
144
144
|
if (key.$$is_string) {
|
|
145
145
|
if (#{`key` == object}) {
|
|
146
|
-
return [key, self
|
|
146
|
+
return [key, self.$$smap[key]];
|
|
147
147
|
}
|
|
148
148
|
} else {
|
|
149
149
|
if (#{`key.key` == object}) {
|
|
@@ -233,11 +233,11 @@ class Hash
|
|
|
233
233
|
return enum_for(:delete_if){self.size} unless block
|
|
234
234
|
|
|
235
235
|
%x{
|
|
236
|
-
for (var i = 0, keys = self
|
|
236
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
237
237
|
key = keys[i];
|
|
238
238
|
|
|
239
239
|
if (key.$$is_string) {
|
|
240
|
-
value = self
|
|
240
|
+
value = self.$$smap[key];
|
|
241
241
|
} else {
|
|
242
242
|
value = key.value;
|
|
243
243
|
key = key.key;
|
|
@@ -267,11 +267,11 @@ class Hash
|
|
|
267
267
|
return enum_for(:each){self.size} unless block
|
|
268
268
|
|
|
269
269
|
%x{
|
|
270
|
-
for (var i = 0, keys = self
|
|
270
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
271
271
|
key = keys[i];
|
|
272
272
|
|
|
273
273
|
if (key.$$is_string) {
|
|
274
|
-
value = self
|
|
274
|
+
value = self.$$smap[key];
|
|
275
275
|
} else {
|
|
276
276
|
value = key.value;
|
|
277
277
|
key = key.key;
|
|
@@ -292,7 +292,7 @@ class Hash
|
|
|
292
292
|
return enum_for(:each_key){self.size} unless block
|
|
293
293
|
|
|
294
294
|
%x{
|
|
295
|
-
for (var i = 0, keys = self
|
|
295
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
296
296
|
key = keys[i];
|
|
297
297
|
|
|
298
298
|
if (block(key.$$is_string ? key : key.key) === $breaker) {
|
|
@@ -310,10 +310,10 @@ class Hash
|
|
|
310
310
|
return enum_for(:each_value){self.size} unless block
|
|
311
311
|
|
|
312
312
|
%x{
|
|
313
|
-
for (var i = 0, keys = self
|
|
313
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
314
314
|
key = keys[i];
|
|
315
315
|
|
|
316
|
-
if (block(key.$$is_string ? self
|
|
316
|
+
if (block(key.$$is_string ? self.$$smap[key] : key.value) === $breaker) {
|
|
317
317
|
return $breaker.$v;
|
|
318
318
|
}
|
|
319
319
|
}
|
|
@@ -323,7 +323,7 @@ class Hash
|
|
|
323
323
|
end
|
|
324
324
|
|
|
325
325
|
def empty?
|
|
326
|
-
`self
|
|
326
|
+
`self.$$keys.length === 0`
|
|
327
327
|
end
|
|
328
328
|
|
|
329
329
|
alias eql? ==
|
|
@@ -360,11 +360,11 @@ class Hash
|
|
|
360
360
|
%x{
|
|
361
361
|
var result = [];
|
|
362
362
|
|
|
363
|
-
for (var i = 0, keys = self
|
|
363
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
364
364
|
key = keys[i];
|
|
365
365
|
|
|
366
366
|
if (key.$$is_string) {
|
|
367
|
-
value = self
|
|
367
|
+
value = self.$$smap[key];
|
|
368
368
|
} else {
|
|
369
369
|
value = key.value;
|
|
370
370
|
key = key.key;
|
|
@@ -395,10 +395,10 @@ class Hash
|
|
|
395
395
|
|
|
396
396
|
def has_value?(value)
|
|
397
397
|
%x{
|
|
398
|
-
for (var i = 0, keys = self
|
|
398
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
399
399
|
key = keys[i];
|
|
400
400
|
|
|
401
|
-
if (#{`(key.$$is_string ? self
|
|
401
|
+
if (#{`(key.$$is_string ? self.$$smap[key] : key.value)` == value}) {
|
|
402
402
|
return true;
|
|
403
403
|
}
|
|
404
404
|
}
|
|
@@ -434,11 +434,11 @@ class Hash
|
|
|
434
434
|
|
|
435
435
|
Opal.hash_ids[hash_id] = self;
|
|
436
436
|
|
|
437
|
-
for (var i = 0, keys = self
|
|
437
|
+
for (var i = 0, keys = self.$$keys, length = keys.length; i < length; i++) {
|
|
438
438
|
key = keys[i];
|
|
439
439
|
|
|
440
440
|
if (key.$$is_string) {
|
|
441
|
-
result.push([key, self
|
|
441
|
+
result.push([key, self.$$smap[key].$hash()]);
|
|
442
442
|
} else {
|
|
443
443
|
result.push([key.key_hash, key.value.$hash()]);
|
|
444
444
|
}
|
|
@@ -458,11 +458,11 @@ class Hash
|
|
|
458
458
|
|
|
459
459
|
def index(object)
|
|
460
460
|
%x{
|
|
461
|
-
for (var i = 0, keys = self
|
|
461
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
462
462
|
key = keys[i];
|
|
463
463
|
|
|
464
464
|
if (key.$$is_string) {
|
|
465
|
-
value = self
|
|
465
|
+
value = self.$$smap[key];
|
|
466
466
|
} else {
|
|
467
467
|
value = key.value;
|
|
468
468
|
key = key.key;
|
|
@@ -518,11 +518,11 @@ class Hash
|
|
|
518
518
|
|
|
519
519
|
inspect_ids[hash_id] = true;
|
|
520
520
|
|
|
521
|
-
for (var i = 0, keys = self
|
|
521
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
522
522
|
key = keys[i];
|
|
523
523
|
|
|
524
524
|
if (key.$$is_string) {
|
|
525
|
-
value = self
|
|
525
|
+
value = self.$$smap[key];
|
|
526
526
|
} else {
|
|
527
527
|
value = key.value;
|
|
528
528
|
key = key.key;
|
|
@@ -545,11 +545,11 @@ class Hash
|
|
|
545
545
|
%x{
|
|
546
546
|
var hash = Opal.hash();
|
|
547
547
|
|
|
548
|
-
for (var i = 0, keys = self
|
|
548
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
549
549
|
key = keys[i];
|
|
550
550
|
|
|
551
551
|
if (key.$$is_string) {
|
|
552
|
-
value = self
|
|
552
|
+
value = self.$$smap[key];
|
|
553
553
|
} else {
|
|
554
554
|
value = key.value;
|
|
555
555
|
key = key.key;
|
|
@@ -566,11 +566,11 @@ class Hash
|
|
|
566
566
|
return enum_for(:keep_if){self.size} unless block
|
|
567
567
|
|
|
568
568
|
%x{
|
|
569
|
-
for (var i = 0, keys = self
|
|
569
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
570
570
|
key = keys[i];
|
|
571
571
|
|
|
572
572
|
if (key.$$is_string) {
|
|
573
|
-
value = self
|
|
573
|
+
value = self.$$smap[key];
|
|
574
574
|
} else {
|
|
575
575
|
value = key.value;
|
|
576
576
|
key = key.key;
|
|
@@ -602,7 +602,7 @@ class Hash
|
|
|
602
602
|
%x{
|
|
603
603
|
var result = [];
|
|
604
604
|
|
|
605
|
-
for (var i = 0, keys = self
|
|
605
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
606
606
|
key = keys[i];
|
|
607
607
|
|
|
608
608
|
if (key.$$is_string) {
|
|
@@ -617,7 +617,7 @@ class Hash
|
|
|
617
617
|
end
|
|
618
618
|
|
|
619
619
|
def length
|
|
620
|
-
`self
|
|
620
|
+
`self.$$keys.length`
|
|
621
621
|
end
|
|
622
622
|
|
|
623
623
|
alias member? has_key?
|
|
@@ -632,14 +632,14 @@ class Hash
|
|
|
632
632
|
other = #{Opal.coerce_to!(other, Hash, :to_hash)};
|
|
633
633
|
}
|
|
634
634
|
|
|
635
|
-
var i, other_keys = other
|
|
635
|
+
var i, other_keys = other.$$keys, length = other_keys.length, key, value, other_value;
|
|
636
636
|
|
|
637
637
|
if (block === nil) {
|
|
638
638
|
for (i = 0; i < length; i++) {
|
|
639
639
|
key = other_keys[i];
|
|
640
640
|
|
|
641
641
|
if (key.$$is_string) {
|
|
642
|
-
other_value = other
|
|
642
|
+
other_value = other.$$smap[key];
|
|
643
643
|
} else {
|
|
644
644
|
other_value = key.value;
|
|
645
645
|
key = key.key;
|
|
@@ -655,7 +655,7 @@ class Hash
|
|
|
655
655
|
key = other_keys[i];
|
|
656
656
|
|
|
657
657
|
if (key.$$is_string) {
|
|
658
|
-
other_value = other
|
|
658
|
+
other_value = other.$$smap[key];
|
|
659
659
|
} else {
|
|
660
660
|
other_value = key.value;
|
|
661
661
|
key = key.key;
|
|
@@ -677,11 +677,11 @@ class Hash
|
|
|
677
677
|
|
|
678
678
|
def rassoc(object)
|
|
679
679
|
%x{
|
|
680
|
-
for (var i = 0, keys = self
|
|
680
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
681
681
|
key = keys[i];
|
|
682
682
|
|
|
683
683
|
if (key.$$is_string) {
|
|
684
|
-
value = self
|
|
684
|
+
value = self.$$smap[key];
|
|
685
685
|
} else {
|
|
686
686
|
value = key.value;
|
|
687
687
|
key = key.key;
|
|
@@ -709,11 +709,11 @@ class Hash
|
|
|
709
709
|
%x{
|
|
710
710
|
var hash = Opal.hash();
|
|
711
711
|
|
|
712
|
-
for (var i = 0, keys = self
|
|
712
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
713
713
|
key = keys[i];
|
|
714
714
|
|
|
715
715
|
if (key.$$is_string) {
|
|
716
|
-
value = self
|
|
716
|
+
value = self.$$smap[key];
|
|
717
717
|
} else {
|
|
718
718
|
value = key.value;
|
|
719
719
|
key = key.key;
|
|
@@ -740,11 +740,11 @@ class Hash
|
|
|
740
740
|
%x{
|
|
741
741
|
var changes_were_made = false;
|
|
742
742
|
|
|
743
|
-
for (var i = 0, keys = self
|
|
743
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
744
744
|
key = keys[i];
|
|
745
745
|
|
|
746
746
|
if (key.$$is_string) {
|
|
747
|
-
value = self
|
|
747
|
+
value = self.$$smap[key];
|
|
748
748
|
} else {
|
|
749
749
|
value = key.value;
|
|
750
750
|
key = key.key;
|
|
@@ -775,11 +775,11 @@ class Hash
|
|
|
775
775
|
%x{
|
|
776
776
|
Opal.hash_init(self);
|
|
777
777
|
|
|
778
|
-
for (var i = 0, other_keys = other
|
|
778
|
+
for (var i = 0, other_keys = other.$$keys, length = other_keys.length, key, value, other_value; i < length; i++) {
|
|
779
779
|
key = other_keys[i];
|
|
780
780
|
|
|
781
781
|
if (key.$$is_string) {
|
|
782
|
-
other_value = other
|
|
782
|
+
other_value = other.$$smap[key];
|
|
783
783
|
} else {
|
|
784
784
|
other_value = key.value;
|
|
785
785
|
key = key.key;
|
|
@@ -804,11 +804,11 @@ class Hash
|
|
|
804
804
|
%x{
|
|
805
805
|
var hash = Opal.hash();
|
|
806
806
|
|
|
807
|
-
for (var i = 0, keys = self
|
|
807
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
808
808
|
key = keys[i];
|
|
809
809
|
|
|
810
810
|
if (key.$$is_string) {
|
|
811
|
-
value = self
|
|
811
|
+
value = self.$$smap[key];
|
|
812
812
|
} else {
|
|
813
813
|
value = key.value;
|
|
814
814
|
key = key.key;
|
|
@@ -835,11 +835,11 @@ class Hash
|
|
|
835
835
|
%x{
|
|
836
836
|
var result = nil;
|
|
837
837
|
|
|
838
|
-
for (var i = 0, keys = self
|
|
838
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
|
|
839
839
|
key = keys[i];
|
|
840
840
|
|
|
841
841
|
if (key.$$is_string) {
|
|
842
|
-
value = self
|
|
842
|
+
value = self.$$smap[key];
|
|
843
843
|
} else {
|
|
844
844
|
value = key.value;
|
|
845
845
|
key = key.key;
|
|
@@ -866,7 +866,7 @@ class Hash
|
|
|
866
866
|
|
|
867
867
|
def shift
|
|
868
868
|
%x{
|
|
869
|
-
var keys = self
|
|
869
|
+
var keys = self.$$keys,
|
|
870
870
|
key;
|
|
871
871
|
|
|
872
872
|
if (keys.length > 0) {
|
|
@@ -889,11 +889,11 @@ class Hash
|
|
|
889
889
|
%x{
|
|
890
890
|
var result = [];
|
|
891
891
|
|
|
892
|
-
for (var i = 0, keys = self
|
|
892
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
|
|
893
893
|
key = keys[i];
|
|
894
894
|
|
|
895
895
|
if (key.$$is_string) {
|
|
896
|
-
value = self
|
|
896
|
+
value = self.$$smap[key];
|
|
897
897
|
} else {
|
|
898
898
|
value = key.value;
|
|
899
899
|
key = key.key;
|
|
@@ -937,11 +937,11 @@ class Hash
|
|
|
937
937
|
%x{
|
|
938
938
|
var result = [];
|
|
939
939
|
|
|
940
|
-
for (var i = 0, keys = self
|
|
940
|
+
for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
|
|
941
941
|
key = keys[i];
|
|
942
942
|
|
|
943
943
|
if (key.$$is_string) {
|
|
944
|
-
result.push(self
|
|
944
|
+
result.push(self.$$smap[key]);
|
|
945
945
|
} else {
|
|
946
946
|
result.push(key.value);
|
|
947
947
|
}
|