|  | @@ -8,8 +8,6 @@
 | 
	
		
			
				|  |  |   * Execute 'node compiler.js' without arguments or with -h / --help for help.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -var amdefine = require("amdefine");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Map the async filter function onto array and evaluate callback, once all have finished.
 | 
	
		
			
				|  |  |   * Taken from: http://howtonode.org/control-flow-part-iii
 | 
	
	
		
			
				|  | @@ -44,6 +42,40 @@ function always_resolve(callback) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Helper for concatenation modules and producing output
 | 
	
		
			
				|  |  | + * that can be actually run.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function makeBuilder () {
 | 
	
		
			
				|  |  | +	var defineDefine = function () {
 | 
	
		
			
				|  |  | +		var path = require('path');
 | 
	
		
			
				|  |  | +		return ($SRC$)(module);
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return {
 | 
	
		
			
				|  |  | +		elements: [],
 | 
	
		
			
				|  |  | +		ids: [],
 | 
	
		
			
				|  |  | +		add: function () { this.elements.push.apply(this.elements, arguments); },
 | 
	
		
			
				|  |  | +		addId: function () { this.ids.push.apply(this.ids, arguments); },
 | 
	
		
			
				|  |  | +		forEach: function () { this.elements.forEach.apply(this.elements, arguments); },
 | 
	
		
			
				|  |  | +		start: function () {
 | 
	
		
			
				|  |  | +			this.add(
 | 
	
		
			
				|  |  | +				'var define = ('+(''+defineDefine).replace('$SRC$', ""+require('amdefine'))+')(), requirejs = define.require;',
 | 
	
		
			
				|  |  | +				'define("amber_vm/browser-compatibility", [], {});'
 | 
	
		
			
				|  |  | +			);
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +		finish: function (realWork) {
 | 
	
		
			
				|  |  | +			this.add(
 | 
	
		
			
				|  |  | +				'define("amber_vm/_init", ["amber_vm/smalltalk","'+this.ids.join('","')+'"], function (smalltalk) {',
 | 
	
		
			
				|  |  | +				'smalltalk.initialize();',
 | 
	
		
			
				|  |  | +				realWork,
 | 
	
		
			
				|  |  | +				'});', 'requirejs("amber_vm/_init");'
 | 
	
		
			
				|  |  | +			);
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +		toString: function () { return this.elements.join('\n'); }
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Combine several async functions and evaluate callback once all of them have finished.
 | 
	
		
			
				|  |  |   * Taken from: http://howtonode.org/control-flow
 | 
	
	
		
			
				|  | @@ -417,19 +449,19 @@ AmberC.prototype.resolve_init = function(compilerFiles) {
 | 
	
		
			
				|  |  |  AmberC.prototype.create_compiler = function(compilerFilesArray) {
 | 
	
		
			
				|  |  |  	var self = this;
 | 
	
		
			
				|  |  |  	var compiler_files = new Combo(function() {
 | 
	
		
			
				|  |  | -		var define = amdefine(module), requirejs = define.require;
 | 
	
		
			
				|  |  | -		define("amber_vm/browser-compatibility", [], {});
 | 
	
		
			
				|  |  | +		var builder = makeBuilder();
 | 
	
		
			
				|  |  | +		builder.add('(function() {');
 | 
	
		
			
				|  |  | +		builder.start();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		var content = '(function() {';
 | 
	
		
			
				|  |  |  		Array.prototype.slice.call(arguments).forEach(function(data) {
 | 
	
		
			
				|  |  |  			// data is an array where index 0 is the error code and index 1 contains the data
 | 
	
		
			
				|  |  | -			content += data[1];
 | 
	
		
			
				|  |  | +			builder.add(data[1]);
 | 
	
		
			
				|  |  |  			var match = (""+data[1]).match(/^define\("([^"]*)"/);
 | 
	
		
			
				|  |  | -			if (match) content += 'requirejs("'+match[1]+'");\n';
 | 
	
		
			
				|  |  | +			if (match) builder.addId(match[1]);
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  | -		content = content + 'return requirejs("amber_vm/smalltalk");})();';
 | 
	
		
			
				|  |  | -		self.defaults.smalltalk = eval(content);
 | 
	
		
			
				|  |  | -		self.defaults.smalltalk.initialize();
 | 
	
		
			
				|  |  | +		builder.finish('self.defaults.smalltalk = smalltalk;');
 | 
	
		
			
				|  |  | +		builder.add('})();');
 | 
	
		
			
				|  |  | +		eval(builder.toString());
 | 
	
		
			
				|  |  |  		console.log('Compiler loaded');
 | 
	
		
			
				|  |  |  		self.defaults.smalltalk.ErrorHandler._setCurrent_(self.defaults.smalltalk.RethrowErrorHandler._new());
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -599,38 +631,38 @@ AmberC.prototype.compose_js_files = function() {
 | 
	
		
			
				|  |  |  		self.optimize();
 | 
	
		
			
				|  |  |  	});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	var defineDefine = function () {
 | 
	
		
			
				|  |  | -		var path = require('path');
 | 
	
		
			
				|  |  | -		return ($SRC$)(module);
 | 
	
		
			
				|  |  | -	};
 | 
	
		
			
				|  |  | +	var builder = makeBuilder();
 | 
	
		
			
				|  |  | +	builder.start();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	fileStream.write('var define = ('+(''+defineDefine).replace('$SRC$', ""+amdefine)+')(), requirejs = define.require;\n'
 | 
	
		
			
				|  |  | -		+ 'define("amber_vm/browser-compatibility", [], {});\n');
 | 
	
		
			
				|  |  | -	var ids = [];
 | 
	
		
			
				|  |  |  	program_files.forEach(function(file) {
 | 
	
		
			
				|  |  |  		if(fs.existsSync(file)) {
 | 
	
		
			
				|  |  |  			console.log('Adding : ' + file);
 | 
	
		
			
				|  |  |  			var buffer = fs.readFileSync(file);
 | 
	
		
			
				|  |  |  			var match = buffer.toString().match(/^define\("([^"]*)"/);
 | 
	
		
			
				|  |  | -			if (match /*&& match[1].slice(0,9) !== "amber_vm/"*/) { ids.push(match[1]); }
 | 
	
		
			
				|  |  | -			fileStream.write(buffer);
 | 
	
		
			
				|  |  | +			if (match /*&& match[1].slice(0,9) !== "amber_vm/"*/) { builder.addId(match[1]); }
 | 
	
		
			
				|  |  | +			builder.add(buffer);
 | 
	
		
			
				|  |  |  		} else {
 | 
	
		
			
				|  |  |  			fileStream.end();
 | 
	
		
			
				|  |  |  			throw(new Error('Can not find file ' + file));
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	});
 | 
	
		
			
				|  |  | -	fileStream.write('define("amber_vm/_init", ["amber_vm/smalltalk","'+ids.join('","')+'"], function (smalltalk) { smalltalk.initialize();\n');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var realWork = '';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	if (undefined !== defaults.main) {
 | 
	
		
			
				|  |  |  		console.log('Adding call to: %s>>main', defaults.main);
 | 
	
		
			
				|  |  | -		fileStream.write('smalltalk.' + defaults.main + '._main()');
 | 
	
		
			
				|  |  | +		realWork += 'smalltalk.' + defaults.main + '._main();';
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	fileStream.write('});\nrequirejs("amber_vm/_init");\n');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if (undefined !== defaults.mainfile && fs.existsSync(defaults.mainfile)) {
 | 
	
		
			
				|  |  |  		console.log('Adding main file: ' + defaults.mainfile);
 | 
	
		
			
				|  |  | -		fileStream.write(fs.readFileSync(defaults.mainfile));
 | 
	
		
			
				|  |  | +		realWork += '\n' + fs.readFileSync(defaults.mainfile);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	builder.finish(realWork);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	console.log('Writing...');
 | 
	
		
			
				|  |  | +	builder.forEach(function (element) { fileStream.write(element); fileStream.write('\n'); });
 | 
	
		
			
				|  |  |  	console.log('Done.');
 | 
	
		
			
				|  |  |  	fileStream.end();
 | 
	
		
			
				|  |  |  };
 |