# HG changeset patch # User Mike Pavone # Date 1375409448 25200 # Node ID 1a4446f573d3851595ff40deb903f8ba255e0bc5 # Parent d5dc9507d612b52887b82473512b969711384bee Add isInteger? method to the int32 type in the C backend diff -r d5dc9507d612 -r 1a4446f573d3 cbackend.js --- a/cbackend.js Wed Apr 17 23:56:55 2013 -0700 +++ b/cbackend.js Thu Aug 01 19:10:48 2013 -0700 @@ -7,7 +7,7 @@ { if (!(methodName in methodIds)) { methodIds[methodName] = nextmethodId++; - + } return methodIds[methodName]; } @@ -41,7 +41,7 @@ var pre = ''; switch(info.type) { case 'self': - + pre = (new symbol('self', symbols)).toC() + '->'; break; case 'parent': @@ -420,7 +420,7 @@ this.addMessage('_init', { vars: {}, lines: init - }); + }); this.initmsgadded = true; } } @@ -461,7 +461,7 @@ } if (this.slots[i].length == 1) { slotdefs += '\tif (method_id == ' + this.slots[i][0][0] + ') { /* ' + this.slots[i][0][2] + '*/\n' + - '\t\t' + this.slots[i][0][1] + '\n' + + '\t\t' + this.slots[i][0][1] + '\n' + '\t}\n' + '\treturn no_impl(method_id, num_params, (object *)self, args);\n}\n'; } else { @@ -472,7 +472,7 @@ } slotdefs += '\t\tdefault:\n' + '\t\t\treturn no_impl(method_id, num_params, (object *)self, args);\n\t}\n}\n'; - + } metadef += this.name + '_slot_' + i; } else { @@ -544,7 +544,7 @@ lines: messages[i].args[2].toCLines(vars, true) }); } else { - + throw new Error('Only import and import:from calls allowed in object context. ' + messages[i].name + 'with ' + messages[i].args.length + ' arguments found instead.'); } } else { @@ -615,6 +615,12 @@ 'return &(str->header);' ] }); + int32.addMessage('isInteger?', { + vars: {}, + lines: [ + 'return ' + toplevel.moduleVar('true') + ';' + ] + }); int32.addMessage('hash', { vars: {}, lines: [ @@ -776,7 +782,7 @@ }; function processUsedToplevel(toplevel) -{ +{ var alwaysused = ['true', 'false']; var ret = ''; var modulenum = 0; @@ -802,7 +808,7 @@ } } } - + for (var i = allused.length-1; i >= 0; i--) { var symbol = allused[i]; debugprint('//---module', symbol, '(' + i +')--- compile'); @@ -857,7 +863,7 @@ } for (var i = 0; i < args.length; ++i) { var argname = args[i].toC(); - + args[i] = (argname.indexOf('->') < 0 ? '\tobject * ' : '\t') + argname + ' = va_arg(args, object *);\n'; } var compiled = [] @@ -871,7 +877,7 @@ if (exprs.length) { exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');'; } - + if (Object.keys(this.symbols.closedover).length) { forwarddec += 'struct ' + this.name + '_env {\n'; if (this.symbols.needsParentEnv) { @@ -885,7 +891,7 @@ } } forwarddec += '};\n' - + var myenvinit = '\t' + this.name + '_env * myenv = GC_MALLOC(sizeof(' + this.name + '_env));\n'; if (this.symbols.needsParentEnv) { myenvinit += '\tmyenv->parent = env;\n'; @@ -895,7 +901,7 @@ var myenvinit = ''; } forwarddec += 'object *' + this.name + ' (' + this.symbols.parentEnvType() + ' * env, uint32_t num_args, ...);\n'; - + toplevelcode += 'object * ' + this.name + ' ( ' + this.symbols.parentEnvType() + ' * env, uint32_t num_args, ...) {\n\tva_list args;\n' + myenvinit + '\tva_start(args, num_args);\n'; if (this.selftype) { var selfvar = (new symbol('self', this.symbols)).toC(); @@ -904,10 +910,10 @@ } else { toplevelcode += '\t' + selfvar + ' = va_arg(args, ' + this.selftype + ' *);\n'; } - + } toplevelcode += args.join('') + '\tva_end(args);\n' + exprs.join(';\n\t') + '\n}\n'; - + if (this.selftype) { return this.name; } else { @@ -919,7 +925,7 @@ } debugprint('//' + this.name, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length); return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')'; - } else { + } else { toplevelcode += 'lambda ' + this.name + '_obj = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; return '((object *)&' + this.name + '_obj)'; }