[svn:parrot] r38050 - branches/packfile_revamp/src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Sat Apr 11 02:24:24 UTC 2009


Author: bacek
Date: Sat Apr 11 02:24:24 2009
New Revision: 38050
URL: https://trac.parrot.org/parrot/changeset/38050

Log:
Imlement PackfileFixupTable set_pointer/get_pointer

Modified:
   branches/packfile_revamp/src/pmc/packfilefixuptable.pmc

Modified: branches/packfile_revamp/src/pmc/packfilefixuptable.pmc
==============================================================================
--- branches/packfile_revamp/src/pmc/packfilefixuptable.pmc	Sat Apr 11 02:24:07 2009	(r38049)
+++ branches/packfile_revamp/src/pmc/packfilefixuptable.pmc	Sat Apr 11 02:24:24 2009	(r38050)
@@ -99,6 +99,22 @@
 */
 
     VTABLE void set_pointer(void * pointer) {
+        Parrot_PackfileFixupTable_attributes * attrs =
+                PARROT_PACKFILEFIXUPTABLE(SELF);
+        PackFile_FixupTable * table = (PackFile_FixupTable*)pointer;
+
+        PMC                 *entry;
+        PackFile_FixupEntry *val;
+        opcode_t             i;
+
+        VTABLE_set_integer_native(interp, attrs->entries, table->fixup_count);
+
+        for (i = 0; i < table->fixup_count; ++i) {
+            val = table->fixups[i];
+            entry = pmc_new(interp, enum_class_PackfileFixupEntry);
+            VTABLE_set_pointer(interp, entry, (void*)val);
+            VTABLE_set_pmc_keyed_int(interp, attrs->entries, i, entry);
+        }
     }
 
 /*
@@ -112,10 +128,21 @@
                 PARROT_PACKFILEFIXUPTABLE(SELF);
         PackFile_FixupTable * pftable = 
                 mem_allocate_zeroed_typed(PackFile_FixupTable);
-
-        pftable->base.type = PF_FIXUP_SEG;
-
-        /* TODO: Copy all entries */
+        PMC                 * entry;
+        PackFile_FixupEntry * val;
+        opcode_t              i;
+        
+        pftable->base.type   = PF_FIXUP_SEG;
+        pftable->fixup_count = VTABLE_elements(interp, attrs->entries);
+        pftable->fixups      = mem_allocate_n_typed(pftable->fixup_count,
+                PackFile_FixupEntry*);
+
+        /* Copy all entries */
+        for (i = 0; i < pftable->fixup_count; ++i) {
+            entry = VTABLE_get_pmc_keyed_int(interp, attrs->entries, i);
+            val   = (PackFile_FixupEntry*)VTABLE_get_pointer(interp, entry);
+            pftable->fixups[i] = val;
+        }
 
         return pftable;
     }
@@ -131,8 +158,8 @@
 
 */
     VTABLE INTVAL elements() {
-        PackFile_FixupTable *pftable = PMC_data_typed(SELF, PackFile_FixupTable *);
-        return pftable->fixup_count;
+        return VTABLE_elements(interp,
+                PARROT_PACKFILEFIXUPTABLE(SELF)->entries);
     }
 
 
@@ -146,14 +173,8 @@
 
 */
     VTABLE PMC *get_pmc_keyed_int(INTVAL index)  {
-        PackFile_FixupTable *pftable = PMC_data_typed(SELF, PackFile_FixupTable *);
-        PMC *rv;
-        if (index < 0 || index >= pftable->fixup_count)
-            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_OUT_OF_BOUNDS,
-                    "Requested data out of range.");
-        rv = pmc_new(interp, enum_class_PackfileFixupEntry);
-        PMC_data(rv) = pftable->fixups[index];
-        return rv;
+        return VTABLE_get_pmc_keyed_int(interp,
+            PARROT_PACKFILEFIXUPTABLE(SELF)->entries, index);
     }
 
 
@@ -167,7 +188,8 @@
 
 */
     VTABLE void set_pmc_keyed_int(INTVAL index, PMC *value)  {
-        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, "Not implemented yet.");
+        VTABLE_set_pmc_keyed_int(interp,
+                PARROT_PACKFILEFIXUPTABLE(SELF)->entries, index, value);
     }
 
 


More information about the parrot-commits mailing list