fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / src / ops / set.ops
blob55b6355ba4f5bfe11e5654ffaf8d76d7b5333e4d
1 /*
2  * $Id$
3 ** set.ops
4 */
6 =head1 NAME
8 set.ops - Assignment Opcodes
10 =head1 DESCRIPTION
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.
17 =over 4
19 =cut
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.
28 =cut
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)
34        : $2;
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)
82 Set $1 to $2.
84 =cut
86 inline op set(out INT, in INT) :base_core {
87     $1 = $2;
90 inline op set(out INT, in NUM) :base_core {
91     $1 = (INTVAL)($2);
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 {
99     $1 = $2;
102 inline op set(out NUM, in INT) :base_core {
103     $1 = (FLOATVAL)$2;
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 {
119     $1 = $2;
122 inline op set(out STR, inconst STR) :base_core {
123     $1 = $2;
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 {
135     $1 = $2;
138 inline op set(out PMC, invar PMC) :base_core {
139     $1 = $2;
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);
161 =back
163 =cut
165 ########################################
167 =head2 PMC assignment operations: Px = x
169 =over 4
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.
196 =cut
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 {
215     $1 = $2;
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);
226 =back
228 =cut
230 ########################################
232 =head2 Keyed set operations: Px[ INTKEY ] = Bx
234 =over 4
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)
244 =cut
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);
262 =back
264 =cut
266 ########################################
268 =head2 Keyed get operations: Ax = Px[ INTKEY ]
270 =over 4
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)
280 =cut
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);
298 =back
300 =cut
302 ########################################
304 =head2 Keyed set operations: Px[ KEY ] = Bx
306 =over 4
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)
316 =cut
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);
334 =back
336 =cut
338 ########################################
340 =head2 Keyed get operations: Ax = Px[ KEY ]
342 =over 4
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)
352 =cut
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.
374 =cut
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.
384 =cut
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.
394 =cut
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);
402     }
403     else {
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);
427             }
428         }
429     }
432 =back
434 =cut
436 ###############################################################################
438 =head2 Register operations
440 These operations effect entire sets of registers.
442 =over 4
444 =cut
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.
462 =cut
464 inline op null(out STR) :base_core {
465     $1 = STRINGNULL;
468 inline op null(out INT) :base_core {
469     $1 = 0;
472 inline op null(out PMC) :base_core {
473     $1 = PMCNULL;
476 inline op null(out NUM) :base_core {
477     $1 = 0;
480 =back
482 =cut
484 ###############################################################################
486 =head1 COPYRIGHT
488 Copyright (C) 2001-2010, Parrot Foundation.
490 =head1 LICENSE
492 This program is free software. It is subject to the same license
493 as the Parrot interpreter itself.
495 =cut
498  * Local variables:
499  *   c-file-style: "parrot"
500  * End:
501  * vim: expandtab shiftwidth=4:
502  */