| 
					
				 | 
			
			
				@@ -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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 |