Mercurial > repos > tabletprog
comparison cbackend.js @ 40:927fd7911a01
Add append message to array
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 11 Jul 2012 19:17:24 -0700 |
parents | a997e42b9051 |
children | 0558dad9d061 |
comparison
equal
deleted
inserted
replaced
39:a997e42b9051 | 40:927fd7911a01 |
---|---|
106 strlit.prototype.toC = function() { | 106 strlit.prototype.toC = function() { |
107 return 'make_str("' + this.val.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r') + '")'; | 107 return 'make_str("' + this.val.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r') + '")'; |
108 } | 108 } |
109 | 109 |
110 listlit.prototype.toC = function() { | 110 listlit.prototype.toC = function() { |
111 var ret = 'make_list(' + this.val.length + ', '; | 111 var ret = 'make_list(' + this.val.length; |
112 for (var i = 0; i < this.val.length; i++) { | 112 for (var i = 0; i < this.val.length; i++) { |
113 ret += (i ? ', ' : '') + this.val[i].toC(); | 113 ret += ', ' + this.val[i].toC(); |
114 } | 114 } |
115 return ret + ')'; | 115 return ret + ')'; |
116 } | 116 } |
117 | 117 |
118 arraylit.prototype.toC = function() { | 118 arraylit.prototype.toC = function() { |
119 var ret = 'make_array(' + this.val.length + ', '; | 119 var ret = 'make_array(' + this.val.length; |
120 for (var i = 0; i < this.val.length; i++) { | 120 for (var i = 0; i < this.val.length; i++) { |
121 ret += (i ? ', ' : '') + this.val[i].toC(); | 121 ret += ', ' + this.val[i].toC(); |
122 } | 122 } |
123 return ret + ')'; | 123 return ret + ')'; |
124 } | 124 } |
125 | 125 |
126 funcall.prototype.toC = function() { | 126 funcall.prototype.toC = function() { |
383 ' ccall(clos, 2, index, self->data[i]);', | 383 ' ccall(clos, 2, index, self->data[i]);', |
384 '}', | 384 '}', |
385 'return (object *)self;' | 385 'return (object *)self;' |
386 ] | 386 ] |
387 }); | 387 }); |
388 array.addMessage('append', { | |
389 vars: {tmp: 'object *'}, | |
390 lines: [ | |
391 'if (self->storage == self->size) {', | |
392 ' self->storage *= 2;', | |
393 ' tmp = realloc(self->data, self->storage);', | |
394 ' if (!tmp) {', | |
395 ' fputs("Failed to increase array size\\n", stderr);', | |
396 ' exit(1);', | |
397 ' }', | |
398 ' self->data = tmp;', | |
399 '}', | |
400 'self->data[self->size++] = va_arg(args, object *);', | |
401 'return self;' | |
402 ] | |
403 }); | |
388 forwarddec = toplevelcode = ''; | 404 forwarddec = toplevelcode = ''; |
389 forwarddec += int32.toEarlyCDef() + array.toEarlyCDef(); | 405 forwarddec += int32.toEarlyCDef() + array.toEarlyCDef(); |
390 toplevelcode += int32.toCDef() + array.toCDef(); | 406 toplevelcode += int32.toCDef() + array.toCDef(); |
391 obj.populateSymbols(toplevel); | 407 obj.populateSymbols(toplevel); |
392 var rest = 'object * mainModule() {\n\tmain_module = ' + obj.toC() + ';\n\treturn main_module;\n}\n'; | 408 var rest = 'object * mainModule() {\n\tmain_module = ' + obj.toC() + ';\n\treturn main_module;\n}\n'; |