Mercurial > repos > rhope
diff runtime/object.c @ 34:df038cef648b
More work on supporting user defined types in the C backend
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 30 Sep 2009 01:25:03 -0400 |
parents | 914ad38f9b59 |
children | 495dddadd058 |
line wrap: on
line diff
--- a/runtime/object.c Mon Sep 28 22:08:40 2009 -0400 +++ b/runtime/object.c Wed Sep 30 01:25:03 2009 -0400 @@ -342,6 +342,104 @@ bp->method_lookup[methodid-bp->first_methodid] = impl; } +void add_getter(blueprint * bp, uint32_t getfieldid, rhope_func impl) +{ + rhope_func * temp; + if(getfieldid < 1) { + fputs("Attempt to add a method with an ID < 1\n", stderr); + exit(-1); + } + if (!bp->getter_lookup) + { + bp->getter_lookup = malloc(sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + if(!bp->getter_lookup) { + fprintf(stderr, "Couldn't allocate %d bytes for getter lookup table\n", sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + exit(-1); + } + if(BELOW_INITIAL_METHOD > getfieldid) { + bp->first_getfieldid = 1; + bp->last_getfieldid = 1+INITIAL_METHOD_LOOKUP; + } else { + bp->first_getfieldid = getfieldid - BELOW_INITIAL_METHOD; + bp->last_getfieldid = bp->first_getfieldid + INITIAL_METHOD_LOOKUP; + } + memset(bp->getter_lookup, '\0', sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + } else { + if (getfieldid < bp->first_getfieldid) { + temp = bp->getter_lookup; + //Note: if this gets changed to generating an exception on failure, we need to restore the original buffer + bp->getter_lookup = malloc(sizeof(rhope_func) * (bp->last_getfieldid-getfieldid)); + if(!bp->getter_lookup) { + fprintf(stderr, "Couldn't allocate %d bytes for getter lookup table\n", sizeof(rhope_func) * (bp->last_getfieldid-getfieldid)); + exit(-1); + } + memset(bp->getter_lookup, '\0', (bp->first_getfieldid-getfieldid) * sizeof(rhope_func)); + memcpy(bp->getter_lookup + bp->first_getfieldid-getfieldid, temp, (bp->last_getfieldid-bp->first_getfieldid)*sizeof(rhope_func)); + free(temp); + bp->first_getfieldid = getfieldid; + } else if(getfieldid >= bp->last_getfieldid) { + //Note: if this gets changed to generating an exception on failure, we need to restore the original buffer + bp->getter_lookup = realloc(bp->getter_lookup, (getfieldid+1-bp->first_getfieldid) * sizeof(rhope_func)); + if(!bp->getter_lookup) { + fprintf(stderr, "Couldn't resize getter lookup table to %d bytes\n", (getfieldid+1-bp->first_getfieldid) * sizeof(rhope_func)); + exit(-1); + } + memset(bp->getter_lookup+bp->last_getfieldid, '\0', (getfieldid+1)-bp->last_getfieldid); + bp->last_getfieldid = getfieldid+1; + } + } + bp->getter_lookup[getfieldid-bp->first_getfieldid] = impl; +} + +void add_setter(blueprint * bp, uint32_t setfieldid, rhope_func impl) +{ + rhope_func * temp; + if(setfieldid < 1) { + fputs("Attempt to add a method with an ID < 1\n", stderr); + exit(-1); + } + if (!bp->setter_lookup) + { + bp->setter_lookup = malloc(sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + if(!bp->setter_lookup) { + fprintf(stderr, "Couldn't allocate %d bytes for setter lookup table\n", sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + exit(-1); + } + if(BELOW_INITIAL_METHOD > setfieldid) { + bp->first_setfieldid = 1; + bp->last_setfieldid = 1+INITIAL_METHOD_LOOKUP; + } else { + bp->first_setfieldid = setfieldid - BELOW_INITIAL_METHOD; + bp->last_setfieldid = bp->first_setfieldid + INITIAL_METHOD_LOOKUP; + } + memset(bp->setter_lookup, '\0', sizeof(rhope_func) * INITIAL_METHOD_LOOKUP); + } else { + if (setfieldid < bp->first_setfieldid) { + temp = bp->setter_lookup; + //Note: if this sets changed to generating an exception on failure, we need to restore the original buffer + bp->setter_lookup = malloc(sizeof(rhope_func) * (bp->last_setfieldid-setfieldid)); + if(!bp->setter_lookup) { + fprintf(stderr, "Couldn't allocate %d bytes for setter lookup table\n", sizeof(rhope_func) * (bp->last_setfieldid-setfieldid)); + exit(-1); + } + memset(bp->setter_lookup, '\0', (bp->first_setfieldid-setfieldid) * sizeof(rhope_func)); + memcpy(bp->setter_lookup + bp->first_setfieldid-setfieldid, temp, (bp->last_setfieldid-bp->first_setfieldid)*sizeof(rhope_func)); + free(temp); + bp->first_setfieldid = setfieldid; + } else if(setfieldid >= bp->last_setfieldid) { + //Note: if this sets changed to generating an exception on failure, we need to restore the original buffer + bp->setter_lookup = realloc(bp->setter_lookup, (setfieldid+1-bp->first_setfieldid) * sizeof(rhope_func)); + if(!bp->setter_lookup) { + fprintf(stderr, "Couldn't resize setter lookup table to %d bytes\n", (setfieldid+1-bp->first_setfieldid) * sizeof(rhope_func)); + exit(-1); + } + memset(bp->setter_lookup+bp->last_setfieldid, '\0', (setfieldid+1)-bp->last_setfieldid); + bp->last_setfieldid = setfieldid+1; + } + } + bp->setter_lookup[setfieldid-bp->first_setfieldid] = impl; +} + blueprint * get_blueprint_byid(uint32_t type) { if(type >= max_registered_type)