Mercurial > repos > tabletprog
changeset 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 |
files | cbackend.js runtime/progfoot.inc samples/testarray.tp |
diffstat | 3 files changed, 36 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/cbackend.js Tue Jul 10 23:18:14 2012 -0700 +++ b/cbackend.js Wed Jul 11 19:17:24 2012 -0700 @@ -108,17 +108,17 @@ } listlit.prototype.toC = function() { - var ret = 'make_list(' + this.val.length + ', '; + var ret = 'make_list(' + this.val.length; for (var i = 0; i < this.val.length; i++) { - ret += (i ? ', ' : '') + this.val[i].toC(); + ret += ', ' + this.val[i].toC(); } return ret + ')'; } arraylit.prototype.toC = function() { - var ret = 'make_array(' + this.val.length + ', '; + var ret = 'make_array(' + this.val.length; for (var i = 0; i < this.val.length; i++) { - ret += (i ? ', ' : '') + this.val[i].toC(); + ret += ', ' + this.val[i].toC(); } return ret + ')'; } @@ -385,6 +385,22 @@ 'return (object *)self;' ] }); + array.addMessage('append', { + vars: {tmp: 'object *'}, + lines: [ + 'if (self->storage == self->size) {', + ' self->storage *= 2;', + ' tmp = realloc(self->data, self->storage);', + ' if (!tmp) {', + ' fputs("Failed to increase array size\\n", stderr);', + ' exit(1);', + ' }', + ' self->data = tmp;', + '}', + 'self->data[self->size++] = va_arg(args, object *);', + 'return self;' + ] + }); forwarddec = toplevelcode = ''; forwarddec += int32.toEarlyCDef() + array.toEarlyCDef(); toplevelcode += int32.toCDef() + array.toCDef();
--- a/runtime/progfoot.inc Tue Jul 10 23:18:14 2012 -0700 +++ b/runtime/progfoot.inc Wed Jul 11 19:17:24 2012 -0700 @@ -7,7 +7,10 @@ arr->header.meta = &array_meta; arr->header.parent = NULL; arr->storage = arr->size = num_els; - arr->data = malloc(sizeof(object *) * num_els); + if (num_els < 4) { + arr->storage = 4; + } + arr->data = malloc(sizeof(object *) * arr->storage); va_start(els, num_els); for (i = 0; i < num_els; i++) arr->data[i] = va_arg(els, object *);
--- a/samples/testarray.tp Tue Jul 10 23:18:14 2012 -0700 +++ b/samples/testarray.tp Wed Jul 11 19:17:24 2012 -0700 @@ -1,11 +1,18 @@ #{ + sum <- :arr { + cursum <- 0 + foreach: arr :idx el { + cursum <- cursum + el + } + cursum + } main <- { foo <- #[42 30 28] - sum <- 0 - foreach: foo :idx el { - sum <- sum + el - } - sum + bar <- #[] + bar append: 30 + bar append: 28 + bar append: 42 + (sum: foo) + (sum: bar) } }