diff runtime/builtin.c @ 48:a24eb366195c

Fixed some bugs introduced in previous commit and moved definition of integer methods out of runtime and into the compiler
author Mike Pavone <pavone@retrodev.com>
date Tue, 02 Mar 2010 00:18:49 -0500
parents 640f541e9116
children 689fb73e7612
line wrap: on
line diff
--- a/runtime/builtin.c	Tue Dec 22 01:22:09 2009 -0500
+++ b/runtime/builtin.c	Tue Mar 02 00:18:49 2010 -0500
@@ -10,25 +10,6 @@
 	blueprint * bp;
 	switch(type)
 	{
-	case TYPE_INT32:
-		bp = register_type_byid(TYPE_INT32, sizeof(int32_t), NULL, NULL, NULL);
-		add_method(bp, METHOD_ADD, MethodName(_PL_,Int32));
-		add_method(bp, METHOD_SUB, MethodName(_MN_,Int32));
-		add_method(bp, METHOD_MUL, MethodName(_TM_,Int32));
-		add_method(bp, METHOD_DIV, MethodName(_DV_,Int32));
-		add_method(bp, METHOD_LSHIFT, MethodName(LShift,Int32));
-		add_method(bp, METHOD_RSHIFT, MethodName(RShift,Int32));
-		add_method(bp, METHOD_LESS, MethodName(_LT_,Int32));
-		add_method(bp, METHOD_GREATER, MethodName(_GT_,Int32));
-		break;
-	case TYPE_BOOLEAN:
-		bp = register_type_byid(TYPE_BOOLEAN, sizeof(int32_t), NULL, NULL, NULL);
-		add_method(bp, METHOD_IF, MethodName(If,Boolean));
-		val_yes = (t_Boolean *)new_object(TYPE_BOOLEAN);
-		val_yes->val = 1;
-		val_no = (t_Boolean *)new_object(TYPE_BOOLEAN);
-		val_no->val = 0;
-		break;
 	case TYPE_BLUEPRINT:
 		bp = register_type_byid(TYPE_BLUEPRINT, sizeof(blueprint *), NULL, NULL, NULL);
 		break;
@@ -49,10 +30,37 @@
 	
 	if(get_blueprint(cdata->params[0]) == get_blueprint_byid(TYPE_INT32))
 	{
-		printf("%d\n", ((t_Int32 *)(cdata->params[0]))->num);
+		printf("%d\n", ((t_Int32 *)(cdata->params[0]))->Num);
 	} else {
 		puts("Don't know how to print this type");
 	}
 	release_ref(cdata->params[0]);
 	Ret(0, make_Int32(0))
 EndFunc
+object * make_Int32(int32_t val)
+{
+	t_Int32 * obj;
+	object * ret = new_object(TYPE_INT32);
+	obj = (t_Int32 *)ret;
+	obj->Num = val;
+	return ret;
+}
+
+#define lval ((t_Boolean *)(cdata->params[0]))->Val
+
+MethodNoLocals(If,Boolean,
+	NumParams 1,
+	CallSpace 1)
+	
+	Param(0, TYPE_BOOLEAN)
+	
+	if(lval)
+	{
+		Ret(1, NULL)
+	} else {
+		Ret(1, cdata->params[0]);
+		Ret(0, NULL)
+	}
+EndFunc
+
+