8 set.ops - Assignment Opcodes
12 These operations all set registers to various values.
14 When making changes to any ops file, run C<make bootstrap-ops> to regenerate
15 all generated ops files.
21 ########################################
23 =item B<clone>(out STR, in STR)
25 Effectively the same as set $1, $2, except that if $2 is a null STRING, $1 gets
26 a new empty string instead.
30 inline op clone(out STR, in STR) :base_mem {
31 /* cloning a NULL STRING produces an empty STRING; TT #964 */
32 $1 = STRING_IS_NULL($2)
33 ? Parrot_str_new(interp, NULL, 0)
37 ########################################
39 =item B<set>(out INT, in INT)
41 =item B<set>(out INT, in NUM)
43 A floating-point number is truncated (rounded toward zero) when assigned
44 to an integer register.
46 =item B<set>(out INT, invar PMC)
48 =item B<set>(out INT, invar PMC)
50 =item B<set>(out INT, in STR)
52 =item B<set>(out NUM, in INT)
54 =item B<set>(out NUM, in NUM)
56 =item B<set>(out NUM, invar PMC)
58 =item B<set>(out NUM, in STR)
60 =item B<set>(invar PMC, in INT)
62 =item B<set>(invar PMC, in NUM)
64 =item B<set>(out PMC, invar PMC)
66 =item B<set>(invar PMC, invar STR)
68 =item B<set>(out STR, in INT)
70 =item B<set>(out STR, in NUM)
72 =item B<set>(out STR, invar PMC)
74 =item B<set>(out STR, inconst STR)
76 =item B<set>(out STR, invar STR)
78 =item B<set>(out PMC, inconst PMC)
80 =item B<set>(invar PMC, inconst STR)
86 inline op set(out INT, in INT) :base_core {
90 inline op set(out INT, in NUM) :base_core {
94 inline op set(out INT, in STR) :base_core {
95 $1 = Parrot_str_to_int(interp, $2);
98 inline op set(out NUM, in NUM) :base_core {
102 inline op set(out NUM, in INT) :base_core {
106 inline op set(out NUM, in STR) :base_core {
107 $1 = Parrot_str_to_num(interp, $2);
110 inline op set(out NUM, invar PMC) :base_core {
111 $1 = VTABLE_get_number(interp, $2);
114 inline op set(out STR, invar PMC) :base_core {
115 $1 = VTABLE_get_string(interp, $2);
118 inline op set(out STR, invar STR) :base_core {
122 inline op set(out STR, inconst STR) :base_core {
126 inline op set(out STR, in INT) :base_core {
127 $1 = Parrot_str_from_int(interp, $2);
130 inline op set(out STR, in NUM) :base_core {
131 $1 = Parrot_str_from_num(interp, $2);
134 inline op set(out PMC, inconst PMC) :base_core {
138 inline op set(out PMC, invar PMC) :base_core {
142 inline op set(invar PMC, in INT) :base_core {
143 VTABLE_set_integer_native(interp, $1, $2);
146 inline op set(invar PMC, in NUM) :base_core {
147 VTABLE_set_number_native(interp, $1, $2);
150 inline op set(invar PMC, invar STR) :base_core {
151 VTABLE_set_string_native(interp, $1, $2);
154 inline op set(invar PMC, inconst STR) :base_core {
155 VTABLE_set_string_native(interp, $1, $2);
157 inline op set(out INT, invar PMC) :base_core {
158 $1 = VTABLE_get_integer(interp, $2);
165 ########################################
167 =head2 PMC assignment operations: Px = x
171 =item B<assign>(invar PMC, in INT)
173 =item B<assign>(invar PMC, in NUM)
175 Assign a new value $2, to PMC $1. Same as the equivalent B<set> opcodes.
177 =item B<assign>(invar PMC, in STR)
179 =item B<assign>(invar PMC, invar PMC)
181 Assign a new value $2, to PMC $1 by copying the value.
183 =item B<assign>(out STR, in STR)
185 Assign a new value to a string by reusing the string header.
187 =item B<setref>(invar PMC, invar PMC)
189 Make $1 refer to $2 by calling C<set_pmc>.
191 =item B<deref>(out PMC, invar PMC)
193 Not strictly an assignment operation: Put into $1 the PMC that the
194 reference PMC $2 refers to.
198 inline op assign(invar PMC, invar PMC) :base_core {
199 VTABLE_assign_pmc(interp, $1, $2);
202 inline op assign(invar PMC, in INT) :base_core {
203 VTABLE_set_integer_native(interp, $1, $2);
206 inline op assign(invar PMC, in NUM) :base_core {
207 VTABLE_set_number_native(interp, $1, $2);
210 inline op assign(invar PMC, in STR) :base_core {
211 VTABLE_assign_string_native(interp, $1, $2);
214 inline op assign(out STR, in STR) :base_core {
218 inline op setref(invar PMC, invar PMC) :base_core {
219 VTABLE_set_pmc(interp, $1, $2);
222 inline op deref(out PMC, invar PMC) :base_ref {
223 $1 = VTABLE_get_pmc(interp, $2);
230 ########################################
232 =head2 Keyed set operations: Px[ INTKEY ] = Bx
236 =item B<set>(invar PMC, in INTKEY, in INT)
238 =item B<set>(invar PMC, in INTKEY, in NUM)
240 =item B<set>(invar PMC, in INTKEY, in STR)
242 =item B<set>(invar PMC, in INTKEY, invar PMC)
246 inline op set(invar PMC, in INTKEY, in INT) :base_core {
247 VTABLE_set_integer_keyed_int(interp, $1, $2, $3);
250 inline op set(invar PMC, in INTKEY, in NUM) :base_core {
251 VTABLE_set_number_keyed_int(interp, $1, $2, $3);
254 inline op set(invar PMC, in INTKEY, in STR) :base_core {
255 VTABLE_set_string_keyed_int(interp, $1, $2, $3);
258 inline op set(invar PMC, in INTKEY, invar PMC) :base_core {
259 VTABLE_set_pmc_keyed_int(interp, $1, $2, $3);
266 ########################################
268 =head2 Keyed get operations: Ax = Px[ INTKEY ]
272 =item B<set>(out INT, invar PMC, in INTKEY)
274 =item B<set>(out NUM, invar PMC, in INTKEY)
276 =item B<set>(out STR, invar PMC, in INTKEY)
278 =item B<set>(out PMC, invar PMC, in INTKEY)
282 inline op set(out INT, invar PMC, in INTKEY) :base_core {
283 $1 = VTABLE_get_integer_keyed_int(interp, $2, $3);
286 inline op set(out NUM, invar PMC, in INTKEY) :base_core {
287 $1 = VTABLE_get_number_keyed_int(interp, $2, $3);
290 inline op set(out STR, invar PMC, in INTKEY) :base_core {
291 $1 = VTABLE_get_string_keyed_int(interp, $2, $3);
294 inline op set(out PMC, invar PMC, in INTKEY) :base_core {
295 $1 = VTABLE_get_pmc_keyed_int(interp, $2, $3);
302 ########################################
304 =head2 Keyed set operations: Px[ KEY ] = Bx
308 =item B<set>(invar PMC, in KEY, in INT)
310 =item B<set>(invar PMC, in KEY, in NUM)
312 =item B<set>(invar PMC, in KEY, in STR)
314 =item B<set>(invar PMC, in KEY, invar PMC)
318 inline op set(invar PMC, in KEY, in INT) :base_core {
319 VTABLE_set_integer_keyed(interp, $1, $2, $3);
322 inline op set(invar PMC, in KEY, in NUM) :base_core {
323 VTABLE_set_number_keyed(interp, $1, $2, $3);
326 inline op set(invar PMC, in KEY, in STR) :base_core {
327 VTABLE_set_string_keyed(interp, $1, $2, $3);
330 inline op set(invar PMC, in KEY, invar PMC) :base_core {
331 VTABLE_set_pmc_keyed(interp, $1, $2, $3);
338 ########################################
340 =head2 Keyed get operations: Ax = Px[ KEY ]
344 =item B<set>(out INT, invar PMC, in KEY)
346 =item B<set>(out NUM, invar PMC, in KEY)
348 =item B<set>(out STR, invar PMC, in KEY)
350 =item B<set>(out PMC, invar PMC, in KEY)
354 inline op set(out INT, invar PMC, in KEY) :base_core {
355 $1 = VTABLE_get_integer_keyed(interp, $2, $3);
358 inline op set(out NUM, invar PMC, in KEY) :base_core {
359 $1 = VTABLE_get_number_keyed(interp, $2, $3);
362 inline op set(out STR, invar PMC, in KEY) :base_core {
363 $1 = VTABLE_get_string_keyed(interp, $2, $3);
366 inline op set(out PMC, invar PMC, in KEY) :base_core {
367 $1 = VTABLE_get_pmc_keyed(interp, $2, $3);
370 =item B<clone>(out PMC, invar PMC)
372 Makes a copy of the PMC in $2 and puts it in $1.
376 inline op clone(out PMC, invar PMC) :base_mem {
377 $1 = VTABLE_clone(interp, $2);
380 =item B<clone>(out PMC, invar PMC, in PMC)
382 Makes a copy of the PMC in $2 and puts it in $1, using the arguments in $3.
386 inline op clone(out PMC, invar PMC, in PMC) :base_mem {
387 $1 = VTABLE_clone_pmc(interp, $2, $3);
390 =item B<copy>(inout PMC, invar PMC)
392 Morphs the PMC in $1 to the type of the PMC in $2, then assigns $2 to $1.
396 inline op copy(inout PMC, invar PMC) :base_mem {
397 if (PMC_IS_NULL($1)) {
398 opcode_t * const dest = expr NEXT();
399 opcode_t * const handler = Parrot_ex_throw_from_op_args(interp, dest,
400 EXCEPTION_NULL_REG_ACCESS, "Null PMC in copy");
401 goto ADDRESS(handler);
404 PMC * const clone = VTABLE_clone(interp, $2);
405 /* Preserve the metadata on the destination. */
406 PMC * const meta = VTABLE_getprops(interp, $1);
408 /* avoid leaks and unreachable memory by destroying the destination PMC */
409 Parrot_pmc_destroy(interp, $1);
411 /* the source PMC knows how to clone itself, but we must reuse the
412 * destination header */
413 memmove($1, clone, sizeof (PMC));
415 /* don't let the clone's destruction destroy the destination's data */
416 PObj_custom_destroy_CLEAR(clone);
417 PMC_data(clone) = NULL;
418 PMC_metadata(clone) = NULL;
420 /* Restore metadata. */
421 if (!PMC_IS_NULL(meta)) {
422 PMC * const iter = VTABLE_get_iter(interp, meta);
423 while (VTABLE_get_bool(interp, iter)) {
424 STRING * const key = VTABLE_shift_string(interp, iter);
425 PMC * const value = VTABLE_get_pmc_keyed_str(interp, meta, key);
426 VTABLE_setprop(interp, $1, key, value);
436 ###############################################################################
438 =head2 Register operations
440 These operations effect entire sets of registers.
446 ########################################
448 =item B<null>(out INT)
450 =item B<null>(out NUM)
452 Set register $1 to zero.
454 =item B<null>(out STR)
456 Set register $1 to a NULL string value.
458 =item B<null>(out PMC)
460 Set register $1 to PMCNULL.
464 inline op null(out STR) :base_core {
468 inline op null(out INT) :base_core {
472 inline op null(out PMC) :base_core {
476 inline op null(out NUM) :base_core {
484 ###############################################################################
488 Copyright (C) 2001-2010, Parrot Foundation.
492 This program is free software. It is subject to the same license
493 as the Parrot interpreter itself.
499 * c-file-style: "parrot"
501 * vim: expandtab shiftwidth=4: