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

bacek at svn.parrot.org bacek at svn.parrot.org
Wed Apr 8 12:24:26 UTC 2009


Author: bacek
Date: Wed Apr  8 12:24:25 2009
New Revision: 37978
URL: https://trac.parrot.org/parrot/changeset/37978

Log:
Switch Packfile.pmc to use attributes.

Main intention - keep copy of passed string to "unpack" because PackFile doesn't
own this string.

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

Modified: branches/packfile_revamp/src/pmc/packfile.pmc
==============================================================================
--- branches/packfile_revamp/src/pmc/packfile.pmc	Wed Apr  8 08:50:49 2009	(r37977)
+++ branches/packfile_revamp/src/pmc/packfile.pmc	Wed Apr  8 12:24:25 2009	(r37978)
@@ -24,6 +24,11 @@
 
 pmclass Packfile {
 
+    /* Copy of packed string. PackFile doesn't own packed data */
+    ATTR STRING             *packed;
+    /* PackFile by it self */
+    ATTR struct PackFile    *pf; 
+
 /*
 
 =item C<void init()>
@@ -34,8 +39,14 @@
 
 */
     VTABLE void init() {
-        PObj_active_destroy_SET(SELF);
-        PMC_data(SELF) = PackFile_new(interp, 0);
+        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;
+
+        PObj_custom_mark_destroy_SETALL(SELF);
     }
 
 
@@ -50,36 +61,74 @@
 */
 
     VTABLE void destroy() {
-        PackFile_destroy(interp, PMC_data_typed(SELF, PackFile *));
+        Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
+        PackFile_destroy(interp, attrs->pf);
+        mem_sys_free(attrs);
     }
 
 /*
 
+=item C<void mark()>
+
+Marks the Packfile as alive.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
+
+        if (attrs->packed)
+            pobject_lives(INTERP, (PObj *)attrs->packed);
+    }
+/*
+
 =item C<STRING *get_string()>
 
-Shortcut for self.pack.
+Return raw serialized PBC file data.
 
 =cut
 
 */
     VTABLE STRING *get_string() {
-        STRING * ret;
-        (STRING *ret) = PCCINVOKE(INTERP, SELF, "pack");
-        return ret;
+        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);
+        return str;
     }
 
 /*
 
 =item C<void set_string_native(STRING *str)>
 
-Shortcut for self.unpack.
+Parse raw serialized PBC file data into the Packfile data structure.
 
 =cut
 
 Implementation note: taken from the bottom end of Parrot_pbc_read().
 */
     VTABLE void set_string_native(STRING *str) {
-        PCCINVOKE(INTERP, SELF, "unpack", 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);
     }
 
 
@@ -117,7 +166,8 @@
 
 */
     VTABLE INTVAL get_integer_keyed_str(STRING *key) {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
+        PackFile *pf;
+        GET_ATTR_pf(INTERP, SELF, pf);
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "wordsize")))
             return pf->header->wordsize;
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "byteorder")))
@@ -160,7 +210,8 @@
 
 */
     VTABLE STRING *get_string_keyed_str(STRING *key) {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
+        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);
 
@@ -223,7 +274,8 @@
 
 */
     VTABLE void set_integer_keyed_str(STRING *key, INTVAL value) {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
+        PackFile *pf;
+        GET_ATTR_pf(INTERP, SELF, pf);
         if (!Parrot_str_compare(interp, key, CONST_STRING(interp, "version_major"))) {
             pf->header->major = value;
             return;
@@ -265,22 +317,15 @@
 
 =item C<STRING * pack()>
 
-Return raw serialized PBC file data.
+Return raw serialized PBC file data. Synonym for get_string.
 
 =cut
 
 */
 
     METHOD STRING *pack() {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
-        opcode_t length = PackFile_pack_size(interp, pf) * sizeof (opcode_t);
-        opcode_t *ptr = (opcode_t*)mem_sys_allocate(length);
-        STRING *str;
-        PackFile_pack(interp, pf, ptr);
-        str = Parrot_str_new_init(interp, (const char*)ptr, length,
-                PARROT_FIXED_8_ENCODING, PARROT_BINARY_CHARSET, 0);
-        mem_sys_free(ptr);
-        RETURN(STRING *str);
+        STRING * ret = SELF.get_string();
+        RETURN(STRING * ret);
     }
 
 /*
@@ -288,21 +333,14 @@
 =item C<STRING * unpack()>
 
 Parse raw serialized PBC file data into the Packfile data structure.
+Synonym for set_string.
 
 =cut
 
 */
     
     METHOD void unpack(STRING *str) {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
-        const opcode_t *ptr = (const opcode_t*)Parrot_string_cstring(interp, str);
-        int length = Parrot_str_byte_length(interp, str);
-        if (!PackFile_unpack(interp, 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, pf->cur_cs, PBC_PBC, NULL);
+        SELF.set_string_native(str);
     }
 
 /*
@@ -316,9 +354,9 @@
 
 */
     METHOD get_directory() {
-        PackFile *pf = PMC_data_typed(SELF, PackFile *);
+        Parrot_Packfile_attributes * attrs = PARROT_PACKFILE(SELF);
         PMC *dir = pmc_new(interp, enum_class_PackfileDirectory);
-        PMC_data(dir) = &pf->directory;
+        PMC_data(dir) = &attrs->pf->directory;
         RETURN(PMC *dir);
     }
 


More information about the parrot-commits mailing list