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)
 	}
 }