@@ -341,6 +341,15 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
341
341
@ sig . push ($ cps );
342
342
}
343
343
344
+ my sub set_variable ($ var , $ value ) {
345
+ if self . is_dynamic_var($ var ) {
346
+ @ setup . push (" { $ * CTX } [{ quote_string($ var . name )} ] = $ value ;\n " );
347
+ }
348
+ else {
349
+ $ * BLOCK . add_js_lexical(self . mangle_name($ var . name ));
350
+ @ setup . push (" { self . mangle_name($ var . name )} = $ value ;\n " );
351
+ }
352
+ }
344
353
345
354
my $ handled_this := 0 ;
346
355
my $ bind_named := ' ' ;
@@ -353,7 +362,6 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
353
362
else {
354
363
$ slurpy := $ _ ;
355
364
}
356
- $ * BLOCK . add_js_lexical(self . mangle_name($ _ . name ));
357
365
}
358
366
elsif $ _ . named {
359
367
my $ quoted := quote_string($ _ . named);
@@ -372,14 +380,7 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
372
380
373
381
# TODO required named arguments and defaultless optional ones
374
382
375
- if self . is_dynamic_var($ _ ) {
376
- @ setup . push (" { $ * CTX } [{ quote_string($ _ . name )} ] = $ value ;\n " );
377
- }
378
- else {
379
- $ * BLOCK . add_js_lexical(self . mangle_name($ _ . name ));
380
- @ setup . push (" { self . mangle_name($ _ . name )} = $ value ;\n " );
381
- }
382
-
383
+ set_variable($ _ , $ value );
383
384
}
384
385
elsif self . is_dynamic_var($ _ ) {
385
386
my $ tmp := self . unique_var(' param' );
@@ -430,10 +431,10 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
430
431
}
431
432
432
433
if $ slurpy {
433
- @ setup . push ( " { self . mangle_name( $ slurpy . name ) } = new nqp.NQPArray(Array.prototype.slice.call(arguments,{ + @ sig } )); \n " );
434
+ set_variable( $ slurpy , " new nqp.NQPArray(Array.prototype.slice.call(arguments,{ + @ sig } ))" );
434
435
}
435
436
if $ slurpy_named {
436
- @ setup . push ( " { self . mangle_name( $ slurpy_named . name ) } = nqp.slurpy_named(_NAMED, { known_named(@ * KNOWN_NAMED )} ); \n " );
437
+ set_variable( $ slurpy_named , " nqp.slurpy_named(_NAMED, { known_named(@ * KNOWN_NAMED )} )" );
437
438
}
438
439
439
440
Chunk. new ($ T_NONVAL , nqp :: join (' ,' , @ sig ), @ setup );
@@ -868,8 +869,8 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
868
869
869
870
if $ expected_outer . cuid ne $ * BLOCK . cuid {
870
871
@ capture_inners . push (" (function() \{\n " );
871
- @ capture_inners . push (self . import_stuff_from_setting($ * SETTING_TARGET ));
872
872
@ capture_inners . push (" var { $ expected_outer . ctx} = null;\n " );
873
+ @ capture_inners . push (self . import_stuff_from_setting($ * SETTING_TARGET ));
873
874
}
874
875
875
876
if % * BLOCKS_AS_METHOD {$ _ . key } {
@@ -892,6 +893,9 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
892
893
893
894
# Should we compile it to a form that's more efficent when used as a method
894
895
method looks_like_a_method (QAST ::Block $ block ) {
896
+ # Disable it as we currently don't make use of it at runtime
897
+ return 0 ;
898
+
895
899
if $ block . blocktype eq ' declaration_static'
896
900
&& nqp ::istype($ block [0 ], QAST ::Stmts)
897
901
&& nqp ::istype($ block [0 ][0 ], QAST ::Var)
@@ -948,10 +952,10 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
948
952
949
953
my @ function := [
950
954
" function({ $ sig . expr} ) \{\n " ,
951
- self . setup_setting($ node ),
952
955
self . declare_js_vars($ * BLOCK . tmps),
953
956
self . declare_js_vars($ * BLOCK . js_lexicals),
954
957
$ create_ctx ,
958
+ self . setup_setting($ node ),
955
959
$ sig ,
956
960
self . clone_inners($ * BLOCK ),
957
961
self . capture_inners($ * BLOCK ),
@@ -997,10 +1001,10 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
997
1001
998
1002
my @ function_cps := [
999
1003
" function({ $ sig_cps . expr} ) \{\n " ,
1000
- self . setup_setting($ node ),
1001
1004
self . declare_js_vars($ * BLOCK . tmps),
1002
1005
self . declare_js_vars($ * BLOCK . js_lexicals),
1003
1006
$ create_ctx ,
1007
+ self . setup_setting($ node ),
1004
1008
$ sig_cps ,
1005
1009
self . clone_inners($ * BLOCK ),
1006
1010
self . capture_inners($ * BLOCK ),
@@ -1114,12 +1118,18 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
1114
1118
if self . is_ctxsave($ node ) {
1115
1119
my @ lexicals ;
1116
1120
for $ * BLOCK . variables -> $ var {
1121
+ my $ value ;
1117
1122
if $ * BLOCK . lookup_static_variable($ var ) -> $ static {
1118
- @ lexicals . push (quote_string($ var . name ) ~ ' : ' ~ self . value_as_js($ static . value ));
1123
+ $ value := self . value_as_js($ static . value );
1124
+ }
1125
+ elsif self . is_dynamic_var($ var ) {
1126
+ $ value := " { $ * CTX } .lookup({ quote_string($ var . name )} )" ;
1119
1127
}
1120
1128
else {
1121
- @ lexicals . push (quote_string( $ var . name ) ~ ' : ' ~ self . mangle_name($ var . name ) );
1129
+ $ value := self . mangle_name($ var . name );
1122
1130
}
1131
+ @ lexicals . push (quote_string($ var . name ) ~ ' : ' ~ $ value );
1132
+
1123
1133
}
1124
1134
Chunk. void (" nqp.ctxsave(\{ { nqp :: join (' ,' , @ lexicals )} \} );\n " );
1125
1135
}
@@ -1477,41 +1487,54 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
1477
1487
$ T_OBJ ;
1478
1488
}
1479
1489
1480
- method compile_var (QAST ::Var $ var , : $ cps ) {
1481
- if self . var_is_lexicalish($ var ) && self . is_dynamic_var($ var ) {
1482
- if $ * BINDVAL {
1483
- my $ bindval := self . as_js_clear_bindval($ * BINDVAL , : want($ T_OBJ ), : $ cps );
1484
- if $ var . decl eq ' var' {
1485
- self . stored_result(Chunk. new ($ T_OBJ , " ({ $ * CTX } [{ quote_string($ var . name )} ] = { $ bindval . expr} )" , [$ bindval ]));
1486
- }
1487
- else {
1488
- self . stored_result(Chunk. new ($ T_OBJ , " { $ * CTX } .bind({ quote_string($ var . name )} , { $ bindval . expr} )" , [$ bindval ]));
1489
- }
1490
+ method compile_var_as_js_var (QAST ::Var $ var , : $ cps ) {
1491
+ my $ type := self . figure_out_type($ var );
1492
+ my $ mangled := self . mangle_name($ var . name );
1493
+ if $ * BINDVAL {
1494
+ # TODO better source mapping
1495
+ # TODO use the proper type
1496
+ my $ bindval := self . as_js_clear_bindval($ * BINDVAL , : want($ type ), : $ cps );
1497
+ self . cpsify_chunk(Chunk. new ($ type ,$ mangled , [$ bindval ,' (' ~ $ mangled ~ ' = (' ~ $ bindval . expr ~ " ));\n " ]));
1498
+ }
1499
+ else {
1500
+ # TODO get the proper type
1501
+ self . cpsify_chunk(Chunk. new ($ type , $ mangled , [], : node($ var )));
1502
+ }
1503
+ }
1504
+
1505
+ method compile_var_as_part_of_ctx (QAST ::Var $ var , : $ cps ) {
1506
+ if $ * BINDVAL {
1507
+ my $ bindval := self . as_js_clear_bindval($ * BINDVAL , : want($ T_OBJ ), : $ cps );
1508
+ if $ var . decl eq ' var' {
1509
+ self . stored_result(Chunk. new ($ T_OBJ , " ({ $ * CTX } [{ quote_string($ var . name )} ] = { $ bindval . expr} )" , [$ bindval ]));
1490
1510
}
1491
1511
else {
1492
- if $ var . decl eq ' var' {
1493
- self . stored_result(Chunk. new ($ T_OBJ , " ({ $ * CTX } [{ quote_string($ var . name )} ] = null)" , []));
1494
- }
1495
- else {
1496
- Chunk. new ($ T_OBJ , " { $ * CTX } .lookup({ quote_string($ var . name )} )" , [], : node($ var ));
1497
- }
1512
+ self . stored_result(Chunk. new ($ T_OBJ , " { $ * CTX } .bind({ quote_string($ var . name )} , { $ bindval . expr} )" , [$ bindval ]));
1498
1513
}
1499
1514
}
1500
- elsif $ * BLOCK . lookup_static_variable($ var ) -> $ static {
1515
+ else {
1516
+ if $ var . decl eq ' var' {
1517
+ self . stored_result(Chunk. new ($ T_OBJ , " ({ $ * CTX } [{ quote_string($ var . name )} ] = null)" , []));
1518
+ }
1519
+ else {
1520
+ Chunk. new ($ T_OBJ , " { $ * CTX } .lookup({ quote_string($ var . name )} )" , [], : node($ var ));
1521
+ }
1522
+ }
1523
+ }
1524
+
1525
+ method compile_var (QAST ::Var $ var , : $ cps ) {
1526
+ if $ * BLOCK . lookup_static_variable($ var ) -> $ static {
1501
1527
Chunk. new ($ T_OBJ , self . value_as_js($ static . value ), []);
1502
1528
}
1503
- elsif self . var_is_lexicalish($ var ) || $ var . scope eq ' local' {
1504
- my $ type := self . figure_out_type($ var );
1505
- my $ mangled := self . mangle_name($ var . name );
1506
- if $ * BINDVAL {
1507
- # TODO better source mapping
1508
- # TODO use the proper type
1509
- my $ bindval := self . as_js_clear_bindval($ * BINDVAL , : want($ type ), : $ cps );
1510
- self . cpsify_chunk(Chunk. new ($ type ,$ mangled , [$ bindval ,' (' ~ $ mangled ~ ' = (' ~ $ bindval . expr ~ " ));\n " ]));
1529
+ elsif $ var . scope eq ' local' {
1530
+ self . compile_var_as_js_var($ var , : $ cps );
1531
+ }
1532
+ elsif self . var_is_lexicalish($ var ) {
1533
+ if self . is_dynamic_var($ var ) {
1534
+ self . compile_var_as_part_of_ctx($ var , : $ cps );
1511
1535
}
1512
1536
else {
1513
- # TODO get the proper type
1514
- self . cpsify_chunk(Chunk. new ($ type , $ mangled , [], : node($ var )));
1537
+ self . compile_var_as_js_var($ var , : $ cps );
1515
1538
}
1516
1539
}
1517
1540
elsif ($ var . scope eq ' positional' ) {
0 commit comments