OK, I've revised the tests for C<set Sx, Px> in line with Alex's
concerns, and added explicit tests for PerlInts and PerlNums. As yet
there are still no PerlArray or PerlHash tests.
Re the former, am I right in thinking that assignment from a PerlArray
to a non-PMC register should always be in scalar context; ie that:
new P0, PerlArray
set S0, P0
should lead to S0 having the value "0" and not ""?
Simon
--- core.ops.old Fri Feb 1 15:57:44 2002
+++ core.ops Fri Feb 1 15:59:10 2002
@@ -527,6 +527,11 @@
goto NEXT();
}
+inline op set(out STR, in PMC) {
+ $1 = $2->vtable->get_string(interpreter, $2);
+ goto NEXT();
+}
+
inline op set(out STR, in STR) {
$1 = string_copy(interpreter, $2);
goto NEXT();
--- t/pmc/pmc.t.old Mon Feb 4 13:55:15 2002
+++ t/pmc/pmc.t Mon Feb 4 15:13:20 2002
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 58;
+use Parrot::Test tests => 61;
use Test::More;
my $fp_equality_macro = <<'ENDOFMACRO';
@@ -816,7 +816,103 @@
foo
OUTPUT
+output_is(<<'CODE', <<'OUTPUT', "set/get string value");
+ new P0, PerlInt
+ set P0, "foo"
+ set S0, P0
+ eq S0, "foo", OK1
+ print "not "
+OK1: print "ok 1\n"
+
+ set P0, "\0"
+ set S0, P0
+ eq S0, "\0", OK2
+ print "not "
+OK2: print "ok 2\n"
+
+ set P0, ""
+ set S0, P0
+ eq S0, "", OK3
+ print "not "
+OK3: print "ok 3\n"
+
+ set P0, 0
+ set S0, P0
+ eq S0, "0", OK4
+ print "not "
+OK4: print "ok 4\n"
+
+ set P0, 0.0
+ set S0, P0
+ eq S0, "0.000000", OK5
+ print "not "
+OK5: print "ok 5\n"
+
+ set P0, "0b000001"
+ set S0, P0
+ eq S0, "0b000001", OK6
+ print "not "
+OK6: print "ok 6\n"
+ end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
+OUTPUT
+
+# The same for PerlNums...
+
+output_is(<<'CODE', <<'OUTPUT', "set/get string value");
+ new P0, PerlNum
+ set P0, "bar"
+ set S0, P0
+ eq S0, "bar", OK1
+ print "not "
+OK1: print "ok 1\n"
+
+ set P0, "\0"
+ set S0, P0
+ eq S0, "\0", OK2
+ print "not "
+OK2: print "ok 2\n"
+
+ set P0, ""
+ set S0, P0
+ eq S0, "", OK3
+ print "not "
+OK3: print "ok 3\n"
+
+ set P0, -1
+ set S0, P0
+ eq S0, "-1", OK4
+ print "not "
+OK4: print "ok 4\n"
+
+ set P0, -1.0
+ set S0, P0
+ eq S0, "-1.000000", OK5
+ print "not "
+OK5: print "ok 5\n"
+
+ set P0, "1.23e23"
+ set S0, P0
+ eq S0, "1.23e23", OK6
+ print "not "
+OK6: print "ok 6\n"
+
+ end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
+OUTPUT
output_is(<<CODE, <<OUTPUT, "if (P) - Int");
new P0, PerlInt
@@ -1255,6 +1351,18 @@
0
0
OUTPUT
+
+output_is(<<"CODE", <<'OUTPUT', "undef-string");
+ new P0, PerlUndef
+ set S0, P0
+ eq S0, "", OK
+ print "not "
+OK: print "ok\\n"
+ end
+CODE
+ok
+OUTPUT
+
output_is(<<CODE, <<OUTPUT, "IntQueue test");
new P0,IntQueue
--- t/pmc/perlstring.t.old Mon Feb 4 13:55:26 2002
+++ t/pmc/perlstring.t Mon Feb 4 15:05:58 2002
@@ -1,6 +1,54 @@
#! perl -w
-use Parrot::Test tests => 5;
+use Parrot::Test tests => 6;
+
+output_is(<<CODE, <<OUTPUT, "Set/get strings");
+ new P0, PerlString
+ set P0, "foo"
+ set S0, P0
+ eq S0, "foo", OK1
+ print "not "
+OK1: print "ok 1\\n"
+
+ set P0, "\0"
+ set S0, P0
+ eq S0, "\0", OK2
+ print "not "
+OK2: print "ok 2\\n"
+
+ set P0, ""
+ set S0, P0
+ eq S0, "", OK3
+ print "not "
+OK3: print "ok 3\\n"
+
+ set P0, 123
+ set S0, P0
+ eq S0, "123", OK4
+ print "not "
+OK4: print "ok 4\\n"
+
+ set P0, 1.234567
+ set S0, P0
+ eq S0, "1.234567", OK5
+ print "not "
+OK5: print "ok 5\\n"
+
+ set P0, "0xFFFFFF"
+ set S0, P0
+ eq S0, "0xFFFFFF", OK6
+ print "not "
+OK6: print "ok 6\\n"
+
+ end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
+OUTPUT
output_is(<<CODE, <<OUTPUT, "ensure that concat ppp copies strings");
new P0, PerlString