1 typedef char *pvcontents;
2 typedef char *strconst;
4 typedef char *op_tr_array;
10 #define BGET_FREAD(argp, len, nelem) \
11 bs.fread((char*)(argp),(len),(nelem),bs.data)
12 #define BGET_FGETC() bs.fgetc(bs.data)
14 #define BGET_U32(arg) \
15 BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
16 #define BGET_I32(arg) \
17 BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
18 #define BGET_U16(arg) \
19 BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
20 #define BGET_U8(arg) arg = BGET_FGETC()
22 #define BGET_PV(arg) STMT_START { \
25 bs.freadpv(arg, bs.data, &bytecode_pv); \
27 bytecode_pv.xpv_pv = 0; \
28 bytecode_pv.xpv_len = 0; \
29 bytecode_pv.xpv_cur = 0; \
33 #define BGET_comment_t(arg) \
34 do { arg = BGET_FGETC(); } while (arg != '\n' && arg != EOF)
37 * In the following, sizeof(IV)*4 is just a way of encoding 32 on 64-bit-IV
38 * machines such that 32-bit machine compilers don't whine about the shift
39 * count being too high even though the code is never reached there.
41 #define BGET_IV64(arg) STMT_START { \
45 if (sizeof(IV) == 8) \
46 arg = (IV) (hi << (sizeof(IV)*4) | lo); \
47 else if (((I32)hi == -1 && (I32)lo < 0) \
48 || ((I32)hi == 0 && (I32)lo >= 0)) { \
52 bytecode_iv_overflows++; \
57 #define BGET_op_tr_array(arg) do { \
58 unsigned short *ary; \
60 New(666, ary, 256, unsigned short); \
61 BGET_FREAD(ary, 256, 2); \
62 for (i = 0; i < 256; i++) \
63 ary[i] = PerlSock_ntohs(ary[i]); \
67 #define BGET_pvcontents(arg) arg = bytecode_pv.xpv_pv
68 #define BGET_strconst(arg) STMT_START { \
69 for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
73 #define BGET_double(arg) STMT_START { \
79 #define BGET_objindex(arg, type) STMT_START { \
82 arg = (type)bytecode_obj_list[ix]; \
84 #define BGET_svindex(arg) BGET_objindex(arg, svindex)
85 #define BGET_opindex(arg) BGET_objindex(arg, opindex)
87 #define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
89 #define BSET_sv_refcnt_add(svrefcnt, arg) svrefcnt += arg
90 #define BSET_gp_refcnt_add(gprefcnt, arg) gprefcnt += arg
91 #define BSET_gp_share(sv, arg) STMT_START { \
93 GvGP(sv) = GvGP(arg); \
96 #define BSET_gv_fetchpv(sv, arg) sv = (SV*)gv_fetchpv(arg, TRUE, SVt_PV)
97 #define BSET_gv_stashpv(sv, arg) sv = (SV*)gv_stashpv(arg, TRUE)
98 #define BSET_sv_magic(sv, arg) sv_magic(sv, Nullsv, arg, 0, 0)
99 #define BSET_mg_pv(mg, arg) mg->mg_ptr = arg; mg->mg_len = bytecode_pv.xpv_cur
100 #define BSET_sv_upgrade(sv, arg) (void)SvUPGRADE(sv, arg)
101 #define BSET_xpv(sv) do { \
102 SvPV_set(sv, bytecode_pv.xpv_pv); \
103 SvCUR_set(sv, bytecode_pv.xpv_cur); \
104 SvLEN_set(sv, bytecode_pv.xpv_len); \
106 #define BSET_av_extend(sv, arg) av_extend((AV*)sv, arg)
108 #define BSET_av_push(sv, arg) av_push((AV*)sv, arg)
109 #define BSET_hv_store(sv, arg) \
110 hv_store((HV*)sv, bytecode_pv.xpv_pv, bytecode_pv.xpv_cur, arg, 0)
111 #define BSET_pv_free(pv) Safefree(pv.xpv_pv)
112 #define BSET_pregcomp(o, arg) \
113 ((PMOP*)o)->op_pmregexp = arg ? \
114 CALLREGCOMP(arg, arg + bytecode_pv.xpv_cur, ((PMOP*)o)) : 0
115 #define BSET_newsv(sv, arg) sv = NEWSV(666,0); SvUPGRADE(sv, arg)
116 #define BSET_newop(o, arg) o = (OP*)safemalloc(optype_size[arg])
117 #define BSET_newopn(o, arg) STMT_START { \
119 BSET_newop(o, arg); \
120 oldop->op_next = o; \
123 #define BSET_ret(foo) return
126 * Kludge special-case workaround for OP_MAPSTART
127 * which needs the ppaddr for OP_GREPSTART. Blech.
129 #define BSET_op_type(o, arg) STMT_START { \
131 if (arg == OP_MAPSTART) \
132 arg = OP_GREPSTART; \
133 o->op_ppaddr = PL_ppaddr[arg]; \
135 #define BSET_op_ppaddr(o, arg) croak("op_ppaddr not yet implemented")
136 #define BSET_curpad(pad, arg) STMT_START { \
137 PL_comppad = (AV *)arg; \
138 pad = AvARRAY(arg); \
141 #define BSET_OBJ_STORE(obj, ix) \
142 (I32)ix > bytecode_obj_list_fill ? \
143 bset_obj_store(obj, (I32)ix) : (bytecode_obj_list[ix] = obj)
144 typedef char *pvcontents;
145 typedef char *strconst;
147 typedef char *op_tr_array;
148 typedef int comment_t;
153 #define BGET_FREAD(argp, len, nelem) \
154 bs.fread((char*)(argp),(len),(nelem),bs.data)
155 #define BGET_FGETC() bs.fgetc(bs.data)
157 #define BGET_U32(arg) \
158 BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
159 #define BGET_I32(arg) \
160 BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
161 #define BGET_U16(arg) \
162 BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
163 #define BGET_U8(arg) arg = BGET_FGETC()
165 #define BGET_PV(arg) STMT_START { \
168 bs.freadpv(arg, bs.data, &bytecode_pv); \
170 bytecode_pv.xpv_pv = 0; \
171 bytecode_pv.xpv_len = 0; \
172 bytecode_pv.xpv_cur = 0; \
176 #define BGET_comment_t(arg) \
177 do { arg = BGET_FGETC(); } while (arg != '\n' && arg != EOF)
180 * In the following, sizeof(IV)*4 is just a way of encoding 32 on 64-bit-IV
181 * machines such that 32-bit machine compilers don't whine about the shift
182 * count being too high even though the code is never reached there.
184 #define BGET_IV64(arg) STMT_START { \
188 if (sizeof(IV) == 8) \
189 arg = (IV) (hi << (sizeof(IV)*4) | lo); \
190 else if (((I32)hi == -1 && (I32)lo < 0) \
191 || ((I32)hi == 0 && (I32)lo >= 0)) { \
195 bytecode_iv_overflows++; \
200 #define BGET_op_tr_array(arg) do { \
201 unsigned short *ary; \
203 New(666, ary, 256, unsigned short); \
204 BGET_FREAD(ary, 256, 2); \
205 for (i = 0; i < 256; i++) \
206 ary[i] = PerlSock_ntohs(ary[i]); \
207 arg = (char *) ary; \
210 #define BGET_pvcontents(arg) arg = bytecode_pv.xpv_pv
211 #define BGET_strconst(arg) STMT_START { \
212 for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
216 #define BGET_double(arg) STMT_START { \
218 BGET_strconst(str); \
222 #define BGET_objindex(arg, type) STMT_START { \
225 arg = (type)bytecode_obj_list[ix]; \
227 #define BGET_svindex(arg) BGET_objindex(arg, svindex)
228 #define BGET_opindex(arg) BGET_objindex(arg, opindex)
230 #define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
232 #define BSET_sv_refcnt_add(svrefcnt, arg) svrefcnt += arg
233 #define BSET_gp_refcnt_add(gprefcnt, arg) gprefcnt += arg
234 #define BSET_gp_share(sv, arg) STMT_START { \
236 GvGP(sv) = GvGP(arg); \
239 #define BSET_gv_fetchpv(sv, arg) sv = (SV*)gv_fetchpv(arg, TRUE, SVt_PV)
240 #define BSET_gv_stashpv(sv, arg) sv = (SV*)gv_stashpv(arg, TRUE)
241 #define BSET_sv_magic(sv, arg) sv_magic(sv, Nullsv, arg, 0, 0)
242 #define BSET_mg_pv(mg, arg) mg->mg_ptr = arg; mg->mg_len = bytecode_pv.xpv_cur
243 #define BSET_sv_upgrade(sv, arg) (void)SvUPGRADE(sv, arg)
244 #define BSET_xpv(sv) do { \
245 SvPV_set(sv, bytecode_pv.xpv_pv); \
246 SvCUR_set(sv, bytecode_pv.xpv_cur); \
247 SvLEN_set(sv, bytecode_pv.xpv_len); \
249 #define BSET_av_extend(sv, arg) av_extend((AV*)sv, arg)
251 #define BSET_av_push(sv, arg) av_push((AV*)sv, arg)
252 #define BSET_hv_store(sv, arg) \
253 hv_store((HV*)sv, bytecode_pv.xpv_pv, bytecode_pv.xpv_cur, arg, 0)
254 #define BSET_pv_free(pv) Safefree(pv.xpv_pv)
255 #define BSET_pregcomp(o, arg) \
256 ((PMOP*)o)->op_pmregexp = arg ? \
257 CALLREGCOMP(arg, arg + bytecode_pv.xpv_cur, ((PMOP*)o)) : 0
258 #define BSET_newsv(sv, arg) sv = NEWSV(666,0); SvUPGRADE(sv, arg)
259 #define BSET_newop(o, arg) o = (OP*)safemalloc(optype_size[arg])
260 #define BSET_newopn(o, arg) STMT_START { \
262 BSET_newop(o, arg); \
263 oldop->op_next = o; \
266 #define BSET_ret(foo) return
269 * Kludge special-case workaround for OP_MAPSTART
270 * which needs the ppaddr for OP_GREPSTART. Blech.
272 #define BSET_op_type(o, arg) STMT_START { \
274 if (arg == OP_MAPSTART) \
275 arg = OP_GREPSTART; \
276 o->op_ppaddr = PL_ppaddr[arg]; \
278 #define BSET_op_ppaddr(o, arg) croak("op_ppaddr not yet implemented")
279 #define BSET_curpad(pad, arg) STMT_START { \
280 PL_comppad = (AV *)arg; \
281 pad = AvARRAY(arg); \
284 #define BSET_OBJ_STORE(obj, ix) \
285 (I32)ix > bytecode_obj_list_fill ? \
286 bset_obj_store(obj, (I32)ix) : (bytecode_obj_list[ix] = obj)
287 typedef char *pvcontents;
288 typedef char *strconst;
290 typedef char *op_tr_array;
291 typedef int comment_t;
296 #define BGET_FREAD(argp, len, nelem) \
297 bs.fread((char*)(argp),(len),(nelem),bs.data)
298 #define BGET_FGETC() bs.fgetc(bs.data)
300 #define BGET_U32(arg) \
301 BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
302 #define BGET_I32(arg) \
303 BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
304 #define BGET_U16(arg) \
305 BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
306 #define BGET_U8(arg) arg = BGET_FGETC()
308 #define BGET_PV(arg) STMT_START { \
311 bs.freadpv(arg, bs.data, &bytecode_pv); \
313 bytecode_pv.xpv_pv = 0; \
314 bytecode_pv.xpv_len = 0; \
315 bytecode_pv.xpv_cur = 0; \
319 #define BGET_comment_t(arg) \
320 do { arg = BGET_FGETC(); } while (arg != '\n' && arg != EOF)
323 * In the following, sizeof(IV)*4 is just a way of encoding 32 on 64-bit-IV
324 * machines such that 32-bit machine compilers don't whine about the shift
325 * count being too high even though the code is never reached there.
327 #define BGET_IV64(arg) STMT_START { \
331 if (sizeof(IV) == 8) \
332 arg = (IV) (hi << (sizeof(IV)*4) | lo); \
333 else if (((I32)hi == -1 && (I32)lo < 0) \
334 || ((I32)hi == 0 && (I32)lo >= 0)) { \
338 bytecode_iv_overflows++; \
343 #define BGET_op_tr_array(arg) do { \
344 unsigned short *ary; \
346 New(666, ary, 256, unsigned short); \
347 BGET_FREAD(ary, 256, 2); \
348 for (i = 0; i < 256; i++) \
349 ary[i] = PerlSock_ntohs(ary[i]); \
350 arg = (char *) ary; \
353 #define BGET_pvcontents(arg) arg = bytecode_pv.xpv_pv
354 #define BGET_strconst(arg) STMT_START { \
355 for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
359 #define BGET_double(arg) STMT_START { \
361 BGET_strconst(str); \
365 #define BGET_objindex(arg, type) STMT_START { \
368 arg = (type)bytecode_obj_list[ix]; \
370 #define BGET_svindex(arg) BGET_objindex(arg, svindex)
371 #define BGET_opindex(arg) BGET_objindex(arg, opindex)
373 #define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
375 #define BSET_sv_refcnt_add(svrefcnt, arg) svrefcnt += arg
376 #define BSET_gp_refcnt_add(gprefcnt, arg) gprefcnt += arg
377 #define BSET_gp_share(sv, arg) STMT_START { \
379 GvGP(sv) = GvGP(arg); \
382 #define BSET_gv_fetchpv(sv, arg) sv = (SV*)gv_fetchpv(arg, TRUE, SVt_PV)
383 #define BSET_gv_stashpv(sv, arg) sv = (SV*)gv_stashpv(arg, TRUE)
384 #define BSET_sv_magic(sv, arg) sv_magic(sv, Nullsv, arg, 0, 0)
385 #define BSET_mg_pv(mg, arg) mg->mg_ptr = arg; mg->mg_len = bytecode_pv.xpv_cur
386 #define BSET_sv_upgrade(sv, arg) (void)SvUPGRADE(sv, arg)
387 #define BSET_xpv(sv) do { \
388 SvPV_set(sv, bytecode_pv.xpv_pv); \
389 SvCUR_set(sv, bytecode_pv.xpv_cur); \
390 SvLEN_set(sv, bytecode_pv.xpv_len); \
392 #define BSET_av_extend(sv, arg) av_extend((AV*)sv, arg)
394 #define BSET_av_push(sv, arg) av_push((AV*)sv, arg)
395 #define BSET_hv_store(sv, arg) \
396 hv_store((HV*)sv, bytecode_pv.xpv_pv, bytecode_pv.xpv_cur, arg, 0)
397 #define BSET_pv_free(pv) Safefree(pv.xpv_pv)
398 #define BSET_pregcomp(o, arg) \
399 ((PMOP*)o)->op_pmregexp = arg ? \
400 CALLREGCOMP(arg, arg + bytecode_pv.xpv_cur, ((PMOP*)o)) : 0
401 #define BSET_newsv(sv, arg) sv = NEWSV(666,0); SvUPGRADE(sv, arg)
402 #define BSET_newop(o, arg) o = (OP*)safemalloc(optype_size[arg])
403 #define BSET_newopn(o, arg) STMT_START { \
405 BSET_newop(o, arg); \
406 oldop->op_next = o; \
409 #define BSET_ret(foo) return
412 * Kludge special-case workaround for OP_MAPSTART
413 * which needs the ppaddr for OP_GREPSTART. Blech.
415 #define BSET_op_type(o, arg) STMT_START { \
417 if (arg == OP_MAPSTART) \
418 arg = OP_GREPSTART; \
419 o->op_ppaddr = PL_ppaddr[arg]; \
421 #define BSET_op_ppaddr(o, arg) croak("op_ppaddr not yet implemented")
422 #define BSET_curpad(pad, arg) STMT_START { \
423 PL_comppad = (AV *)arg; \
424 pad = AvARRAY(arg); \
427 #define BSET_OBJ_STORE(obj, ix) \
428 (I32)ix > bytecode_obj_list_fill ? \
429 bset_obj_store(obj, (I32)ix) : (bytecode_obj_list[ix] = obj)