[svn:parrot] r36957 - trunk/src/pmc
cotto at svn.parrot.org
cotto at svn.parrot.org
Tue Feb 24 10:01:15 UTC 2009
Author: cotto
Date: Tue Feb 24 10:01:14 2009
New Revision: 36957
URL: https://trac.parrot.org/parrot/changeset/36957
Log:
[PMC] switch Iterator to ATTRs
Modified:
trunk/src/pmc/hash.pmc
trunk/src/pmc/iterator.pmc
Modified: trunk/src/pmc/hash.pmc
==============================================================================
--- trunk/src/pmc/hash.pmc Tue Feb 24 09:56:25 2009 (r36956)
+++ trunk/src/pmc/hash.pmc Tue Feb 24 10:01:14 2009 (r36957)
@@ -19,6 +19,7 @@
*/
#include "parrot/parrot.h"
+#include "pmc_iterator.h"
/*
@@ -538,7 +539,7 @@
PMC * const iter = pmc_new_init(INTERP, enum_class_Iterator, SELF);
PMC * const key = pmc_new(INTERP, enum_class_Key);
- PMC_struct_val(iter) = key;
+ SETATTR_Iterator_key(INTERP, iter, key);
PObj_get_FLAGS(key) |= KEY_hash_iterator_FLAGS;
PMC_data(key) = (void *)INITBucketIndex;
Modified: trunk/src/pmc/iterator.pmc
==============================================================================
--- trunk/src/pmc/iterator.pmc Tue Feb 24 09:56:25 2009 (r36956)
+++ trunk/src/pmc/iterator.pmc Tue Feb 24 10:01:14 2009 (r36957)
@@ -64,6 +64,8 @@
#include "parrot/parrot.h"
pmclass Iterator no_ro {
+ ATTR PMC *aggregate; /* the aggregate which this Iterator iterates */
+ ATTR PMC *key; /* the Key used by this Iterator */
void class_init() {
if (pass) {
@@ -101,9 +103,14 @@
*/
VTABLE void init_pmc(PMC *aggregate) {
- PMC_pmc_val(SELF) = aggregate;
- PMC_struct_val(SELF) = NULL;
- PObj_custom_mark_SET(SELF);
+ Parrot_Iterator_attributes *attrs =
+ mem_allocate_zeroed_typed(Parrot_Iterator_attributes);
+
+ attrs->aggregate = aggregate;
+ attrs->key = NULL;
+ PMC_data(SELF) = attrs;
+
+ PObj_custom_mark_destroy_SETALL(SELF);
/* by default, iterate from start */
SELF.set_integer_native(ITERATE_FROM_START);
@@ -111,6 +118,20 @@
/*
+=item C<void destroy()>
+
+destroys this PMC
+
+=cut
+
+*/
+
+ VTABLE void destroy() {
+ mem_sys_free(PMC_data(SELF));
+ }
+
+/*
+
=item C<void mark()>
Marks the current idx/key and the aggregate as live.
@@ -120,9 +141,11 @@
*/
VTABLE void mark() {
- /* the KEY */
- if (PMC_struct_val(SELF))
- pobject_lives(INTERP, (PObj *)PMC_struct_val(SELF));
+ /* the Key */
+ PMC *key;
+ GET_ATTR_key(INTERP, SELF, key);
+ if (key)
+ pobject_lives(INTERP, (PObj *)key);
/* the aggregate */
if (SELF.get_pmc() != PMCNULL)
@@ -140,10 +163,13 @@
*/
VTABLE PMC *clone() {
+ PMC *key;
STRING * const name = CONST_STRING(interp, "set_key");
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const res = pmc_new_init(INTERP, SELF->vtable->base_type,
SELF.get_pmc());
+
+ GET_ATTR_key(INTERP, SELF, key);
+
Parrot_PCCINVOKE(interp, res, name, "P->", VTABLE_clone(interp, key));
return res;
}
@@ -174,7 +200,8 @@
*/
VTABLE STRING *get_string() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
+ PMC *key;
+ GET_ATTR_key(INTERP, SELF, key);
return Parrot_str_from_int(INTERP, key_integer(INTERP, key));
}
@@ -201,8 +228,10 @@
*/
VTABLE INTVAL get_integer_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_get_integer_keyed_int(INTERP, agg, PMC_int_val(key) +idx);
}
@@ -229,8 +258,10 @@
*/
VTABLE FLOATVAL get_number_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_get_number_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
}
@@ -259,8 +290,10 @@
*/
VTABLE STRING *get_string_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_get_string_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
}
@@ -275,7 +308,8 @@
*/
VTABLE INTVAL get_bool() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
+ PMC *key;
+ GET_ATTR_key(INTERP, SELF, key);
return key && PMC_int_val(key) != -1;
}
@@ -304,7 +338,9 @@
*/
VTABLE PMC *get_pmc() {
- return PMC_pmc_val(SELF) ? PMC_pmc_val(SELF) : PMCNULL;
+ PMC *agg;
+ GET_ATTR_aggregate(INTERP, SELF, agg);
+ return agg ? agg : PMCNULL;
}
/*
@@ -331,8 +367,10 @@
*/
VTABLE PMC *get_pmc_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_get_pmc_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
}
@@ -361,18 +399,17 @@
if (agg->vtable->base_type == enum_class_Slice) {
/* it's an xrange serving as its own aggregate */
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, agg, NULL, value);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, agg, NULL, value));
}
else {
PMC *key;
- if (!PMC_struct_val(SELF))
+ GET_ATTR_key(INTERP, SELF, key);
+ if (PMC_is_null(INTERP, key))
key = key_new(INTERP);
- else
- key = (PMC *)PMC_struct_val(SELF);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, value);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, value));
}
}
@@ -385,11 +422,14 @@
*/
VTABLE INTVAL pop_integer() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- const INTVAL ret = VTABLE_get_integer_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV);
+ PMC * const agg = SELF.get_pmc();
+ PMC *key;
+ INTVAL ret;
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_integer_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
return ret;
}
@@ -403,11 +443,14 @@
*/
VTABLE FLOATVAL pop_float() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- const FLOATVAL ret = VTABLE_get_number_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV);
+ PMC * const agg = SELF.get_pmc();
+ PMC *key;
+ FLOATVAL ret;
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_number_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
return ret;
}
@@ -421,11 +464,15 @@
*/
VTABLE STRING *pop_string() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- STRING * const ret = VTABLE_get_string_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV);
+ STRING *ret;
+ PMC *key;
+ PMC * const agg = SELF.get_pmc();
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_string_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
+
return ret;
}
@@ -441,11 +488,14 @@
*/
VTABLE PMC *pop_pmc() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- PMC * const ret = VTABLE_get_pmc_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV);
+ PMC * const agg = SELF.get_pmc();
+ PMC *key;
+ PMC *ret;
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_pmc_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
return ret;
}
@@ -462,11 +512,15 @@
*/
VTABLE INTVAL shift_integer() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- const INTVAL ret = VTABLE_get_integer_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT);
+ INTVAL ret;
+ PMC *key;
+ PMC * const agg = SELF.get_pmc();
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_integer_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
+
return ret;
}
@@ -530,11 +584,15 @@
*/
VTABLE FLOATVAL shift_float() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- const FLOATVAL ret = VTABLE_get_number_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT);
+ PMC *key;
+ PMC * const agg = SELF.get_pmc();
+ FLOATVAL ret;
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_number_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
+
return ret;
}
@@ -548,11 +606,15 @@
*/
VTABLE STRING *shift_string() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
- PMC * const agg = SELF.get_pmc();
- STRING * const ret = VTABLE_get_string_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT);
+ PMC *key;
+ PMC * const agg = SELF.get_pmc();
+ STRING *ret;
+
+ GET_ATTR_key(INTERP, SELF, key);
+ ret = VTABLE_get_string_keyed(INTERP, agg, key);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
+
return ret;
}
@@ -568,9 +630,11 @@
*/
VTABLE PMC *shift_pmc() {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
PMC *ret;
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
if (PMC_int_val(key) == -1)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
@@ -578,8 +642,8 @@
ret = VTABLE_get_pmc_keyed(INTERP, agg, key);
- PMC_struct_val(SELF) =
- VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT);
+ SET_ATTR_key(INTERP, SELF,
+ VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
return ret;
}
@@ -609,8 +673,9 @@
*/
VTABLE INTVAL exists_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_exists_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
}
@@ -651,8 +716,10 @@
*/
VTABLE INTVAL defined_keyed_int(INTVAL idx) {
- PMC * const key = (PMC *)PMC_struct_val(SELF);
PMC * const agg = SELF.get_pmc();
+ PMC *key;
+
+ GET_ATTR_key(INTERP, SELF, key);
return VTABLE_defined_keyed_int(INTERP, agg, PMC_int_val(key) + idx);
}
@@ -661,11 +728,12 @@
}
METHOD set_key(PMC *key) {
- PMC_struct_val(SELF) = key;
+ SET_ATTR_key(INTERP, SELF, key);
}
METHOD get_key() {
- PMC *key = (PMC*)PMC_struct_val(SELF);
+ PMC *key;
+ GET_ATTR_key(INTERP, SELF, key);
RETURN(PMC *key);
}
More information about the parrot-commits
mailing list