Front page | perl.cvs.parrot |
Postings from January 2009
[svn:parrot] r36053 - in trunk: compilers/imcc include/parrot languages/perl6/src/pmc src src/ops src/pmc
From:
cotto
Date:
January 27, 2009 04:26
Subject:
[svn:parrot] r36053 - in trunk: compilers/imcc include/parrot languages/perl6/src/pmc src src/ops src/pmc
Message ID:
20090127122509.91FCCCB9AE@x12.develooper.com
Author: cotto
Date: Tue Jan 27 04:25:07 2009
New Revision: 36053
Modified:
trunk/compilers/imcc/pbc.c
trunk/include/parrot/inter_call.h
trunk/languages/perl6/src/pmc/perl6multisub.pmc
trunk/src/inter_call.c
trunk/src/multidispatch.c
trunk/src/ops/core.ops
trunk/src/pbc_merge.c
trunk/src/pmc/fixedintegerarray.pmc
trunk/src/pmc/resizableintegerarray.pmc
trunk/src/pmc/string.pmc
trunk/src/pmc/sub.pmc
Log:
[pmc] update *IntegerArray to use ATTRs
Modified: trunk/compilers/imcc/pbc.c
==============================================================================
--- trunk/compilers/imcc/pbc.c (original)
+++ trunk/compilers/imcc/pbc.c Tue Jan 27 04:25:07 2009
@@ -1388,7 +1388,7 @@
break;
case PFC_STRING:
ns_pmc = constant_pmc_new(interp, enum_class_String);
- PMC_str_val(ns_pmc) = ct->constants[ns_const]->u.string;
+ VTABLE_set_string_native(interp, ns_pmc, ct->constants[ns_const]->u.string);
break;
default:
break;
Modified: trunk/include/parrot/inter_call.h
==============================================================================
--- trunk/include/parrot/inter_call.h (original)
+++ trunk/include/parrot/inter_call.h Tue Jan 27 04:25:07 2009
@@ -363,7 +363,7 @@
*(pc) == PARROT_OP_get_params_pc || \
*(pc) == PARROT_OP_set_returns_pc) { \
PMC * const sig = (seg)->const_table->constants[(pc)[1]]->u.key; \
- (n) += SIG_ELEMS(sig); \
+ (n) += VTABLE_elements((interp), sig); \
} \
} while (0)
Modified: trunk/languages/perl6/src/pmc/perl6multisub.pmc
==============================================================================
--- trunk/languages/perl6/src/pmc/perl6multisub.pmc (original)
+++ trunk/languages/perl6/src/pmc/perl6multisub.pmc Tue Jan 27 04:25:07 2009
@@ -131,7 +131,7 @@
++args_op;
sig = constants[*args_op]->u.key;
ASSERT_SIG_PMC(sig);
- sig_len = SIG_ELEMS(sig);
+ sig_len = VTABLE_elements(interp, sig);
/* If we have a zero-length signature, we're done. */
if (sig_len == 0)
@@ -140,7 +140,7 @@
/* Otherwise, we have arguments. */
++args_op;
for (i = 0; i < sig_len; ++i, ++args_op) {
- const INTVAL type = SIG_ITEM(sig, i);
+ const INTVAL type = VTABLE_get_integer_keyed_int(interp, sig, i);
const int idx = *args_op;
/* If we find a named argument, then we know there's no more positional
Modified: trunk/src/inter_call.c
==============================================================================
--- trunk/src/inter_call.c (original)
+++ trunk/src/inter_call.c Tue Jan 27 04:25:07 2009
@@ -22,13 +22,14 @@
#include "parrot/parrot.h"
#include "parrot/oplib/ops.h"
#include "inter_call.str"
+#include "pmc/pmc_fixedintegerarray.h"
/* HEADERIZER HFILE: include/parrot/inter_call.h */
/* HEADERIZER BEGIN: static */
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-static void check_for_opt_flag(ARGMOD(call_state *st), int has_arg)
+static void check_for_opt_flag(PARROT_INTERP, ARGMOD(call_state *st), int has_arg)
__attribute__nonnull__(1)
FUNC_MODIFIES(*st);
@@ -138,7 +139,7 @@
__attribute__nonnull__(2)
FUNC_MODIFIES(*st);
-static void next_arg_sig(ARGMOD(call_state_item *sti))
+static void next_arg_sig(PARROT_INTERP, ARGMOD(call_state_item *sti))
__attribute__nonnull__(1)
FUNC_MODIFIES(*sti);
@@ -429,7 +430,7 @@
PARROT_EXPORT
int
-Parrot_init_arg_indexes_and_sig_pmc(SHIM_INTERP, ARGIN(Parrot_Context *ctx),
+Parrot_init_arg_indexes_and_sig_pmc(PARROT_INTERP, ARGIN(Parrot_Context *ctx),
ARGIN_NULLOK(opcode_t *indexes), ARGIN_NULLOK(PMC *sig_pmc),
ARGMOD(call_state_item *sti))
{
@@ -453,11 +454,11 @@
ASSERT_SIG_PMC(sig_pmc);
sti->u.op.signature = sig_pmc;
sti->u.op.pc = indexes;
- sti->n = SIG_ELEMS(sig_pmc);
+ sti->n = VTABLE_elements(interp, sig_pmc);
/* initialize sti->sig */
if (sti->n)
- next_arg_sig(sti);
+ next_arg_sig(interp, sti);
}
return sti->n > 0;
@@ -507,7 +508,7 @@
PARROT_EXPORT
int
-Parrot_init_arg_sig(SHIM_INTERP, ARGIN(Parrot_Context *ctx),
+Parrot_init_arg_sig(PARROT_INTERP, ARGIN(Parrot_Context *ctx),
ARGIN(const char *sig), ARGIN_NULLOK(void *ap),
ARGMOD(call_state_item *sti))
{
@@ -526,7 +527,7 @@
/* initialize st->sig */
if (sti->n)
- next_arg_sig(sti);
+ next_arg_sig(interp, sti);
}
return sti->n > 0;
@@ -589,12 +590,13 @@
*/
static void
-next_arg_sig(ARGMOD(call_state_item *sti))
+next_arg_sig(PARROT_INTERP, ARGMOD(call_state_item *sti))
{
ASSERT_ARGS(next_arg_sig)
switch (sti->mode & CALL_S_D_MASK) {
case CALL_STATE_OP:
- sti->sig = SIG_ITEM(sti->u.op.signature, sti->i);
+ sti->sig = VTABLE_get_integer_keyed_int(interp,
+ sti->u.op.signature, sti->i);
break;
case CALL_STATE_SIG:
switch (sti->u.sig.sig[sti->i]) {
@@ -770,7 +772,7 @@
st->src.used = 0;
- next_arg_sig(&st->src);
+ next_arg_sig(interp, &st->src);
/* check if we're supposed to continue a :flat argument */
if (st->src.mode & CALL_STATE_FLATTEN) {
@@ -807,7 +809,7 @@
&& !(st->src.sig & PARROT_ARG_FLATTEN)) {
fetch_arg_op(interp, st);
st->name = UVal_str(st->val);
- next_arg_sig(&st->src);
+ next_arg_sig(interp, &st->src);
}
switch (st->src.mode & CALL_S_D_MASK) {
@@ -839,7 +841,7 @@
Parrot_fetch_arg_nci(PARROT_INTERP, ARGMOD(call_state *st))
{
ASSERT_ARGS(Parrot_fetch_arg_nci)
- next_arg_sig(&st->dest);
+ next_arg_sig(interp, &st->dest);
if (st->dest.sig & PARROT_ARG_SLURPY_ARRAY) {
PMC *slurped = pmc_new(interp,
@@ -1013,7 +1015,7 @@
*/
static void
-check_for_opt_flag(ARGMOD(call_state *st), int has_arg)
+check_for_opt_flag(PARROT_INTERP, ARGMOD(call_state *st), int has_arg)
{
ASSERT_ARGS(check_for_opt_flag)
INTVAL idx;
@@ -1026,7 +1028,7 @@
if (dest->i >= dest->n)
return;
- next_arg_sig(dest);
+ next_arg_sig(interp, dest);
/* if this isn't an :opt_flag argument, we need to reset things
* and go to the next argument */
@@ -1113,7 +1115,8 @@
/* 1) count named args, make sure there is less than 32/64
* 2) create slurpy hash if needed */
for (i = st->dest.i; i < st->dest.n; ++i) {
- const INTVAL sig = SIG_ITEM(st->dest.u.op.signature, i);
+ const INTVAL sig = VTABLE_get_integer_keyed_int(interp,
+ st->dest.u.op.signature, i);
/* skip the arg name, only count the actual args of the named args */
if (!(sig & PARROT_ARG_NAME))
@@ -1168,7 +1171,8 @@
int idx;
STRING *param;
- st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i);
+ st->dest.sig = VTABLE_get_integer_keyed_int(interp,
+ st->dest.u.op.signature, i);
if (!(st->dest.sig & PARROT_ARG_NAME))
continue;
@@ -1183,7 +1187,8 @@
if (st->name == param || string_equal(interp, st->name, param) == 0) {
++i;
- st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i);
+ st->dest.sig = VTABLE_get_integer_keyed_int(interp,
+ st->dest.u.op.signature, i);
st->dest.i = i;
/* if bit is set we have a duplicate */
@@ -1371,7 +1376,8 @@
for (i = st->first_named; i < st->dest.n; ++i) {
/* verify that a name exists */
- const INTVAL sig = st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i);
+ const INTVAL sig = st->dest.sig =
+ VTABLE_get_integer_keyed_int(interp, st->dest.u.op.signature, i);
if (sig & PARROT_ARG_NAME) {
INTVAL arg_sig;
int last_name_pos;
@@ -1387,12 +1393,17 @@
i++;
/* verify that an actual arg exists */
- arg_sig = st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i);
+ arg_sig = st->dest.sig = VTABLE_get_integer_keyed_int(interp,
+ st->dest.u.op.signature, i);
PARROT_ASSERT(!(arg_sig & PARROT_ARG_NAME));
/* if this named arg is already filled, continue */
if (st->named_done & (1 << n_named)) {
- arg_sig = st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i+1);
+ /* XXX: This reads past the end of the array. TT #233*/
+ INTVAL* int_array;
+ GETATTR_FixedIntegerArray_int_array(interp,
+ st->dest.u.op.signature, int_array);
+ arg_sig = st->dest.sig = int_array[i+1];
/* skip associated opt flag arg as well */
if (arg_sig & PARROT_ARG_OPT_FLAG)
@@ -1409,7 +1420,8 @@
/* Don't walk off the end of the array */
if (i+1 >= st->dest.n)
continue;
- arg_sig = st->dest.sig = SIG_ITEM(st->dest.u.op.signature, i+1);
+ arg_sig = st->dest.sig = VTABLE_get_integer_keyed_int(interp,
+ st->dest.u.op.signature, i+1);
if (arg_sig & PARROT_ARG_OPT_FLAG) {
i++;
idx = st->dest.u.op.pc[i];
@@ -1505,7 +1517,7 @@
int has_arg;
/* check if the next dest arg is :slurpy */
- next_arg_sig(dest);
+ next_arg_sig(interp, dest);
if (dest->sig & PARROT_ARG_SLURPY_ARRAY)
break;
@@ -1534,11 +1546,11 @@
PARROT_ASSERT(idx >= 0);
store_arg(st, idx);
- check_for_opt_flag(st, 0);
+ check_for_opt_flag(interp, st, 0);
/* next dest arg */
dest->i++;
- next_arg_sig(dest);
+ next_arg_sig(interp, dest);
}
/* Restore value */
@@ -1553,7 +1565,7 @@
if (!has_arg)
break;
dest->i++;
- next_arg_sig(dest);
+ next_arg_sig(interp, dest);
}
/* if there *is* an arg, convert it */
@@ -1581,7 +1593,7 @@
/* if we're at an :optional argument, check for an :opt_flag */
if (dest->sig & PARROT_ARG_OPTIONAL)
- check_for_opt_flag(st, has_arg);
+ check_for_opt_flag(interp, st, has_arg);
}
/* 2nd: Positional :slurpy */
@@ -1653,7 +1665,7 @@
/* if we're at an :optional argument, check for an :opt_flag */
if (dest->sig & PARROT_ARG_OPTIONAL)
- check_for_opt_flag(st, 1);
+ check_for_opt_flag(interp, st, 1);
}
/* otherwise this doesn't get reset and we can't catch positional args
Modified: trunk/src/multidispatch.c
==============================================================================
--- trunk/src/multidispatch.c (original)
+++ trunk/src/multidispatch.c Tue Jan 27 04:25:07 2009
@@ -593,14 +593,14 @@
ASSERT_SIG_PMC(args_array);
- sig_len = SIG_ELEMS(args_array);
+ sig_len = VTABLE_elements(interp, args_array);
if (!sig_len)
return arg_tuple;
++args_op;
for (i = 0; i < sig_len; ++i, ++args_op) {
- type = SIG_ITEM(args_array, i);
+ type = VTABLE_get_integer_keyed_int(interp, args_array, i);
/* named don't MMD */
if (type & PARROT_ARG_NAME)
Modified: trunk/src/ops/core.ops
==============================================================================
--- trunk/src/ops/core.ops (original)
+++ trunk/src/ops/core.ops Tue Jan 27 04:25:07 2009
@@ -564,7 +564,7 @@
/* for now just point to the opcode */
interp->current_args = _this;
- argc = SIG_ELEMS(signature);
+ argc = VTABLE_elements(interp, signature);
goto OFFSET(argc + 2);
}
@@ -574,7 +574,7 @@
INTVAL argc;
CONTEXT(interp)->current_results = _this;
- argc = SIG_ELEMS(signature);
+ argc = VTABLE_elements(interp, signature);
goto OFFSET(argc + 2);
}
@@ -608,7 +608,7 @@
Parrot_free_context(interp, caller_ctx, 1);
interp->current_args = NULL;
}
- argc = SIG_ELEMS(signature);
+ argc = VTABLE_elements(interp, signature);
goto OFFSET(argc + 2);
}
@@ -646,7 +646,7 @@
parrot_pass_args(interp, ctx, ctx->caller_ctx, interp->current_returns,
ctx->caller_ctx->current_results, PARROT_PASS_RESULTS);
}
- argc = SIG_ELEMS(signature);
+ argc = VTABLE_elements(interp, signature);
goto OFFSET(argc + 2);
}
Modified: trunk/src/pbc_merge.c
==============================================================================
--- trunk/src/pbc_merge.c (original)
+++ trunk/src/pbc_merge.c Tue Jan 27 04:25:07 2009
@@ -762,9 +762,9 @@
const PMC * const sig = bc->const_table->constants[op_ptr[1]]->u.key;
/* Loop over the arguments to locate any that need a fixup. */
- const int sig_items = SIG_ELEMS(sig);
+ const int sig_items = VTABLE_elements(interp, sig);
for (cur_arg = 0; cur_arg < sig_items; cur_arg++) {
- switch (SIG_ITEM(sig, cur_arg)) {
+ switch (VTABLE_get_integer_keyed_int(interp, sig, cur_arg)) {
case PARROT_ARG_NC:
case PARROT_ARG_PC:
case PARROT_ARG_SC:
Modified: trunk/src/pmc/fixedintegerarray.pmc
==============================================================================
--- trunk/src/pmc/fixedintegerarray.pmc (original)
+++ trunk/src/pmc/fixedintegerarray.pmc Tue Jan 27 04:25:07 2009
@@ -22,6 +22,8 @@
#include "parrot/parrot.h"
pmclass FixedIntegerArray need_ext provides array {
+ ATTR INTVAL size; /* number of INTVALs stored in this array */
+ ATTR INTVAL * int_array; /* INTVALs are stored here */
/*
@@ -40,8 +42,10 @@
*/
VTABLE void init() {
- PMC_int_val(SELF) = 0;
- PMC_data(SELF) = NULL;
+ Parrot_FixedIntegerArray_attributes* attrs =
+ mem_allocate_zeroed_typed(Parrot_FixedIntegerArray_attributes);
+ PMC_data(SELF) = attrs;
+ PObj_active_destroy_SET(SELF);
}
/*
@@ -148,11 +152,11 @@
*/
VTABLE void destroy() {
- if (PMC_data(SELF))
- mem_sys_free(PMC_data(SELF));
-
- PMC_data(SELF) = NULL;
- PMC_int_val(SELF) = 0;
+ INTVAL* int_array;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ if (int_array)
+ mem_sys_free(int_array);
+ mem_sys_free(PMC_data(SELF));
}
/*
@@ -173,17 +177,21 @@
* vtable
*/
- PMC * const dest =
+ INTVAL * int_array;
+ PMC * const dest =
PObj_constant_TEST(SELF)
? constant_pmc_new(INTERP, SELF->vtable->base_type)
: pmc_new(INTERP, SELF->vtable->base_type);
- if (PMC_data(SELF)) {
- const INTVAL size = PMC_int_val(SELF);
- PMC_int_val(dest) = size;
- PMC_data(dest) = mem_allocate_n_typed(size, INTVAL);
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ if (int_array) {
+ INTVAL *dest_int_array;
+ const INTVAL size = SELF.elements();
+ dest_int_array = mem_allocate_n_typed(size, INTVAL);
+ SET_ATTR_size(INTERP, dest, size);
+ SET_ATTR_int_array(INTERP, dest, dest_int_array);
- mem_sys_memcopy(PMC_data(dest), PMC_data(SELF), size * sizeof (INTVAL));
+ mem_sys_memcopy(dest_int_array, int_array, size * sizeof (INTVAL));
PObj_active_destroy_SET(dest);
}
@@ -228,7 +236,7 @@
*/
VTABLE INTVAL get_integer() {
- return PMC_int_val(SELF);
+ return PARROT_FIXEDINTEGERARRAY(SELF)->size;
}
@@ -243,14 +251,14 @@
*/
VTABLE INTVAL get_integer_keyed_int(INTVAL key) {
- INTVAL *data;
+ INTVAL *int_array;
- if (key < 0 || key >= PMC_int_val(SELF))
+ if (key < 0 || key >= SELF.elements())
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_OUT_OF_BOUNDS,
"FixedIntegerArray: index out of bounds!");
- data = (INTVAL *)PMC_data(SELF);
- return data[key];
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ return int_array[key];
}
/*
@@ -402,12 +410,15 @@
*/
VTABLE void set_integer_native(INTVAL size) {
- if (PMC_int_val(SELF) || size < 1)
+ INTVAL *int_array;
+ if (SELF.elements() || size < 1)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
"FixedIntegerArray: Can't resize!");
- PMC_int_val(SELF) = size;
- mem_realloc_n_typed(PMC_data(SELF), size, INTVAL);
+ SET_ATTR_size(INTERP, SELF, size);
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ int_array = mem_realloc_n_typed(int_array, size, INTVAL);
+ SET_ATTR_int_array(INTERP, SELF, int_array);
PObj_active_destroy_SET(SELF);
}
@@ -422,14 +433,14 @@
*/
VTABLE void set_integer_keyed_int(INTVAL key, INTVAL value) {
- INTVAL *data;
+ INTVAL *int_array;
- if (key < 0 || key >= PMC_int_val(SELF))
+ if (key < 0 || key >= SELF.elements())
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_OUT_OF_BOUNDS,
"FixedIntegerArray: index out of bounds!");
- data = (INTVAL *)PMC_data(SELF);
- data[key] = value;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ int_array[key] = value;
}
/*
@@ -488,7 +499,7 @@
VTABLE void set_string_keyed_int(INTVAL key, STRING *value) {
INTVAL tempInt;
- PMC * const tempPMC = temporary_pmc_new(INTERP, enum_class_Integer);
+ PMC * const tempPMC = temporary_pmc_new(INTERP, enum_class_Integer);
VTABLE_set_string_native(INTERP, tempPMC, value);
tempInt = VTABLE_get_integer(INTERP, tempPMC);
temporary_pmc_free(interp, tempPMC);
@@ -541,10 +552,13 @@
}
METHOD sort(PMC *cmp_func) {
- UINTVAL n = (UINTVAL)PMC_int_val(SELF);
+ INTVAL *int_array;
+ UINTVAL n = (UINTVAL)SELF.elements();
- if (n > 1)
- Parrot_quicksort(interp, PMC_data_typed(SELF, void **), n, cmp_func);
+ if (n > 1) {
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ Parrot_quicksort(interp, (void**)int_array, n, cmp_func);
+ }
}
/*
@@ -567,43 +581,47 @@
*/
- VTABLE void visit(visit_info *info) {
+ /*VTABLE void visit(visit_info *info) {
SUPER(info);
- }
+ }*/
VTABLE void freeze(visit_info *info) {
IMAGE_IO *io = info->image_io;
- INTVAL *ar;
+ INTVAL *int_array;
INTVAL i, n;
SUPER(info);
n = SELF.get_integer();
VTABLE_push_integer(INTERP, io, n);
- ar = (INTVAL *)PMC_data(SELF);
+ GET_ATTR_int_array(INTERP, SELF, int_array);
for (i = 0; i < n; ++i)
- VTABLE_push_integer(INTERP, io, ar[i]);
+ VTABLE_push_integer(INTERP, io, int_array[i]);
}
VTABLE void thaw(visit_info *info) {
+ Parrot_FixedIntegerArray_attributes *attrs =
+ mem_allocate_zeroed_typed(Parrot_FixedIntegerArray_attributes);
+ PMC_data(SELF) = attrs;
+
if (info->extra_flags == EXTRA_IS_NULL) {
IMAGE_IO * const io = info->image_io;
const INTVAL n = VTABLE_shift_integer(INTERP, io);
- PMC_int_val(SELF) = 0;
- PMC_data(SELF) = NULL;
+ SET_ATTR_size(INTERP, SELF, 0);
+ SET_ATTR_int_array(INTERP, SELF, NULL);
if (n) {
INTVAL i;
- INTVAL *ar;
+ INTVAL *int_array;
SELF.set_integer_native(n);
- ar = (INTVAL *)PMC_data(SELF);
+ GET_ATTR_int_array(INTERP, SELF, int_array);
for (i = 0; i < n; ++i)
- ar[i] = VTABLE_shift_integer(INTERP, io);
+ int_array[i] = VTABLE_shift_integer(INTERP, io);
}
}
else
Modified: trunk/src/pmc/resizableintegerarray.pmc
==============================================================================
--- trunk/src/pmc/resizableintegerarray.pmc (original)
+++ trunk/src/pmc/resizableintegerarray.pmc Tue Jan 27 04:25:07 2009
@@ -24,6 +24,23 @@
pmclass ResizableIntegerArray extends FixedIntegerArray need_ext provides array {
+ ATTR INTVAL resize_threshold; /* max size before array needs to be resized */
+
+/*
+
+=item C<void init()>
+
+Initializes the array.
+
+=cut
+
+*/
+ VTABLE void init() {
+ Parrot_ResizableIntegerArray_attributes* attrs =
+ mem_allocate_zeroed_typed(Parrot_ResizableIntegerArray_attributes);
+ PMC_data(SELF) = attrs;
+ PObj_active_destroy_SET(SELF);
+ }
/*
@@ -36,7 +53,7 @@
*/
VTABLE INTVAL get_integer_keyed_int(INTVAL key) {
- INTVAL *data;
+ INTVAL *int_array;
if (key < 0)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
@@ -45,8 +62,8 @@
if (key >= SELF.get_integer())
return 0;
- data = (INTVAL *)PMC_data(SELF);
- return data[key];
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ return int_array[key];
}
/*
@@ -60,7 +77,7 @@
*/
VTABLE void set_integer_keyed_int(INTVAL key, INTVAL value) {
- INTVAL *data;
+ INTVAL *int_array;
if (key < 0)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
@@ -69,8 +86,8 @@
if (key >= SELF.get_integer())
SELF.set_integer_native(key+1);
- data = (INTVAL *)PMC_data(SELF);
- data[key] = value;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ int_array[key] = value;
}
/*
@@ -84,29 +101,36 @@
*/
VTABLE void set_integer_native(INTVAL size) {
+
+ INTVAL *int_array;
+ INTVAL resize_threshold;
+
if (size < 0)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
"ResizableIntegerArray: Can't resize!");
- if (!PMC_data(SELF)) {
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ GET_ATTR_resize_threshold(INTERP, SELF, resize_threshold);
+ if (!int_array) {
/* empty - used fixed routine */
if (size < 8) {
SUPER(8);
- PMC_int_val(SELF) = size;
- PMC_int_val2(SELF) = 8;
+ SET_ATTR_size(INTERP, SELF, size);
+ SET_ATTR_resize_threshold(INTERP, SELF, 8);
}
else {
SUPER(size);
- PMC_int_val2(SELF) = size;
+ SET_ATTR_resize_threshold(INTERP, SELF, size);
}
}
- else if (size <= PMC_int_val2(SELF)) {
+ else if (size <= resize_threshold) {
/* we could shrink here if necessary */
- PMC_int_val(SELF) = size;
+ SET_ATTR_size(INTERP, SELF, size);
return;
}
else {
- INTVAL cur = PMC_int_val2(SELF);
+ INTVAL cur = resize_threshold;
+ INTVAL *int_array;
if (cur < 8192)
cur = size < 2 * cur ? 2 * cur : size;
@@ -116,10 +140,11 @@
cur &= ~0xfff;
}
- PMC_data(SELF) = mem_sys_realloc(PMC_data(SELF),
- cur * sizeof (INTVAL));
- PMC_int_val2(SELF) = cur;
- PMC_int_val(SELF) = size;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ int_array = (INTVAL*)mem_sys_realloc( (void*)int_array, cur * sizeof (INTVAL));
+ SET_ATTR_int_array(INTERP, SELF, int_array);
+ SET_ATTR_size(INTERP, SELF, size);
+ SET_ATTR_resize_threshold(INTERP, SELF, cur);
}
}
@@ -172,18 +197,18 @@
*/
VTABLE INTVAL shift_integer() {
- INTVAL value, *data;
+ INTVAL value, *int_array;
INTVAL size = SELF.get_integer();
if (size == 0)
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
"ResizableIntegerArray: Can't shift from an empty array!");
- data = (INTVAL *)PMC_data(SELF);
- value = data[0];
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ value = int_array[0];
--size;
- mem_sys_memmove(data, data + 1, size * sizeof (INTVAL));
+ mem_sys_memmove(int_array, int_array + 1, size * sizeof (INTVAL));
SELF.set_integer_native(size);
return value;
}
@@ -199,13 +224,13 @@
*/
VTABLE void unshift_integer(INTVAL value) {
- INTVAL *data;
+ INTVAL *int_array;
INTVAL size = SELF.get_integer();
SELF.set_integer_native(size + 1);
- data = (INTVAL *)PMC_data(SELF);
- mem_sys_memmove(data + 1, data, size * sizeof (INTVAL));
- data[0] = value;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+ mem_sys_memmove(int_array + 1, int_array, size * sizeof (INTVAL));
+ int_array[0] = value;
}
/*
@@ -226,9 +251,10 @@
"ResizableIntegerArray: index out of bounds!");
}
else {
- INTVAL *data = (INTVAL *)PMC_data(SELF);
+ INTVAL *int_array;
+ GET_ATTR_int_array(INTERP, SELF, int_array);
--size;
- mem_sys_memmove(data + key, data + key + 1, (size - key) * sizeof (INTVAL));
+ mem_sys_memmove(int_array + key, int_array + key + 1, (size - key) * sizeof (INTVAL));
SELF.set_integer_native(size);
}
}
@@ -244,16 +270,80 @@
*/
VTABLE PMC *clone() {
+ INTVAL size;
PMC *copy = SUPER();
/* copy trimmed extra space */
- PMC_int_val2(copy) = PMC_int_val(SELF);
+ GET_ATTR_size(INTERP, SELF, size);
+ SET_ATTR_resize_threshold(INTERP, SELF, size);
return copy;
}
-}
+/*
+
+=item C<void freeze(visit_info *info)>
+
+Used to archive the array.
+
+=item C<void thaw(visit_info *info)>
+
+Used to unarchive the array.
+=cut
+
+*/
+
+ VTABLE void freeze(visit_info *info) {
+ IMAGE_IO *io = info->image_io;
+ INTVAL *int_array;
+ INTVAL i, n, rt;
+
+ SUPER(info);
+
+ n = SELF.get_integer();
+ GET_ATTR_resize_threshold(INTERP, SELF, rt);
+ VTABLE_push_integer(INTERP, io, n);
+ VTABLE_push_integer(INTERP, io, rt);
+
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+
+ for (i = 0; i < n; ++i)
+ VTABLE_push_integer(INTERP, io, int_array[i]);
+ }
+
+ VTABLE void thaw(visit_info *info) {
+
+ Parrot_ResizableIntegerArray_attributes *attrs =
+ mem_allocate_zeroed_typed(Parrot_ResizableIntegerArray_attributes);
+ PMC_data(SELF) = attrs;
+
+ if (info->extra_flags == EXTRA_IS_NULL) {
+ IMAGE_IO * const io = info->image_io;
+ const INTVAL n = VTABLE_shift_integer(INTERP, io);
+ const INTVAL rt = VTABLE_shift_integer(INTERP, io);
+
+ SET_ATTR_size(INTERP, SELF, 0);
+ SET_ATTR_resize_threshold(INTERP, SELF, rt);
+ SET_ATTR_int_array(INTERP, SELF, NULL);
+
+ if (n) {
+ INTVAL i;
+ INTVAL *int_array;
+
+ SELF.set_integer_native(n);
+ GET_ATTR_int_array(INTERP, SELF, int_array);
+
+ for (i = 0; i < n; ++i)
+ int_array[i] = VTABLE_shift_integer(INTERP, io);
+ }
+ }
+ else
+ SUPER(info);
+ }
+
+
+}
/*
=back
Modified: trunk/src/pmc/string.pmc
==============================================================================
--- trunk/src/pmc/string.pmc (original)
+++ trunk/src/pmc/string.pmc Tue Jan 27 04:25:07 2009
@@ -890,7 +890,7 @@
p = (unsigned char *)src->strstart;
/* TODO verify trans table */
- tr_data = PMC_data_typed(table, INTVAL *); /* XXX */
+ GETATTR_FixedIntegerArray_int_array(INTERP, table, tr_data);
for (i = 0; i < len; ++i, ++p) {
const unsigned char ch = (unsigned char)tr_data[*p];
Modified: trunk/src/pmc/sub.pmc
==============================================================================
--- trunk/src/pmc/sub.pmc (original)
+++ trunk/src/pmc/sub.pmc Tue Jan 27 04:25:07 2009
@@ -715,8 +715,8 @@
/* If the first instruction is a get_params... */
if (*pc == PARROT_OP_get_params_pc) {
- int i, sig_length;
- PMC *sig;
+ int i, sig_length;
+ PMC *sig;
/* Get the signature (the next thing in the bytecode). */
pc++;
@@ -724,10 +724,10 @@
ASSERT_SIG_PMC(sig);
/* Iterate over the signature and compute argument counts. */
- sig_length = SIG_ELEMS(sig);
+ sig_length = VTABLE_elements(INTERP, sig);
for (i = 0; i < sig_length; i++)
{
- int sig_item = SIG_ITEM(sig, i);
+ int sig_item = VTABLE_get_integer_keyed_int(INTERP, sig, i);;
if (PARROT_ARG_SLURPY_ARRAY_ISSET(sig_item)){
if (PARROT_ARG_NAME_ISSET(sig_item))
sub->arg_info->named_slurpy = 1;
@@ -736,7 +736,7 @@
}
else if (PARROT_ARG_NAME_ISSET(sig_item)) {
i++;
- sig_item = SIG_ITEM(sig, i);
+ sig_item = VTABLE_get_integer_keyed_int(INTERP, sig, i);;
if (PARROT_ARG_OPTIONAL_ISSET(sig_item))
sub->arg_info->named_optional++;
else
-
[svn:parrot] r36053 - in trunk: compilers/imcc include/parrot languages/perl6/src/pmc src src/ops src/pmc
by cotto