[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