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;
80 sv_free(sv); /* note, can modify tmps_ix!!! */
97 sv = GvSV(gv) = NEWSV(0,0);
98 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv)) {
99 sv_upgrade(sv, SvTYPE(osv));
100 SvMAGIC(sv) = SvMAGIC(osv);
108 #ifdef INLINED_ELSEWHERE
124 GvSV(gv) = NEWSV(72,0);
125 GvLINE(gv) = curcop->cop_line;
140 SSPUSHINT(SAVEt_SVREF);
142 sv = *sptr = NEWSV(0,0);
143 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(sv)) {
144 sv_upgrade(sv, SvTYPE(osv));
145 SvMAGIC(sv) = SvMAGIC(osv);
159 SSPUSHPTR(GvAVn(gv));
162 GvAV(gv) = Null(AV*);
172 SSPUSHPTR(GvHVn(gv));
175 GvHV(gv) = Null(HV*);
186 SSPUSHPTR(item); /* remember the pointer */
189 SSPUSHPTR(sv); /* remember the value */
190 SSPUSHINT(SAVEt_ITEM);
200 SSPUSHINT(SAVEt_INT);
210 SSPUSHINT(SAVEt_I32);
220 SSPUSHINT(SAVEt_SPTR);
229 SSPUSHINT(SAVEt_NSTAB);
239 SSPUSHINT(SAVEt_HPTR);
249 SSPUSHINT(SAVEt_APTR);
253 save_list(sarg,maxsarg)
260 SSCHECK(3 * maxsarg);
261 for (i = 1; i <= maxsarg; i++) {
262 SSPUSHPTR(sarg[i]); /* remember the pointer */
264 sv_setsv(sv,sarg[i]);
265 SSPUSHPTR(sv); /* remember the value */
266 SSPUSHINT(SAVEt_ITEM);
282 croak("panic: corrupt saved stack index");
283 while (savestack_ix > base) {
285 case SAVEt_ITEM: /* normal string */
286 value = (SV*)SSPOPPTR;
288 sv_replace(sv,value);
291 case SAVEt_SV: /* scalar reference */
292 value = (SV*)SSPOPPTR;
295 if (SvTYPE(sv) >= SVt_PVMG)
298 GvSV(gv) = sv = value;
301 case SAVEt_SVREF: /* scalar reference */
304 if (SvTYPE(sv) >= SVt_PVMG)
307 *(SV**)ptr = sv = (SV*)SSPOPPTR;
310 case SAVEt_AV: /* array reference */
316 case SAVEt_HV: /* hash reference */
319 (void)hv_free(GvHV(gv));
322 case SAVEt_INT: /* int reference */
324 *(int*)ptr = (int)SSPOPINT;
326 case SAVEt_I32: /* I32 reference */
328 *(I32*)ptr = (I32)SSPOPINT;
330 case SAVEt_SPTR: /* SV* reference */
332 *(SV**)ptr = (SV*)SSPOPPTR;
334 case SAVEt_HPTR: /* HV* reference */
336 *(HV**)ptr = (HV*)SSPOPPTR;
338 case SAVEt_APTR: /* AV* reference */
340 *(AV**)ptr = (AV*)SSPOPPTR;
346 case SAVEt_GP: /* scalar reference */
353 croak("panic: leave_scope inconsistency");