diff options
author | Simon Cozens <simon@netthink.co.uk> | 2001-08-01 06:57:02 -0700 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2001-08-01 22:38:31 +0000 |
commit | a2efc82216efc10377cf26fd4aff1aa5e66c6687 (patch) | |
tree | 6c9717258434d9d96ae509d2c3d7cd229e20b852 | |
parent | 6bab786b4dc26323c40cdd19dc27ad4499214f4e (diff) | |
download | perl-a2efc82216efc10377cf26fd4aff1aa5e66c6687.tar.gz |
Pluggable optimizer
Message-ID: <20010801135702.I10442@netthink.co.uk>
p4raw-id: //depot/perl@11541
-rw-r--r-- | embedvar.h | 4 | ||||
-rw-r--r-- | op.c | 16 | ||||
-rw-r--r-- | perl.c | 1 | ||||
-rw-r--r-- | perl.h | 1 | ||||
-rw-r--r-- | perlapi.h | 2 | ||||
-rw-r--r-- | sv.c | 3 | ||||
-rw-r--r-- | thrdvar.h | 2 | ||||
-rw-r--r-- | util.c | 2 |
8 files changed, 24 insertions, 7 deletions
diff --git a/embedvar.h b/embedvar.h index 34d781fb72..f6d6aac4ca 100644 --- a/embedvar.h +++ b/embedvar.h @@ -73,6 +73,7 @@ #define PL_ofs_sv (vTHX->Tofs_sv) #define PL_op (vTHX->Top) #define PL_opsave (vTHX->Topsave) +#define PL_peepp (vTHX->Tpeepp) #define PL_protect (vTHX->Tprotect) #define PL_reg_call_cc (vTHX->Treg_call_cc) #define PL_reg_curpm (vTHX->Treg_curpm) @@ -788,6 +789,7 @@ #define PL_ofs_sv (aTHXo->interp.Tofs_sv) #define PL_op (aTHXo->interp.Top) #define PL_opsave (aTHXo->interp.Topsave) +#define PL_peepp (aTHXo->interp.Tpeepp) #define PL_protect (aTHXo->interp.Tprotect) #define PL_reg_call_cc (aTHXo->interp.Treg_call_cc) #define PL_reg_curpm (aTHXo->interp.Treg_curpm) @@ -1492,6 +1494,7 @@ #define PL_ofs_sv (aTHX->Tofs_sv) #define PL_op (aTHX->Top) #define PL_opsave (aTHX->Topsave) +#define PL_peepp (aTHX->Tpeepp) #define PL_protect (aTHX->Tprotect) #define PL_reg_call_cc (aTHX->Treg_call_cc) #define PL_reg_curpm (aTHX->Treg_curpm) @@ -1629,6 +1632,7 @@ #define PL_Tofs_sv PL_ofs_sv #define PL_Top PL_op #define PL_Topsave PL_opsave +#define PL_Tpeepp PL_peepp #define PL_Tprotect PL_protect #define PL_Treg_call_cc PL_reg_call_cc #define PL_Treg_curpm PL_reg_curpm @@ -20,6 +20,8 @@ #include "perl.h" #include "keywords.h" +#define CALL_PEEP(o) CALL_FPTR(PL_peepp)(o) + /* #define PL_OP_SLAB_ALLOC */ #ifdef PL_OP_SLAB_ALLOC @@ -2174,7 +2176,7 @@ Perl_newPROG(pTHX_ OP *o) PL_eval_root->op_private |= OPpREFCOUNTED; OpREFCNT_set(PL_eval_root, 1); PL_eval_root->op_next = 0; - peep(PL_eval_start); + CALL_PEEP(PL_eval_start); } else { if (!o) @@ -2185,7 +2187,7 @@ Perl_newPROG(pTHX_ OP *o) PL_main_root->op_private |= OPpREFCOUNTED; OpREFCNT_set(PL_main_root, 1); PL_main_root->op_next = 0; - peep(PL_main_start); + CALL_PEEP(PL_main_start); PL_compcv = 0; /* Register with debugger */ @@ -2369,7 +2371,7 @@ Perl_gen_constant_list(pTHX_ register OP *o) PL_op = curop = LINKLIST(o); o->op_next = 0; - peep(curop); + CALL_PEEP(curop); pp_pushmark(); CALLRUNOPS(aTHX); PL_op = curop; @@ -4829,7 +4831,7 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) OpREFCNT_set(CvROOT(cv), 1); CvSTART(cv) = LINKLIST(CvROOT(cv)); CvROOT(cv)->op_next = 0; - peep(CvSTART(cv)); + CALL_PEEP(CvSTART(cv)); /* now that optimizer has done its work, adjust pad values */ if (CvCLONE(cv)) { @@ -5170,7 +5172,7 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block) OpREFCNT_set(CvROOT(cv), 1); CvSTART(cv) = LINKLIST(CvROOT(cv)); CvROOT(cv)->op_next = 0; - peep(CvSTART(cv)); + CALL_PEEP(CvSTART(cv)); op_free(o); PL_copline = NOLINE; LEAVE_SCOPE(floor); @@ -6343,7 +6345,7 @@ Perl_ck_sort(pTHX_ OP *o) kid->op_next = 0; /* just disconnect the leave */ k = kLISTOP->op_first; } - peep(k); + CALL_PEEP(k); kid = firstkid; if (o->op_type == OP_SORT) { @@ -6881,7 +6883,7 @@ Perl_peep(pTHX_ register OP *o) o->op_seq = PL_op_seqmax++; while (cLOGOP->op_other->op_type == OP_NULL) cLOGOP->op_other = cLOGOP->op_other->op_next; - peep(cLOGOP->op_other); + peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */ break; case OP_ENTERLOOP: @@ -3782,6 +3782,7 @@ S_init_main_thread(pTHX) (void) find_threadsv("@"); /* Ensure $@ is initialised early */ PL_maxscream = -1; + PL_peepp = MEMBER_TO_FPTR(Perl_peep); PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp); PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags); PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start); @@ -3019,6 +3019,7 @@ enum { /* pass one of these to get_vtbl */ #define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0)) /* Enable variables which are pointers to functions */ +typedef void (CPERLscope(*peep_t))(pTHX_ OP* o); typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm); typedef I32 (CPERLscope(*regexec_t)) (pTHX_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, @@ -728,6 +728,8 @@ START_EXTERN_C #define PL_op (*Perl_Top_ptr(aTHXo)) #undef PL_opsave #define PL_opsave (*Perl_Topsave_ptr(aTHXo)) +#undef PL_peepp +#define PL_peepp (*Perl_Tpeepp_ptr(aTHXo)) #undef PL_protect #define PL_protect (*Perl_Tprotect_ptr(aTHXo)) #undef PL_reg_call_cc @@ -10268,6 +10268,9 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_reginterp_cnt = 0; PL_reg_starttry = 0; + /* Pluggable optimizer */ + PL_peepp = proto_perl->Tpeepp; + if (!(flags & CLONEf_KEEP_PTR_TABLE)) { ptr_table_free(PL_ptr_table); PL_ptr_table = NULL; @@ -211,6 +211,8 @@ PERLVAR(Treg_leftiter, I32) /* wait until caching pos */ PERLVARI(Treg_poscache, char *, Nullch) /* cache of pos of WHILEM */ PERLVAR(Treg_poscache_size, STRLEN) /* size of pos cache of WHILEM */ +PERLVARI(Tpeepp, peep_t, MEMBER_TO_FPTR(Perl_peep)) + /* Pointer to peephole optimizer */ PERLVARI(Tregcompp, regcomp_t, MEMBER_TO_FPTR(Perl_pregcomp)) /* Pointer to REx compiler */ PERLVARI(Tregexecp, regexec_t, MEMBER_TO_FPTR(Perl_regexec_flags)) @@ -3037,6 +3037,8 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t) PL_reg_start_tmpl = 0; PL_reg_poscache = Nullch; + PL_peepp = MEMBER_TO_FPTR(Perl_peep); + /* parent thread's data needs to be locked while we make copy */ MUTEX_LOCK(&t->mutex); |