# HG changeset patch # User Mike Pavone # Date 1376037429 25200 # Node ID 833624457b81c4b879b6128bcf33013e5dd32535 # Parent 15aac5334b6414f3856f5759de0f151f85e35fce# Parent 5bcaddff29f5a2a8c89566e31970f28c6670ee31 Merge diff -r 15aac5334b64 -r 833624457b81 cbackend.js --- 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(''); - 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(''); + //-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) diff -r 15aac5334b64 -r 833624457b81 parser.js --- a/parser.js Fri Aug 09 01:36:53 2013 -0700 +++ b/parser.js Fri Aug 09 01:37:09 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; } @@ -77,14 +81,14 @@ 'expr = e:(funcall / methcall / opexpr) ws { return e; };' + 'opexpr = left:compareop pieces:(hws ("&&" / "||") hws compareop)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ 'compareop = left:addsub pieces:(hws ("<=" / ">=" / "<" / ">" / "=" / "!=") hws addsub)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ -'addsub = left:muldiv pieces:(hws ("+"/"-"/"xor"/".") hws muldiv)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ +'addsub = left:muldiv pieces:(hws ("+"/"-"/"xor"/"and"/"or"/".") hws muldiv)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ 'muldiv = left:primlitsym pieces:(hws ("*"/"/"/"%") hws primlitsym)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ 'primlitsym = hws val:(float / hex / binary / int / string / symbol / object / array / list / lambda / "(" ws expr:expr hws ")" { return expr; }) { return val; };' + 'symbol = chars:[a-zA-Z_!?@]+ trailing:(":"? [a-zA-Z_!?@0-9])* ! ":" { for (var i = 0; i < trailing.length; i++) { trailing[i] = trailing[i].join(""); } return new symbol(chars.join("") + trailing.join("")); };' + '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)); };' + +'hex = "0x" digits:[0-9a-fA-F]+ size:("i" ("8" / "16" / "32" / "64"))? { var bits = size ? parseInt(size[1], 10) : 0; return new intlit(parseInt(digits.join(""), 16), bits); };' + +'int = sign:"-"? digits:[0-9]+ size:("i" ("8" / "16" / "32" / "64"))? { var 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; };' + diff -r 15aac5334b64 -r 833624457b81 samples/bitwise.tp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/bitwise.tp Fri Aug 09 01:37:09 2013 -0700 @@ -0,0 +1,11 @@ +#{ + main <- { + a <- 0x42 + b <- 0x7A + print: "a or b = " . (string: a or b) . "\n" + print: "a and b = " . (string: a and b) . "\n" + print: "a xor b = " . (string: a xor b) . "\n" + print: "lshift: a by: 3 = " . (string: (lshift: a by: 3)) . "\n" + print: "rshift: b by: 1 = " . (string: (rshift: b by: 1)) . "\n" + } +} diff -r 15aac5334b64 -r 833624457b81 samples/int64.tp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/int64.tp Fri Aug 09 01:37:09 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" + } +}