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

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


Author: bacek
Date: Sat Apr 11 02:23:37 2009
New Revision: 38047
URL: https://trac.parrot.org/parrot/changeset/38047

Log:
Fully implement PackfileFixupEntry.

* Use attributes for storing data.
* Use set_pointer to initialize from PackFile_FixupEntry
* Use get_pointer to create PackFile_FixupEntry

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

Modified: branches/packfile_revamp/src/pmc/packfilefixupentry.pmc
==============================================================================
--- branches/packfile_revamp/src/pmc/packfilefixupentry.pmc	Sat Apr 11 02:23:21 2009	(r38046)
+++ branches/packfile_revamp/src/pmc/packfilefixupentry.pmc	Sat Apr 11 02:23:37 2009	(r38047)
@@ -22,6 +22,107 @@
 #include "parrot/parrot.h"
 
 pmclass PackfileFixupEntry {
+    ATTR INTVAL     type;
+    ATTR STRING     *name;
+    ATTR INTVAL     offset;
+
+
+/*
+
+=item C<void init()>
+
+Initialize PackfileFixupEntry.
+
+=cut
+
+*/
+    VTABLE void init() {
+        Parrot_PackfileFixupEntry_attributes * attrs =
+                mem_allocate_zeroed_typed(Parrot_PackfileFixupEntry_attributes);
+
+        attrs->name = Parrot_str_new_noinit(interp, enum_stringrep_one, 0);
+
+        PObj_custom_mark_destroy_SETALL(SELF);
+        PMC_data(SELF) = attrs;
+    }
+
+/*
+
+=item C<void mark()>
+
+Marks the object as live. 
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        Parrot_PackfileFixupEntry_attributes * attrs =
+                PARROT_PACKFILEFIXUPENTRY(SELF);
+
+        if (attrs->name)
+            pobject_lives(interp, (PObj *)attrs->name);
+    }
+
+/*
+
+=item C<void destroy()>
+
+Destroys the PMC and frees all allocated memory.
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        Parrot_PackfileFixupEntry_attributes * attrs =
+                PARROT_PACKFILEFIXUPENTRY(SELF);
+
+        if (attrs) {
+            mem_sys_free(attrs);
+            PMC_data(SELF) = NULL;
+        }
+    }
+
+
+/*
+
+=item C<set_pointer>
+
+=cut
+
+*/
+
+    VTABLE void set_pointer(void * pointer) {
+        Parrot_PackfileFixupEntry_attributes * attrs =
+                PARROT_PACKFILEFIXUPENTRY(SELF);
+        PackFile_FixupEntry *entry = (PackFile_FixupEntry*)pointer;
+
+        attrs->type     = entry->type;
+        attrs->name     = Parrot_str_new_init(interp, entry->name,
+                strlen(entry->name), PARROT_FIXED_8_ENCODING,
+                PARROT_BINARY_CHARSET, 0);
+        attrs->offset   = entry->offset;
+    }
+
+/*
+
+=item C<void *get_pointer()>
+=cut
+
+*/
+    VTABLE void *get_pointer() {
+        Parrot_PackfileFixupEntry_attributes * attrs =
+                PARROT_PACKFILEFIXUPENTRY(SELF);
+        PackFile_FixupEntry                  * entry =
+                mem_allocate_zeroed_typed(PackFile_FixupEntry);
+
+        entry->type     = attrs->type;
+        entry->name     = strdup(Parrot_string_cstring(interp, attrs->name));
+        entry->offset   = attrs->offset;
+        return entry;
+    }
+
 
 /*
 
@@ -33,8 +134,7 @@
 
 */
     VTABLE STRING *get_string() {
-        PackFile_FixupEntry *pfentry = PMC_data_typed(SELF, PackFile_FixupEntry *);
-        return Parrot_str_new(interp, pfentry->name, strlen(pfentry->name));
+        return PARROT_PACKFILEFIXUPENTRY(SELF)->name;
     }
 
 /*
@@ -47,7 +147,7 @@
 
 */
     VTABLE void set_string_native(STRING *value) {
-        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, "Not implemented yet.");
+        SETATTR_PackfileFixupEntry_name(INTERP, SELF, value);
     }
 
 
@@ -61,8 +161,7 @@
 
 */
     VTABLE INTVAL get_integer() {
-        PackFile_FixupEntry *pfentry = PMC_data_typed(SELF, PackFile_FixupEntry *);
-        return pfentry->offset;
+        return PARROT_PACKFILEFIXUPENTRY(SELF)->offset;
     }
 
 
@@ -76,7 +175,7 @@
 
 */
     VTABLE void set_integer_native(INTVAL offset) {
-        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, "Not implemented yet.");
+        SETATTR_PackfileFixupEntry_offset(INTERP, SELF, offset);
     }
 
 
@@ -90,8 +189,7 @@
 
 */
     METHOD get_type() {
-        PackFile_FixupEntry *pfentry = PMC_data_typed(SELF, PackFile_FixupEntry *);
-        int rv = pfentry->type;
+        INTVAL rv = PARROT_PACKFILEFIXUPENTRY(SELF)->type;
         RETURN(INTVAL rv);
     }
 
@@ -105,8 +203,8 @@
 =cut
 
 */
-    void set_type(INTVAL offset) {
-        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, "Not implemented yet.");
+    METHOD set_type(INTVAL type) {
+        SETATTR_PackfileFixupEntry_type(INTERP, SELF, type);
     }
 
 }


More information about the parrot-commits mailing list