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

NotFound at svn.parrot.org NotFound at svn.parrot.org
Sat Apr 24 22:57:43 UTC 2010


Author: NotFound
Date: Sat Apr 24 22:57:42 2010
New Revision: 45998
URL: https://trac.parrot.org/parrot/changeset/45998

Log:
allocate packfile fixups as array of structs instead of array of pointers to structs

Modified:
   trunk/include/parrot/packfile.h
   trunk/src/embed.c
   trunk/src/packdump.c
   trunk/src/packfile.c
   trunk/src/pbc_merge.c
   trunk/src/pmc/eval.pmc
   trunk/src/pmc/packfilefixuptable.pmc

Modified: trunk/include/parrot/packfile.h
==============================================================================
--- trunk/include/parrot/packfile.h	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/include/parrot/packfile.h	Sat Apr 24 22:57:42 2010	(r45998)
@@ -229,7 +229,7 @@
 typedef struct PackFile_FixupTable {
     PackFile_Segment             base;
     opcode_t                     fixup_count;
-    PackFile_FixupEntry        **fixups;
+    PackFile_FixupEntry         *fixups;
     PackFile_ByteCode           *code;   /* where this segment belongs to */
 } PackFile_FixupTable;
 

Modified: trunk/src/embed.c
==============================================================================
--- trunk/src/embed.c	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/embed.c	Sat Apr 24 22:57:42 2010	(r45998)
@@ -707,8 +707,8 @@
      */
 
     for (i = 0; i < ft->fixup_count; i++) {
-        if (ft->fixups[i]->type == enum_fixup_sub) {
-            const opcode_t ci      = ft->fixups[i]->offset;
+        if (ft->fixups[i].type == enum_fixup_sub) {
+            const opcode_t ci      = ft->fixups[i].offset;
             PMC    * const sub_pmc = ct->constants[ci]->u.key;
             Parrot_Sub_attributes *sub;
 

Modified: trunk/src/packdump.c
==============================================================================
--- trunk/src/packdump.c	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/packdump.c	Sat Apr 24 22:57:42 2010	(r45998)
@@ -378,18 +378,18 @@
 
     for (i = 0; i < ft->fixup_count; i++) {
         Parrot_io_printf(interp, "\t#%d\n", (int) i);
-        switch (ft->fixups[i]->type) {
+        switch (ft->fixups[i].type) {
           case enum_fixup_label:
           case enum_fixup_sub:
             Parrot_io_printf(interp,
                         "\ttype => %d offs => %8d name => '%s',\n",
-                        (int)ft->fixups[i]->type,
-                        (int)ft->fixups[i]->offset,
-                        ft->fixups[i]->name);
+                        (int)ft->fixups[i].type,
+                        (int)ft->fixups[i].offset,
+                        ft->fixups[i].name);
             break;
           default:
             Parrot_io_printf(interp, "\ttype => %d ???,\n",
-                        (int) ft->fixups[i]->type);
+                        (int) ft->fixups[i].type);
             break;
         }
     }

Modified: trunk/src/packfile.c
==============================================================================
--- trunk/src/packfile.c	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/packfile.c	Sat Apr 24 22:57:42 2010	(r45998)
@@ -919,13 +919,13 @@
     TRACE_PRINTF(("PackFile: do_sub_pragmas (action=%d)\n", action));
 
     for (i = 0; i < ft->fixup_count; i++) {
-        switch (ft->fixups[i]->type) {
+        switch (ft->fixups[i].type) {
             case enum_fixup_sub:
             {
                 /* offset is an index into const_table holding the Sub PMC */
                 PMC           *sub_pmc;
                 Parrot_Sub_attributes    *sub;
-                const opcode_t ci = ft->fixups[i]->offset;
+                const opcode_t ci = ft->fixups[i].offset;
 
                 if (ci < 0 || ci >= ct->const_count)
                     Parrot_ex_throw_from_c_args(interp, NULL, 1,
@@ -943,7 +943,7 @@
 
                     /* replace Sub PMC with computation results */
                     if (action == PBC_IMMEDIATE && !PMC_IS_NULL(result)) {
-                        ft->fixups[i]->type      = enum_fixup_none;
+                        ft->fixups[i].type      = enum_fixup_none;
                         ct->constants[ci]->u.key = result;
                     }
                 }
@@ -3258,26 +3258,20 @@
 PackFile_FixupTable_clear(PARROT_INTERP, ARGMOD(PackFile_FixupTable *self))
 {
     ASSERT_ARGS(PackFile_FixupTable_clear)
-    opcode_t i;
 
     if (!self) {
         Parrot_io_eprintf(interp, "PackFile_FixupTable_clear: self == NULL!\n");
         return;
     }
 
-    for (i = 0; i < self->fixup_count; i++) {
-        mem_gc_free(interp, self->fixups[i]->name);
-        self->fixups[i]->name = NULL;
-
-        mem_gc_free(interp, self->fixups[i]);
-        self->fixups[i] = NULL;
-    }
-
     if (self->fixup_count) {
+        opcode_t i;
+        for (i = 0; i < self->fixup_count; i++) {
+            mem_gc_free(interp, self->fixups[i].name);
+            self->fixups[i].name = NULL;
+        }
         mem_gc_free(interp, self->fixups);
-        self->fixups = NULL;
     }
-
     self->fixups      = NULL;
     self->fixup_count = 0;
 
@@ -3325,10 +3319,10 @@
     for (i = 0; i < ft->fixup_count; i++) {
         /* fixup_entry type */
         size++;
-        switch (ft->fixups[i]->type) {
+        switch (ft->fixups[i].type) {
           case enum_fixup_label:
           case enum_fixup_sub:
-            size += PF_size_cstring(ft->fixups[i]->name);
+            size += PF_size_cstring(ft->fixups[i].name);
             size ++; /* offset */
             break;
           case enum_fixup_none:
@@ -3366,12 +3360,12 @@
     *cursor++ = ft->fixup_count;
 
     for (i = 0; i < ft->fixup_count; i++) {
-        *cursor++ = (opcode_t) ft->fixups[i]->type;
-        switch (ft->fixups[i]->type) {
+        *cursor++ = (opcode_t) ft->fixups[i].type;
+        switch (ft->fixups[i].type) {
           case enum_fixup_label:
           case enum_fixup_sub:
-            cursor    = PF_store_cstring(cursor, ft->fixups[i]->name);
-            *cursor++ = ft->fixups[i]->offset;
+            cursor    = PF_store_cstring(cursor, ft->fixups[i].name);
+            *cursor++ = ft->fixups[i].offset;
             break;
           case enum_fixup_none:
             break;
@@ -3448,7 +3442,7 @@
 
     if (self->fixup_count) {
         self->fixups = mem_gc_allocate_n_zeroed_typed(interp,
-            self->fixup_count, PackFile_FixupEntry *);
+            self->fixup_count, PackFile_FixupEntry);
 
         if (!self->fixups) {
             Parrot_io_eprintf(interp,
@@ -3460,9 +3454,7 @@
     }
 
     for (i = 0; i < self->fixup_count; i++) {
-        PackFile_FixupEntry * const entry           =
-                                    self->fixups[i] =
-                                    mem_gc_allocate_zeroed_typed(interp, PackFile_FixupEntry);
+        PackFile_FixupEntry * const entry = self->fixups + i;
 
         entry->type = PF_fetch_opcode(pf, &cursor);
 
@@ -3521,12 +3513,11 @@
 
     i = self->fixup_count++;
     self->fixups = mem_gc_realloc_n_typed_zeroed(interp,
-            self->fixups, self->fixup_count, i, PackFile_FixupEntry *);
+            self->fixups, self->fixup_count, i, PackFile_FixupEntry);
 
-    self->fixups[i]         = mem_gc_allocate_zeroed_typed(interp, PackFile_FixupEntry);
-    self->fixups[i]->type   = type;
-    self->fixups[i]->name   = mem_sys_strdup(label);
-    self->fixups[i]->offset = offs;
+    self->fixups[i].type   = type;
+    self->fixups[i].name   = mem_sys_strdup(label);
+    self->fixups[i].offset = offs;
 }
 
 
@@ -3553,9 +3544,9 @@
     ASSERT_ARGS(find_fixup)
     opcode_t i;
     for (i = 0; i < ft->fixup_count; i++) {
-        if ((INTVAL)((enum_fixup_t)ft->fixups[i]->type) == type
-        &&  STREQ(ft->fixups[i]->name, name)) {
-            return ft->fixups[i];
+        if ((INTVAL)((enum_fixup_t)ft->fixups[i].type) == type
+        &&  STREQ(ft->fixups[i].name, name)) {
+            return ft->fixups + i;
         }
     }
 

Modified: trunk/src/pbc_merge.c
==============================================================================
--- trunk/src/pbc_merge.c	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/pbc_merge.c	Sat Apr 24 22:57:42 2010	(r45998)
@@ -474,8 +474,7 @@
 {
     ASSERT_ARGS(pbc_merge_fixups)
     PackFile_FixupTable  *fixup_seg;
-    PackFile_FixupEntry **fixups = mem_gc_allocate_typed(interp,
-            PackFile_FixupEntry *);
+    PackFile_FixupEntry  *fixups = NULL;
     opcode_t              cursor = 0;
     int                   i;
 
@@ -504,14 +503,14 @@
         /* Allocate space for these fixups, provided we have some. */
         if (in_seg->fixup_count > 0) {
             fixups = mem_gc_realloc_n_typed(interp, fixups,
-                    cursor + in_seg->fixup_count, PackFile_FixupEntry*);
+                    cursor + in_seg->fixup_count, PackFile_FixupEntry);
         }
 
         /* Loop over the fixups and copy them to the output PBC, correcting
            the offsets into the bytecode. */
         for (j = 0; j < in_seg->fixup_count; j++) {
             /* Get the entry and allocate space for copies. */
-            const PackFile_FixupEntry * const cur_entry = in_seg->fixups[j];
+            const PackFile_FixupEntry * const cur_entry = in_seg->fixups + j;
             PackFile_FixupEntry * const copy =
                 mem_gc_allocate_typed(interp, PackFile_FixupEntry);
             char * const name_copy = mem_gc_allocate_n_typed(interp,
@@ -536,7 +535,7 @@
             }
 
             /* Slot it into the list. */
-            fixups[cursor] = copy;
+            fixups[cursor] = *copy;
             cursor++;
         }
     }

Modified: trunk/src/pmc/eval.pmc
==============================================================================
--- trunk/src/pmc/eval.pmc	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/pmc/eval.pmc	Sat Apr 24 22:57:42 2010	(r45998)
@@ -74,13 +74,13 @@
         return;
 
     for (i = 0; i < ft->fixup_count; i++) {
-        const PackFile_FixupEntry * const e = ft->fixups[i];
+        PackFile_FixupEntry * const e = ft->fixups + i;
 
         if (e->type == enum_fixup_sub) {
             opcode_t  ci             = e->offset;
 
             ct->constants[ci]->u.key = NULL;
-            ft->fixups[i]->type      = 0;
+            e->type                  = 0;
         }
     }
 }
@@ -113,7 +113,7 @@
         return PMCNULL;
 
     for (i = n = 0; i < ft->fixup_count; i++) {
-        PackFile_FixupEntry *e = ft->fixups[i];
+        const PackFile_FixupEntry * const e = ft->fixups + i;
 
         if (e->type == enum_fixup_sub) {
             opcode_t ci = e->offset;
@@ -152,7 +152,7 @@
         return;
 
     for (i = 0; i < ft->fixup_count; i++) {
-        PackFile_FixupEntry *e = ft->fixups[i];
+        const PackFile_FixupEntry * const e = ft->fixups + i;
 
         if (e->type == enum_fixup_sub) {
             opcode_t  ci  = e->offset;
@@ -427,7 +427,7 @@
             return 0;
 
         for (i = n = 0; i < ft->fixup_count; i++) {
-            PackFile_FixupEntry *e = ft->fixups[i];
+            const PackFile_FixupEntry * const e = ft->fixups + i;
 
             if (e->type == enum_fixup_sub)
                 n++;

Modified: trunk/src/pmc/packfilefixuptable.pmc
==============================================================================
--- trunk/src/pmc/packfilefixuptable.pmc	Sat Apr 24 20:54:09 2010	(r45997)
+++ trunk/src/pmc/packfilefixuptable.pmc	Sat Apr 24 22:57:42 2010	(r45998)
@@ -92,7 +92,7 @@
         VTABLE_set_integer_native(interp, attrs->entries, table->fixup_count);
 
         for (i = 0; i < table->fixup_count; ++i) {
-            val = table->fixups[i];
+            val = table->fixups + i;
             entry = Parrot_pmc_new(interp, enum_class_PackfileFixupEntry);
             VTABLE_set_pointer(interp, entry, (void*)val);
             VTABLE_set_pmc_keyed_int(interp, attrs->entries, i, entry);
@@ -120,13 +120,14 @@
         pftable->base.type   = PF_FIXUP_SEG;
         pftable->fixup_count = VTABLE_elements(interp, attrs->entries);
         pftable->fixups      = mem_gc_allocate_n_typed(INTERP,
-                pftable->fixup_count, PackFile_FixupEntry*);
+                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;
+            pftable->fixups[i] = *val;
+	    mem_gc_free(INTERP, val);
         }
 
         return pftable;


More information about the parrot-commits mailing list