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);