… | |
… | |
442 | |
442 | |
443 | while (@ops) { |
443 | while (@ops) { |
444 | $op = shift @ops; |
444 | $op = shift @ops; |
445 | $op_name = $op->name; |
445 | $op_name = $op->name; |
446 | |
446 | |
|
|
447 | my $class = B::class $op; |
|
|
448 | |
447 | $source .= "op_$$op: /* $op_name */\n"; |
449 | $source .= "op_$$op: /* $op_name */\n"; |
448 | #$source .= "fprintf (stderr, \"$$op in op $op_name\\n\");\n";#d# |
450 | #$source .= "fprintf (stderr, \"$$op in op $op_name\\n\");\n";#d# |
449 | #$source .= "{ dSP; sv_dump (TOPs); }\n";#d# |
451 | #$source .= "{ dSP; sv_dump (TOPs); }\n";#d# |
450 | |
452 | |
451 | $source .= " PERL_ASYNC_CHECK ();\n" |
453 | $source .= " PERL_ASYNC_CHECK ();\n" |
… | |
… | |
458 | } elsif (exists $f_unsafe{$op_name}) { |
460 | } elsif (exists $f_unsafe{$op_name}) { |
459 | # unsafe, return to interpreter |
461 | # unsafe, return to interpreter |
460 | assert "nextop == (OP *)$$op"; |
462 | assert "nextop == (OP *)$$op"; |
461 | $source .= " return nextop;\n"; |
463 | $source .= " return nextop;\n"; |
462 | |
464 | |
463 | } elsif ("LOGOP" eq B::class $op) { |
465 | } elsif ("LOGOP" eq $class) { |
464 | # logical operation with optionaรถ branch |
466 | # logical operation with optional branch |
465 | out_callop; |
467 | out_callop; |
466 | out_cond_jump $op->other; |
468 | out_cond_jump $op->other; |
467 | out_jump_next; |
469 | out_jump_next; |
468 | |
470 | |
469 | } elsif ("PMOP" eq B::class $op) { |
471 | } elsif ("PMOP" eq $class) { |
470 | # regex-thingy |
472 | # regex-thingy |
471 | out_callop; |
473 | out_callop; |
472 | out_cond_jump $op->pmreplroot if ${$op->pmreplroot}; |
474 | out_cond_jump $op->pmreplroot if $op_name ne "pushre" && ${$op->pmreplroot}; |
473 | out_jump_next; |
475 | out_jump_next; |
474 | |
476 | |
475 | } else { |
477 | } else { |
476 | # normal operator, linear execution |
478 | # normal operator, linear execution |
477 | out_linear; |
479 | out_linear; |