- Timestamp:
- 06/22/08 17:05:21 (5 months ago)
- Location:
- dan/perl/PL_check/trunk
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
dan/perl/PL_check/trunk/hack.xs
r14414 r14415 6 6 7 7 #include "ppport.h" 8 9 OP * next_hack(pTHX) { 10 PerlIO_printf(PerlIO_stderr(), "-- next_hack\n"); 11 return PL_ppaddr[PL_op->op_type](aTHXR);// 今現在のオペコードのデフォルト実行関数を使うよ 12 } 13 14 OP * 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 } 8 28 9 29 OP * next_hack_ppaddr(pTHX) { … … 21 41 static OP *(*hack_old_method)(pTHX_ OP *op) = NULL; 22 42 static OP *(*hack_old_method_named)(pTHX_ OP *op) = NULL; 43 static OP *(*hack_old_print)(pTHX_ OP *op) = NULL; 23 44 24 45 OP * hack_enterloop(pTHX_ OP *o) { … … 39 60 OP * hack_next(pTHX_ OP *o) { 40 61 PerlIO_printf(PerlIO_stderr(), "hack_next\n"); 41 o->op_ppaddr = next_hack_ppaddr; 62 o->op_ppaddr = next_hack_ppaddr;// next 組み込み関数の挙動を変える 42 63 return CALL_FPTR(hack_old_next)(aTHX_ o); 43 64 } … … 61 82 PerlIO_printf(PerlIO_stderr(), "hack_method_named\n"); 62 83 return CALL_FPTR(hack_old_method_named)(aTHX_ o); 84 } 85 86 OP * 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); 63 90 } 64 91 … … 105 132 PL_check[OP_METHOD_NAMED] = hack_method_named; 106 133 134 hack_old_print = PL_check[OP_PRINT]; 135 PL_check[OP_PRINT] = hack_print; 136 107 137 /* 108 138 hack_old_ = PL_check[OP_]; -
dan/perl/PL_check/trunk/test.pl
r14411 r14415 18 18 19 19 #exit; 20 warn " running";20 warn "---------------------\nRUNNING"; 21 21 22 22 so; … … 38 38 for (1..2) { 39 39 } 40 41 warn "go to print hack"; 42 print "PRINT: 1\n"; 43 print "PRINT: 2\n";
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)