This patch is a collection of a few small fixes vaguely related to the
lexical pads.  It implements pop_pad(out PMC), banishes Intval in
favor of INTVAL, and adds some newlines to internal_exception calls.

Luke

Index: core.ops
===================================================================
RCS file: /cvs/public/parrot/core.ops,v
retrieving revision 1.274
diff -u -r1.274 core.ops
--- core.ops    30 May 2003 01:06:23 -0000      1.274
+++ core.ops    1 Jun 2003 07:05:31 -0000
@@ -3855,7 +3855,7 @@
 =item B<pop_pad>(out PMC)
 
 Pop the current lexical scope pad off the stack and store
-it in $1 (XXX JPS: not implemented yet).
+it in $1.
 
 =item B<peek_pad>(out PMC)
 
@@ -3931,6 +3931,13 @@
 op pop_pad() {
     stack_pop(interpreter, &interpreter->ctx.pad_stack,
               NULL, STACK_ENTRY_PMC);
+    goto NEXT();
+}
+
+op pop_pad(out PMC) {
+    $1 = new_pmc_header(interpreter);
+    stack_pop(interpreter, &interpreter->ctx.pad_stack,
+              &$1, STACK_ENTRY_PMC);
     goto NEXT();
 }
 
Index: stacks.c
===================================================================
RCS file: /cvs/public/parrot/stacks.c,v
retrieving revision 1.50
diff -u -r1.50 stacks.c
--- stacks.c    31 Jan 2003 16:41:02 -0000      1.50
+++ stacks.c    1 Jun 2003 07:05:31 -0000
@@ -118,7 +118,7 @@
    Returns NULL if |depth| > number of entries in stack
 */
 Stack_Entry_t *
-stack_entry(Interp *interpreter, Stack_Chunk_t *stack, Intval depth)
+stack_entry(Interp *interpreter, Stack_Chunk_t *stack, INTVAL depth)
 {
     Stack_Chunk_t *chunk;
     Stack_Entry_t *entry = NULL;
@@ -150,11 +150,11 @@
    is bubble down, so that the Nth element becomes the top most element.
 */
 void
-rotate_entries(Interp *interpreter, Stack_Chunk_t *stack, Intval num_entries)
+rotate_entries(Interp *interpreter, Stack_Chunk_t *stack, INTVAL num_entries)
 {
     Stack_Entry_t temp;
-    Intval i;
-    Intval depth = num_entries - 1;
+    INTVAL i;
+    INTVAL depth = num_entries - 1;
 
     if (num_entries >= -1 && num_entries <= 1) {
         return;
@@ -251,10 +251,10 @@
     /* Store our thing */
     switch (type) {
     case STACK_ENTRY_INT:
-        entry->entry.int_val = *(Intval *)thing;
+        entry->entry.int_val = *(INTVAL *)thing;
         break;
     case STACK_ENTRY_FLOAT:
-        entry->entry.num_val = *(Floatval *)thing;
+        entry->entry.num_val = *(FLOATVAL *)thing;
         break;
     case STACK_ENTRY_PMC:
         entry->entry.pmc_val = (PMC *)thing;
@@ -342,10 +342,10 @@
     /* Snag the value */
     switch (type) {
     case STACK_ENTRY_INT:
-        *(Intval *)where = entry->entry.int_val;
+        *(INTVAL *)where = entry->entry.int_val;
         break;
     case STACK_ENTRY_FLOAT:
-        *(Floatval *)where = entry->entry.num_val;
+        *(FLOATVAL *)where = entry->entry.num_val;
         break;
     case STACK_ENTRY_PMC:
         *(PMC **)where = entry->entry.pmc_val;
Index: sub.c
===================================================================
RCS file: /cvs/public/parrot/sub.c,v
retrieving revision 1.18
diff -u -r1.18 sub.c
--- sub.c       29 Jan 2003 18:34:02 -0000      1.18
+++ sub.c       1 Jun 2003 07:05:31 -0000
@@ -82,7 +82,7 @@
         pad->cache.int_val + scope_index : scope_index;
 
     if (scope_index >= pad->cache.int_val || scope_index < 0) {
-        internal_exception(-1, "Pad index out of range");
+        internal_exception(-1, "Pad index out of range\n");
         return NULL;
     }
 
@@ -211,7 +211,7 @@
     if (name) {
         /* use name to find lex and position */
         lex = scratchpad_find(interp, pad, name, &position);
-        if (!lex) internal_exception(-1, "Lexical not found");
+        if (!lex) internal_exception(-1, "Lexical not found\n");
     }
     else {
         /* assume current lexical pad */
@@ -255,7 +255,7 @@
     if (name) lex = scratchpad_find(interp, pad, name, &position);
     else lex = scratchpad_index(interp, pad, -1);
 
-    if (!lex) internal_exception(-1, "Lexical not found");
+    if (!lex) internal_exception(-1, "Lexical not found\n");
 
     return *(PMC **)list_get(interp, lex->values, position, enum_type_PMC);
 }
@@ -271,7 +271,7 @@
     }
 
     if (!lex || position < 0 || position >= list_length(interp, lex->values)) {
-        internal_exception(-1, "Lexical not found");
+        internal_exception(-1, "Lexical not found\n");
     }
 
     return *(PMC **)list_get(interp, lex->values, position, enum_type_PMC);
Index: include/parrot/stacks.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/stacks.h,v
retrieving revision 1.24
diff -u -r1.24 stacks.h
--- include/parrot/stacks.h     26 Jun 2002 00:03:19 -0000      1.24
+++ include/parrot/stacks.h     1 Jun 2003 07:05:31 -0000
@@ -39,8 +39,8 @@
 
 typedef struct Stack_Entry {
     union {
-        Floatval num_val;
-        Intval   int_val;
+        FLOATVAL num_val;
+        INTVAL   int_val;
         PMC     *pmc_val;
         String  *string_val;
         void    *generic_pointer;
@@ -77,10 +77,10 @@
 size_t stack_height(Interp *interpreter, Stack_Chunk_t *stack_base);
 
 Stack_Entry_t * stack_entry(Interp *intepreter, Stack_Chunk_t *stack_base, 
-                          Intval stack_depth);
+                          INTVAL stack_depth);
 
 void rotate_entries(Interp *interpreter, Stack_Chunk_t *stack_base,
-                    Intval num_entries);
+                    INTVAL num_entries);
 
 void stack_push(Interp *interpreter, Stack_Chunk_t **stack_base,
                 void *thing, Stack_entry_type type, 
Index: t/op/lexicals.t
===================================================================
RCS file: /cvs/public/parrot/t/op/lexicals.t,v
retrieving revision 1.4
diff -u -r1.4 lexicals.t
--- t/op/lexicals.t     15 Nov 2002 23:44:08 -0000      1.4
+++ t/op/lexicals.t     1 Jun 2003 07:05:31 -0000
@@ -194,11 +194,17 @@
         print P20
         print "\\n"
 
-        pop_pad
+        pop_pad P7
         find_lex P20, "a"
         print P20
         print "\\n"
 
+        push_pad P7
+        find_lex P20, "a"
+        print P20
+        print "\\n"
+        pop_pad
+
         peek_pad P22
         pop_pad
         find_lex P20, "a"
@@ -215,6 +221,7 @@
 7
 46
 7
+46
 12
 7
 OUTPUT

Reply via email to