# HG changeset patch # User Mike Pavone # Date 1342324821 25200 # Node ID ab6f24d6945d66bf52833fde54fad763a1e3adf5 # Parent 0efd25a4958a53d1c8c75b7b1ea7fa4401fb6604 Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output. diff -r 0efd25a4958a -r ab6f24d6945d cbackend.js --- a/cbackend.js Sat Jul 14 19:32:14 2012 -0700 +++ b/cbackend.js Sat Jul 14 21:00:21 2012 -0700 @@ -169,30 +169,36 @@ } var method = false; var funinfo = this.symbols.find(name); + var start = 0; if (!funinfo || funinfo.def instanceof setter) { method = true; } else { switch(funinfo.type) { case 'self': - - if (args.length < funinfo.def.args.length || !funinfo.def.args.length || funinfo.def.args[0].name != 'self') { - args.splice(0, 0, new symbol('self', this.symbols)); - } else { - args.splice(0, 1); + case 'parent': + var defargs = funinfo.def.args.length; + if (!defargs || funinfo.def.args[0].name != 'self') { + defargs ++ + } + if (args.length < defargs) { + if (funinfo.type == 'self') { + args.splice(0, 0, new symbol('self', this.symbols)); + } else { + var obj = (new symbol('self', this.symbols)).toC() + '->header.'; + for (var i = 0; i < funinfo.depth; ++i) { + obj += (i ? '->' : '') + 'parent'; + } + args.splice(0, 0, ', ' + obj); + start = 1; + } } method = true; break; - case 'parent': - ret = 'self'; - for (var i = 0; i < funinfo.depth; ++i) { - ret += '->parent'; - } - break; } } - for (var i in args) { - args[i] = ', ' + args[i].toC(); + for (var i = start; i < args.length; i++) { + args[i] = ', ' + (!i && method ? '(object *)(' : '') + args[i].toC() + (!i && method ? ')' : ''); } var callpart; if (method) { @@ -831,7 +837,7 @@ } exprs = compiled; if (exprs.length) { - exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';'; + exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');'; } if (Object.keys(this.symbols.closedover).length) { @@ -943,7 +949,7 @@ } else { cobj.addProperty(this.symbol.name, val); if (this.expression instanceof object && this.expression.symbols.needsparent) { - cobj.addInit('self->' + escapeCName(this.symbol.name) + '->parent = self;'); + cobj.addInit('self->' + escapeCName(this.symbol.name) + '->parent = (object *)self;'); } } };