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)