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

bacek at svn.parrot.org bacek at svn.parrot.org
Fri Apr 10 05:28:58 UTC 2009


Author: bacek
Date: Fri Apr 10 05:28:58 2009
New Revision: 38005
URL: https://trac.parrot.org/parrot/changeset/38005

Log:
Start reimplementing Packfile PMCs to generate underlying PackFile instead of using it directly.

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

Modified: branches/packfile_revamp/src/pmc/packfile.pmc
==============================================================================
--- branches/packfile_revamp/src/pmc/packfile.pmc	Fri Apr 10 05:23:05 2009	(r38004)
+++ branches/packfile_revamp/src/pmc/packfile.pmc	Fri Apr 10 05:28:58 2009	(r38005)
@@ -23,12 +23,18 @@
 #include "pmc_packfiledirectory.h"
 
 pmclass Packfile {
+        ATTR INTVAL wordsize;
+        ATTR INTVAL byteorder;
+        ATTR INTVAL fptype;
+        ATTR INTVAL version_major;
+        ATTR INTVAL version_minor;
+        ATTR INTVAL version_patch;
+        ATTR INTVAL bytecode_major;
+        ATTR INTVAL bytecode_minor;
+        ATTR INTVAL uuid_type;
+        ATTR STRING *uuid;
 
-    /* Copy of packed string. PackFile doesn't own packed data */
-    ATTR STRING             *packed;
-    /* PackFile by it self */
-    ATTR struct PackFile    *pf; 
-
+        ATTR PMC    *directory;
 /*
 
 =item C<void init()>
@@ -42,9 +48,9 @@
         Parrot_Packfile_attributes *attrs =
             mem_allocate_zeroed_typed(Parrot_Packfile_attributes);
 
-        attrs->packed = Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
-        attrs->pf = PackFile_new(interp, 0);
-        PMC_data(SELF) = attrs;
+        attrs->uuid     = Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
+        attrs->directory = pmc_new(INTERP, enum_class_PackfileDirectory);
+        PMC_data(SELF)  = attrs;
 
         PObj_custom_mark_destroy_SETALL(SELF);
     }
@@ -61,9 +67,10 @@
 */
 
     VTABLE void destroy() {
-        Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
-        PackFile_destroy(interp, attrs->pf);
-        mem_sys_free(attrs);
+        if (PARROT_PACKFILE(SELF)) {
+            mem_sys_free(PARROT_PACKFILE(SELF));
+            PMC_data(SELF) = NULL;
+        }
     }
 
 /*
@@ -79,8 +86,10 @@
     VTABLE void mark() {
         Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
 
-        if (attrs->packed)
-            pobject_lives(INTERP, (PObj *)attrs->packed);
+        if (attrs->uuid)
+            pobject_lives(INTERP, (PObj *)attrs->uuid);
+        if (attrs->directory)
+            pobject_lives(INTERP, (PObj *)attrs->directory);
     }
 /*
 
@@ -92,14 +101,16 @@
 
 */
     VTABLE STRING *get_string() {
+    /*
         Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
         opcode_t length = PackFile_pack_size(interp, attrs->pf) * sizeof (opcode_t);
         opcode_t *ptr = (opcode_t*)mem_sys_allocate(length);
-        STRING *str;
         PackFile_pack(interp, attrs->pf, ptr);
         str = Parrot_str_new_init(interp, (const char*)ptr, length,
                 PARROT_FIXED_8_ENCODING, PARROT_BINARY_CHARSET, 0);
         mem_sys_free(ptr);
+        */
+        STRING *str = Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
         return str;
     }
 
@@ -114,21 +125,20 @@
 Implementation note: taken from the bottom end of Parrot_pbc_read().
 */
     VTABLE void set_string_native(STRING *str) {
+    /*
         Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
         const opcode_t *ptr;
         int length;
         
-        /* Copy string to SELF to prevent collect it */
-        attrs->packed = Parrot_str_copy(INTERP, str);
-
         ptr = (const opcode_t*)Parrot_string_cstring(interp, attrs->packed);
         length = Parrot_str_byte_length(interp, str);
         if (!PackFile_unpack(interp, attrs->pf, ptr, length))
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_MALFORMED_PACKFILE,
                                         "Can't unpack packfile.");
 
+    */
         /* Set :main routine */
-        do_sub_pragmas(interp, attrs->pf->cur_cs, PBC_PBC, NULL);
+        //do_sub_pragmas(interp, attrs->pf->cur_cs, PBC_PBC, NULL);
     }
 
 
@@ -166,28 +176,25 @@
 
 */
     VTABLE INTVAL get_integer_keyed_str(STRING *key) {
-        PackFile *pf;
-        GET_ATTR_pf(INTERP, SELF, pf);
+        Parrot_Packfile_attributes *attrs = PARROT_PACKFILE(SELF);
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "wordsize")))
-            return pf->header->wordsize;
+            return attrs->wordsize;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "byteorder")))
-            return pf->header->byteorder;
+            return attrs->byteorder;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "fptype")))
-            return pf->header->floattype;
+            return attrs->fptype;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_major")))
-            return pf->header->major;
+            return attrs->version_major;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_minor")))
-            return pf->header->minor;
+            return attrs->version_minor;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_patch")))
-            return pf->header->patch;
+            return attrs->version_patch;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "bytecode_major")))
-            return pf->header->bc_major;
+            return attrs->bytecode_major;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "bytecode_minor")))
-            return pf->header->bc_minor;
+            return attrs->bytecode_minor;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "uuid_type")))
-            return pf->header->uuid_type;
-        if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "uuid_length")))
-            return pf->header->uuid_size;
+            return attrs->uuid_type;
 
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_KEY_NOT_FOUND,
                        "Packfile: No such integer key \"%s\"",
@@ -210,10 +217,8 @@
 
 */
     VTABLE STRING *get_string_keyed_str(STRING *key) {
-        PackFile *pf;
-        GET_ATTR_pf(INTERP, SELF, pf);
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "uuid")))
-            return Parrot_str_new(interp, (char*)pf->header->uuid_data, pf->header->uuid_size);
+            return PARROT_PACKFILE(SELF)->uuid;
 
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_KEY_NOT_FOUND,
                        "Packfile: No such string key \"%s\"",
@@ -274,22 +279,21 @@
 
 */
     VTABLE void set_integer_keyed_str(STRING *key, INTVAL value) {
-        PackFile *pf;
-        GET_ATTR_pf(INTERP, SELF, pf);
+        Parrot_Packfile_attributes *attrs = PARROT_PACKFILE(SELF);
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_major"))) {
-            pf->header->major = value;
+            attrs->version_major = value;
             return;
         }
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_minor"))) {
-            pf->header->minor = value;
+            attrs->version_minor = value;
             return;
         }
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_patch"))) {
-            pf->header->patch = value;
+            attrs->version_patch = value;
             return;
         }
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "uuid_type"))) {
-            pf->header->uuid_type = value;
+            attrs->uuid_type = value;
             return;
         }
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_KEY_NOT_FOUND,
@@ -315,6 +319,50 @@
 
 /*
 
+=item * C<get_string_keyed_str> (v-table)
+
+Used to get data about fields in the header that have a string value. Valid
+keys are:
+
+=over 4
+
+=item uuid
+
+=back
+
+=cut
+
+*/
+
+    VTABLE void set_string_keyed_str(STRING *key, STRING *value) {
+        if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "uuid"))) {
+            PARROT_PACKFILE(SELF)->uuid = value;
+            return;
+        }
+
+        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_KEY_NOT_FOUND,
+                       "Packfile: No such string key \"%s\"",
+                       Parrot_string_cstring(interp, key));
+    }
+
+/*
+
+=item C<void set_string_keyed(PMC *key, STRING *val)>
+
+Set a keyed string value in the packfile object.  Dispatches to
+set_string_keyed_str.
+
+=cut
+
+*/
+    VTABLE void set_string_keyed(PMC *key, STRING *val) {
+        STRING * const s = VTABLE_get_string(INTERP, key);
+        SELF.set_string_keyed_str(s, val);
+    }
+
+
+/*
+
 =item C<STRING * pack()>
 
 Return raw serialized PBC file data. Synonym for get_string.
@@ -354,9 +402,7 @@
 
 */
     METHOD get_directory() {
-        Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
-        PMC *dir = pmc_new(interp, enum_class_PackfileDirectory);
-        PMC_data(dir) = &attrs->pf->directory;
+        PMC *dir = PARROT_PACKFILE(SELF)->directory;
         RETURN(PMC *dir);
     }
 


More information about the parrot-commits mailing list