1 /* $RCSfile: op.c,v $$Revision: 4.1 $$Date: 92/08/07 17:19:16 $
3 * Copyright (c) 1991, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
17 cxstack_max = cxstack_max * 3 / 2;
18 Renew(cxstack, cxstack_max, CONTEXT);
19 return cxstack_ix + 1;
26 if (retstack_ix == retstack_max) {
27 retstack_max = retstack_max * 3 / 2;
28 Renew(retstack, retstack_max, OP*);
30 retstack[retstack_ix++] = retop;
37 return retstack[--retstack_ix];
45 if (scopestack_ix == scopestack_max) {
46 scopestack_max = scopestack_max * 3 / 2;
47 Renew(scopestack, scopestack_max, I32);
49 scopestack[scopestack_ix++] = savestack_ix;
56 I32 oldsave = scopestack[--scopestack_ix];
57 if (savestack_ix > oldsave)
64 savestack_max = savestack_max * 3 / 2;
65 Renew(savestack, savestack_max, ANY);
71 /* XXX should tmps_floor live in cxstack? */
72 I32 myfloor = tmps_floor;
73 while (tmps_ix > myfloor) { /* clean up after last statement */
74 SV* sv = tmps_stack[tmps_ix];
75 tmps_stack[tmps_ix--] = Nullsv;
77 sv_free(sv); /* note, can modify tmps_ix!!! */
93 sv = GvSV(gv) = NEWSV(0,0);
94 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv)) {
95 sv_upgrade(sv, SvTYPE(osv));
96 SvMAGIC(sv) = SvMAGIC(osv);
104 #ifdef INLINED_ELSEWHERE
120 GvSV(gv) = NEWSV(72,0);
121 GvLINE(gv) = curcop->cop_line;
136 SSPUSHINT(SAVEt_SVREF);
138 sv = *sptr = NEWSV(0,0);
139 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(sv)) {
140 sv_upgrade(sv, SvTYPE(osv));
141 SvMAGIC(sv) = SvMAGIC(osv);
155 SSPUSHPTR(GvAVn(gv));
158 GvAV(gv) = Null(AV*);
168 SSPUSHPTR(GvHVn(gv));
171 GvHV(gv) = Null(HV*);
182 SSPUSHPTR(item); /* remember the pointer */
185 SSPUSHPTR(sv); /* remember the value */
186 SSPUSHINT(SAVEt_ITEM);
196 SSPUSHINT(SAVEt_INT);
206 SSPUSHINT(SAVEt_I32);
216 SSPUSHINT(SAVEt_SPTR);
225 SSPUSHINT(SAVEt_NSTAB);
235 SSPUSHINT(SAVEt_HPTR);
245 SSPUSHINT(SAVEt_APTR);
249 save_list(sarg,maxsarg)
256 SSCHECK(3 * maxsarg);
257 for (i = 1; i <= maxsarg; i++) {
258 SSPUSHPTR(sarg[i]); /* remember the pointer */
260 sv_setsv(sv,sarg[i]);
261 SSPUSHPTR(sv); /* remember the value */
262 SSPUSHINT(SAVEt_ITEM);
278 fatal("panic: corrupt saved stack index");
279 while (savestack_ix > base) {
281 case SAVEt_ITEM: /* normal string */
282 value = (SV*)SSPOPPTR;
284 sv_replace(sv,value);
287 case SAVEt_SV: /* scalar reference */
288 value = (SV*)SSPOPPTR;
291 if (SvTYPE(sv) >= SVt_PVMG)
294 GvSV(gv) = sv = value;
297 case SAVEt_SVREF: /* scalar reference */
300 if (SvTYPE(sv) >= SVt_PVMG)
303 *(SV**)ptr = sv = (SV*)SSPOPPTR;
306 case SAVEt_AV: /* array reference */
312 case SAVEt_HV: /* hash reference */
315 (void)hv_free(GvHV(gv), FALSE);
318 case SAVEt_INT: /* int reference */
320 *(int*)ptr = (int)SSPOPINT;
322 case SAVEt_I32: /* I32 reference */
324 *(I32*)ptr = (I32)SSPOPINT;
326 case SAVEt_SPTR: /* SV* reference */
328 *(SV**)ptr = (SV*)SSPOPPTR;
330 case SAVEt_HPTR: /* HV* reference */
332 *(HV**)ptr = (HV*)SSPOPPTR;
334 case SAVEt_APTR: /* AV* reference */
336 *(AV**)ptr = (AV*)SSPOPPTR;
342 case SAVEt_GP: /* scalar reference */
349 fatal("panic: leave_scope inconsistency");