Changeset 14415 for dan

Show
Ignore:
Timestamp:
06/22/08 17:05:21 (5 months ago)
Author:
yappo
Message:

組み込み関数の print を実行フェーズ中なのに動的に挙動を変えちゃう

Location:
dan/perl/PL_check/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • dan/perl/PL_check/trunk/hack.xs

    r14414 r14415  
    66 
    77#include "ppport.h" 
     8 
     9OP * next_hack(pTHX) { 
     10    PerlIO_printf(PerlIO_stderr(), "-- next_hack\n"); 
     11    return PL_ppaddr[PL_op->op_type](aTHXR);// 今現在のオペコードのデフォルト実行関数を使うよ 
     12} 
     13 
     14OP * print_hack_ppaddr(pTHX) { 
     15    OP *next_op = PL_op; 
     16    PerlIO_printf(PerlIO_stderr(), "print_hack_ppaddr\n"); 
     17 
     18    while ((next_op = next_op->op_next) != NULL) { 
     19        if (next_op->op_type == OP_PRINT) { 
     20            // 次のOP_PRINTの実行フェーズでhook仕掛ける 
     21            next_op->op_ppaddr = next_hack; 
     22            break; 
     23        } 
     24    } 
     25 
     26    return PL_ppaddr[OP_PRINT](aTHXR); 
     27} 
    828 
    929OP * next_hack_ppaddr(pTHX) { 
     
    2141static OP *(*hack_old_method)(pTHX_ OP *op) = NULL; 
    2242static OP *(*hack_old_method_named)(pTHX_ OP *op) = NULL; 
     43static OP *(*hack_old_print)(pTHX_ OP *op) = NULL; 
    2344 
    2445OP * hack_enterloop(pTHX_ OP *o) { 
     
    3960OP * hack_next(pTHX_ OP *o) { 
    4061   PerlIO_printf(PerlIO_stderr(), "hack_next\n"); 
    41    o->op_ppaddr = next_hack_ppaddr; 
     62   o->op_ppaddr = next_hack_ppaddr;// next 組み込み関数の挙動を変える 
    4263   return CALL_FPTR(hack_old_next)(aTHX_ o); 
    4364} 
     
    6182   PerlIO_printf(PerlIO_stderr(), "hack_method_named\n"); 
    6283   return CALL_FPTR(hack_old_method_named)(aTHX_ o); 
     84} 
     85 
     86OP * hack_print(pTHX_ OP *o) { 
     87   PerlIO_printf(PerlIO_stderr(), "hack_print\n"); 
     88   o->op_ppaddr = print_hack_ppaddr;// print 組み込み関数の挙動を変える 
     89   return CALL_FPTR(hack_old_print)(aTHX_ o); 
    6390} 
    6491 
     
    105132          PL_check[OP_METHOD_NAMED] = hack_method_named; 
    106133 
     134          hack_old_print     = PL_check[OP_PRINT]; 
     135          PL_check[OP_PRINT] = hack_print; 
     136 
    107137          /*     
    108138          hack_old_     = PL_check[OP_]; 
  • dan/perl/PL_check/trunk/test.pl

    r14411 r14415  
    1818 
    1919#exit; 
    20 warn "running"; 
     20warn "---------------------\nRUNNING"; 
    2121 
    2222so; 
     
    3838for (1..2) { 
    3939} 
     40 
     41warn "go to print hack"; 
     42print "PRINT: 1\n"; 
     43print "PRINT: 2\n";