On Mon, Oct 21, 2002 at 08:05:32PM +0200, Peter Gibbs wrote:
> The last one looks like a fundamental problem in MultiArray.
> The line
> b->cell_buffer = new_buffer_header(interpreter);
> in function new_marray is creating a new buffer header, overwriting
> the new_bufferlike_header created earlier.
I didn't really read enough of the code to know whether this is doing
at all the right thing or not, but here's a trial patch that makes the
test failure go away on my machine, at least. Josef, can you take a
look? Apply with patch -p0 < multiarray.patch in the parrot directory.
Index: classes/multiarray.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/multiarray.pmc,v
retrieving revision 1.5
diff -p -u -r1.5 multiarray.pmc
--- classes/multiarray.pmc 7 Sep 2002 02:29:09 -0000 1.5
+++ classes/multiarray.pmc 22 Oct 2002 07:00:30 -0000
@@ -56,7 +56,7 @@ typedef struct _cell_buffer CELL_B;
* cell buffer representation
*/
struct _cell_buffer {
- Buffer *cell_buffer;
+ Buffer buffer;
INTVAL size;
INTVAL free_cell;
PMC *dimension;
@@ -102,7 +102,7 @@ static INTVAL calc_offset_multi(struct P
dim_key = cell_data->dimension;
my_key = k;
- if(cell_data->cell_buffer != NULL && dim_key != NULL && my_key != NULL ) {
+ if(cell_data->buffer.bufstart != NULL && dim_key != NULL && my_key != NULL ) {
/* first part of alg.
* (i + (j-1)*Ni
@@ -155,7 +155,7 @@ static void expand_cell_buffer( struct P
{
CELL_B *b = data;
if(new_size > b->size) {
- Parrot_reallocate(interpreter, b->cell_buffer, new_size * sizeof(CELL));
+ Parrot_reallocate(interpreter, &b->buffer, new_size * sizeof(CELL));
b->free_cell += (new_size - b->size);
b->size = new_size;
}
@@ -171,7 +171,7 @@ static CELL *new_cell( struct Parrot_Int
CELL *ret_cell;
INTVAL new_size = 0;
CELL_B *cell_b = data;
- ret_cell = (CELL *)cell_b->cell_buffer->bufstart;
+ ret_cell = (CELL *)cell_b->buffer.bufstart;
if((cell_b->free_cell-1) > 0) {
cell_b->free_cell -= 1;
@@ -179,7 +179,7 @@ static CELL *new_cell( struct Parrot_Int
new_size = cell_b->size*2;
expand_cell_buffer( interpreter, cell_b, new_size);
cell_b->free_cell -= 1;
- ret_cell = (CELL *)cell_b->cell_buffer->bufstart;
+ ret_cell = (CELL *)cell_b->buffer.bufstart;
}
return &ret_cell[cell_b->size - cell_b->free_cell-1]; /* notice -1 we start at 0
*/
}
@@ -188,13 +188,11 @@ static CELL *new_cell( struct Parrot_Int
static CELL_B *new_marray( Interp *interpreter )
{
CELL_B *b = (CELL_B *)new_bufferlike_header(interpreter, sizeof(*b));
- /* CELL_B *b = (CELL_B *)new_tracked_header(interpreter, sizeof(*b)); */
b->size = CELL_POOL_SIZE;
b->free_cell = CELL_POOL_SIZE;
- b->cell_buffer = new_buffer_header(interpreter);
b->dimension = NULL;
- Parrot_allocate(interpreter, b->cell_buffer , CELL_POOL_SIZE*sizeof(CELL));
- memset( b->cell_buffer->bufstart, 0, CELL_POOL_SIZE*sizeof(CELL));
+ Parrot_allocate(interpreter, &b->buffer, CELL_POOL_SIZE*sizeof(CELL));
+ memset( b->cell_buffer.bufstart, 0, CELL_POOL_SIZE*sizeof(CELL));
return b;
}
@@ -208,8 +206,8 @@ static void init_marray( Interp *interpr
PMC *oldkey;
marray = new_marray(interpreter);
- marray->cell_buffer->flags |= PMC_is_buffer_ptr_FLAG;
- marray->cell_buffer->flags |= PMC_is_PMC_ptr_FLAG;
+ marray->buffer.flags |= PMC_is_buffer_ptr_FLAG;
+ marray->buffer.flags |= PMC_is_PMC_ptr_FLAG;
self->data = (CELL_B *)marray;
self->cache.int_val = 0;
@@ -225,8 +223,8 @@ static void init_marray( Interp *interpr
marray->size = size;
marray->free_cell = size;
- Parrot_reallocate(interpreter, marray->cell_buffer, marray->size * sizeof(CELL));
- memset(marray->cell_buffer->bufstart, 0, marray->size * sizeof(CELL));
+ Parrot_reallocate(interpreter, &marray->buffer, marray->size * sizeof(CELL));
+ memset(marray->buffer.bufstart, 0, marray->size * sizeof(CELL));
marray->dimension = oldkey;
}
@@ -249,7 +247,7 @@ static INTVAL get_marray_keyed( Interp *
offs = calc_offset_multi(interpreter, mg_marray, key);
- base = (CELL *)mg_marray->cell_buffer->bufstart;
+ base = (CELL *)mg_marray->buffer.bufstart;
buffer_ptr = &base[offs];
buffer_ptr_virt = buffer_ptr;
@@ -319,7 +317,7 @@ static void set_marray_keyed( Interp *in
CELL *base;
INTVAL offs = 0;
offs = calc_offset_multi(interpreter, sik_marray, key);
- base = (CELL *)sik_marray->cell_buffer->bufstart;
+ base = (CELL *)sik_marray->buffer.bufstart;
my_cell = &base[offs];
my_cell->virtual_addr = offs;
my_cell->data.int_val = src_value;
@@ -827,7 +825,7 @@ pmclass MultiArray {
INTVAL stalker;
marray = SELF->data;
- base = (CELL *)marray->cell_buffer->bufstart;
+ base = (CELL *)marray->buffer.bufstart;
size = stalker = marray->size;
while(stalker >= 0) {
ptr = &base[size-stalker];
@@ -865,7 +863,7 @@ pmclass MultiArray {
INTVAL stalker;
marray = SELF->data;
- base = (CELL *)marray->cell_buffer->bufstart;
+ base = (CELL *)marray->buffer.bufstart;
size = stalker = marray->size;
while(stalker >= 0) {
ptr = &base[size-stalker];
@@ -902,7 +900,7 @@ pmclass MultiArray {
INTVAL stalker;
marray = SELF->data;
- base = (CELL *)marray->cell_buffer->bufstart;
+ base = (CELL *)marray->buffer.bufstart;
size = stalker = marray->size;
while(stalker >= 0) {
ptr = &base[size-stalker];
@@ -939,7 +937,7 @@ pmclass MultiArray {
INTVAL stalker;
marray = SELF->data;
- base = (CELL *)marray->cell_buffer->bufstart;
+ base = (CELL *)marray->buffer.bufstart;
size = stalker = marray->size;
while(stalker >= 0) {
ptr = &base[size-stalker];
@@ -976,7 +974,7 @@ pmclass MultiArray {
INTVAL stalker;
marray = SELF->data;
- base = (CELL *)marray->cell_buffer->bufstart;
+ base = (CELL *)marray->buffer.bufstart;
size = stalker = marray->size;
while(stalker >= 0) {
ptr = &base[size-stalker];