Created
January 6, 2012 20:47
-
-
Save kripken/1572341 to your computer and use it in GitHub Desktop.
smaller testcase for uglifyjs issue 294
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var arguments_ = []; | |
var ENVIRONMENT_IS_NODE = typeof process === "object"; | |
var ENVIRONMENT_IS_WEB = typeof window === "object"; | |
var ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; | |
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; | |
if (ENVIRONMENT_IS_NODE) { | |
print = (function(x) { | |
process["stdout"].write(x + "\n"); | |
}); | |
printErr = (function(x) { | |
process["stderr"].write(x + "\n"); | |
}); | |
var nodeFS = require("fs"); | |
read = (function(filename) { | |
var ret = nodeFS["readFileSync"](filename).toString(); | |
if (!ret && filename[0] != "/") { | |
filename = __dirname.split("/").slice(0, -1).join("/") + "/src/" + filename; | |
ret = nodeFS["readFileSync"](filename).toString(); | |
} | |
return ret; | |
}); | |
arguments_ = process["argv"].slice(2); | |
} else if (ENVIRONMENT_IS_SHELL) { | |
if (!this["read"]) { | |
read = (function(f) { | |
snarf(f); | |
}); | |
} | |
if (!this["arguments"]) { | |
arguments_ = scriptArgs; | |
} else { | |
arguments_ = arguments; | |
} | |
} else if (ENVIRONMENT_IS_WEB) { | |
print = printErr = (function(x) { | |
console.log(x); | |
}); | |
read = (function(url) { | |
var xhr = new XMLHttpRequest; | |
xhr.open("GET", url, false); | |
xhr.send(null); | |
return xhr.responseText; | |
}); | |
if (this["arguments"]) { | |
arguments_ = arguments; | |
} | |
} else if (ENVIRONMENT_IS_WORKER) { | |
load = importScripts; | |
} else { | |
throw "Unknown runtime environment. Where are we?"; | |
} | |
function globalEval(x) { | |
eval.call(null, x); | |
} | |
if (typeof load == "undefined" && typeof read != "undefined") { | |
load = (function(f) { | |
globalEval(read(f)); | |
}); | |
} | |
if (typeof printErr === "undefined") { | |
printErr = (function() {}); | |
} | |
if (typeof print === "undefined") { | |
print = printErr; | |
} | |
try { | |
this["Module"] = Module; | |
} catch (e) { | |
this["Module"] = Module = {}; | |
} | |
if (!Module.arguments) { | |
Module.arguments = arguments_; | |
} | |
if (Module.print) { | |
print = Module.print; | |
} | |
var Runtime = { | |
stackSave: (function() { | |
return STACKTOP; | |
}), | |
stackRestore: (function(stackTop) { | |
STACKTOP = stackTop; | |
}), | |
forceAlign: (function(target, quantum) { | |
quantum = quantum || 4; | |
if (isNumber(target) && isNumber(quantum)) { | |
return Math.ceil(target / quantum) * quantum; | |
} else { | |
return "Math.ceil((" + target + ")/" + quantum + ")*" + quantum; | |
} | |
}), | |
isNumberType: (function(type) { | |
return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES; | |
}), | |
isPointerType: function isPointerType(type) { | |
return type[type.length - 1] == "*"; | |
}, | |
isStructType: function isStructType(type) { | |
if (isPointerType(type)) return false; | |
if (/^\[\d+\ x\ (.*)\]/.test(type)) return true; | |
if (/<?{ [^}]* }>?/.test(type)) return true; | |
return type[0] == "%"; | |
}, | |
INT_TYPES: { | |
"i1": 0, | |
"i8": 0, | |
"i16": 0, | |
"i32": 0, | |
"i64": 0 | |
}, | |
FLOAT_TYPES: { | |
"float": 0, | |
"double": 0 | |
}, | |
or64: (function(x, y) { | |
var l = x | 0 | (y | 0); | |
var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}), | |
and64: (function(x, y) { | |
var l = (x | 0) & (y | 0); | |
var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}), | |
xor64: (function(x, y) { | |
var l = (x | 0) ^ (y | 0); | |
var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}), | |
getNativeTypeSize: (function(type, quantumSize) { | |
if (Runtime.QUANTUM_SIZE == 1) return 1; | |
var size = { | |
"%i1": 1, | |
"%i8": 1, | |
"%i16": 2, | |
"%i32": 4, | |
"%i64": 8, | |
"%float": 4, | |
"%double": 8 | |
}["%" + type]; | |
if (!size && type[type.length - 1] == "*") { | |
size = Runtime.QUANTUM_SIZE; | |
} | |
return size; | |
}), | |
getNativeFieldSize: (function(type) { | |
return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); | |
}), | |
dedup: function dedup(items, ident) { | |
var seen = {}; | |
if (ident) { | |
return items.filter((function(item) { | |
if (seen[item[ident]]) return false; | |
seen[item[ident]] = true; | |
return true; | |
})); | |
} else { | |
return items.filter((function(item) { | |
if (seen[item]) return false; | |
seen[item] = true; | |
return true; | |
})); | |
} | |
}, | |
set: function set() { | |
var args = typeof arguments[0] === "object" ? arguments[0] : arguments; | |
var ret = {}; | |
for (var i = 0; i < args.length; i++) { | |
ret[args[i]] = 0; | |
} | |
return ret; | |
}, | |
calculateStructAlignment: function calculateStructAlignment(type) { | |
type.flatSize = 0; | |
type.alignSize = 0; | |
var diffs = []; | |
var prev = -1; | |
type.flatIndexes = type.fields.map((function(field) { | |
var size, alignSize; | |
if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) { | |
size = Runtime.getNativeTypeSize(field); | |
alignSize = size; | |
} else if (Runtime.isStructType(field)) { | |
size = Types.types[field].flatSize; | |
alignSize = Types.types[field].alignSize; | |
} else { | |
throw "Unclear type in struct: " + field + ", in " + type.name_ + " :: " + dump(Types.types[type.name_]); | |
} | |
alignSize = type.packed ? 1 : Math.min(alignSize, Runtime.QUANTUM_SIZE); | |
type.alignSize = Math.max(type.alignSize, alignSize); | |
var curr = Runtime.alignMemory(type.flatSize, alignSize); | |
type.flatSize = curr + size; | |
if (prev >= 0) { | |
diffs.push(curr - prev); | |
} | |
prev = curr; | |
return curr; | |
})); | |
type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize); | |
if (diffs.length == 0) { | |
type.flatFactor = type.flatSize; | |
} else if (Runtime.dedup(diffs).length == 1) { | |
type.flatFactor = diffs[0]; | |
} | |
type.needsFlattening = type.flatFactor != 1; | |
return type.flatIndexes; | |
}, | |
generateStructInfo: (function(struct, typeName, offset) { | |
var type, alignment; | |
if (typeName) { | |
offset = offset || 0; | |
type = (typeof Types === "undefined" ? Runtime.typeInfo : Types.types)[typeName]; | |
if (!type) return null; | |
if (!struct) struct = (typeof Types === "undefined" ? Runtime : Types).structMetadata[typeName.replace(/.*\./, "")]; | |
if (!struct) return null; | |
assert(type.fields.length === struct.length, "Number of named fields must match the type for " + typeName + ". Perhaps due to inheritance, which is not supported yet?"); | |
alignment = type.flatIndexes; | |
} else { | |
var type = { | |
fields: struct.map((function(item) { | |
return item[0]; | |
})) | |
}; | |
alignment = Runtime.calculateStructAlignment(type); | |
} | |
var ret = { | |
__size__: type.flatSize | |
}; | |
if (typeName) { | |
struct.forEach((function(item, i) { | |
if (typeof item === "string") { | |
ret[item] = alignment[i] + offset; | |
} else { | |
var key; | |
for (var k in item) key = k; | |
ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]); | |
} | |
})); | |
} else { | |
struct.forEach((function(item, i) { | |
ret[item[1]] = alignment[i]; | |
})); | |
} | |
return ret; | |
}), | |
stackAlloc: function stackAlloc(size) { | |
var ret = STACKTOP; | |
STACKTOP += size; | |
STACKTOP = Math.ceil(STACKTOP / 4) * 4; | |
return ret; | |
}, | |
staticAlloc: function staticAlloc(size) { | |
var ret = STATICTOP; | |
STATICTOP += size; | |
STATICTOP = Math.ceil(STATICTOP / 4) * 4; | |
if (STATICTOP >= TOTAL_MEMORY) enlargeMemory(); | |
return ret; | |
}, | |
alignMemory: function alignMemory(size, quantum) { | |
var ret = size = Math.ceil(size / (quantum ? quantum : 4)) * (quantum ? quantum : 4); | |
return ret; | |
}, | |
QUANTUM_SIZE: 4, | |
__dummy__: 0 | |
}; | |
var CorrectionsMonitor = { | |
MAX_ALLOWED: 0, | |
corrections: 0, | |
sigs: {}, | |
note: (function(type, succeed, sig) { | |
if (!succeed) { | |
this.corrections++; | |
if (this.corrections >= this.MAX_ALLOWED) abort("\n\nToo many corrections!"); | |
} | |
}), | |
print: (function() { | |
var items = []; | |
for (var sig in this.sigs) { | |
items.push({ | |
sig: sig, | |
fails: this.sigs[sig][0], | |
succeeds: this.sigs[sig][1], | |
total: this.sigs[sig][0] + this.sigs[sig][1] | |
}); | |
} | |
items.sort((function(x, y) { | |
return y.total - x.total; | |
})); | |
for (var i = 0; i < items.length; i++) { | |
var item = items[i]; | |
print(item.sig + " : " + item.total + " hits, %" + Math.ceil(100 * item.fails / item.total) + " failures"); | |
} | |
}) | |
}; | |
var __globalConstructor__ = function globalConstructor() {}; | |
var __THREW__ = false; | |
var __ATEXIT__ = []; | |
var ABORT = false; | |
var undef = 0; | |
var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD; | |
var tempI64, tempI64b; | |
var tempDoubleBuffer = new ArrayBuffer(8); | |
var tempDoubleI32 = new Int32Array(tempDoubleBuffer); | |
var tempDoubleF64 = new Float64Array(tempDoubleBuffer); | |
function abort(text) { | |
print(text + ":\n" + (new Error).stack); | |
ABORT = true; | |
throw "Assertion: " + text; | |
} | |
function assert(condition, text) { | |
if (!condition) { | |
abort("Assertion failed: " + text); | |
} | |
} | |
function setValue(ptr, value, type, noSafe) { | |
type = type || "i8"; | |
if (type[type.length - 1] === "*") type = "i32"; | |
switch (type) { | |
case "i1": | |
HEAP8[ptr] = value; | |
break; | |
case "i8": | |
HEAP8[ptr] = value; | |
break; | |
case "i16": | |
HEAP16[ptr >> 1] = value; | |
break; | |
case "i32": | |
HEAP32[ptr >> 2] = value; | |
break; | |
case "i64": | |
HEAP32[ptr >> 2] = value[0], HEAP32[ptr + 4 >> 2] = value[1]; | |
break; | |
case "float": | |
HEAPF32[ptr >> 2] = value; | |
break; | |
case "double": | |
tempDoubleF64[0] = value, HEAP32[ptr >> 2] = tempDoubleI32[0], HEAP32[ptr + 4 >> 2] = tempDoubleI32[1]; | |
break; | |
default: | |
abort("invalid type for setValue: " + type); | |
} | |
} | |
Module["setValue"] = setValue; | |
function getValue(ptr, type, noSafe) { | |
type = type || "i8"; | |
if (type[type.length - 1] === "*") type = "i32"; | |
switch (type) { | |
case "i1": | |
return HEAP8[ptr]; | |
case "i8": | |
return HEAP8[ptr]; | |
case "i16": | |
return HEAP16[ptr >> 1]; | |
case "i32": | |
return HEAP32[ptr >> 2]; | |
case "i64": | |
return [ HEAPU32[ptr >> 2], HEAPU32[ptr + 4 >> 2] ]; | |
case "float": | |
return HEAPF32[ptr >> 2]; | |
case "double": | |
return tempDoubleI32[0] = HEAP32[ptr >> 2], tempDoubleI32[1] = HEAP32[ptr + 4 >> 2], tempDoubleF64[0]; | |
default: | |
abort("invalid type for setValue: " + type); | |
} | |
return null; | |
} | |
Module["getValue"] = getValue; | |
var ALLOC_NORMAL = 0; | |
var ALLOC_STACK = 1; | |
var ALLOC_STATIC = 2; | |
Module["ALLOC_NORMAL"] = ALLOC_NORMAL; | |
Module["ALLOC_STACK"] = ALLOC_STACK; | |
Module["ALLOC_STATIC"] = ALLOC_STATIC; | |
function allocate(slab, types, allocator) { | |
var zeroinit, size; | |
if (typeof slab === "number") { | |
zeroinit = true; | |
size = slab; | |
} else { | |
zeroinit = false; | |
size = slab.length; | |
} | |
var singleType = typeof types === "string" ? types : null; | |
var ret = [ _malloc, Runtime.stackAlloc, Runtime.staticAlloc ][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); | |
var i = 0, type; | |
while (i < size) { | |
var curr = zeroinit ? 0 : slab[i]; | |
if (typeof curr === "function") { | |
curr = Runtime.getFunctionIndex(curr); | |
} | |
type = singleType || types[i]; | |
if (type === 0) { | |
i++; | |
continue; | |
} | |
if (type == "i64") type = "i32"; | |
setValue(ret + i, curr, type); | |
i += Runtime.getNativeTypeSize(type); | |
} | |
return ret; | |
} | |
Module["allocate"] = allocate; | |
function Pointer_stringify(ptr) { | |
var ret = ""; | |
var i = 0; | |
var t; | |
var nullByte = String.fromCharCode(0); | |
while (1) { | |
t = String.fromCharCode(HEAPU8[ptr + i]); | |
if (t == nullByte) { | |
break; | |
} else {} | |
ret += t; | |
i += 1; | |
} | |
return ret; | |
} | |
Module["Pointer_stringify"] = Pointer_stringify; | |
function Array_stringify(array) { | |
var ret = ""; | |
for (var i = 0; i < array.length; i++) { | |
ret += String.fromCharCode(array[i]); | |
} | |
return ret; | |
} | |
Module["Array_stringify"] = Array_stringify; | |
var FUNCTION_TABLE; | |
var PAGE_SIZE = 4096; | |
function alignMemoryPage(x) { | |
return Math.ceil(x / PAGE_SIZE) * PAGE_SIZE; | |
} | |
var HEAP; | |
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32; | |
var STACK_ROOT, STACKTOP, STACK_MAX; | |
var STATICTOP; | |
function enlargeMemory() { | |
while (TOTAL_MEMORY <= STATICTOP) { | |
TOTAL_MEMORY = alignMemoryPage(TOTAL_MEMORY * 1.25); | |
} | |
var oldHEAP8 = HEAP8; | |
var buffer = new ArrayBuffer(TOTAL_MEMORY); | |
HEAP8 = new Int8Array(buffer); | |
HEAP16 = new Int16Array(buffer); | |
HEAP32 = new Int32Array(buffer); | |
HEAPU8 = new Uint8Array(buffer); | |
HEAPU16 = new Uint16Array(buffer); | |
HEAPU32 = new Uint32Array(buffer); | |
HEAPF32 = new Float32Array(buffer); | |
HEAP8.set(oldHEAP8); | |
} | |
var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880; | |
var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 10485760; | |
var FAST_MEMORY = Module["FAST_MEMORY"] || 2097152; | |
assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1))["subarray"] && !!(new Int32Array(1))["set"], "Cannot fallback to non-typed array case: Code is too specialized"); | |
var buffer = new ArrayBuffer(TOTAL_MEMORY); | |
HEAP8 = new Int8Array(buffer); | |
HEAP16 = new Int16Array(buffer); | |
HEAP32 = new Int32Array(buffer); | |
HEAPU8 = new Uint8Array(buffer); | |
HEAPU16 = new Uint16Array(buffer); | |
HEAPU32 = new Uint32Array(buffer); | |
HEAPF32 = new Float32Array(buffer); | |
HEAP32[0] = 255; | |
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, "Typed arrays 2 must be run on a little-endian system"); | |
var base = intArrayFromString("(null)"); | |
STATICTOP = base.length; | |
for (var i = 0; i < base.length; i++) { | |
HEAP8[i] = base[i]; | |
} | |
Module["HEAP"] = HEAP; | |
Module["HEAP8"] = HEAP8; | |
Module["HEAP16"] = HEAP16; | |
Module["HEAP32"] = HEAP32; | |
Module["HEAPU8"] = HEAPU8; | |
Module["HEAPU16"] = HEAPU16; | |
Module["HEAPU32"] = HEAPU32; | |
Module["HEAPF32"] = HEAPF32; | |
STACK_ROOT = STACKTOP = alignMemoryPage(10); | |
STACK_MAX = STACK_ROOT + TOTAL_STACK; | |
STATICTOP = alignMemoryPage(STACK_MAX); | |
function __shutdownRuntime__() { | |
while (__ATEXIT__.length > 0) { | |
var atexit = __ATEXIT__.pop(); | |
var func = atexit.func; | |
if (typeof func === "number") { | |
func = FUNCTION_TABLE[func]; | |
} | |
func(atexit.arg === undefined ? null : atexit.arg); | |
} | |
CorrectionsMonitor.print(); | |
} | |
function Array_copy(ptr, num) { | |
return Array.prototype.slice.call(HEAP8.subarray(ptr, ptr + num)); | |
return HEAP.slice(ptr, ptr + num); | |
} | |
Module["Array_copy"] = Array_copy; | |
function String_len(ptr) { | |
var i = 0; | |
while (HEAP8[ptr + i]) i++; | |
return i; | |
} | |
Module["String_len"] = String_len; | |
function String_copy(ptr, addZero) { | |
var len = String_len(ptr); | |
if (addZero) len++; | |
var ret = Array_copy(ptr, len); | |
if (addZero) ret[len - 1] = 0; | |
return ret; | |
} | |
Module["String_copy"] = String_copy; | |
function intArrayFromString(stringy, dontAddNull) { | |
var ret = []; | |
var t; | |
var i = 0; | |
while (i < stringy.length) { | |
var chr = stringy.charCodeAt(i); | |
if (chr > 255) { | |
chr &= 255; | |
} | |
ret.push(chr); | |
i = i + 1; | |
} | |
if (!dontAddNull) { | |
ret.push(0); | |
} | |
return ret; | |
} | |
Module["intArrayFromString"] = intArrayFromString; | |
function intArrayToString(array) { | |
var ret = []; | |
for (var i = 0; i < array.length; i++) { | |
var chr = array[i]; | |
if (chr > 255) { | |
chr &= 255; | |
} | |
ret.push(String.fromCharCode(chr)); | |
} | |
return ret.join(""); | |
} | |
Module["intArrayToString"] = intArrayToString; | |
function unSign(value, bits, ignore, sig) { | |
if (value >= 0) { | |
return value; | |
} | |
return bits <= 32 ? 2 * Math.abs(1 << bits - 1) + value : Math.pow(2, bits) + value; | |
} | |
function reSign(value, bits, ignore, sig) { | |
if (value <= 0) { | |
return value; | |
} | |
var half = bits <= 32 ? Math.abs(1 << bits - 1) : Math.pow(2, bits - 1); | |
if (value >= half && (bits <= 32 || value > half)) { | |
value = -2 * half + value; | |
} | |
return value; | |
} | |
function _main() { | |
var __stackBase__ = STACKTOP; | |
STACKTOP += 8; | |
var __label__; | |
var $retval; | |
var $x = __stackBase__; | |
var $y; | |
$retval = 0; | |
HEAP32[$x >> 2] = [ 4294967291, 4294967295 ].slice(0)[0], HEAP32[$x + 4 >> 2] = [ 4294967291, 4294967295 ].slice(0)[1]; | |
var $0 = [ HEAPU32[$x >> 2], HEAPU32[$x + 4 >> 2] ]; | |
var $div = (tempBigIntP = (tempBigIntR = (tempI64 = $0.slice(0), tempI64[1] <= 2147483648 ? (tempI64[0] >>> 0) + (tempI64[1] >>> 0) * 4294967296 : (tempI64[0] | 0) + (1 + (tempI64[1] | 0)) * 4294967296) / (tempI64 = [ 2, 0 ], tempI64[1] <= 2147483648 ? (tempI64[0] >>> 0) + (tempI64[1] >>> 0) * 4294967296 : (tempI64[0] | 0) + (1 + (tempI64[1] | 0)) * 4294967296), tempBigIntR >= 0 ? Math.floor(tempBigIntR) : Math.ceil(tempBigIntR)), [ tempBigIntP >>> 0 >>> 0, Math.min(Math.floor(tempBigIntP / 4294967296), 4294967295) >>> 0 ]); | |
var $call = _printf(__str, allocate([ $div.slice(0)[0], 0, 0, 0, $div.slice(0)[1], 0, 0, 0 ], [ "i64", 0, 0, 0, "i32", 0, 0, 0 ], ALLOC_STACK)); | |
HEAP32[$x >> 2] = [ 5, 0 ].slice(0)[0], HEAP32[$x + 4 >> 2] = [ 5, 0 ].slice(0)[1]; | |
var $1 = [ HEAPU32[$x >> 2], HEAPU32[$x + 4 >> 2] ]; | |
var $div1 = (tempBigIntP = (tempBigIntR = (tempI64 = $1.slice(0), tempI64[1] <= 2147483648 ? (tempI64[0] >>> 0) + (tempI64[1] >>> 0) * 4294967296 : (tempI64[0] | 0) + (1 + (tempI64[1] | 0)) * 4294967296) / (tempI64 = [ 2, 0 ], tempI64[1] <= 2147483648 ? (tempI64[0] >>> 0) + (tempI64[1] >>> 0) * 4294967296 : (tempI64[0] | 0) + (1 + (tempI64[1] | 0)) * 4294967296), tempBigIntR >= 0 ? Math.floor(tempBigIntR) : Math.ceil(tempBigIntR)), [ tempBigIntP >>> 0 >>> 0, Math.min(Math.floor(tempBigIntP / 4294967296), 4294967295) >>> 0 ]); | |
var $call2 = _printf(__str, allocate([ $div1.slice(0)[0], 0, 0, 0, $div1.slice(0)[1], 0, 0, 0 ], [ "i64", 0, 0, 0, "i32", 0, 0, 0 ], ALLOC_STACK)); | |
$y = -5.329999923706055; | |
var $2 = $y; | |
var $conv = [ $2 >>> 0 >>> 0, Math.min(Math.floor($2 / 4294967296), 4294967295) >>> 0 ]; | |
HEAP32[$x >> 2] = $conv.slice(0).slice(0)[0], HEAP32[$x + 4 >> 2] = $conv.slice(0).slice(0)[1]; | |
var $3 = [ HEAPU32[$x >> 2], HEAPU32[$x + 4 >> 2] ]; | |
var $call3 = _printf(__str, allocate([ $3.slice(0)[0], 0, 0, 0, $3.slice(0)[1], 0, 0, 0 ], [ "i64", 0, 0, 0, "i32", 0, 0, 0 ], ALLOC_STACK)); | |
$y = 5.329999923706055; | |
var $4 = $y; | |
var $conv4 = [ $4 >>> 0 >>> 0, Math.min(Math.floor($4 / 4294967296), 4294967295) >>> 0 ]; | |
HEAP32[$x >> 2] = $conv4.slice(0).slice(0)[0], HEAP32[$x + 4 >> 2] = $conv4.slice(0).slice(0)[1]; | |
var $5 = [ HEAPU32[$x >> 2], HEAPU32[$x + 4 >> 2] ]; | |
var $call5 = _printf(__str, allocate([ $5.slice(0)[0], 0, 0, 0, $5.slice(0)[1], 0, 0, 0 ], [ "i64", 0, 0, 0, "i32", 0, 0, 0 ], ALLOC_STACK)); | |
var $putchar = _putchar(10); | |
var $6 = $retval; | |
STACKTOP = __stackBase__; | |
return $6; | |
return null; | |
} | |
Module["_main"] = _main; | |
var _llvm_dbg_declare; | |
var ERRNO_CODES = { | |
E2BIG: 7, | |
EACCES: 13, | |
EADDRINUSE: 98, | |
EADDRNOTAVAIL: 99, | |
EAFNOSUPPORT: 97, | |
EAGAIN: 11, | |
EALREADY: 114, | |
EBADF: 9, | |
EBADMSG: 74, | |
EBUSY: 16, | |
ECANCELED: 125, | |
ECHILD: 10, | |
ECONNABORTED: 103, | |
ECONNREFUSED: 111, | |
ECONNRESET: 104, | |
EDEADLK: 35, | |
EDESTADDRREQ: 89, | |
EDOM: 33, | |
EDQUOT: 122, | |
EEXIST: 17, | |
EFAULT: 14, | |
EFBIG: 27, | |
EHOSTUNREACH: 113, | |
EIDRM: 43, | |
EILSEQ: 84, | |
EINPROGRESS: 115, | |
EINTR: 4, | |
EINVAL: 22, | |
EIO: 5, | |
EISCONN: 106, | |
EISDIR: 21, | |
ELOOP: 40, | |
EMFILE: 24, | |
EMLINK: 31, | |
EMSGSIZE: 90, | |
EMULTIHOP: 72, | |
ENAMETOOLONG: 36, | |
ENETDOWN: 100, | |
ENETRESET: 102, | |
ENETUNREACH: 101, | |
ENFILE: 23, | |
ENOBUFS: 105, | |
ENODATA: 61, | |
ENODEV: 19, | |
ENOENT: 2, | |
ENOEXEC: 8, | |
ENOLCK: 37, | |
ENOLINK: 67, | |
ENOMEM: 12, | |
ENOMSG: 42, | |
ENOPROTOOPT: 92, | |
ENOSPC: 28, | |
ENOSR: 63, | |
ENOSTR: 60, | |
ENOSYS: 38, | |
ENOTCONN: 107, | |
ENOTDIR: 20, | |
ENOTEMPTY: 39, | |
ENOTRECOVERABLE: 131, | |
ENOTSOCK: 88, | |
ENOTSUP: 95, | |
ENOTTY: 25, | |
ENXIO: 6, | |
EOVERFLOW: 75, | |
EOWNERDEAD: 130, | |
EPERM: 1, | |
EPIPE: 32, | |
EPROTO: 71, | |
EPROTONOSUPPORT: 93, | |
EPROTOTYPE: 91, | |
ERANGE: 34, | |
EROFS: 30, | |
ESPIPE: 29, | |
ESRCH: 3, | |
ESTALE: 116, | |
ETIME: 62, | |
ETIMEDOUT: 110, | |
ETXTBSY: 26, | |
EWOULDBLOCK: 11, | |
EXDEV: 18 | |
}; | |
function ___setErrNo(value) { | |
if (!___setErrNo.ret) ___setErrNo.ret = allocate([ 0 ], "i32", ALLOC_STATIC); | |
HEAP32[___setErrNo.ret >> 2] = value; | |
return value; | |
} | |
var _stdin = 0; | |
var _stdout = 0; | |
var _stderr = 0; | |
var __impure_ptr = 0; | |
var FS = { | |
currentPath: "/", | |
nextInode: 2, | |
streams: [ null ], | |
ignorePermissions: true, | |
absolutePath: (function(relative, base) { | |
if (typeof relative !== "string") return null; | |
if (base === undefined) base = FS.currentPath; | |
if (relative && relative[0] == "/") base = ""; | |
var full = base + "/" + relative; | |
var parts = full.split("/").reverse(); | |
var absolute = [ "" ]; | |
while (parts.length) { | |
var part = parts.pop(); | |
if (part == "" || part == ".") {} else if (part == "..") { | |
if (absolute.length > 1) absolute.pop(); | |
} else { | |
absolute.push(part); | |
} | |
} | |
return absolute.length == 1 ? "/" : absolute.join("/"); | |
}), | |
analyzePath: (function(path, dontResolveLastLink, linksVisited) { | |
var ret = { | |
isRoot: false, | |
exists: false, | |
error: 0, | |
name: null, | |
path: null, | |
object: null, | |
parentExists: false, | |
parentPath: null, | |
parentObject: null | |
}; | |
path = FS.absolutePath(path); | |
if (path == "/") { | |
ret.isRoot = true; | |
ret.exists = ret.parentExists = true; | |
ret.name = "/"; | |
ret.path = ret.parentPath = "/"; | |
ret.object = ret.parentObject = FS.root; | |
} else if (path !== null) { | |
linksVisited = linksVisited || 0; | |
path = path.slice(1).split("/"); | |
var current = FS.root; | |
var traversed = [ "" ]; | |
while (path.length) { | |
if (path.length == 1 && current.isFolder) { | |
ret.parentExists = true; | |
ret.parentPath = traversed.length == 1 ? "/" : traversed.join("/"); | |
ret.parentObject = current; | |
ret.name = path[0]; | |
} | |
var target = path.shift(); | |
if (!current.isFolder) { | |
ret.error = ERRNO_CODES.ENOTDIR; | |
break; | |
} else if (!current.read) { | |
ret.error = ERRNO_CODES.EACCES; | |
break; | |
} else if (!current.contents.hasOwnProperty(target)) { | |
ret.error = ERRNO_CODES.ENOENT; | |
break; | |
} | |
current = current.contents[target]; | |
if (current.link && !(dontResolveLastLink && path.length == 0)) { | |
if (linksVisited > 40) { | |
ret.error = ERRNO_CODES.ELOOP; | |
break; | |
} | |
var link = FS.absolutePath(current.link, traversed.join("/")); | |
return FS.analyzePath([ link ].concat(path).join("/"), dontResolveLastLink, linksVisited + 1); | |
} | |
traversed.push(target); | |
if (path.length == 0) { | |
ret.exists = true; | |
ret.path = traversed.join("/"); | |
ret.object = current; | |
} | |
} | |
return ret; | |
} | |
return ret; | |
}), | |
findObject: (function(path, dontResolveLastLink) { | |
FS.ensureRoot(); | |
var ret = FS.analyzePath(path, dontResolveLastLink); | |
if (ret.exists) { | |
return ret.object; | |
} else { | |
___setErrNo(ret.error); | |
return null; | |
} | |
}), | |
createObject: (function(parent, name, properties, canRead, canWrite) { | |
if (!parent) parent = "/"; | |
if (typeof parent === "string") parent = FS.findObject(parent); | |
if (!parent) { | |
___setErrNo(ERRNO_CODES.EACCES); | |
throw new Error("Parent path must exist."); | |
} | |
if (!parent.isFolder) { | |
___setErrNo(ERRNO_CODES.ENOTDIR); | |
throw new Error("Parent must be a folder."); | |
} | |
if (!parent.write && !FS.ignorePermissions) { | |
___setErrNo(ERRNO_CODES.EACCES); | |
throw new Error("Parent folder must be writeable."); | |
} | |
if (!name || name == "." || name == "..") { | |
___setErrNo(ERRNO_CODES.ENOENT); | |
throw new Error("Name must not be empty."); | |
} | |
if (parent.contents.hasOwnProperty(name)) { | |
___setErrNo(ERRNO_CODES.EEXIST); | |
throw new Error("Can't overwrite object."); | |
} | |
parent.contents[name] = { | |
read: canRead === undefined ? true : canRead, | |
write: canWrite === undefined ? false : canWrite, | |
timestamp: Date.now(), | |
inodeNumber: FS.nextInode++ | |
}; | |
for (var key in properties) { | |
if (properties.hasOwnProperty(key)) { | |
parent.contents[name][key] = properties[key]; | |
} | |
} | |
return parent.contents[name]; | |
}), | |
createFolder: (function(parent, name, canRead, canWrite) { | |
var properties = { | |
isFolder: true, | |
isDevice: false, | |
contents: {} | |
}; | |
return FS.createObject(parent, name, properties, canRead, canWrite); | |
}), | |
createPath: (function(parent, path, canRead, canWrite) { | |
var current = FS.findObject(parent); | |
if (current === null) throw new Error("Invalid parent."); | |
path = path.split("/").reverse(); | |
while (path.length) { | |
var part = path.pop(); | |
if (!part) continue; | |
if (!current.contents.hasOwnProperty(part)) { | |
FS.createFolder(current, part, canRead, canWrite); | |
} | |
current = current.contents[part]; | |
} | |
return current; | |
}), | |
createFile: (function(parent, name, properties, canRead, canWrite) { | |
properties.isFolder = false; | |
return FS.createObject(parent, name, properties, canRead, canWrite); | |
}), | |
createDataFile: (function(parent, name, data, canRead, canWrite) { | |
if (typeof data === "string") { | |
var dataArray = []; | |
for (var i = 0; i < data.length; i++) dataArray.push(data.charCodeAt(i)); | |
data = dataArray; | |
} | |
var properties = { | |
isDevice: false, | |
contents: data | |
}; | |
return FS.createFile(parent, name, properties, canRead, canWrite); | |
}), | |
createLazyFile: (function(parent, name, url, canRead, canWrite) { | |
var properties = { | |
isDevice: false, | |
url: url | |
}; | |
return FS.createFile(parent, name, properties, canRead, canWrite); | |
}), | |
createLink: (function(parent, name, target, canRead, canWrite) { | |
var properties = { | |
isDevice: false, | |
link: target | |
}; | |
return FS.createFile(parent, name, properties, canRead, canWrite); | |
}), | |
createDevice: (function(parent, name, input, output) { | |
if (!(input || output)) { | |
throw new Error("A device must have at least one callback defined."); | |
} | |
var ops = { | |
isDevice: true, | |
input: input, | |
output: output | |
}; | |
return FS.createFile(parent, name, ops, Boolean(input), Boolean(output)); | |
}), | |
forceLoadFile: (function(obj) { | |
if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; | |
var success = true; | |
if (typeof XMLHttpRequest !== "undefined") { | |
var xhr = new XMLHttpRequest; | |
xhr.open("GET", obj.url, false); | |
if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer"; | |
if (xhr.overrideMimeType) { | |
xhr.overrideMimeType("text/plain; charset=x-user-defined"); | |
} | |
xhr.send(null); | |
if (xhr.status != 200 && xhr.status != 0) success = false; | |
if (xhr.response !== undefined) { | |
obj.contents = new Uint8Array(xhr.response || []); | |
} else { | |
obj.contents = intArrayFromString(xhr.responseText || "", true); | |
} | |
} else if (typeof read !== "undefined") { | |
try { | |
obj.contents = intArrayFromString(read(obj.url), true); | |
} catch (e) { | |
success = false; | |
} | |
} else { | |
throw new Error("Cannot load without read() or XMLHttpRequest."); | |
} | |
if (!success) ___setErrNo(ERRNO_CODES.EIO); | |
return success; | |
}), | |
ensureRoot: (function() { | |
if (FS.root) return; | |
FS.root = { | |
read: true, | |
write: false, | |
isFolder: true, | |
isDevice: false, | |
timestamp: Date.now(), | |
inodeNumber: 1, | |
contents: {} | |
}; | |
}), | |
init: (function(input, output, error) { | |
if (FS.init.initialized) return; | |
FS.init.initialized = true; | |
FS.ensureRoot(); | |
if (!input) input = (function() { | |
if (!input.cache || !input.cache.length) { | |
var result; | |
if (typeof window != "undefined" && typeof window.prompt == "function") { | |
result = window.prompt("Input: "); | |
} else if (typeof readline == "function") { | |
result = readline(); | |
} | |
if (!result) result = ""; | |
input.cache = intArrayFromString(result + "\n", true); | |
} | |
return input.cache.shift(); | |
}); | |
if (!output) output = (function(val) { | |
if (val === null || val === "\n".charCodeAt(0)) { | |
output.printer(output.buffer.join("")); | |
output.buffer = []; | |
} else { | |
output.buffer.push(String.fromCharCode(val)); | |
} | |
}); | |
if (!output.printer) output.printer = print; | |
if (!output.buffer) output.buffer = []; | |
if (!error) error = output; | |
FS.createFolder("/", "tmp", true, true); | |
var devFolder = FS.createFolder("/", "dev", true, false); | |
var stdin = FS.createDevice(devFolder, "stdin", input); | |
var stdout = FS.createDevice(devFolder, "stdout", null, output); | |
var stderr = FS.createDevice(devFolder, "stderr", null, error); | |
FS.createDevice(devFolder, "tty", input, output); | |
FS.streams[1] = { | |
path: "/dev/stdin", | |
object: stdin, | |
position: 0, | |
isRead: true, | |
isWrite: false, | |
isAppend: false, | |
error: false, | |
eof: false, | |
ungotten: [] | |
}; | |
FS.streams[2] = { | |
path: "/dev/stdout", | |
object: stdout, | |
position: 0, | |
isRead: false, | |
isWrite: true, | |
isAppend: false, | |
error: false, | |
eof: false, | |
ungotten: [] | |
}; | |
FS.streams[3] = { | |
path: "/dev/stderr", | |
object: stderr, | |
position: 0, | |
isRead: false, | |
isWrite: true, | |
isAppend: false, | |
error: false, | |
eof: false, | |
ungotten: [] | |
}; | |
_stdin = allocate([ 1 ], "void*", ALLOC_STATIC); | |
_stdout = allocate([ 2 ], "void*", ALLOC_STATIC); | |
_stderr = allocate([ 3 ], "void*", ALLOC_STATIC); | |
FS.streams[_stdin] = FS.streams[1]; | |
FS.streams[_stdout] = FS.streams[2]; | |
FS.streams[_stderr] = FS.streams[3]; | |
__impure_ptr = allocate([ allocate([ 0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0 ], "void*", ALLOC_STATIC) ], "void*", ALLOC_STATIC); | |
}), | |
quit: (function() { | |
if (!FS.init.initialized) return; | |
if (FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output("\n".charCodeAt(0)); | |
if (FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output("\n".charCodeAt(0)); | |
}) | |
}; | |
function _pwrite(fildes, buf, nbyte, offset) { | |
var stream = FS.streams[fildes]; | |
if (!stream || stream.object.isDevice) { | |
___setErrNo(ERRNO_CODES.EBADF); | |
return -1; | |
} else if (!stream.isWrite) { | |
___setErrNo(ERRNO_CODES.EACCES); | |
return -1; | |
} else if (stream.object.isFolder) { | |
___setErrNo(ERRNO_CODES.EISDIR); | |
return -1; | |
} else if (nbyte < 0 || offset < 0) { | |
___setErrNo(ERRNO_CODES.EINVAL); | |
return -1; | |
} else { | |
var contents = stream.object.contents; | |
while (contents.length < offset) contents.push(0); | |
for (var i = 0; i < nbyte; i++) { | |
contents[offset + i] = HEAPU8[buf + i]; | |
} | |
stream.object.timestamp = Date.now(); | |
return i; | |
} | |
} | |
function _write(fildes, buf, nbyte) { | |
var stream = FS.streams[fildes]; | |
if (!stream) { | |
___setErrNo(ERRNO_CODES.EBADF); | |
return -1; | |
} else if (!stream.isWrite) { | |
___setErrNo(ERRNO_CODES.EACCES); | |
return -1; | |
} else if (nbyte < 0) { | |
___setErrNo(ERRNO_CODES.EINVAL); | |
return -1; | |
} else { | |
if (stream.object.isDevice) { | |
if (stream.object.output) { | |
for (var i = 0; i < nbyte; i++) { | |
try { | |
stream.object.output(HEAP8[buf + i]); | |
} catch (e) { | |
___setErrNo(ERRNO_CODES.EIO); | |
return -1; | |
} | |
} | |
stream.object.timestamp = Date.now(); | |
return i; | |
} else { | |
___setErrNo(ERRNO_CODES.ENXIO); | |
return -1; | |
} | |
} else { | |
var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position); | |
if (bytesWritten != -1) stream.position += bytesWritten; | |
return bytesWritten; | |
} | |
} | |
} | |
function _fwrite(ptr, size, nitems, stream) { | |
var bytesToWrite = nitems * size; | |
if (bytesToWrite == 0) return 0; | |
var bytesWritten = _write(stream, ptr, bytesToWrite); | |
if (bytesWritten == -1) { | |
if (FS.streams[stream]) FS.streams[stream].error = true; | |
return -1; | |
} else { | |
return Math.floor(bytesWritten / size); | |
} | |
} | |
function __formatString(format, varargs) { | |
var textIndex = format; | |
var argIndex = 0; | |
function getNextArg(type) { | |
var ret; | |
if (type === "double") { | |
ret = (tempDoubleI32[0] = HEAP32[varargs + argIndex >> 2], tempDoubleI32[1] = HEAP32[varargs + argIndex + 4 >> 2], tempDoubleF64[0]); | |
} else if (type == "i64") { | |
ret = [ HEAP32[varargs + argIndex >> 2], HEAP32[varargs + argIndex + 4 >> 2] ]; | |
ret = unSign(ret[0], 32) + unSign(ret[1], 32) * Math.pow(2, 32); | |
} else { | |
type = "i32"; | |
ret = HEAP32[varargs + argIndex >> 2]; | |
} | |
argIndex += Runtime.getNativeFieldSize(type); | |
return Number(ret); | |
} | |
var ret = []; | |
var curr, next, currArg; | |
while (1) { | |
var startTextIndex = textIndex; | |
curr = HEAP8[textIndex]; | |
if (curr === 0) break; | |
next = HEAP8[textIndex + 1]; | |
if (curr == "%".charCodeAt(0)) { | |
var flagAlwaysSigned = false; | |
var flagLeftAlign = false; | |
var flagAlternative = false; | |
var flagZeroPad = false; | |
flagsLoop : while (1) { | |
switch (next) { | |
case "+".charCodeAt(0): | |
flagAlwaysSigned = true; | |
break; | |
case "-".charCodeAt(0): | |
flagLeftAlign = true; | |
break; | |
case "#".charCodeAt(0): | |
flagAlternative = true; | |
break; | |
case "0".charCodeAt(0): | |
if (flagZeroPad) { | |
break flagsLoop; | |
} else { | |
flagZeroPad = true; | |
break; | |
} | |
default: | |
break flagsLoop; | |
} | |
textIndex++; | |
next = HEAP8[textIndex + 1]; | |
} | |
var width = 0; | |
if (next == "*".charCodeAt(0)) { | |
width = getNextArg("i32"); | |
textIndex++; | |
next = HEAP8[textIndex + 1]; | |
} else { | |
while (next >= "0".charCodeAt(0) && next <= "9".charCodeAt(0)) { | |
width = width * 10 + (next - "0".charCodeAt(0)); | |
textIndex++; | |
next = HEAP8[textIndex + 1]; | |
} | |
} | |
var precisionSet = false; | |
if (next == ".".charCodeAt(0)) { | |
var precision = 0; | |
precisionSet = true; | |
textIndex++; | |
next = HEAP8[textIndex + 1]; | |
if (next == "*".charCodeAt(0)) { | |
precision = getNextArg("i32"); | |
textIndex++; | |
} else { | |
while (1) { | |
var precisionChr = HEAP8[textIndex + 1]; | |
if (precisionChr < "0".charCodeAt(0) || precisionChr > "9".charCodeAt(0)) break; | |
precision = precision * 10 + (precisionChr - "0".charCodeAt(0)); | |
textIndex++; | |
} | |
} | |
next = HEAP8[textIndex + 1]; | |
} else { | |
var precision = 6; | |
} | |
var argSize; | |
switch (String.fromCharCode(next)) { | |
case "h": | |
var nextNext = HEAP8[textIndex + 2]; | |
if (nextNext == "h".charCodeAt(0)) { | |
textIndex++; | |
argSize = 1; | |
} else { | |
argSize = 2; | |
} | |
break; | |
case "l": | |
var nextNext = HEAP8[textIndex + 2]; | |
if (nextNext == "l".charCodeAt(0)) { | |
textIndex++; | |
argSize = 8; | |
} else { | |
argSize = 4; | |
} | |
break; | |
case "L": | |
case "q": | |
case "j": | |
argSize = 8; | |
break; | |
case "z": | |
case "t": | |
case "I": | |
argSize = 4; | |
break; | |
default: | |
argSize = null; | |
} | |
if (argSize) textIndex++; | |
next = HEAP8[textIndex + 1]; | |
if ([ "d", "i", "u", "o", "x", "X", "p" ].indexOf(String.fromCharCode(next)) != -1) { | |
var signed = next == "d".charCodeAt(0) || next == "i".charCodeAt(0); | |
argSize = argSize || 4; | |
var currArg = getNextArg("i" + argSize * 8); | |
if (argSize <= 4) { | |
var limit = Math.pow(256, argSize) - 1; | |
currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8); | |
} | |
var currAbsArg = Math.abs(currArg); | |
var argText; | |
var prefix = ""; | |
if (next == "d".charCodeAt(0) || next == "i".charCodeAt(0)) { | |
argText = reSign(currArg, 8 * argSize, 1).toString(10); | |
} else if (next == "u".charCodeAt(0)) { | |
argText = unSign(currArg, 8 * argSize, 1).toString(10); | |
currArg = Math.abs(currArg); | |
} else if (next == "o".charCodeAt(0)) { | |
argText = (flagAlternative ? "0" : "") + currAbsArg.toString(8); | |
} else if (next == "x".charCodeAt(0) || next == "X".charCodeAt(0)) { | |
prefix = flagAlternative ? "0x" : ""; | |
if (currArg < 0) { | |
currArg = -currArg; | |
argText = (currAbsArg - 1).toString(16); | |
var buffer = []; | |
for (var i = 0; i < argText.length; i++) { | |
buffer.push((15 - parseInt(argText[i], 16)).toString(16)); | |
} | |
argText = buffer.join(""); | |
while (argText.length < argSize * 2) argText = "f" + argText; | |
} else { | |
argText = currAbsArg.toString(16); | |
} | |
if (next == "X".charCodeAt(0)) { | |
prefix = prefix.toUpperCase(); | |
argText = argText.toUpperCase(); | |
} | |
} else if (next == "p".charCodeAt(0)) { | |
if (currAbsArg === 0) { | |
argText = "(nil)"; | |
} else { | |
prefix = "0x"; | |
argText = currAbsArg.toString(16); | |
} | |
} | |
if (precisionSet) { | |
while (argText.length < precision) { | |
argText = "0" + argText; | |
} | |
} | |
if (flagAlwaysSigned) { | |
if (currArg < 0) { | |
prefix = "-" + prefix; | |
} else { | |
prefix = "+" + prefix; | |
} | |
} | |
while (prefix.length + argText.length < width) { | |
if (flagLeftAlign) { | |
argText += " "; | |
} else { | |
if (flagZeroPad) { | |
argText = "0" + argText; | |
} else { | |
prefix = " " + prefix; | |
} | |
} | |
} | |
argText = prefix + argText; | |
argText.split("").forEach((function(chr) { | |
ret.push(chr.charCodeAt(0)); | |
})); | |
} else if ([ "f", "F", "e", "E", "g", "G" ].indexOf(String.fromCharCode(next)) != -1) { | |
var currArg = getNextArg("double"); | |
var argText; | |
if (isNaN(currArg)) { | |
argText = "nan"; | |
flagZeroPad = false; | |
} else if (!isFinite(currArg)) { | |
argText = (currArg < 0 ? "-" : "") + "inf"; | |
flagZeroPad = false; | |
} else { | |
var isGeneral = false; | |
var effectivePrecision = Math.min(precision, 20); | |
if (next == "g".charCodeAt(0) || next == "G".charCodeAt(0)) { | |
isGeneral = true; | |
precision = precision || 1; | |
var exponent = parseInt(currArg.toExponential(effectivePrecision).split("e")[1], 10); | |
if (precision > exponent && exponent >= -4) { | |
next = (next == "g".charCodeAt(0) ? "f" : "F").charCodeAt(0); | |
precision -= exponent + 1; | |
} else { | |
next = (next == "g".charCodeAt(0) ? "e" : "E").charCodeAt(0); | |
precision--; | |
} | |
effectivePrecision = Math.min(precision, 20); | |
} | |
if (next == "e".charCodeAt(0) || next == "E".charCodeAt(0)) { | |
argText = currArg.toExponential(effectivePrecision); | |
if (/[eE][-+]\d$/.test(argText)) { | |
argText = argText.slice(0, -1) + "0" + argText.slice(-1); | |
} | |
} else if (next == "f".charCodeAt(0) || next == "F".charCodeAt(0)) { | |
argText = currArg.toFixed(effectivePrecision); | |
} | |
var parts = argText.split("e"); | |
if (isGeneral && !flagAlternative) { | |
while (parts[0].length > 1 && parts[0].indexOf(".") != -1 && (parts[0].slice(-1) == "0" || parts[0].slice(-1) == ".")) { | |
parts[0] = parts[0].slice(0, -1); | |
} | |
} else { | |
if (flagAlternative && argText.indexOf(".") == -1) parts[0] += "."; | |
while (precision > effectivePrecision++) parts[0] += "0"; | |
} | |
argText = parts[0] + (parts.length > 1 ? "e" + parts[1] : ""); | |
if (next == "E".charCodeAt(0)) argText = argText.toUpperCase(); | |
if (flagAlwaysSigned && currArg >= 0) { | |
argText = "+" + argText; | |
} | |
} | |
while (argText.length < width) { | |
if (flagLeftAlign) { | |
argText += " "; | |
} else { | |
if (flagZeroPad && (argText[0] == "-" || argText[0] == "+")) { | |
argText = argText[0] + "0" + argText.slice(1); | |
} else { | |
argText = (flagZeroPad ? "0" : " ") + argText; | |
} | |
} | |
} | |
if (next < "a".charCodeAt(0)) argText = argText.toUpperCase(); | |
argText.split("").forEach((function(chr) { | |
ret.push(chr.charCodeAt(0)); | |
})); | |
} else if (next == "s".charCodeAt(0)) { | |
var arg = getNextArg("i8*"); | |
var copiedString; | |
if (arg) { | |
copiedString = String_copy(arg); | |
if (precisionSet && copiedString.length > precision) { | |
copiedString = copiedString.slice(0, precision); | |
} | |
} else { | |
copiedString = intArrayFromString("(null)", true); | |
} | |
if (!flagLeftAlign) { | |
while (copiedString.length < width--) { | |
ret.push(" ".charCodeAt(0)); | |
} | |
} | |
ret = ret.concat(copiedString); | |
if (flagLeftAlign) { | |
while (copiedString.length < width--) { | |
ret.push(" ".charCodeAt(0)); | |
} | |
} | |
} else if (next == "c".charCodeAt(0)) { | |
if (flagLeftAlign) ret.push(getNextArg("i8")); | |
while (--width > 0) { | |
ret.push(" ".charCodeAt(0)); | |
} | |
if (!flagLeftAlign) ret.push(getNextArg("i8")); | |
} else if (next == "n".charCodeAt(0)) { | |
var ptr = getNextArg("i32*"); | |
HEAP32[ptr >> 2] = ret.length; | |
} else if (next == "%".charCodeAt(0)) { | |
ret.push(curr); | |
} else { | |
for (var i = startTextIndex; i < textIndex + 2; i++) { | |
ret.push(HEAP8[i]); | |
} | |
} | |
textIndex += 2; | |
} else { | |
ret.push(curr); | |
textIndex += 1; | |
} | |
} | |
return ret; | |
} | |
function _fprintf(stream, format, varargs) { | |
var result = __formatString(format, varargs); | |
var stack = Runtime.stackSave(); | |
var ret = _fwrite(allocate(result, "i8", ALLOC_STACK), 1, result.length, stream); | |
Runtime.stackRestore(stack); | |
return ret; | |
} | |
function _printf(format, varargs) { | |
var stdout = HEAP32[_stdout >> 2]; | |
return _fprintf(stdout, format, varargs); | |
} | |
function _fputc(c, stream) { | |
var chr = unSign(c & 255); | |
HEAP8[_fputc.ret] = chr; | |
var ret = _write(stream, _fputc.ret, 1); | |
if (ret == -1) { | |
if (stream in FS.streams) FS.streams[stream].error = true; | |
return -1; | |
} else { | |
return chr; | |
} | |
} | |
function _putchar(c) { | |
return _fputc(c, HEAP32[_stdout >> 2]); | |
} | |
function _memset(ptr, value, num) { | |
var dest, stop, stop4, fast, value; | |
dest = ptr; | |
stop = dest + num; | |
value = value; | |
if (value < 0) value += 256; | |
value = value + (value << 8) + (value << 16) + value * 16777216; | |
while (dest % 4 !== 0 && dest < stop) { | |
HEAP8[dest++] = value; | |
} | |
dest >>= 2; | |
stop4 = stop >> 2; | |
while (dest < stop4) { | |
HEAP32[dest++] = value; | |
} | |
dest <<= 2; | |
while (dest < stop) { | |
HEAP8[dest++] = value; | |
} | |
} | |
function _malloc(bytes) { | |
return Runtime.staticAlloc(bytes || 1); | |
} | |
function _free() {} | |
FS.init(); | |
__ATEXIT__.push({ | |
func: (function() { | |
FS.quit(); | |
}) | |
}); | |
___setErrNo(0); | |
_fputc.ret = allocate([ 0 ], "i8", ALLOC_STATIC); | |
Module.callMain = function callMain(args) { | |
var argc = args.length + 1; | |
function pad() { | |
for (var i = 0; i < 4 - 1; i++) { | |
argv.push(0); | |
} | |
} | |
var argv = [ allocate(intArrayFromString("/bin/this.program"), "i8", ALLOC_STATIC) ]; | |
pad(); | |
for (var i = 0; i < argc - 1; i = i + 1) { | |
argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_STATIC)); | |
pad(); | |
} | |
argv.push(0); | |
argv = allocate(argv, "i32", ALLOC_STATIC); | |
return _main(argc, argv, 0); | |
}; | |
var __str; | |
__str = allocate([ 42, 37, 100, 42, 0 ], "i8", ALLOC_STATIC); | |
FUNCTION_TABLE = [ 0, 0 ]; | |
Module["FUNCTION_TABLE"] = FUNCTION_TABLE; | |
function run(args) { | |
args = args || Module["arguments"]; | |
__globalConstructor__(); | |
var ret = null; | |
if (Module["_main"]) { | |
ret = Module.callMain(args); | |
__shutdownRuntime__(); | |
} | |
return ret; | |
} | |
Module["run"] = run; | |
try { | |
FS.ignorePermissions = false; | |
} catch (e) {} | |
if (!Module["noInitialRun"]) { | |
var ret = run(); | |
} | |
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["_main"] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment