Mercurial > repos > tabletprog
diff cbackend.js @ 57:08ae75d90dc2
Add != operator. Fix more closure bugs.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 14 Jul 2012 00:00:24 -0700 |
parents | 93ddb4ad6fcb |
children | 7b454d100dc8 |
line wrap: on
line diff
--- 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';