# HG changeset patch # User Mike Pavone # Date 1342249224 25200 # Node ID 08ae75d90dc2b401295b8a306fa2337cf9e2aedc # Parent a9bf3ffb63796e2d66d945f271b931f1ffc4f901 Add != operator. Fix more closure bugs. diff -r a9bf3ffb6379 -r 08ae75d90dc2 cbackend.js --- a/cbackend.js Fri Jul 13 21:28:37 2012 -0700 +++ b/cbackend.js Sat Jul 14 00:00:24 2012 -0700 @@ -64,14 +64,15 @@ pre = (new symbol('self', symbols)).toC() + '->'; break; case 'parent': - pre = 'self->'; + pre = (new symbol('self', symbols)).toC() + '->header.'; for (var i = 0; i < info.depth; ++i) { - pre += 'parent->'; + pre += (i ? '->' : '') + 'parent'; } + pre = '((' + info.selftype + ' *)' + pre + ')->'; break; case 'upvar': pre = 'env->'; - for (var i = 1; i < info.depth; ++i) { + for (var i = info.startdepth; i < info.depth; ++i) { pre += 'parent->'; } break; @@ -291,7 +292,8 @@ '\t\t\t' + this.slots[i][j][1] + '\n'; } slotdefs += '\t\tdefault:\n' + - '\treturn no_impl(method_id, num_params, params, args);\n}\n'; + '\t\t\treturn no_impl(method_id, num_params, (object *)self, args);\n\t}\n}\n'; + } metadef += this.name + '_slot_' + i; } else { @@ -319,6 +321,7 @@ var values = []; var imports = [] var me = new cObject('object_' + nextobject++); + this.symbols.typename = me.name; if (this.symbols.needsenv) { me.addProperty('env', this.symbols.envVar(), 'struct ' + this.symbols.getEnvType() + ' * '); me.hasenv = true; @@ -494,6 +497,16 @@ 'return mcall(METHOD_ID_FALSE, 1, main_module);' ] }); + string.addMessage('NEQ_', { + vars: {argb: 'string *'}, + lines: [ + 'argb = va_arg(args, string *);', + 'if (self->length != argb->length || self->bytes != argb->bytes || memcmp(self->data, argb->data, self->bytes)) {', + ' return mcall(METHOD_ID_TRUE, 1, main_module);', + '}', + 'return mcall(METHOD_ID_FALSE, 1, main_module);' + ] + }); string.addMessage('print', { vars: {}, lines: [ @@ -703,6 +716,7 @@ var args = this.args ? this.args.slice(0, this.args.length) : []; var exprs = this.expressions; var mynum = lambdanum++; + debugprint('//lambda', mynum); if (Object.keys(this.symbols.closedover).length) { this.symbols.envtype = 'lambda_' + mynum + '_env'; } @@ -734,6 +748,9 @@ if (Object.keys(this.symbols.closedover).length) { forwarddec += 'typedef struct lambda_' + mynum + '_env {\n'; + if (this.symbols.needsParentEnv) { + forwarddec += '\tstruct ' + this.symbols.parentEnvType() + ' * parent;\n'; + } for (var varname in this.symbols.closedover) { if (varname == 'self' && this.selftype) { forwarddec += '\tstruct ' + this.selftype + ' * self;\n'; diff -r a9bf3ffb6379 -r 08ae75d90dc2 compiler.js --- a/compiler.js Fri Jul 13 21:28:37 2012 -0700 +++ b/compiler.js Sat Jul 14 00:00:24 2012 -0700 @@ -66,6 +66,7 @@ this.parent = parent; this.names = {}; this.needsenv = false; + this.typename = null; } osymbols.prototype.find = function(name, nestedcall) { debugprint('//osymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall); @@ -79,6 +80,7 @@ var ret = { type: 'self', def: this.names[name], + selftype: this.typename }; } else if(this.parent) { var ret = this.parent.find(name, nestedcall); @@ -140,6 +142,7 @@ this.needsSelfVar = false; this.passthruenv = false; this.envtype = 'void'; + this.needsParentEnv = false; } lsymbols.prototype.find = function(name, nestedcall) { debugprint('//lsymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall); @@ -177,18 +180,22 @@ if (ret.type == 'upvar') { if (Object.keys(this.closedover).length) { ret.depth++; + ret.startdepth = 1; + this.needsParentEnv = true; } else { this.passthruenv = true; - if (ret.depth == 0) { + ret.startdepth = 0; + /*if (ret.depth == 0) { ret.depth = 1; - } + }*/ } } } } else { return null; } - debugprint('\t//symbol type:', ret ? ret.type : 'null'); + var type = ret ? ret.type : 'null'; + debugprint('\t//symbol type:', type , type == 'upvar' ? 'depth: ' + ret.depth : ''); return ret; }; lsymbols.prototype.defineVar = function(name, def) { @@ -261,7 +268,7 @@ symbol.prototype.populateSymbols = function(symbols) { this.symbols = symbols; var ret = symbols.find(this.cleanName()); - if (ret.type == 'self') { + if (ret && ret.type == 'self') { symbols.find('self'); } } diff -r a9bf3ffb6379 -r 08ae75d90dc2 parser.js --- a/parser.js Fri Jul 13 21:28:37 2012 -0700 +++ b/parser.js Sat Jul 14 00:00:24 2012 -0700 @@ -74,7 +74,7 @@ 'ws = ([ \\t\\n\\r] / "//" [^\\n]* "\\n")*;' + 'hws = ([ \\t] / "/*" ([^*] / "*" ! "/")* "*/" )*;' + 'expr = e:(funcall / methcall / opexpr) ws { return e; };' + -'opexpr = 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; } };'+ +'opexpr = 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 ("+"/"-"/".") 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; };' +