[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