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



 This patch fixes the lookback ops to work properly when given negative
 offsets, and adds a test of them to stacks.t

 Simon

--- core.ops.old        Tue Jul  2 19:05:23 2002
+++ core.ops    Tue Jul  2 19:05:50 2002
@@ -3336,9 +3336,8 @@ op lookback(out INT, in INT) {
   /* If they're counting up from the bottom, figure out where we'd be
      if we counted down from the top */
   if (depth < 0) {
-    depth += 1;
     total_depth = stack_height(interpreter, interpreter->user_stack);
-    depth = total_depth - depth;
+    depth = total_depth + depth;
     if (depth < 0) {
       internal_exception(99, "Stack depth wrong");
     }
@@ -3359,9 +3358,8 @@ op lookback(out STR, in INT) {
   /* If they're counting up from the bottom, figure out where we'd be
      if we counted down from the top */
   if (depth < 0) {
-    depth += 1;
     total_depth = stack_height(interpreter, interpreter->user_stack);
-    depth = total_depth - depth;
+    depth = total_depth + depth;
     if (depth < 0) {
       internal_exception(99, "Stack depth wrong");
     }
@@ -3382,9 +3380,8 @@ op lookback(out NUM, in INT) {
   /* If they're counting up from the bottom, figure out where we'd be
      if we counted down from the top */
   if (depth < 0) {
-    depth += 1;
     total_depth = stack_height(interpreter, interpreter->user_stack);
-    depth = total_depth - depth;
+    depth = total_depth + depth;
     if (depth < 0) {
       internal_exception(99, "Stack depth wrong");
     }
@@ -3405,9 +3402,8 @@ op lookback(out PMC, in INT) {
   /* If they're counting up from the bottom, figure out where we'd be
      if we counted down from the top */
   if (depth < 0) {
-    depth += 1;
     total_depth = stack_height(interpreter, interpreter->user_stack);
-    depth = total_depth - depth;
+    depth = total_depth + depth;
     if (depth < 0) {
       internal_exception(99, "Stack depth wrong");
     }


--- t/op/stacks.t.old   Tue Jul  2 18:46:52 2002
+++ t/op/stacks.t       Tue Jul  2 19:17:48 2002
@@ -1,6 +1,6 @@
 #! perl -w

-use Parrot::Test tests => 34;
+use Parrot::Test tests => 35;
 use Test::More;

 # Tests for stack operations, currently push*, push_*_c and pop*
@@ -736,6 +736,73 @@ $code .= "      end\n";
 $code .= "FAIL: end\n";
 output_is($code, $output, "pushn & popn (deep)" );

+
+output_is(<<CODE, <<'OUTPUT', "lookback");
+@{[ $fp_equality_macro ]}
+        save 1
+        save 1.0
+        save "Foo"
+
+        new P12, .PerlHash
+        set P12["Apple"], "Banana"
+        save P12
+
+        lookback P0, 0
+        lookback S0, 1
+        lookback N0, 2
+        lookback I0, 3
+
+        set S2, P0["Apple"]
+        eq S2, "Banana", OK1
+        print "not "
+OK1:    print "ok 1\\n"
+
+        eq I0, 1, OK2
+        print "not "
+OK2:    print "ok 2\\n"
+
+        .fp_eq (N0, 1.0, OK3)
+        print "not "
+OK3:    print "ok 3\\n"
+
+        eq S0, "Foo", OK4
+        print "not "
+OK4:    print "ok 4\\n"
+
+        lookback I1, -1
+        lookback N1, -2
+        lookback S1, -3
+        lookback P1, -4
+
+        eq I0, 1, OK5
+        print "not "
+OK5:    print "ok 5\\n"
+
+        .fp_eq (N0, 1.0, OK6)
+        print "not "
+OK6:    print "ok 6\\n"
+
+        eq S0, "Foo", OK7
+        print "not "
+OK7:    print "ok 7\\n"
+
+        set S3, P1["Apple"]
+        eq S3, "Banana", OK8
+        print "not "
+OK8:    print "ok 8\\n"
+
+        end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
+ok 7
+ok 8
+OUTPUT
+
 ##############################

 # set integer registers to some value given by $code...




Reply via email to