changeset 135:f98790d8a53d

Add int64, int16 and int8. Also add hex method to integer types.
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Aug 2013 20:03:15 -0700
parents 34e0befbdd77
children 4c7c3d3e0265
files cbackend.js parser.js samples/int64.tp
diffstat 3 files changed, 64 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Thu Aug 08 19:19:19 2013 -0700
+++ b/cbackend.js	Thu Aug 08 20:03:15 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();
@@ -598,50 +599,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');
-	addBinaryOp(int32, 'or', '|', 'obj_int32');
-	addBinaryOp(int32, 'xor', '^', 'obj_int32');
-	addBinaryOp(int32, 'and', '&', 'obj_int32');
-	addBinaryOp(int32, 'lshift:by', '<<', 'obj_int32');
-	addBinaryOp(int32, 'rshift:by', '>>', '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()
@@ -683,7 +699,7 @@
 
 function builtinTypes()
 {
-	return [makeInt32(), makeArray(), makeString(), makelambda()];
+	return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()];
 }
 
 function addBuiltinModules(toplevel)
--- a/parser.js	Thu Aug 08 19:19:19 2013 -0700
+++ b/parser.js	Thu Aug 08 20:03:15 2013 -0700
@@ -15,8 +15,12 @@
 	return this.name[0] == ':' ? this.name.substr(1) : this.name;
 }
 
-function intlit(val)
+function intlit(val, bits)
 {
+	if (!bits) {
+		bits = 32;
+	}
+	this.bits = bits;
 	this.val = val;
 }
 
@@ -84,7 +88,7 @@
 'float = digits:[0-9]+ "." decimals:[0-9]+ { return new floatlit(parseFloat(digits.join("") + "." + decimals.join(""))); };' +
 'binary = "0b" digits:[01]+ { return new intlit(parseInt(digits.join(""), 2)); };' +
 'hex = "0x" digits:[0-9a-fA-F]+ { return new intlit(parseInt(digits.join(""), 16)); };' +
-'int = sign:"-"? digits:[0-9]+ { return new intlit(parseInt(sign + digits.join(""), 10)); };' +
+'int = sign:"-"? digits:[0-9]+ size:("i" ("8" / "16" / "32" / "64"))? { bits = size ? parseInt(size[1], 10) : 0; return new intlit(parseInt(sign + digits.join(""), 10), bits); };' +
 'string = "\\"" text:(strpart/escape)* "\\"" { return new strlit(text.join("")); };' +
 'strpart = text:[^\\"\\\\]+ { return text.join(""); };' +
 'escape = "\\\\" char:[nt\\"r\\\\] { if (char == "n") { return "\\n"; } if (char == "r") { return "\\r"; } return char; };' +
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/int64.tp	Thu Aug 08 20:03:15 2013 -0700
@@ -0,0 +1,10 @@
+#{
+	main <- {
+		a <- 2147483647
+		b <- 2147483647i64
+		print: "a + a = " . (string: a + a) . "\n"
+		print: "b + b = " . (string: b + b) . "\n"
+		print: "hex: a + a = " . (hex: a + a) . "\n"
+		print: "hex: b + b = " . (hex: b + b) . "\n"
+	}
+}