 			while (sidestack.length) {
 				value = sidestack.pop();
 				instructions.push(makeInstruction(new PushAbstraction(value.value), registers));
-				values.push(new AbstractArg(value.value));
+				var pushedArg:AbstractArg = new AbstractArg(value.value);
+				if (!AbstractArg.argInVec(pushedArg, values))
+					values.push(pushedArg);
 			}
 			
 			//cleanup other values to be initialized

					throw new Error("!");
			} else if (abstraction.value != value.value)
				throw new Error("!!!");
			
			for each (var arg:AbstractArg in abstraction.getAbstractArgs())
				if (!arg.immediate && !AbstractArg.argInVec(arg, values)) {
					values.push(arg);
					if (arg.inStack)
						sidestack.push(arg);
				}
			
			return abstraction;
		}

		}
		
		
		protected var DEBUG_PRINTOUT:String;
		protected function log(...args):void {
			if (DEBUG.PRINT_TESTS)
				C.log(args);
			else {
				if (!DEBUG_PRINTOUT)
					DEBUG_PRINTOUT = '';
				DEBUG_PRINTOUT += args.join(", ") + "\n";
			}
		}
		
		
