[svn:parrot] r37063 - in trunk: include/parrot src src/call src/pmc

cotto at svn.parrot.org cotto at svn.parrot.org
Sun Mar 1 13:24:20 UTC 2009


Author: cotto
Date: Sun Mar  1 13:24:20 2009
New Revision: 37063
URL: https://trac.parrot.org/parrot/changeset/37063

Log:
[PMC] Convert the Key PMC to use ATTRs.
This is not the same as making Keys sane.  They're still not.

Modified:
   trunk/include/parrot/key.h
   trunk/src/call/pcc.c
   trunk/src/debug.c
   trunk/src/hash.c
   trunk/src/key.c
   trunk/src/packout.c
   trunk/src/pmc/hash.pmc
   trunk/src/pmc/iterator.pmc
   trunk/src/pmc/key.pmc
   trunk/src/trace.c

Modified: trunk/include/parrot/key.h
==============================================================================
--- trunk/include/parrot/key.h	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/include/parrot/key.h	Sun Mar  1 13:24:20 2009	(r37063)
@@ -121,7 +121,8 @@
         __attribute__nonnull__(2);
 
 PARROT_EXPORT
-void key_set_integer(SHIM_INTERP, ARGMOD(PMC *key), INTVAL value)
+void key_set_integer(PARROT_INTERP, ARGMOD(PMC *key), INTVAL value)
+        __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*key);
 
@@ -139,15 +140,17 @@
         FUNC_MODIFIES(*key);
 
 PARROT_EXPORT
-void key_set_register(SHIM_INTERP,
+void key_set_register(PARROT_INTERP,
     ARGMOD(PMC *key),
     INTVAL value,
     INTVAL flag)
+        __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*key);
 
 PARROT_EXPORT
-void key_set_string(SHIM_INTERP, ARGMOD(PMC *key), ARGIN(STRING *value))
+void key_set_string(PARROT_INTERP, ARGMOD(PMC *key), ARGIN(STRING *value))
+        __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         __attribute__nonnull__(3)
         FUNC_MODIFIES(*key);
@@ -203,7 +206,8 @@
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(key)
 #define ASSERT_ARGS_key_set_integer __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(key)
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(key)
 #define ASSERT_ARGS_key_set_number __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(key)
@@ -212,9 +216,11 @@
     || PARROT_ASSERT_ARG(key) \
     || PARROT_ASSERT_ARG(value)
 #define ASSERT_ARGS_key_set_register __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(key)
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(key)
 #define ASSERT_ARGS_key_set_string __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(key) \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(key) \
     || PARROT_ASSERT_ARG(value)
 #define ASSERT_ARGS_key_set_to_string __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)

Modified: trunk/src/call/pcc.c
==============================================================================
--- trunk/src/call/pcc.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/call/pcc.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -678,7 +678,7 @@
 
         /* create key needed to iterate the hash */
         st->key              = pmc_new(interp, enum_class_Key);
-        PMC_int_val(st->key) = 0;
+        VTABLE_set_integer_native(interp, st->key, 0);
         SETATTR_Key_next_key(interp, st->key, (PMC *)INITBucketIndex);
     }
     else {

Modified: trunk/src/debug.c
==============================================================================
--- trunk/src/debug.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/debug.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -2638,11 +2638,13 @@
                 case KEY_string_FLAG:
                     dest[size++] = '"';
                     {
-                        char * const temp = Parrot_str_to_cstring(interp, PMC_str_val(k));
+                        char * const temp = Parrot_str_to_cstring(interp,
+                                VTABLE_get_string(interp, k));
                         strcpy(&dest[size], temp);
                         Parrot_str_free_cstring(temp);
                     }
-                    size += Parrot_str_byte_length(interp, PMC_str_val(k));
+                    size += Parrot_str_byte_length(interp,
+                            VTABLE_get_string(interp, (k)));
                     dest[size++] = '"';
                     break;
                 case KEY_integer_FLAG|KEY_register_FLAG:

Modified: trunk/src/hash.c
==============================================================================
--- trunk/src/hash.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/hash.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -1201,7 +1201,7 @@
     ASSERT_ARGS(parrot_hash_get_idx)
     HashBucket       *b;
     void             *res;
-    INTVAL            i  = PMC_int_val(key);
+    INTVAL            i  = VTABLE_get_integer(interp, key);
     PMC              *fake_bi;
     BucketIndex       bi;
 
@@ -1218,7 +1218,9 @@
         SETATTR_Key_next_key(interp, key, NULL);
     }
     else if (i >= size || i < 0) {
-        PMC_int_val(key) = -1;
+        /* NOTE: These instances of SETATTR_Key_int_key can't be VTABLE
+         * functions because of the "special" way hash iterators work. */
+        SETATTR_Key_int_key(interp, key, -1);
         return NULL;
     }
 
@@ -1239,7 +1241,7 @@
     if (i >= size)
         i = -1;
 
-    PMC_int_val(key) = i;
+    SETATTR_Key_int_key(interp, key, i);
 
     return res;
 }

Modified: trunk/src/key.c
==============================================================================
--- trunk/src/key.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/key.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -66,7 +66,7 @@
     PMC * const key = pmc_new(interp, enum_class_Key);
 
     PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-    PMC_int_val(key)     = value;
+    SETATTR_Key_int_key(interp, key, value);
 
     return key;
 }
@@ -118,7 +118,7 @@
     PMC * const key = pmc_new(interp, enum_class_Key);
 
     PObj_get_FLAGS(key) |= KEY_string_FLAG;
-    PMC_str_val(key)     = value;
+    SETATTR_Key_str_key(interp, key, value);
 
     return key;
 }
@@ -182,12 +182,12 @@
 
 PARROT_EXPORT
 void
-key_set_integer(SHIM_INTERP, ARGMOD(PMC *key), INTVAL value)
+key_set_integer(PARROT_INTERP, ARGMOD(PMC *key), INTVAL value)
 {
     ASSERT_ARGS(key_set_integer)
     PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
     PObj_get_FLAGS(key) |=  KEY_integer_FLAG;
-    PMC_int_val(key)     = value;
+    SETATTR_Key_int_key(interp, key, value);
 
     return;
 }
@@ -205,12 +205,12 @@
 
 PARROT_EXPORT
 void
-key_set_register(SHIM_INTERP, ARGMOD(PMC *key), INTVAL value, INTVAL flag)
+key_set_register(PARROT_INTERP, ARGMOD(PMC *key), INTVAL value, INTVAL flag)
 {
     ASSERT_ARGS(key_set_register)
     PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
     PObj_get_FLAGS(key) |=  KEY_register_FLAG | flag;
-    PMC_int_val(key)     = value;
+    SETATTR_Key_int_key(interp, key, value);
 
     return;
 }
@@ -251,12 +251,12 @@
 
 PARROT_EXPORT
 void
-key_set_string(SHIM_INTERP, ARGMOD(PMC *key), ARGIN(STRING *value))
+key_set_string(PARROT_INTERP, ARGMOD(PMC *key), ARGIN(STRING *value))
 {
     ASSERT_ARGS(key_set_string)
     PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
     PObj_get_FLAGS(key) |=  KEY_string_FLAG;
-    PMC_str_val(key)     = value;
+    SETATTR_Key_str_key(interp, key, value);
 
     return;
 }
@@ -326,31 +326,42 @@
 key_integer(PARROT_INTERP, ARGIN(PMC *key))
 {
     ASSERT_ARGS(key_integer)
+    INTVAL  int_key;
+    STRING *str_key;
+
     if (VTABLE_isa(interp, key, CONST_STRING(interp, "Key"))) {
         switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
         case KEY_hash_iterator_FLAGS:
 
         case KEY_integer_FLAG:
-            return PMC_int_val(key);
+            GETATTR_Key_int_key(interp, key, int_key);
+            return int_key;
         case KEY_integer_FLAG | KEY_register_FLAG:
-            return REG_INT(interp, PMC_int_val(key));
+            GETATTR_Key_int_key(interp, key, int_key);
+            return REG_INT(interp, int_key);
 
         case KEY_number_FLAG:
             return PMC_num_val(key);
         case KEY_number_FLAG | KEY_register_FLAG:
-            return REG_NUM(interp, PMC_int_val(key));
+            GETATTR_Key_int_key(interp, key, int_key);
+            return REG_NUM(interp, int_key);
 
         case KEY_pmc_FLAG | KEY_register_FLAG:
             {
-            PMC * const reg = REG_PMC(interp, PMC_int_val(key));
+            PMC *reg;
+            GETATTR_Key_int_key(interp, key, int_key);
+            reg = REG_PMC(interp, int_key);
             return VTABLE_get_integer(interp, reg);
             }
 
         case KEY_string_FLAG:
-            return Parrot_str_to_int(interp, PMC_str_val(key));
+            GETATTR_Key_str_key(interp, key, str_key);
+            return Parrot_str_to_int(interp, str_key);
         case KEY_string_FLAG | KEY_register_FLAG:
             {
-            STRING * const s_reg = REG_STR(interp, PMC_int_val(key));
+            STRING *s_reg;
+            GETATTR_Key_int_key(interp, key, int_key);
+            s_reg = REG_STR(interp, int_key);
             return Parrot_str_to_int(interp, s_reg);
             }
 
@@ -390,17 +401,22 @@
 key_number(PARROT_INTERP, ARGIN(PMC *key))
 {
     ASSERT_ARGS(key_number)
+    INTVAL int_key;
+
     switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
     case KEY_number_FLAG:
         return PMC_num_val(key);
     case KEY_number_FLAG | KEY_register_FLAG:
-        return REG_NUM(interp, PMC_int_val(key));
+        GETATTR_Key_int_key(interp, key, int_key);
+        return REG_NUM(interp, int_key);
     case KEY_pmc_FLAG:
         return VTABLE_get_number(interp, key);
                                                  /*  PMC_pmc_val(key)); */
     case KEY_pmc_FLAG | KEY_register_FLAG:
         {
-        PMC * const reg = REG_PMC(interp, PMC_int_val(key));
+        PMC *reg;
+        GETATTR_Key_int_key(interp, key, int_key);
+        reg = REG_PMC(interp, int_key);
         return VTABLE_get_number(interp, reg);
         }
     default:
@@ -427,18 +443,23 @@
 key_string(PARROT_INTERP, ARGIN(PMC *key))
 {
     ASSERT_ARGS(key_string)
+    INTVAL int_key;
+
     switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
         /* remember to COW strings instead of returning them directly */
         case KEY_string_FLAG:
         {
-            STRING *s = PMC_str_val(key);
+            STRING *s;
+            GETATTR_Key_str_key(interp, key, s);
             if (s)
                 s = Parrot_str_new_COW(interp, s);
             return s;
         }
         case KEY_string_FLAG | KEY_register_FLAG:
         {
-            STRING *s = REG_STR(interp, PMC_int_val(key));
+            STRING *s;
+            GETATTR_Key_int_key(interp, key, int_key);
+            s = REG_STR(interp, int_key);
             if (s)
                 s = Parrot_str_new_COW(interp, s);
             return s;
@@ -446,18 +467,23 @@
                                                /*   PMC_pmc_val(key)); */
         case KEY_pmc_FLAG | KEY_register_FLAG:
         {
-            PMC * const reg = REG_PMC(interp, PMC_int_val(key));
+            PMC *reg;
+            GETATTR_Key_int_key(interp, key, int_key);
+            reg = REG_PMC(interp, int_key);
             return VTABLE_get_string(interp, reg);
         }
         case KEY_integer_FLAG:
-            return Parrot_str_from_int(interp, PMC_int_val(key));
+            GETATTR_Key_int_key(interp, key, int_key);
+            return Parrot_str_from_int(interp, int_key);
         case KEY_integer_FLAG | KEY_register_FLAG:
-            return Parrot_str_from_int(interp, REG_INT(interp, PMC_int_val(key)));
+            GETATTR_Key_int_key(interp, key, int_key);
+            return Parrot_str_from_int(interp, REG_INT(interp, int_key));
 
         case KEY_number_FLAG:
             return Parrot_str_from_num(interp, PMC_num_val(key));
         case KEY_number_FLAG | KEY_register_FLAG:
-            return Parrot_str_from_num(interp, REG_NUM(interp, PMC_int_val(key)));
+            GETATTR_Key_int_key(interp, key, int_key);
+            return Parrot_str_from_num(interp, REG_NUM(interp, int_key));
 
         default:
         case KEY_pmc_FLAG:
@@ -484,9 +510,12 @@
 key_pmc(PARROT_INTERP, ARGIN(PMC *key))
 {
     ASSERT_ARGS(key_pmc)
+    INTVAL int_key;
+
     switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
     case KEY_pmc_FLAG | KEY_register_FLAG:
-        return REG_PMC(interp, PMC_int_val(key));
+        GETATTR_Key_int_key(interp, key, int_key);
+        return REG_PMC(interp, int_key);
     default:
         return key; /* PMC_pmc_val(key); */
     }
@@ -577,9 +606,12 @@
     ASSERT_ARGS(key_mark)
     const UINTVAL flags = PObj_get_FLAGS(key) & KEY_type_FLAGS;
     PMC          *next_key;
+    STRING       *str_key;
 
-    if (flags == KEY_string_FLAG)
-        pobject_lives(interp, (PObj *)PMC_str_val(key));
+    if (flags == KEY_string_FLAG) {
+        GETATTR_Key_str_key(interp, key, str_key);
+        pobject_lives(interp, (PObj *)str_key);
+    }
 
     /*
      * KEY_hash_iterator_FLAGS denote a hash key iteration, PMC_data() is
@@ -620,20 +652,25 @@
     STRING * const quote     = CONST_STRING(interp, "'");
     STRING        *value     = Parrot_str_new(interp, "[ ", 2);
     PMC           *next_key;
+    INTVAL         int_key;
+    STRING        *str_key;
 
     for (;key;) {
         switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
             case KEY_integer_FLAG:
+                GETATTR_Key_int_key(interp, key, int_key);
                 value = Parrot_str_append(interp, value,
-                    Parrot_str_from_int(interp, PMC_int_val(key)));
+                    Parrot_str_from_int(interp, int_key));
                 break;
             case KEY_number_FLAG:
+                GETATTR_Key_int_key(interp, key, int_key);
                 value = Parrot_str_append(interp, value,
-                    Parrot_str_from_num(interp, PMC_int_val(key)));
+                    Parrot_str_from_num(interp, int_key));
                 break;
             case KEY_string_FLAG:
+                GETATTR_Key_str_key(interp, key, str_key);
                 value = Parrot_str_append(interp, value, quote);
-                value = Parrot_str_append(interp, value, PMC_str_val(key));
+                value = Parrot_str_append(interp, value, str_key);
                 value = Parrot_str_append(interp, value, quote);
                 break;
             case KEY_pmc_FLAG:
@@ -641,24 +678,29 @@
                     VTABLE_get_string(interp, key));
                 break;
             case KEY_integer_FLAG | KEY_register_FLAG:
+                GETATTR_Key_int_key(interp, key, int_key);
                 value = Parrot_str_append(interp, value,
                         Parrot_str_from_int(interp,
-                            REG_INT(interp, PMC_int_val(key))));
+                            REG_INT(interp, int_key)));
                 break;
             case KEY_number_FLAG | KEY_register_FLAG:
+                GETATTR_Key_int_key(interp, key, int_key);
                 value = Parrot_str_append(interp, value,
                         Parrot_str_from_num(interp,
-                            REG_NUM(interp, PMC_int_val(key))));
+                            REG_NUM(interp, int_key)));
                 break;
             case KEY_string_FLAG | KEY_register_FLAG:
                 value = Parrot_str_append(interp, value, quote);
+                GETATTR_Key_int_key(interp, key, int_key);
                 value = Parrot_str_append(interp, value,
-                    REG_STR(interp, PMC_int_val(key)));
+                    REG_STR(interp, int_key));
                 value = Parrot_str_append(interp, value, quote);
                 break;
             case KEY_pmc_FLAG | KEY_register_FLAG:
                 {
-                PMC * const reg = REG_PMC(interp, PMC_int_val(key));
+                PMC *reg;
+                GETATTR_Key_int_key(interp, key, int_key);
+                reg = REG_PMC(interp, int_key);
                 value           = Parrot_str_append(interp, value,
                                     VTABLE_get_string(interp, reg));
                 }

Modified: trunk/src/packout.c
==============================================================================
--- trunk/src/packout.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/packout.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -306,7 +306,7 @@
             switch (type & KEY_type_FLAGS) {
                 case KEY_integer_FLAG:
                     *cursor++ = PARROT_ARG_IC | slice_bits;
-                    *cursor++ = PMC_int_val(key);
+                    GETATTR_Key_int_key(interp, key, *cursor++);
                     break;
                 case KEY_number_FLAG:
                     *cursor++ = PARROT_ARG_NC | slice_bits;
@@ -321,19 +321,19 @@
 
                 case KEY_integer_FLAG | KEY_register_FLAG:
                     *cursor++ = PARROT_ARG_I | slice_bits;
-                    *cursor++ = PMC_int_val(key);
+                    GETATTR_Key_int_key(interp, key, *cursor++);
                     break;
                 case KEY_number_FLAG | KEY_register_FLAG:
                     *cursor++ = PARROT_ARG_N | slice_bits;
-                    *cursor++ = PMC_int_val(key);
+                    GETATTR_Key_int_key(interp, key, *cursor++);
                     break;
                 case KEY_string_FLAG | KEY_register_FLAG:
                     *cursor++ = PARROT_ARG_S | slice_bits;
-                    *cursor++ = PMC_int_val(key);
+                    GETATTR_Key_int_key(interp, key, *cursor++);
                     break;
                 case KEY_pmc_FLAG | KEY_register_FLAG:
                     *cursor++ = PARROT_ARG_P | slice_bits;
-                    *cursor++ = PMC_int_val(key);
+                    GETATTR_Key_int_key(interp, key, *cursor++);
                     break;
                 default:
                     Parrot_io_eprintf(NULL, "PackFile_Constant_pack: "

Modified: trunk/src/pmc/hash.pmc
==============================================================================
--- trunk/src/pmc/hash.pmc	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/pmc/hash.pmc	Sun Mar  1 13:24:20 2009	(r37063)
@@ -545,8 +545,8 @@
         SETATTR_Key_next_key(INTERP, key, (PMC *)INITBucketIndex);
 
         /* -1 for an empty hash, 0 for a non-empty hash.  */
-        PMC_int_val(key)     =
-            parrot_hash_size(INTERP, (Hash *)PMC_struct_val(SELF)) ? 0 : -1;
+        SETATTR_Key_int_key(INTERP, key,
+            parrot_hash_size(INTERP, (Hash *)PMC_struct_val(SELF)) ? 0 : -1);
 
         return iter;
     }

Modified: trunk/src/pmc/iterator.pmc
==============================================================================
--- trunk/src/pmc/iterator.pmc	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/pmc/iterator.pmc	Sun Mar  1 13:24:20 2009	(r37063)
@@ -232,7 +232,8 @@
         PMC        *key;
 
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_integer_keyed_int(INTERP, agg, PMC_int_val(key) +idx);
+        return VTABLE_get_integer_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) +idx);
     }
 
 /*
@@ -262,7 +263,8 @@
         PMC        *key;
 
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_number_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
+        return VTABLE_get_number_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) + idx);
     }
 
 
@@ -294,7 +296,8 @@
         PMC        *key;
 
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_string_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
+        return VTABLE_get_string_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) + idx);
     }
 
 /*
@@ -310,7 +313,8 @@
     VTABLE INTVAL get_bool() {
         PMC *key;
         GET_ATTR_key(INTERP, SELF, key);
-        return !PMC_is_null(INTERP, key) && PMC_int_val(key) != -1;
+        return !PMC_is_null(INTERP, key) &&
+                VTABLE_get_integer(INTERP, key) != -1;
     }
 
 /*
@@ -371,7 +375,8 @@
         PMC        *key;
 
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_pmc_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
+        return VTABLE_get_pmc_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) + idx);
     }
 
 /*
@@ -636,7 +641,7 @@
 
         GET_ATTR_key(INTERP, SELF, key);
 
-        if (PMC_int_val(key) == -1)
+        if (VTABLE_get_integer(INTERP, key) == -1)
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
                 "StopIteration");
 
@@ -676,7 +681,8 @@
         PMC * const agg = SELF.get_pmc();
         PMC        *key;
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_exists_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
+        return VTABLE_exists_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) + idx);
     }
 
 /*
@@ -720,7 +726,8 @@
         PMC        *key;
 
         GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_defined_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
+        return VTABLE_defined_keyed_int(INTERP, agg,
+                VTABLE_get_integer(INTERP, key) + idx);
     }
 
     VTABLE PMC *get_iter() {

Modified: trunk/src/pmc/key.pmc
==============================================================================
--- trunk/src/pmc/key.pmc	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/pmc/key.pmc	Sun Mar  1 13:24:20 2009	(r37063)
@@ -21,8 +21,15 @@
 #include "parrot/parrot.h"
 
 pmclass Key need_ext {
-    ATTR PMC *next_key; /* Sometimes it's the next key, sometimes it's not.
-                           The Key code is like that. */
+    ATTR PMC      *next_key; /* Sometimes it's the next key, sometimes it's
+                                not.  The Key code is like that. */
+    ATTR INTVAL    int_key;  /* int value of this key, or something magical if
+                                it's a hash iterator key */
+    ATTR FLOATVAL  num_key;  /* num value of this key, if any */
+    ATTR STRING   *str_key;  /* STRING value of this key, if any */
+                             /* Theoretically there'd also be a pmc_key here,
+                              * but that code looks broken and unneeded. */
+
 
 /*
 
@@ -307,6 +314,7 @@
     VTABLE PMC *nextkey_keyed(PMC *agg, INTVAL what) {
         PMC  * const ret = SELF;
         const INTVAL n   = VTABLE_elements(INTERP, agg);
+        INTVAL       int_key;
 
         switch (what) {
             case ITERATE_FROM_START_KEYS:
@@ -337,9 +345,12 @@
                  &&  agg->vtable->base_type != enum_class_OrderedHash)
                     PObj_get_FLAGS(ret) |= KEY_hash_iterator_FLAGS;
         init:
-                PMC_int_val(ret) = 0;
-                if (!n)
-                    PMC_int_val(ret) = -1;
+                if (!n) {
+                    SET_ATTR_int_key(INTERP, ret, -1);
+                }
+                else {
+                    SET_ATTR_int_key(INTERP, ret, 0);
+                }
 
                 /* iterating over a hash additionally needs the Bucket index */
                 if (KEY_IS_HASH_ITERATOR(ret))
@@ -352,20 +363,24 @@
                  * so, if we are iterating over a hash do nothing
                  * */
                 if (!KEY_IS_HASH_ITERATOR(ret)) {
-                    if (PMC_int_val(ret) < n - 1)
-                        ++PMC_int_val(ret);
-                    else
-                        PMC_int_val(ret) = -1;
+                    GET_ATTR_int_key(INTERP, ret, int_key);
+                    if (int_key < n - 1) {
+                        SET_ATTR_int_key(INTERP, ret, int_key+1);
+                    }
+                    else {
+                        SET_ATTR_int_key(INTERP, ret, -1);
+                    }
                 }
                 break;
             case ITERATE_GET_PREV:
-                if (PMC_int_val(ret) >= 0)
-                    --PMC_int_val(ret);
+                GET_ATTR_int_key(INTERP, ret, int_key);
+                if (int_key >= 0)
+                    SET_ATTR_int_key(INTERP, ret, int_key-1);
                 break;
             case ITERATE_FROM_END:
                 PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
                 PObj_get_FLAGS(ret) |= KEY_integer_FLAG;
-                PMC_int_val(ret)     = n - 1;
+                SET_ATTR_int_key(INTERP, ret, n-1);
                 break;
             default:
                 Parrot_ex_throw_from_c_args(interp, NULL,
@@ -433,7 +448,7 @@
                 break;
             case KEY_string_FLAG:
             case KEY_string_FLAG | KEY_register_FLAG:
-                VTABLE_push_string(INTERP, io, VTABLE_get_string(INTERP, SELF));
+                VTABLE_push_string(INTERP, io, key_string(INTERP, SELF));
                 break;
             default:
                 Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_KEY_NOT_FOUND,
@@ -449,16 +464,19 @@
         PObj_get_FLAGS(SELF) |= flags;
         PObj_custom_mark_SET(SELF);
 
+        if (!PMC_data(SELF))
+            SELF.init();
+
         /* get contents */
         switch (flags) {
             case KEY_integer_FLAG:
-                PMC_int_val(SELF) = VTABLE_shift_integer(INTERP, io);
+                SET_ATTR_int_key(INTERP, SELF, VTABLE_shift_integer(INTERP, io));
                 break;
             case KEY_number_FLAG:
                 VTABLE_set_number_native(INTERP, SELF, VTABLE_shift_float(INTERP, io));
                 break;
             case KEY_string_FLAG:
-                PMC_str_val(SELF) = VTABLE_shift_string(INTERP, io);
+                VTABLE_set_string_native(INTERP, SELF, VTABLE_shift_string(INTERP, io));
                 break;
             default:
                 Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_KEY_NOT_FOUND,

Modified: trunk/src/trace.c
==============================================================================
--- trunk/src/trace.c	Sun Mar  1 12:55:14 2009	(r37062)
+++ trunk/src/trace.c	Sun Mar  1 13:24:20 2009	(r37063)
@@ -33,11 +33,13 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-static STRING* trace_class_name(ARGIN(const PMC* pmc))
-        __attribute__nonnull__(1);
+static STRING* trace_class_name(PARROT_INTERP, ARGIN(const PMC* pmc))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
 
 #define ASSERT_ARGS_trace_class_name __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(pmc)
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(pmc)
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: static */
 
@@ -55,7 +57,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 static STRING*
-trace_class_name(ARGIN(const PMC* pmc))
+trace_class_name(PARROT_INTERP, ARGIN(const PMC* pmc))
 {
     ASSERT_ARGS(trace_class_name)
     STRING *class_name;
@@ -63,7 +65,7 @@
         SLOTTYPE * const class_array = (SLOTTYPE *)PMC_data(pmc);
         PMC * const class_name_pmc = get_attrib_num(class_array,
                                                     PCD_CLASS_NAME);
-        class_name = PMC_str_val(class_name_pmc);
+        class_name = VTABLE_get_string(interp, class_name_pmc);
     }
     else
         class_name = pmc->vtable->whoami;
@@ -103,7 +105,7 @@
         Parrot_io_eprintf(debugger, "**************** PMC is on free list *****\n");
     }
     if (pmc->vtable->pmc_class == pmc) {
-        STRING * const name = trace_class_name(pmc);
+        STRING * const name = trace_class_name(interp, pmc);
         Parrot_io_eprintf(debugger, "Class=%Ss:PMC(%#p)", name, pmc);
     }
     else if (pmc->vtable->base_type == enum_class_String) {


More information about the parrot-commits mailing list