[svn:parrot] r37124 - in trunk: src/pmc t/pmc

Infinoid at svn.parrot.org Infinoid at svn.parrot.org
Thu Mar 5 14:03:59 UTC 2009


Author: Infinoid
Date: Thu Mar  5 14:03:53 2009
New Revision: 37124
URL: https://trac.parrot.org/parrot/changeset/37124

Log:
[pmc] Un-TODO the PackfileDirectory.set_pmc_keyed_str test
This is a modified version of add_packfile_segment.patch from chromatic++'s
post on 2009-02-20 to the parrot-dev list.  I've made some additional
initializer fixes to get it working.

Modified:
   trunk/src/pmc/packfiledirectory.pmc
   trunk/src/pmc/packfilesegment.pmc
   trunk/t/pmc/packfiledirectory.t

Modified: trunk/src/pmc/packfiledirectory.pmc
==============================================================================
--- trunk/src/pmc/packfiledirectory.pmc	Thu Mar  5 10:31:41 2009	(r37123)
+++ trunk/src/pmc/packfiledirectory.pmc	Thu Mar  5 14:03:53 2009	(r37124)
@@ -57,12 +57,15 @@
     VTABLE PMC *get_pmc_keyed_int(INTVAL index)  {
         const PackFile_Directory * const pfd = PMC_data_typed(SELF, PackFile_Directory *);
         PackFile_Segment *pfseg;
-        PMC *rv;
-        int pmc_type;
+        PMC              *rv;
+        int              pmc_type;
+
         if (index < 0 || index >= (INTVAL)pfd->num_segments)
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_OUT_OF_BOUNDS,
-                                        "PackfileDirectory: index out of bounds!");
+                    "PackfileDirectory: index out of bounds!");
+
         pfseg = pfd->segments[index];
+
         switch (pfseg->type) {
             case PF_DIR_SEG:
                 pmc_type = enum_class_PackfileDirectory;
@@ -80,7 +83,8 @@
                 pmc_type = enum_class_PackfileRawSegment;
                 break;
         }
-        rv = pmc_new(interp, pmc_type);
+
+        rv           = pmc_new(interp, pmc_type);
         PMC_data(rv) = pfseg;
         return rv;
     }
@@ -156,7 +160,31 @@
 
 */
     VTABLE void set_pmc_keyed_str(STRING *name, PMC *segment)  {
-        Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, "Not implemented yet.");
+        PackFile_Directory * const pfd = PMC_data_typed(SELF, PackFile_Directory *);
+        PackFile_Segment *add_seg = PMC_data_typed(segment, PackFile_Segment *);
+
+        const int total = pfd->num_segments;
+        int       i;
+
+        for (i = 0; i < total; i++) {
+            const PackFile_Segment * const pfseg = pfd->segments[i];
+
+            if (!Parrot_str_compare(interp, name,
+                    Parrot_str_new_constant(interp, pfseg->name))) {
+                    add_seg->pf = pfd->base.pf;
+                    pfd->segments[i] = add_seg;
+                return;
+            }
+        }
+
+        add_seg->name = Parrot_str_to_cstring(interp, name);
+        add_seg->pf = pfd->base.pf;
+        PackFile_add_segment(interp, pfd, add_seg);
+    }
+
+    VTABLE void set_pmc_keyed(PMC *key, PMC *segment)  {
+        STRING *s_key = VTABLE_get_string(interp, key);
+        VTABLE_set_pmc_keyed_str(interp, SELF, s_key, segment);
     }
 
 

Modified: trunk/src/pmc/packfilesegment.pmc
==============================================================================
--- trunk/src/pmc/packfilesegment.pmc	Thu Mar  5 10:31:41 2009	(r37123)
+++ trunk/src/pmc/packfilesegment.pmc	Thu Mar  5 14:03:53 2009	(r37124)
@@ -38,7 +38,9 @@
 
 */
     VTABLE void init() {
-        PMC_data(SELF) = PackFile_Segment_new(interp, NULL, "", 0);
+        PackFile_Segment *seg = PackFile_Segment_new(interp, NULL, "", 0);
+        PMC_data(SELF) = seg;
+        seg->type = PF_UNKNOWN_SEG;
     }
 
 

Modified: trunk/t/pmc/packfiledirectory.t
==============================================================================
--- trunk/t/pmc/packfiledirectory.t	Thu Mar  5 10:31:41 2009	(r37123)
+++ trunk/t/pmc/packfiledirectory.t	Thu Mar  5 14:03:53 2009	(r37124)
@@ -170,12 +170,12 @@
 
 # PackfileDirectory.set_pmc_keyed_str
 
-pir_output_is( <<'CODE' . $get_uuid_pbc, <<'OUT', 'PackfileDirectory.set_pmc_keyed_str', todo => 'implement this' );
+pir_output_is( <<'CODE' . $get_uuid_pbc, <<'OUT', 'PackfileDirectory.set_pmc_keyed_str' );
 .sub 'test' :main
     .local pmc pf, pfdir
     pf    = _pbc()
     pfdir = pf.'get_directory'()
-    $P0   = pfdir[0]
+    $P0   = new [ 'PackfileRawSegment' ]
     $S0   = 'BYTECODE_foo'
     pfdir[$S0] = $P0
     $I0   = elements pfdir


More information about the parrot-commits mailing list