Mercurial > repos > tabletprog
comparison cbackend.js @ 122:9820ecd4eed4
Add support for implementing operators on user defined objects
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 03 Aug 2013 00:13:09 -0700 |
parents | 1a4446f573d3 |
children | 34e0befbdd77 bf8f75b69048 |
comparison
equal
deleted
inserted
replaced
121:1a4446f573d3 | 122:9820ecd4eed4 |
---|---|
10 | 10 |
11 } | 11 } |
12 return methodIds[methodName]; | 12 return methodIds[methodName]; |
13 } | 13 } |
14 | 14 |
15 function getOpMethodName(opname) | |
16 { | |
17 var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '%': 'MOD_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_', '&&':'if', '||':'ifnot'}; | |
18 if (opname in optoMeth) { | |
19 return optoMeth[opname]; | |
20 } else { | |
21 return opname; | |
22 } | |
23 } | |
24 | |
15 op.prototype.toC = function(isReceiver) { | 25 op.prototype.toC = function(isReceiver) { |
16 var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '%': 'MOD_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_', '&&':'if', '||':'ifnot'}; | 26 var method = getOpMethodName(this.op); |
17 var method = optoMeth[this.op]; | 27 return 'mcall(' + getMethodId(method) + '/* operator ' + method + ' */, 2, (object *)' + this.left.toC() + ', ' + this.right.toC() + ')\n'; |
18 return 'mcall(' + getMethodId(method) + '/* ' + method + ' */, 2, (object *)' + this.left.toC() + ', ' + this.right.toC() + ')\n'; | |
19 }; | 28 }; |
20 op.prototype.toCLLExpr = function(vars) { | 29 op.prototype.toCLLExpr = function(vars) { |
21 var opmap = {'=': '==', 'xor': '^'}; | 30 var opmap = {'=': '==', 'xor': '^'}; |
22 return this.left.toCLLExpr(vars) + (this.op in opmap ? opmap[this.op] : this.op) + this.right.toCLLExpr(vars); | 31 return this.left.toCLLExpr(vars) + (this.op in opmap ? opmap[this.op] : this.op) + this.right.toCLLExpr(vars); |
23 }; | 32 }; |
1003 messagevars[escaped] = 'object *'; | 1012 messagevars[escaped] = 'object *'; |
1004 params.push(escaped); | 1013 params.push(escaped); |
1005 paramget += escaped + ' = va_arg(args, object *); '; | 1014 paramget += escaped + ' = va_arg(args, object *); '; |
1006 } | 1015 } |
1007 } | 1016 } |
1008 cobj.addMessage(this.symbol.name, { | 1017 cobj.addMessage(getOpMethodName(this.symbol.name), { |
1009 vars: messagevars, | 1018 vars: messagevars, |
1010 lines: [paramget + 'return ' + val + '(' + (cobj.hasenv ? 'self->env' : 'NULL') + ', ' + params.length + (params.length ? ', ' : '') + params.join(', ') + ');'] | 1019 lines: [paramget + 'return ' + val + '(' + (cobj.hasenv ? 'self->env' : 'NULL') + ', ' + params.length + (params.length ? ', ' : '') + params.join(', ') + ');'] |
1011 }); | 1020 }); |
1012 } else { | 1021 } else { |
1013 cobj.addProperty(this.symbol.name, val); | 1022 cobj.addProperty(this.symbol.name, val); |