# New Ticket Created by  Leopold Toetsch 
# Please include the string:  [perl #17026]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=17026 >


core.ops has currently:

- obvious errors e.g.
    -inline op mul (out PMC, out PMC, out PMC) {

- wrong docu and minor typos e.g.
    -=item B<loadlib>(in PMC, in STR)

- and finally (as discussed in perl6-internals, "core ops ARGDIR"), 
wrong ARGDIRs for PMCs:

This patch changes almost all PMCs to inout, actually these, where a 
vtable is called, because the underlying PMC has to exist at this moment.

This patch is crucial[1] for the waiting big imcc update.

[1] imcc does now a full life analysis of all symbols. The register 
allocator depends on this life info for register reusing, so getting 
this right is *really* important.

This patch is tested with imcc/perl6 from CVS as well as with my imcc 
version, and has currently no impacts on other parts of parrot, though 
the JIT people might have a closer look at it.

$ perl6 --test -Rj  # run all perl6 tests jitted

brings the same result as w/o the patch (i386-linux) (i.e. 2 additional 
failures, which might hide somewhere in JIT code).

Please apply,
leo


-- attachment  1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/36596/29540/29af40/core.ops.diff

--- core.ops    Thu Sep  5 06:43:27 2002
+++ /home/lt/src/parrot-leo/core.ops    Thu Sep  5 09:26:20 2002
@@ -485,13 +485,13 @@
 
 =item B<set>(out NUM, in STR)
 
-=item B<set>(out PMC, in INT)
+=item B<set>(inout PMC, in INT)
 
-=item B<set>(out PMC, in NUM)
+=item B<set>(inout PMC, in NUM)
 
 =item B<set>(out PMC, in PMC)
 
-=item B<set>(out PMC, in STR)
+=item B<set>(inout PMC, in STR)
 
 =item B<set>(out STR, in INT)
 
@@ -570,17 +570,17 @@
   goto NEXT();
 }
 
-inline op set(out PMC, in INT) { 
+inline op set(inout PMC, in INT) {
   $1->vtable->set_integer_native(interpreter, $1, $2);
   goto NEXT();
 }
 
-inline op set(out PMC, in NUM) { 
+inline op set(inout PMC, in NUM) {
   $1->vtable->set_number_native(interpreter, $1, $2);
   goto NEXT();
 }
 
-inline op set(out PMC, in STR) {
+inline op set(inout PMC, in STR) {
   $1->vtable->set_string_native(interpreter, $1, $2);
   goto NEXT();
 }
@@ -594,32 +594,32 @@
 
 =head2 PMC assignment operations: Px = x
 
-=item B<assign>(out PMC, in INT)
+=item B<assign>(inout PMC, in INT)
 
-=item B<assign>(out PMC, in NUM)
+=item B<assign>(inout PMC, in NUM)
 
-=item B<assign>(out PMC, in PMC)
+=item B<assign>(inout PMC, in PMC)
 
-=item B<assign>(out PMC, in STR)
+=item B<assign>(inout PMC, in STR)
 
 =cut
 
-inline op assign(out PMC, in PMC) {
+inline op assign(inout PMC, in PMC) {
   $1->vtable->set_pmc(interpreter, $1, $2);
   goto NEXT();
 }
 
-inline op assign(out PMC, in INT) {
+inline op assign(inout PMC, in INT) {
   $1->vtable->set_integer_native(interpreter, $1, $2);
   goto NEXT();
 }
 
-inline op assign(out PMC, in NUM) {
+inline op assign(inout PMC, in NUM) {
   $1->vtable->set_number_native(interpreter, $1, $2);
   goto NEXT();
 }
 
-inline op assign(out PMC, in STR) {
+inline op assign(inout PMC, in STR) {
   $1->vtable->set_string_native(interpreter, $1, $2);
   goto NEXT();
 }
@@ -628,41 +628,41 @@
 
 =head2 Keyed set operations: Px[ INTKEY ] = Bx
 
-=item B<set>(out PMC, in INTKEY, in INT)
+=item B<set>(inout PMC, in INTKEY, in INT)
 
-=item B<set>(out PMC, in INTKEY, in NUM)
+=item B<set>(inout PMC, in INTKEY, in NUM)
 
-=item B<set>(out PMC, in INTKEY, in STR)
+=item B<set>(inout PMC, in INTKEY, in STR)
 
-=item B<set>(out PMC, in INTKEY, in PMC)
+=item B<set>(inout PMC, in INTKEY, in PMC)
 
 =cut
 
-inline op set (out PMC, in INTKEY, in INT)  {
+inline op set (inout PMC, in INTKEY, in INT)  {
     INTVAL key = $2;
     $1->vtable->set_integer_keyed_int(interpreter, $1, &key, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in INTKEY, in NUM)  {
+inline op set (inout PMC, in INTKEY, in NUM)  {
     INTVAL key = $2;
     $1->vtable->set_number_keyed_int(interpreter, $1, &key, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in INTKEY, in STR)  {
+inline op set (inout PMC, in INTKEY, in STR)  {
     INTVAL key = $2;
     $1->vtable->set_string_keyed_int(interpreter, $1, &key, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in INTKEY, in PMC)  {
+inline op set (inout PMC, in INTKEY, in PMC)  {
     INTVAL key = $2;
     $1->vtable->set_pmc_keyed_int(interpreter, $1, &key, $3, NULL);
     goto NEXT();
 }
 
-=head2 Keyed set operations: Ax = Px[ INTKEY ]
+=head2 Keyed get operations: Ax = Px[ INTKEY ]
 
 =cut
 
@@ -672,7 +672,7 @@
 
 =item B<set>(out STR, in PMC, in INTKEY)
 
-=item B<set>(out PMC, in PMC, in INTKEY)
+=item B<set>(inout PMC, in PMC, in INTKEY)
 
 =cut
 
@@ -694,7 +694,7 @@
     goto NEXT();
 }
 
-inline op set (out PMC, in PMC, in INTKEY) {
+inline op set (inout PMC, in PMC, in INTKEY) {
     INTVAL key = $3;
     $1 = $2->vtable->get_pmc_keyed_int(interpreter, $2, &key);
     goto NEXT();
@@ -703,37 +703,37 @@
 
 =head2 Keyed set operations: Px[ KEY ] = Bx
 
-=item B<set>(out PMC, in KEY, in INT)
+=item B<set>(inout PMC, in KEY, in INT)
 
-=item B<set>(out PMC, in KEY, in NUM)
+=item B<set>(inout PMC, in KEY, in NUM)
 
-=item B<set>(out PMC, in KEY, in STR)
+=item B<set>(inout PMC, in KEY, in STR)
 
-=item B<set>(out PMC, in KEY, in PMC)
+=item B<set>(inout PMC, in KEY, in PMC)
 
 =cut
 
-inline op set (out PMC, in KEY, in INT)  {
+inline op set (inout PMC, in KEY, in INT)  {
     $1->vtable->set_integer_keyed(interpreter, $1, $2, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in KEY, in NUM)  {
+inline op set (inout PMC, in KEY, in NUM)  {
     $1->vtable->set_number_keyed(interpreter, $1, $2, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in KEY, in STR)  {
+inline op set (inout PMC, in KEY, in STR)  {
     $1->vtable->set_string_keyed(interpreter, $1, $2, $3);
     goto NEXT();
 }
 
-inline op set (out PMC, in KEY, in PMC)  {
+inline op set (inout PMC, in KEY, in PMC)  {
     $1->vtable->set_pmc_keyed(interpreter, $1, $2, $3, NULL);
     goto NEXT();
 }
 
-=head2 Keyed set operations: Ax = Px[ KEY ]
+=head2 Keyed get operations: Ax = Px[ KEY ]
 
 =item B<set>(out INT, in PMC, in KEY)
 
@@ -741,7 +741,7 @@
 
 =item B<set>(out STR, in PMC, in KEY)
 
-=item B<set>(out PMC, in PMC, in KEY)
+=item B<set>(inout PMC, in PMC, in KEY)
 
 =cut
 
@@ -760,18 +760,18 @@
     goto NEXT();
 }
 
-inline op set (out PMC, in PMC, in KEY)  {
+inline op set (inout PMC, in PMC, in KEY)  {
     $1 = $2->vtable->get_pmc_keyed(interpreter, $2, $3);
     goto NEXT();
 }
 
 =head2 Keyed set operations: Px[ KEY ] = Px[ KEY ]
 
-=item B<set>(out PMC, in KEY, in PMC, in KEY)
+=item B<set>(inout PMC, in KEY, in PMC, in KEY)
 
 =cut
 
-inline op set (out PMC, in KEY, in PMC, in KEY)  {
+inline op set (inout PMC, in KEY, in PMC, in KEY)  {
     $1->vtable->set_pmc_keyed(interpreter, $1, $2, $3, $4);
     goto NEXT();
 }
@@ -1306,9 +1306,9 @@
 
 =item B<add>(out NUM, in NUM, in NUM)
 
-=item B<add>(out PMC, in PMC, in INT)
+=item B<add>(inout PMC, in PMC, in INT)
 
-=item B<add>(out PMC, in PMC, in PMC)
+=item B<add>(inout PMC, in PMC, in PMC)
 
 Set $1 to the sum of $2 and $3.
 
@@ -1349,12 +1349,12 @@
   goto NEXT();
 }
 
-inline op add(out PMC, in PMC, in INT) {
+inline op add(inout PMC, in PMC, in INT) {
   $2->vtable->add_int(interpreter, $2, $3, $1);
   goto NEXT();
 }
 
-inline op add (out PMC, in PMC, in PMC) {
+inline op add (inout PMC, in PMC, in PMC) {
   $2->vtable->add(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1473,7 +1473,7 @@
 
 =item B<div>(out NUM, in NUM, in NUM)
 
-=item B<div>(out PMC, in PMC, in PMC)
+=item B<div>(inout PMC, in PMC, in PMC)
 
 =item B<div>(inout PMC, in INT)
 
@@ -1492,7 +1492,7 @@
   goto NEXT();
 }
 
-inline op div (out PMC, out PMC, out PMC) {
+inline op div (inout PMC, in PMC, in PMC) {
   $2->vtable->divide(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1554,7 +1554,7 @@
   [2] Ronald L. Graham, Donald E. Knuth and Oren Patashnik, *Concrete
       Mathematics*, Second Edition. Addison-Wesley, 1994.
 
-=item B<mod>(out PMC, in PMC, in PMC)
+=item B<mod>(inout PMC, in PMC, in PMC)
 
 Sets $1 to the modulus of $2 and $3.
 
@@ -1591,7 +1591,7 @@
   goto NEXT();
 }
 
-inline op mod (out PMC, out PMC, out PMC) {
+inline op mod (inout PMC, in PMC, in PMC) {
   $2->vtable->modulus(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1644,7 +1644,7 @@
 
 =item B<mul>(out NUM, in NUM, in NUM)
 
-=item B<mul>(out PMC, in PMC, in PMC)
+=item B<mul>(inout PMC, in PMC, in PMC)
 
 Set $1 to the product of $2 and $3.
 
@@ -1665,7 +1665,7 @@
   goto NEXT();
 }
 
-inline op mul (inout PMC, out PMC) {
+inline op mul (inout PMC, in PMC) {
   $1->vtable->multiply(interpreter, $1, $2, $1);
   goto NEXT();
 }
@@ -1680,7 +1680,7 @@
   goto NEXT();
 }
 
-inline op mul (out PMC, out PMC, out PMC) {
+inline op mul (inout PMC, in PMC, in PMC) {
   $2->vtable->multiply(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1697,7 +1697,7 @@
 
 =item B<neg>(out NUM, in NUM)
 
-=item B<neg>(out PMC, in PMC)
+=item B<neg>(inout PMC, in PMC)
 
 Set $1 to the negative of $2.
 
@@ -1723,7 +1723,7 @@
   goto NEXT();
 }
 
-inline op neg(out PMC, in PMC) {
+inline op neg(inout PMC, in PMC) {
   $2->vtable->neg(interpreter, $2, $1);
   goto NEXT();
 }
@@ -1781,9 +1781,9 @@
 
 =item B<sub>(out NUM, in NUM, in NUM)
 
-=item B<sub>(out PMC, in PMC, in INT)
+=item B<sub>(inout PMC, in PMC, in INT)
 
-=item B<sub>(out PMC, in PMC, in PMC)
+=item B<sub>(inout PMC, in PMC, in PMC)
 
 Set $1 to $2 minus $3.
 
@@ -1824,12 +1824,12 @@
   goto NEXT();
 }
 
-inline op sub(out PMC, in PMC, in INT) {
+inline op sub(inout PMC, in PMC, in INT) {
   $2->vtable->subtract_int(interpreter, $2, $3, $1);
   goto NEXT();
 }
 
-inline op sub (out PMC, out PMC, out PMC) {
+inline op sub (inout PMC, in PMC, in PMC) {
   $2->vtable->subtract(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1879,7 +1879,7 @@
 
 =item B<concat>(out STR, in STR, in STR)
 
-=item B<concat>(out PMC, in PMC, in PMC)
+=item B<concat>(inout PMC, in PMC, in PMC)
 
 Append the string in $2 to the string in $1.
 
@@ -1898,7 +1898,7 @@
   goto NEXT();
 }
 
-inline op concat (out PMC, out PMC, out PMC) {
+inline op concat (inout PMC, in PMC, in PMC) {
   $2->vtable->concatenate(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -1907,7 +1907,7 @@
 
 =item B<repeat>(out STR, in STR, in INT)
 
-=item B<repeat>(out PMC, in PMC, in PMC)
+=item B<repeat>(inout PMC, in PMC, in PMC)
 
 Repeats string $2 $3 times and stores result in $1.
 
@@ -1921,7 +1921,7 @@
   goto NEXT();
 }
 
-inline op repeat (out PMC, in PMC, in PMC) {
+inline op repeat (inout PMC, in PMC, in PMC) {
   $2->vtable->repeat(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2553,9 +2553,9 @@
 
 =item B<band>(out INT, in INT, in INT)
 
-=item B<band>(out PMC, in PMC, in INT)
+=item B<band>(inout PMC, in PMC, in INT)
 
-=item B<band>(out PMC, in PMC, in PMC)
+=item B<band>(inout PMC, in PMC, in PMC)
 
 Set the bits of $1 according to the B<and> of the corresponding bits from $2 and $3.
 
@@ -2581,12 +2581,12 @@
   goto NEXT();
 }
 
-inline op band(out PMC, in PMC, in INT) {
+inline op band(inout PMC, in PMC, in INT) {
   $2->vtable->bitwise_and_int(interpreter, $2, $3, $1);
   goto NEXT();
 }
 
-inline op band(out PMC, in PMC, in PMC) {
+inline op band(inout PMC, in PMC, in PMC) {
   $2->vtable->bitwise_and(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2595,7 +2595,7 @@
 
 =item B<bnot>(out INT, in INT)
 
-=item B<bnot>(out PMC, in PMC)
+=item B<bnot>(inout PMC, in PMC)
 
 Set the bits of $1 to the B<not> of the corresponding bits from $2.
 
@@ -2606,7 +2606,7 @@
   goto NEXT();
 }
 
-inline op bnot(out PMC, in PMC) {
+inline op bnot(inout PMC, in PMC) {
   $2->vtable->bitwise_not(interpreter, $2, $1);
   goto NEXT();
 }
@@ -2623,9 +2623,9 @@
 
 =item B<bor>(out INT, in INT, in INT)
 
-=item B<bor>(out PMC, in PMC, in INT)
+=item B<bor>(inout PMC, in PMC, in INT)
 
-=item B<bor>(out PMC, in PMC, in PMC)
+=item B<bor>(inout PMC, in PMC, in PMC)
 
 Set the bits of $1 according to the B<or> of the corresponding bits from $2 and $3.
 
@@ -2651,12 +2651,12 @@
   goto NEXT();
 }
 
-inline op bor(out PMC, in PMC, in INT) {
+inline op bor(inout PMC, in PMC, in INT) {
   $2->vtable->bitwise_or_int(interpreter, $2, $3, $1);
   goto NEXT();
 }
 
-inline op bor(out PMC, in PMC, in PMC) {
+inline op bor(inout PMC, in PMC, in PMC) {
   $2->vtable->bitwise_or(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2665,7 +2665,7 @@
 
 =item B<shl>(out INT, in INT, in INT)
 
-=item B<shl>(out PMC, in PMC, in PMC)
+=item B<shl>(inout PMC, in PMC, in PMC)
 
 Set $1 to the value of $2 shifted left by $3 bits.
 
@@ -2676,7 +2676,7 @@
   goto NEXT();
 }
 
-inline op shl(out PMC, in PMC, in PMC) {
+inline op shl(inout PMC, in PMC, in PMC) {
   $2->vtable->bitwise_shl(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2685,7 +2685,7 @@
 
 =item B<shr>(out INT, in INT, in INT)
 
-=item B<shr>(out PMC, in PMC, in PMC)
+=item B<shr>(inout PMC, in PMC, in PMC)
 
 Set $1 to the value of $2 shifted right by $3 bits.
 
@@ -2696,7 +2696,7 @@
   goto NEXT();
 }
 
-inline op shr(out PMC, in PMC, in PMC) {
+inline op shr(inout PMC, in PMC, in PMC) {
   $2->vtable->bitwise_shr(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2726,9 +2726,9 @@
 
 =item B<bxor>(out INT, in INT, in INT)
 
-=item B<bxor>(out PMC, in PMC, in INT)
+=item B<bxor>(inout PMC, in PMC, in INT)
 
-=item B<bxor>(out PMC, in PMC, in PMC)
+=item B<bxor>(inout PMC, in PMC, in PMC)
 
 Set the bits of $1 according to the B<xor> of the corresponding bits from $2 and $3.
 
@@ -2754,12 +2754,12 @@
   goto NEXT();
 }
 
-inline op bxor(out PMC, in PMC, in INT) {
+inline op bxor(inout PMC, in PMC, in INT) {
   $2->vtable->bitwise_xor_int(interpreter, $2, $3, $1);
   goto NEXT();
 }
 
-inline op bxor(out PMC, in PMC, in PMC) {
+inline op bxor(inout PMC, in PMC, in PMC) {
   $2->vtable->bitwise_xor(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2784,7 +2784,7 @@
 
 =item B<and>(out INT, in INT, in INT)
 
-=item B<and>(out PMC, in PMC, in PMC)
+=item B<and>(inout PMC, in PMC, in PMC)
 
 Short-circuiting logical and.  Returns $2 if it's false, else returns $3.
 
@@ -2795,7 +2795,7 @@
   goto NEXT();
 }
 
-inline op and(out PMC, in PMC, in PMC) {
+inline op and(inout PMC, in PMC, in PMC) {
   $2->vtable->logical_and(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2804,7 +2804,7 @@
 
 =item B<not>(out INT, in INT)
 
-=item B<not>(out PMC, in PMC)
+=item B<not>(inout PMC, in PMC)
 
 Set the boolean state of $1 to the opposite of the boolean state from $2.
 
@@ -2815,7 +2815,7 @@
   goto NEXT();
 }
 
-inline op not(out PMC, in PMC) {
+inline op not(inout PMC, in PMC) {
   $2->vtable->logical_not(interpreter, $2, $1);
   goto NEXT();
 }
@@ -2824,7 +2824,7 @@
 
 =item B<or>(out INT, in INT, in INT)
 
-=item B<or>(out PMC, in PMC, in PMC)
+=item B<or>(inout PMC, in PMC, in PMC)
 
 Short-circuiting logical or.  Returns $2 if it's true, else returns $3.
 
@@ -2835,7 +2835,7 @@
   goto NEXT();
 }
 
-inline op or(out PMC, in PMC, in PMC) {
+inline op or(inout PMC, in PMC, in PMC) {
   $2->vtable->logical_or(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -2844,7 +2844,7 @@
 
 =item B<xor>(out INT, in INT, in INT)
 
-=item B<xor>(out PMC, in PMC, in PMC)
+=item B<xor>(inout PMC, in PMC, in PMC)
 
 Logical xor.  Returns $2 if it's true and $3 isn't,
 returns $3 if it's true and $2 isn't, else returns false.
@@ -2856,7 +2856,7 @@
   goto NEXT();
 }
 
-inline op xor(out PMC, in PMC, in PMC) {
+inline op xor(inout PMC, in PMC, in PMC) {
   $2->vtable->logical_xor(interpreter, $2, $3, $1);
   goto NEXT();
 }
@@ -4000,7 +4000,7 @@
 Load in an extension. $1 is the name of the extension library, $2 is the
 initialization routine for it.
 
-=item B<loadlib>(in PMC, in STR)
+=item B<loadlib>(out PMC, in STR)
 
 Load a dynamic link library named $2 and store it in $1.
 

Reply via email to