@@ -458,36 +458,57 @@ class NQP::World is HLL::World {
458
458
QAST ::Stmts. new (),
459
459
$ past
460
460
);
461
+
462
+ $ past <DYN_COMP_WRAPPER > := 1 ;
461
463
my % seen ;
464
+ my $ mu := try { self . find_symbol([' NQPMu' ]) };
462
465
my $ i := + @ ! BLOCKS ;
463
466
while $ i > 0 {
464
467
$ i := $ i - 1 ;
465
468
my % symbols := @ ! BLOCKS [$ i ]. symtable();
466
469
for % symbols {
467
- if ! % seen {$ _ . key } && nqp ::existskey($ _ . value , ' value' ) {
470
+ unless % seen {$ _ . key } {
471
+ # Add symbol.
472
+ my % sym := $ _ . value ;
473
+ my $ value := nqp ::existskey(% sym , ' value' ) ?? % sym <value > !! $ mu ;
468
474
try {
469
- $ wrapper [0 ]. push (QAST ::Op. new (
470
- : op(' bind' ),
471
- QAST ::Var. new ( : name($ _ . key ), : scope(' lexical' ), : isdecl(' var' ) ),
472
- QAST ::WVal. new ( : value(($ _ . value )<value >) )
475
+ if nqp ::isnull(nqp ::getobjsc($ value )) {
476
+ self . add_object($ value );
477
+ }
478
+ CATCH {
479
+ $ value := $ mu ;
480
+ }
481
+ }
482
+ if ! nqp ::isnull($ value ) {
483
+ $ wrapper [0 ]. push (QAST ::Var. new (
484
+ : name($ _ . key ), : scope(' lexical' ),
485
+ : decl(' static' ),
486
+ : value($ value ),
473
487
));
474
- };
475
- % seen {$ _ . key } := 1 ;
488
+ }
489
+ $ wrapper . symbol($ _ . key , : scope(' lexical' ));
490
+
476
491
}
492
+ % seen {$ _ . key } := 1 ;
477
493
}
478
494
}
479
-
495
+
480
496
# Compile and run it.
481
497
my $ code := self . create_code($ wrapper , ' BEGIN block' , 0 );
482
498
my $ old_global := nqp ::getcurhllsym(' GLOBAL' );
483
- nqp ::bindcurhllsym(' GLOBAL' , $ * GLOBALish );
484
- $ code ();
499
+ nqp ::bindcurhllsym(' GLOBAL' , $ * GLOBALish ); # cargo culted
500
+ my $ r := $ code ();
485
501
nqp ::bindcurhllsym(' GLOBAL' , $ old_global );
486
502
487
- # Need any nested blocks inside the BEGIN block to make it into the
488
- # output code.
489
- $ wrapper . shift ();
490
- return $ wrapper ;
503
+
504
+ if nqp ::isint($ r ) {
505
+ QAST ::IVal. new (: value($ r ));
506
+ } elsif nqp ::isstr($ r ) {
507
+ QAST ::SVal. new (: value($ r ));
508
+ } else {
509
+ self . add_object($ r );
510
+ QAST ::WVal. new (: value($ r ))
511
+ }
491
512
}
492
513
493
514
# Adds libraries that NQP code depends on.
0 commit comments