Mercurial > repos > rhope
diff runtime/object.c @ 186:ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Oct 2011 00:10:02 -0700 |
parents | a68e6828d896 |
children |
line wrap: on
line diff
--- a/runtime/object.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/object.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,9 +1,15 @@ #include "object.h" #include "builtin.h" +#ifdef USE_GC +#include <gc/gc.h> +#else #include <stdlib.h> +#ifndef USE_MALLOC +#include "fixed_alloc.h" +#endif +#endif #include <string.h> #include <stdio.h> -#include "fixed_alloc.h" blueprint ** registered_types = NULL; uint32_t max_registered_type = 0; @@ -129,14 +135,27 @@ object * alloc_object(blueprint * bp) { +#ifdef USE_GC + return GC_malloc(bp->boxed_size); +#else +#ifdef USE_MALLOC + return malloc(bp->boxed_size); +#else return falloc(bp->boxed_size, manager); - //return malloc(bp->boxed_size); +#endif +#endif } +#ifndef USE_GC void dealloc_object(blueprint * bp, object * obj) { +#ifdef USE_MALLOC + free(obj); +#else ffree(obj, bp->boxed_size, manager); +#endif } +#endif object * new_object(uint32_t type) { @@ -155,7 +174,9 @@ if(ret) { ret->bprint = bp; +#ifndef USE_GC rh_atomic_set(ret, refcount, 1); +#endif memset(((char *)ret) + sizeof(object), '\0', bp->size); bp->init(ret); } else { @@ -170,13 +191,23 @@ multisize * ret; if(type >= max_registered_type || !registered_types[type]) return NULL; +#ifdef USE_GC + ret = GC_malloc(sizeof(multisize) + size); +#else +#ifdef USE_MALLOC + ret = malloc(sizeof(multisize) + size); +#else ret = falloc(sizeof(multisize) + size, manager); +#endif +#endif if(ret) { bp = registered_types[type]; ret->base.bprint = bp; ret->size = size; +#ifndef USE_GC rh_atomic_set(&(ret->base), refcount, 1); +#endif memset(((char *)ret) + sizeof(multisize), '\0', size); bp->init((object *)ret); } @@ -188,12 +219,22 @@ object * copy; multisize * mcopy, *mtocopy; blueprint * bp; +#ifndef USE_GC if(rh_atomic_get(tocopy, refcount) == 1) return tocopy; +#endif bp = get_blueprint(tocopy); if(bp->size < 0) { mtocopy = (multisize *)tocopy; +#ifdef USE_GC + mcopy = GC_malloc(sizeof(multisize) + mtocopy->size); +#else +#ifdef USE_MALLOC + mcopy = malloc(sizeof(multisize) + mtocopy->size); +#else mcopy = falloc(sizeof(multisize) + mtocopy->size, manager); +#endif +#endif mcopy->size = mtocopy->size; memcpy(((char *)mcopy)+sizeof(multisize), ((char *)mtocopy)+sizeof(multisize), mtocopy->size); copy = (object *)mcopy; @@ -202,7 +243,9 @@ memcpy(((char *)copy) + sizeof(object), ((char *)tocopy)+sizeof(object), bp->size); } copy->bprint = bp; +#ifndef USE_GC rh_atomic_set(copy, refcount, 1); +#endif bp->copy(copy); release_ref(tocopy); return copy; @@ -217,7 +260,9 @@ dest = alloc_object(bp); memcpy(((char *)dest) + sizeof(object), rawdata, bp->size); dest->bprint = bp; +#ifndef USE_GC rh_atomic_set(dest, refcount, 1); +#endif bp->copy(dest); return dest; } @@ -231,11 +276,13 @@ bp->copy(src); } +#ifndef USE_GC void release_ref(object * obj) { if(rh_atomic_sub_testzero(obj, refcount, 1)) get_blueprint(obj)->free(obj); } +#endif void check_type_storage(type) { @@ -245,7 +292,11 @@ if(type_storage) { type_storage_temp = (type + (type_storage >> 1)); +#ifdef USE_GC + temp = GC_realloc(registered_types, type_storage_temp * sizeof(blueprint *)); +#else temp = realloc(registered_types, type_storage_temp * sizeof(blueprint *)); +#endif if(temp) { registered_types = temp; @@ -254,7 +305,9 @@ } else { +#ifndef USE_GC free(registered_types); +#endif fprintf(stderr, "Couldn't allocate %d bytes for type storage array\n", type_storage_temp * sizeof(blueprint *)); exit(-1); } @@ -264,7 +317,12 @@ type_storage =INITIAL_TYPE_STORAGE; else type_storage = type + 8; +#ifdef USE_GC + registered_types = GC_malloc(type_storage * sizeof(blueprint *)); +#else registered_types = malloc(type_storage * sizeof(blueprint *)); +#endif + if(registered_types) memset(registered_types, '\0', type_storage * sizeof(blueprint *)); else @@ -285,7 +343,9 @@ blueprint * bp = get_blueprint(obj); if(bp->cleanup) bp->cleanup(obj); +#ifndef USE_GC ffree(obj, bp->boxed_size, manager); +#endif } void multi_free(object * obj) @@ -294,17 +354,24 @@ blueprint * bp = get_blueprint(obj); if(bp->cleanup) bp->cleanup(obj); +#ifndef USE_GC ffree(multi, sizeof(multisize) + multi->size, manager); +#endif } blueprint * new_blueprint(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup) { +#ifdef USE_GC + blueprint * bp = GC_malloc(sizeof(blueprint)); +#else blueprint * bp = malloc(sizeof(blueprint)); + //dirty hack!, move elsewhere if (!manager) { fixed_alloc_init(); manager = new_mem_manager(); } +#endif if(bp) { bp->size = size; @@ -343,6 +410,7 @@ return register_type_byid(max_registered_type, size, init, copy, cleanup); } +/* void add_method(blueprint * bp, uint32_t methodid, rhope_func impl) { rhope_func * temp; @@ -489,6 +557,7 @@ } bp->setter_lookup[setfieldid-bp->first_setfieldid] = impl; } +*/ blueprint * get_blueprint_byid(uint32_t type) {