view runtime/array.c @ 78:4d5ea487f810

Working String implementation and some basic (but nowhere near exhaustive) tests
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Jul 2010 21:55:47 -0400
parents 70af7fa155d0
children 5a08705f7610
line wrap: on
line source

#include "integer.h"
#include "object.h"

void _internal_array_copyout(object * array, int32_t index, object * dest)
{
	t_Array * arr = (t_Array *)array;
	memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size);
	get_blueprint(dest)->copy(dest);
}

void _internal_array_copyin(object * array, int32_t index, object * val)
{
	t_Array * arr = (t_Array *)array;
	memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size);
	get_blueprint(val)->copy(val);
}

object * _internal_array_getboxed(object * array, int32_t index)
{
	object * ret;
	object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
	ret = add_ref(intarr[index]);
	release_ref(array);
	return ret;
}

void _internal_array_setboxed(object *array, int32_t index, object * val)
{
	object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
	intarr[index] = val;
}

object *_internal_array_allocboxed(int32_t size)
{
	t_Array * ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+sizeof(object *)*size);
	ret->payload.Length = 0;
	ret->payload.Storage = size;
	ret->payload.Eltype = (t_Blueprint *)make_Blueprint(0);
	
	return (object *)ret;
}

object * _internal_array_allocnaked(int32_t size , object * type)
{
	t_Array * ret;
	t_Blueprint * bp = (t_Blueprint *)type;
	if (bp->bp->size < 0) {
		return _internal_array_allocboxed(size);
	}	
	ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
	ret->payload.Length = 0;
	ret->payload.Storage = size;
	ret->payload.Eltype = bp;
	
	return ret;
}