Hey,

Clint brought a small assembler string but to my attention, and I found
another bug while fixing the first. Bugs were:
a) 'a"b"c' was turned into 'a[sc:1]c' before being turned into [sc:2]
b) 'a\"b' was printing being stored as a\"b and not a"b

Below patch fixes. Not sure if my use of the #" 'construct' is good or
bad. :)

Mike Lambert

Index: lib/Parrot/Assembler.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/Assembler.pm,v
retrieving revision 1.20
diff -u -r1.20 Assembler.pm
--- lib/Parrot/Assembler.pm     10 Mar 2002 21:15:50 -0000      1.20
+++ lib/Parrot/Assembler.pm     16 Apr 2002 17:32:55 -0000
@@ -679,8 +679,7 @@
 sub replace_string_constants {
   my $code = shift;

-  $code =~ s{([NU])?"(((\\")|[^"])*)"}{constantize_string($2, $1)}egx;
-  $code =~ s{([NU])?'(((\\')|[^'])*)'}{constantize_string($2, $1)}egx;
+  $code =~ s{([NU]?)(["'])((?:(?:\\\2)|(?!\2).)*)\2}{constantize_string($3, $1)}egx; 
+#"

   return $code;
 }
@@ -1371,7 +1370,9 @@
     'n'  => "\n",
     'r'  => "\r",
     't'  => "\t",
-    '\\' => '\\'
+    '\\' => '\\',
+    '"'  => '"',
+    "'"  => "'",
 );

 sub constantize_string {
@@ -1384,7 +1385,7 @@

     $s=~s/\\(0\d*)/chr(oct($1))/eg;
     $s=~s/\\x([0-9a-fA-F]{1,2})/chr(hex($1))/ge;
-    $s=~s/\\([anrt\\])/$escape{$1}/ge;
+    $s=~s/\\([anrt\\'"])/$escape{$1}/ge; #"

     if(!exists($constants{$s}{s}{$e})) {
        push(@constants, ['s', $s, $e]);
Index: t/op/string.t
===================================================================
RCS file: /cvs/public/parrot/t/op/string.t,v
retrieving revision 1.19
diff -u -r1.19 string.t
--- t/op/string.t       14 Mar 2002 18:45:22 -0000      1.19
+++ t/op/string.t       16 Apr 2002 17:32:55 -0000
@@ -1,6 +1,6 @@
 #! perl -w

-use Parrot::Test tests => 64;
+use Parrot::Test tests => 65;

 output_is( <<'CODE', <<OUTPUT, "set_s_s|sc" );
        set     S4, "JAPH\n"
@@ -797,6 +797,22 @@
  end
 CODE

+output_is(<<CODE, <<OUTPUT, "assembly_string_constants");
+       set S0, "aa'bb'cc\\n"
+       set S1, "aa\\"bb\\'cc\\n"
+       set S2, 'aa"bb"cc\\n'
+       set S3, 'aa\\'bb\\"cc\\n'
+       print S0
+       print S1
+       print S2
+       print S3
+       end
+CODE
+aa'bb'cc
+aa"bb'cc
+aa"bb"cc
+aa'bb"cc
+OUTPUT

 # Set all string registers to values given by &$_[0](reg num)
 sub set_str_regs {


Reply via email to