diff cbackend.js @ 142:833624457b81

Merge
author Mike Pavone <pavone@retrodev.com>
date Fri, 09 Aug 2013 01:37:09 -0700
parents bf8f75b69048 101fa04ee9e1
children 282b8056b702
line wrap: on
line diff
--- a/cbackend.js	Fri Aug 09 01:36:53 2013 -0700
+++ b/cbackend.js	Fri Aug 09 01:37:09 2013 -0700
@@ -136,12 +136,13 @@
 var declaredInts = {};
 
 intlit.prototype.toC = function() {
-	var str = this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString();
-	if (!(this.val in declaredInts)) {
-		toplevelcode += 'obj_int32 int32_' + str + ' = {{&obj_int32_meta, NULL}, ' + this.val.toString() + '};\n';
-		declaredInts[this.val] = true;
+	var intType = 'int' + this.bits;
+	var str =  intType + '_' + (this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString());
+	if (!(str in declaredInts)) {
+		toplevelcode += 'obj_' + intType + ' ' + str + ' = {{&obj_' + intType + '_meta, NULL}, ' + this.val.toString() + '};\n';
+		declaredInts[str] = true;
 	}
-	return '((object *)&int32_' + str + ')';
+	return '((object *)&' + str + ')';
 }
 intlit.prototype.toCLLExpr = function(vars) {
 	return this.val.toString();
@@ -236,6 +237,8 @@
 					args.splice(0, 0, ', ' + obj);
 					start = 1;
 				}
+			} else if(!(args[0] instanceof symbol) || args[0].name != 'self') {
+				funinfo = null;
 			}
 			method = true;
 			break;
@@ -613,45 +616,65 @@
 	});
 }
 
-function makeInt32()
+function makeInt(bits)
 {
-	var int32 = new cObject('obj_int32');
-	int32.addProperty('num', null, 'int32_t');
-	addBinaryOp(int32, 'ADD_', '+', 'obj_int32');
-	addBinaryOp(int32, 'SUB_', '-', 'obj_int32');
-	addBinaryOp(int32, 'MUL_', '*', 'obj_int32');
-	addBinaryOp(int32, 'DIV_', '/', 'obj_int32');
-	addBinaryOp(int32, 'MOD_', '%', 'obj_int32');
-	addCompOp(int32, 'LT_', '<', 'obj_int32');
-	addCompOp(int32, 'GT_', '>', 'obj_int32');
-	addCompOp(int32, 'EQ_', '==', 'obj_int32');
-	addCompOp(int32, 'NEQ_', '!=', 'obj_int32');
-	addCompOp(int32, 'GEQ_', '>=', 'obj_int32');
-	addCompOp(int32, 'LEQ_', '<=', 'obj_int32');
-	int32.addInclude('<string.h>');
-	int32.addMessage('string', {
+	var typename = 'obj_int' + bits;
+	var intObj = new cObject(typename);
+	intObj.addProperty('num', null, 'int' + bits +'_t');
+	addBinaryOp(intObj, 'ADD_', '+', typename);
+	addBinaryOp(intObj, 'SUB_', '-', typename);
+	addBinaryOp(intObj, 'MUL_', '*', typename);
+	addBinaryOp(intObj, 'DIV_', '/', typename);
+	addBinaryOp(intObj, 'MOD_', '%', typename);
+	addBinaryOp(intObj, 'or', '|', typename);
+	addBinaryOp(intObj, 'xor', '^', typename);
+	addBinaryOp(intObj, 'and', '&', typename);
+	addBinaryOp(intObj, 'lshift:by', '<<', typename);
+	addBinaryOp(intObj, 'rshift:by', '>>', typename);
+	addCompOp(intObj, 'LT_', '<', typename);
+	addCompOp(intObj, 'GT_', '>', typename);
+	addCompOp(intObj, 'EQ_', '==', typename);
+	addCompOp(intObj, 'NEQ_', '!=', typename);
+	addCompOp(intObj, 'GEQ_', '>=', typename);
+	addCompOp(intObj, 'LEQ_', '<=', typename);
+	intObj.addInclude('<string.h>');
+	//-9223372036854775808
+	//01234567890123456789
+	intObj.addMessage('string', {
 		vars: {str: 'string *'},
 		lines: [
 			'str = (string *)make_object(&string_meta, NULL, 0);',
-			'str->data = GC_MALLOC(12);',
-			'sprintf(str->data, "%d", self->num);',
+			'str->data = GC_MALLOC(' + (bits == 64 ? 21 : 12) + ');',
+			'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'d", self->num);',
 			'str->len = str->bytes = strlen(str->data);',
 			'return &(str->header);'
 		]
 	});
-	int32.addMessage('isInteger?', {
+	//7FFFFFFFFFFFFFFF
+	//01234567890123456789
+	intObj.addMessage('hex', {
+		vars: {str: 'string *'},
+		lines: [
+			'str = (string *)make_object(&string_meta, NULL, 0);',
+			'str->data = GC_MALLOC(' + (bits == 64 ? 17 : 9) + ');',
+			'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'X", self->num);',
+			'str->len = str->bytes = strlen(str->data);',
+			'return &(str->header);'
+		]
+	});
+	intObj.addMessage('isInteger?', {
 		vars: {},
 		lines: [
 			'return ' + toplevel.moduleVar('true') + ';'
 		]
 	});
-	int32.addMessage('hash', {
+	intObj.addMessage('hash', {
 		vars: {},
 		lines: [
 			'return &(self->header);'
 		]
 	});
-	return int32;
+	return intObj;
 }
 
 function makeArray()
@@ -693,7 +716,7 @@
 
 function builtinTypes()
 {
-	return [makeInt32(), makeArray(), makeString(), makelambda()];
+	return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()];
 }
 
 function addBuiltinModules(toplevel)