[svn:parrot] r49228 - branches/typesafe_consttable/src/pmc
plobsing at svn.parrot.org
plobsing at svn.parrot.org
Wed Sep 22 03:01:56 UTC 2010
Author: plobsing
Date: Wed Sep 22 03:01:55 2010
New Revision: 49228
URL: https://trac.parrot.org/parrot/changeset/49228
Log:
reimplement PackfileConstantTable with typesafe consttable
Modified:
branches/typesafe_consttable/src/pmc/packfileconstanttable.pmc
Modified: branches/typesafe_consttable/src/pmc/packfileconstanttable.pmc
==============================================================================
--- branches/typesafe_consttable/src/pmc/packfileconstanttable.pmc Wed Sep 22 01:21:38 2010 (r49227)
+++ branches/typesafe_consttable/src/pmc/packfileconstanttable.pmc Wed Sep 22 03:01:55 2010 (r49228)
@@ -29,11 +29,10 @@
/* HEADERIZER END: static */
pmclass PackfileConstantTable auto_attrs extends PackfileSegment {
- /* ResizablePMCArray for storing constants */
- ATTR PMC *constants;
-
- /* ResizableIntegerArray for storing constant types */
- ATTR PMC *types;
+ /* ResizableXArray for storing constants */
+ ATTR PMC *num_constants;
+ ATTR PMC *str_constants;
+ ATTR PMC *pmc_constants;
/*
@@ -49,8 +48,9 @@
Parrot_PackfileConstantTable_attributes * const attrs =
PMC_data_typed(SELF, Parrot_PackfileConstantTable_attributes*);
- attrs->constants = Parrot_pmc_new(INTERP, enum_class_ResizablePMCArray);
- attrs->types = Parrot_pmc_new(INTERP, enum_class_ResizableIntegerArray);
+ attrs->num_constants = Parrot_pmc_new(INTERP, enum_class_ResizableFloatArray);
+ attrs->str_constants = Parrot_pmc_new(INTERP, enum_class_ResizableStringArray);
+ attrs->pmc_constants = Parrot_pmc_new(INTERP, enum_class_ResizablePMCArray);
PObj_custom_mark_SET(SELF);
PMC_data(SELF) = attrs;
@@ -70,8 +70,9 @@
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
- Parrot_gc_mark_PMC_alive(INTERP, attrs->constants);
- Parrot_gc_mark_PMC_alive(INTERP, attrs->types);
+ Parrot_gc_mark_PMC_alive(INTERP, attrs->num_constants);
+ Parrot_gc_mark_PMC_alive(INTERP, attrs->str_constants);
+ Parrot_gc_mark_PMC_alive(INTERP, attrs->pmc_constants);
SUPER();
}
@@ -95,34 +96,18 @@
opcode_t i;
/* Preallocate required amount of memory */
-#if 0
- /* XXX TODO */
- VTABLE_set_integer_native(INTERP, attrs->constants, table->const_count);
- VTABLE_set_integer_native(INTERP, attrs->types, table->const_count);
-
- for (i = 0; i < table->const_count; ++i) {
- const PackFile_Constant * val = &table->constants[i];
- switch (val->type) {
- case PFC_NONE:
- break;
- case PFC_NUMBER:
- SELF.set_number_keyed_int(i, val->u.number);
- break;
- case PFC_STRING:
- SELF.set_string_keyed_int(i, val->u.string);
- break;
- case PFC_KEY:
- /* fall through */
- case PFC_PMC:
- SELF.set_pmc_keyed_int(i, val->u.key);
- break;
- default:
- Parrot_ex_throw_from_c_args(INTERP, NULL,
- EXCEPTION_MALFORMED_PACKFILE,
- "Unknown PackFile constant type: %d", val->type);
- }
- }
-#endif
+ VTABLE_set_integer_native(INTERP, attrs->num_constants, table->num.const_count);
+ VTABLE_set_integer_native(INTERP, attrs->str_constants, table->str.const_count);
+ VTABLE_set_integer_native(INTERP, attrs->pmc_constants, table->pmc.const_count);
+
+ for (i = 0; i < table->num.const_count; i++)
+ SELF.set_number_keyed_int(i, table->num.constants[i]);
+
+ for (i = 0; i < table->str.const_count; i++)
+ SELF.set_string_keyed_int(i, table->str.constants[i]);
+
+ for (i = 0; i < table->pmc.const_count; i++)
+ SELF.set_pmc_keyed_int(i, table->pmc.constants[i]);
}
/*
@@ -141,54 +126,59 @@
pftable->base.type = PF_CONST_SEG;
/* Copy all constanst with respect of type */
-#if 0
- /* XXX TODO */
- pftable->const_count = VTABLE_get_integer(INTERP, attrs->constants);
- pftable->constants = mem_gc_allocate_n_typed(INTERP,
- pftable->const_count, PackFile_Constant);
-
- for (i = 0; i < pftable->const_count; ++i) {
- PackFile_Constant * const value = &pftable->constants[i];
- value->type = VTABLE_get_integer_keyed_int(INTERP, attrs->types, i);
- switch (value->type) {
- case PFC_NONE:
- break;
- case PFC_NUMBER:
- value->u.number = VTABLE_get_number_keyed_int(INTERP,
- attrs->constants, i);
- break;
- case PFC_STRING:
- value->u.string = VTABLE_get_string_keyed_int(INTERP,
- attrs->constants, i);
- break;
- case PFC_KEY:
- case PFC_PMC:
- value->u.key = VTABLE_get_pmc_keyed_int(INTERP,
- attrs->constants, i);
- break;
- default:
- Parrot_ex_throw_from_c_args(INTERP, NULL,
- EXCEPTION_MALFORMED_PACKFILE,
- "Unknown PackFile constant type: %d", value->type);
- }
- }
-#endif
+ pftable->num.const_count = VTABLE_get_integer(INTERP, attrs->num_constants);
+ pftable->str.const_count = VTABLE_get_integer(INTERP, attrs->str_constants);
+ pftable->pmc.const_count = VTABLE_get_integer(INTERP, attrs->pmc_constants);
+
+ pftable->num.constants = mem_gc_allocate_n_typed(INTERP,
+ pftable->num.const_count, FLOATVAL);
+ pftable->str.constants = mem_gc_allocate_n_typed(INTERP,
+ pftable->str.const_count, STRING *);
+ pftable->pmc.constants = mem_gc_allocate_n_typed(INTERP,
+ pftable->pmc.const_count, PMC *);
+
+ for (i = 0; i < pftable->num.const_count; i++)
+ pftable->num.constants[i] =
+ VTABLE_get_number_keyed_int(INTERP, attrs->num_constants, i);
+
+ for (i = 0; i < pftable->str.const_count; i++)
+ pftable->str.constants[i] =
+ VTABLE_get_string_keyed_int(INTERP, attrs->str_constants, i);
+
+ for (i = 0; i < pftable->pmc.const_count; i++)
+ pftable->pmc.constants[i] =
+ VTABLE_get_pmc_keyed_int(INTERP, attrs->pmc_constants, i);
return pftable;
}
/*
-=item C<INTVAL elements()>
+=item C<INTVAL num_count()>
+
+=item C<INTVAL str_count()>
+
+=item C<INTVAL pmc_count()>
-Get the number of elements in the array.
+Get the number of constants.
=cut
*/
- VTABLE INTVAL elements() {
+
+ METHOD INTVAL num_count() {
+ return VTABLE_elements(INTERP,
+ PARROT_PACKFILECONSTANTTABLE(SELF)->num_constants);
+ }
+
+ METHOD INTVAL str_count() {
+ return VTABLE_elements(INTERP,
+ PARROT_PACKFILECONSTANTTABLE(SELF)->str_constants);
+ }
+
+ METHOD INTVAL pmc_count() {
return VTABLE_elements(INTERP,
- PARROT_PACKFILECONSTANTTABLE(SELF)->constants);
+ PARROT_PACKFILECONSTANTTABLE(SELF)->pmc_constants);
}
@@ -196,15 +186,14 @@
=item C<FLOATVAL get_number_keyed_int(INTVAL index)>
-Fetch a numeric constant. An exception is thrown if the given constant isn't
-numeric.
+Fetch a numeric constant.
=cut
*/
VTABLE FLOATVAL get_number_keyed_int(INTVAL index) {
return VTABLE_get_number_keyed_int(INTERP,
- PARROT_PACKFILECONSTANTTABLE(SELF)->constants, index);
+ PARROT_PACKFILECONSTANTTABLE(SELF)->num_constants, index);
}
@@ -212,15 +201,14 @@
=item C<STRING *get_string_keyed_int(INTVAL index)>
-Fetch a string constant. An exception is thrown if the given constant isn't
-a string.
+Fetch a string constant.
=cut
*/
VTABLE STRING *get_string_keyed_int(INTVAL index) {
return VTABLE_get_string_keyed_int(INTERP,
- PARROT_PACKFILECONSTANTTABLE(SELF)->constants, index);
+ PARROT_PACKFILECONSTANTTABLE(SELF)->str_constants, index);
}
@@ -228,14 +216,14 @@
=item C<PMC *get_pmc_keyed_int(INTVAL index)>
-Fetch a PMC constant. An exception is thrown if the given constant isn't a PMC.
+Fetch a PMC constant.
=cut
*/
VTABLE PMC *get_pmc_keyed_int(INTVAL index) {
return VTABLE_get_pmc_keyed_int(INTERP,
- PARROT_PACKFILECONSTANTTABLE(SELF)->constants, index);
+ PARROT_PACKFILECONSTANTTABLE(SELF)->pmc_constants, index);
}
@@ -251,9 +239,7 @@
VTABLE void set_number_keyed_int(INTVAL index, FLOATVAL value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
-
- VTABLE_set_number_keyed_int(INTERP, attrs->constants, index, value);
- VTABLE_set_integer_keyed_int(INTERP, attrs->types, index, PFC_NUMBER);
+ VTABLE_set_number_keyed_int(INTERP, attrs->num_constants, index, value);
}
@@ -270,9 +256,7 @@
VTABLE void set_string_keyed_int(INTVAL index, STRING *value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
-
- VTABLE_set_string_keyed_int(INTERP, attrs->constants, index, value);
- VTABLE_set_integer_keyed_int(INTERP, attrs->types, index, PFC_STRING);
+ VTABLE_set_string_keyed_int(INTERP, attrs->str_constants, index, value);
}
@@ -288,43 +272,7 @@
VTABLE void set_pmc_keyed_int(INTVAL index, PMC *value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
- const opcode_t type =
- VTABLE_isa(INTERP, value, Parrot_str_new_constant(INTERP, "Key"))
- ? PFC_KEY
- : PFC_PMC;
-
- VTABLE_set_pmc_keyed_int(INTERP, attrs->constants, index, value);
- VTABLE_set_integer_keyed_int(INTERP, attrs->types, index, type);
- }
-
-
-/*
-
-=item C<INTVAL get_type(INTVAL index)>
-
-Get the type of the specified constant. Possible type IDs:
-
-=over 4
-
-=item 0x00 - No constant
-
-=item 0x6E - Number constant
-
-=item 0x73 - String constant
-
-=item 0x70 - PMC constant
-
-=item 0x6B - Key constant
-
-=back
-
-=cut
-
-*/
- METHOD get_type(INTVAL index) {
- INTVAL rv = VTABLE_get_integer_keyed_int(INTERP,
- PARROT_PACKFILECONSTANTTABLE(SELF)->types, index);
- RETURN(INTVAL rv);
+ VTABLE_set_pmc_keyed_int(INTERP, attrs->pmc_constants, index, value);
}
/*
@@ -362,61 +310,51 @@
MULTI INTVAL get_or_create_constant(STRING *value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
- const INTVAL num = VTABLE_elements(INTERP, attrs->types);
+ const INTVAL num = VTABLE_elements(INTERP, attrs->str_constants);
INTVAL i;
for (i=0; i < num; ++i) {
- const INTVAL type = VTABLE_get_integer_keyed_int(INTERP, attrs->types, i);
- if (type == PFC_STRING) {
- STRING * const str = VTABLE_get_string_keyed_int(INTERP, attrs->constants, i);
- if (Parrot_str_equal(INTERP, value, str))
- return i;
- }
+ STRING * const str = VTABLE_get_string_keyed_int(INTERP, attrs->str_constants, i);
+ if (Parrot_str_equal(INTERP, value, str))
+ return i;
}
+
/* Constant not found. Add new one */
- VTABLE_set_string_keyed_int(INTERP, SELF, i, value);
+ SELF.set_string_keyed_int(i, value);
return i;
}
MULTI INTVAL get_or_create_constant(FLOATVAL value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
- const INTVAL num = VTABLE_elements(INTERP, attrs->types);
+ const INTVAL num = VTABLE_elements(INTERP, attrs->num_constants);
INTVAL i;
for (i=0; i < num; ++i) {
- const INTVAL type = VTABLE_get_integer_keyed_int(INTERP, attrs->types, i);
- if (type == PFC_NUMBER) {
- const FLOATVAL val = VTABLE_get_number_keyed_int(INTERP, attrs->constants, i);
- if (FLOAT_IS_ZERO(fabs(val - value)))
- return i;
- }
+ const FLOATVAL val = VTABLE_get_number_keyed_int(INTERP, attrs->num_constants, i);
+ if (FLOAT_IS_ZERO(fabs(val - value)))
+ return i;
}
+
/* Constant not found. Add new one */
- VTABLE_set_number_keyed_int(INTERP, SELF, i, value);
+ SELF.set_number_keyed_int(i, value);
return i;
}
MULTI INTVAL get_or_create_constant(PMC *value) {
Parrot_PackfileConstantTable_attributes * const attrs =
PARROT_PACKFILECONSTANTTABLE(SELF);
- const INTVAL num = VTABLE_elements(INTERP, attrs->types);
+ const INTVAL num = VTABLE_elements(INTERP, attrs->pmc_constants);
INTVAL i;
- const INTVAL val_type =
- value->vtable->base_type == enum_class_Key
- ? PFC_KEY
- : PFC_PMC;
for (i=0; i < num; ++i) {
- const INTVAL type = VTABLE_get_integer_keyed_int(INTERP, attrs->types, i);
- if (type == val_type) {
- PMC * const val = VTABLE_get_pmc_keyed_int(INTERP, attrs->constants, i);
- if (VTABLE_is_equal(INTERP, value, val))
- return i;
- }
+ PMC * const val = VTABLE_get_pmc_keyed_int(INTERP, attrs->pmc_constants, i);
+ if (VTABLE_is_equal(INTERP, value, val))
+ return i;
}
+
/* Constant not found. Add new one */
- VTABLE_set_pmc_keyed_int(INTERP, SELF, i, value);
+ SELF.set_pmc_keyed_int(i, value);
return i;
}
More information about the parrot-commits
mailing list