diff 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
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();