From: Malcolm Beattie Date: Tue, 11 Nov 1997 15:20:43 +0000 (+0000) Subject: Change name of OP_SPECIFIC to OP_THREADSV. Fixed perl_get_sv when X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2faa37ccf8e46b865687f0ab4992b29a75eb79ea;p=p5sagit%2Fp5-mst-13.2.git Change name of OP_SPECIFIC to OP_THREADSV. Fixed perl_get_sv when getting per-thread magicals. Fixed thr->errsv initialisation. p4raw-id: //depot/perl@229 --- diff --git a/ext/Opcode/Opcode.pm b/ext/Opcode/Opcode.pm index d2db5ec..dcc5d74 100644 --- a/ext/Opcode/Opcode.pm +++ b/ext/Opcode/Opcode.pm @@ -431,7 +431,7 @@ beyond the scope of the compartment. These ops are related to multi-threading. - lock specific + lock threadsv =item :default diff --git a/op.c b/op.c index 06f027c..50073b1 100644 --- a/op.c +++ b/op.c @@ -576,7 +576,7 @@ OP *o; o->op_targ = 0; /* Was holding hints. */ break; #ifdef USE_THREADS - case OP_SPECIFIC: + case OP_THREADSV: o->op_targ = 0; /* Was holding index into thr->magicals AV. */ break; #endif /* USE_THREADS */ @@ -1203,12 +1203,8 @@ I32 type; break; #ifdef USE_THREADS - case OP_SPECIFIC: + case OP_THREADSV: modcount++; /* XXX ??? */ -#if 0 - if (!type) - croak("Can't localize thread-specific variable"); -#endif break; #endif /* USE_THREADS */ @@ -1368,7 +1364,7 @@ I32 type; } break; - case OP_SPECIFIC: + case OP_THREADSV: o->op_flags |= OPf_MOD; /* XXX ??? */ break; @@ -1641,7 +1637,7 @@ OP *o; if (o->op_type == OP_LIST) { OP *o2; #ifdef USE_THREADS - o2 = newOP(OP_SPECIFIC, 0); + o2 = newOP(OP_THREADSV, 0); o2->op_targ = find_thread_magical(";"); #else o2 = newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE, SVt_PV))), @@ -2190,7 +2186,7 @@ OP *repl; if (pm->op_pmflags & PMf_EVAL) curop = 0; #ifdef USE_THREADS - else if (repl->op_type == OP_SPECIFIC + else if (repl->op_type == OP_THREADSV && strchr("&`'123456789+", per_thread_magicals[repl->op_targ])) { @@ -2204,7 +2200,7 @@ OP *repl; for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) { if (opargs[curop->op_type] & OA_DANGEROUS) { #ifdef USE_THREADS - if (curop->op_type == OP_SPECIFIC + if (curop->op_type == OP_THREADSV && strchr("&`'123456789+", curop->op_private)) { break; } @@ -3876,7 +3872,7 @@ OP *o; o->op_ppaddr = ppaddr[OP_PADSV]; return o; } - else if (o->op_type == OP_SPECIFIC) + else if (o->op_type == OP_THREADSV) return o; return newUNOP(OP_RV2SV, 0, scalar(o)); } diff --git a/opcode.h b/opcode.h index 936831b..b560369 100644 --- a/opcode.h +++ b/opcode.h @@ -349,7 +349,7 @@ typedef enum { OP_GETLOGIN, /* 342 */ OP_SYSCALL, /* 343 */ OP_LOCK, /* 344 */ - OP_SPECIFIC, /* 345 */ + OP_THREADSV, /* 345 */ OP_max } opcode; @@ -704,7 +704,7 @@ EXT char *op_name[] = { "getlogin", "syscall", "lock", - "specific", + "threadsv", }; #endif @@ -1057,7 +1057,7 @@ EXT char *op_desc[] = { "getlogin", "syscall", "lock", - "thread-specific", + "per-thread variable", }; #endif @@ -1439,7 +1439,7 @@ OP * pp_egrent _((ARGSproto)); OP * pp_getlogin _((ARGSproto)); OP * pp_syscall _((ARGSproto)); OP * pp_lock _((ARGSproto)); -OP * pp_specific _((ARGSproto)); +OP * pp_threadsv _((ARGSproto)); #ifndef DOINIT EXT OP * (*ppaddr[])(); @@ -1790,7 +1790,7 @@ EXT OP * (*ppaddr[])() = { pp_getlogin, pp_syscall, pp_lock, - pp_specific, + pp_threadsv, }; #endif @@ -2143,7 +2143,7 @@ EXT OP * (*check[]) _((OP *op)) = { ck_null, /* getlogin */ ck_fun, /* syscall */ ck_rfun, /* lock */ - ck_null, /* specific */ + ck_null, /* threadsv */ }; #endif @@ -2496,6 +2496,6 @@ EXT U32 opargs[] = { 0x0000000c, /* getlogin */ 0x0002151d, /* syscall */ 0x00001c04, /* lock */ - 0x00000044, /* specific */ + 0x00000044, /* threadsv */ }; #endif diff --git a/opcode.pl b/opcode.pl index a97e987..c67f142 100755 --- a/opcode.pl +++ b/opcode.pl @@ -677,4 +677,4 @@ syscall syscall ck_fun imst@ S L # For multi-threading lock lock ck_rfun s% S -specific thread-specific ck_null ds0 +threadsv per-thread variable ck_null ds0 diff --git a/perl.c b/perl.c index dce37a4..3f30f6d 100644 --- a/perl.c +++ b/perl.c @@ -1086,14 +1086,17 @@ perl_get_sv(name, create) char* name; I32 create; { + GV *gv; #ifdef USE_THREADS - PADOFFSET tmp; - if (name[1] == '\0' && !isALPHA(name[0]) - && (tmp = find_thread_magical(name)) != NOT_IN_PAD) { - return *av_fetch(thr->magicals, tmp, FALSE); + if (name[1] == '\0' && !isALPHA(name[0])) { + PADOFFSET tmp = find_thread_magical(name); + if (tmp != NOT_IN_PAD) { + dTHR; + return *av_fetch(thr->magicals, tmp, FALSE); + } } #endif /* USE_THREADS */ - GV* gv = gv_fetchpv(name, create, SVt_PV); + gv = gv_fetchpv(name, create, SVt_PV); if (gv) return GvSV(gv); return Nullsv; @@ -2846,7 +2849,6 @@ init_main_thread() thr->cvcache = newHV(); thr->magicals = newAV(); thr->specific = newAV(); - thr->errsv = newSVpv("", 0); thr->errhv = newHV(); thr->flags = THRf_R_JOINABLE; MUTEX_INIT(&thr->mutex); @@ -2889,6 +2891,7 @@ init_main_thread() sv_upgrade(bodytarget, SVt_PVFM); sv_setpvn(bodytarget, "", 0); formtarget = bodytarget; + thr->errsv = newSVpv("", 0); return thr; } #endif /* USE_THREADS */ diff --git a/pp.c b/pp.c index c2585ae..45ff756 100644 --- a/pp.c +++ b/pp.c @@ -4296,20 +4296,20 @@ PP(pp_lock) RETURN; } -PP(pp_specific) +PP(pp_threadsv) { dSP; #ifdef USE_THREADS SV **svp = av_fetch(thr->magicals, op->op_targ, FALSE); if (!svp) - croak("panic: pp_specific"); + croak("panic: pp_threadsv"); EXTEND(sp, 1); if (op->op_private & OPpLVAL_INTRO) PUSHs(save_svref(svp)); else PUSHs(*svp); #else - DIE("tried to access thread-specific data in non-threaded perl"); + DIE("tried to access per-thread data in non-threaded perl"); #endif /* USE_THREADS */ RETURN; } diff --git a/t/lib/safe2.t b/t/lib/safe2.t index 40c5098..a9d2405 100755 --- a/t/lib/safe2.t +++ b/t/lib/safe2.t @@ -64,7 +64,8 @@ $glob = "ok 11\n"; sub sayok { print "ok @_\n" } -$cpt->share(qw($foo %bar @baz *glob sayok $")); +$cpt->share(qw($foo %bar @baz *glob sayok)); +$cpt->share('$"') unless $Config{archname} =~ /-thread$/; $cpt->reval(q{ package other; diff --git a/toke.c b/toke.c index 5ba993c..80179d5 100644 --- a/toke.c +++ b/toke.c @@ -1263,7 +1263,7 @@ yylex() && !isALPHA(tokenbuf[1]) /* Rule out obvious non-magicals */ && (tmp = find_thread_magical(&tokenbuf[1])) != NOT_IN_PAD) { - yylval.opval = newOP(OP_SPECIFIC, 0); + yylval.opval = newOP(OP_THREADSV, 0); yylval.opval->op_targ = tmp; return PRIVATEREF; } @@ -1404,7 +1404,7 @@ yylex() nextval[nexttoke].ival = 0; force_next(','); #ifdef USE_THREADS - nextval[nexttoke].opval = newOP(OP_SPECIFIC, 0); + nextval[nexttoke].opval = newOP(OP_THREADSV, 0); nextval[nexttoke].opval->op_targ = find_thread_magical("\""); force_next(PRIVATEREF); #else