mirror of
https://github.com/OpenListTeam/OpenList-Frontend.git
synced 2026-03-13 11:20:24 +00:00
5963 lines
196 KiB
JavaScript
5963 lines
196 KiB
JavaScript
var libheif = (() => {
|
|
var _scriptName =
|
|
typeof document != "undefined" ? document.currentScript?.src : undefined
|
|
if (typeof __filename != "undefined") _scriptName = _scriptName || __filename
|
|
return function (moduleArg = {}) {
|
|
var moduleRtn
|
|
|
|
var Module = moduleArg
|
|
var readyPromiseResolve, readyPromiseReject
|
|
var readyPromise = new Promise((resolve, reject) => {
|
|
readyPromiseResolve = resolve
|
|
readyPromiseReject = reject
|
|
})
|
|
var ENVIRONMENT_IS_WEB = typeof window == "object"
|
|
var ENVIRONMENT_IS_WORKER = typeof importScripts == "function"
|
|
var ENVIRONMENT_IS_NODE =
|
|
typeof process == "object" &&
|
|
typeof process.versions == "object" &&
|
|
typeof process.versions.node == "string"
|
|
if (ENVIRONMENT_IS_NODE) {
|
|
}
|
|
var moduleOverrides = Object.assign({}, Module)
|
|
var arguments_ = []
|
|
var thisProgram = "./this.program"
|
|
var quit_ = (status, toThrow) => {
|
|
throw toThrow
|
|
}
|
|
var scriptDirectory = ""
|
|
function locateFile(path) {
|
|
if (Module["locateFile"]) {
|
|
return Module["locateFile"](path, scriptDirectory)
|
|
}
|
|
return scriptDirectory + path
|
|
}
|
|
var readAsync, readBinary
|
|
if (ENVIRONMENT_IS_NODE) {
|
|
var fs = require("fs")
|
|
var nodePath = require("path")
|
|
scriptDirectory = __dirname + "/"
|
|
readBinary = (filename) => {
|
|
filename = isFileURI(filename)
|
|
? new URL(filename)
|
|
: nodePath.normalize(filename)
|
|
var ret = fs.readFileSync(filename)
|
|
return ret
|
|
}
|
|
readAsync = (filename, binary = true) => {
|
|
filename = isFileURI(filename)
|
|
? new URL(filename)
|
|
: nodePath.normalize(filename)
|
|
return new Promise((resolve, reject) => {
|
|
fs.readFile(filename, binary ? undefined : "utf8", (err, data) => {
|
|
if (err) reject(err)
|
|
else resolve(binary ? data.buffer : data)
|
|
})
|
|
})
|
|
}
|
|
if (!Module["thisProgram"] && process.argv.length > 1) {
|
|
thisProgram = process.argv[1].replace(/\\/g, "/")
|
|
}
|
|
arguments_ = process.argv.slice(2)
|
|
quit_ = (status, toThrow) => {
|
|
process.exitCode = status
|
|
throw toThrow
|
|
}
|
|
} else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
scriptDirectory = self.location.href
|
|
} else if (typeof document != "undefined" && document.currentScript) {
|
|
scriptDirectory = document.currentScript.src
|
|
}
|
|
if (_scriptName) {
|
|
scriptDirectory = _scriptName
|
|
}
|
|
if (scriptDirectory.startsWith("blob:")) {
|
|
scriptDirectory = ""
|
|
} else {
|
|
scriptDirectory = scriptDirectory.substr(
|
|
0,
|
|
scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1,
|
|
)
|
|
}
|
|
{
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
readBinary = (url) => {
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open("GET", url, false)
|
|
xhr.responseType = "arraybuffer"
|
|
xhr.send(null)
|
|
return new Uint8Array(xhr.response)
|
|
}
|
|
}
|
|
readAsync = (url) => {
|
|
if (isFileURI(url)) {
|
|
return new Promise((resolve, reject) => {
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open("GET", url, true)
|
|
xhr.responseType = "arraybuffer"
|
|
xhr.onload = () => {
|
|
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
|
|
resolve(xhr.response)
|
|
return
|
|
}
|
|
reject(xhr.status)
|
|
}
|
|
xhr.onerror = reject
|
|
xhr.send(null)
|
|
})
|
|
}
|
|
return fetch(url, { credentials: "same-origin" }).then((response) => {
|
|
if (response.ok) {
|
|
return response.arrayBuffer()
|
|
}
|
|
return Promise.reject(
|
|
new Error(response.status + " : " + response.url),
|
|
)
|
|
})
|
|
}
|
|
}
|
|
} else {
|
|
}
|
|
var out = Module["print"] || console.log.bind(console)
|
|
var err = Module["printErr"] || console.error.bind(console)
|
|
Object.assign(Module, moduleOverrides)
|
|
moduleOverrides = null
|
|
if (Module["arguments"]) arguments_ = Module["arguments"]
|
|
if (Module["thisProgram"]) thisProgram = Module["thisProgram"]
|
|
var wasmBinary = Module["wasmBinary"]
|
|
var wasmMemory
|
|
var ABORT = false
|
|
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64
|
|
function updateMemoryViews() {
|
|
var b = wasmMemory.buffer
|
|
Module["HEAP8"] = HEAP8 = new Int8Array(b)
|
|
Module["HEAP16"] = HEAP16 = new Int16Array(b)
|
|
Module["HEAPU8"] = HEAPU8 = new Uint8Array(b)
|
|
Module["HEAPU16"] = HEAPU16 = new Uint16Array(b)
|
|
Module["HEAP32"] = HEAP32 = new Int32Array(b)
|
|
Module["HEAPU32"] = HEAPU32 = new Uint32Array(b)
|
|
Module["HEAPF32"] = HEAPF32 = new Float32Array(b)
|
|
Module["HEAPF64"] = HEAPF64 = new Float64Array(b)
|
|
}
|
|
var __ATPRERUN__ = []
|
|
var __ATINIT__ = []
|
|
var __ATPOSTRUN__ = []
|
|
var runtimeInitialized = false
|
|
function preRun() {
|
|
if (Module["preRun"]) {
|
|
if (typeof Module["preRun"] == "function")
|
|
Module["preRun"] = [Module["preRun"]]
|
|
while (Module["preRun"].length) {
|
|
addOnPreRun(Module["preRun"].shift())
|
|
}
|
|
}
|
|
callRuntimeCallbacks(__ATPRERUN__)
|
|
}
|
|
function initRuntime() {
|
|
runtimeInitialized = true
|
|
if (!Module["noFSInit"] && !FS.initialized) FS.init()
|
|
FS.ignorePermissions = false
|
|
TTY.init()
|
|
callRuntimeCallbacks(__ATINIT__)
|
|
}
|
|
function postRun() {
|
|
if (Module["postRun"]) {
|
|
if (typeof Module["postRun"] == "function")
|
|
Module["postRun"] = [Module["postRun"]]
|
|
while (Module["postRun"].length) {
|
|
addOnPostRun(Module["postRun"].shift())
|
|
}
|
|
}
|
|
callRuntimeCallbacks(__ATPOSTRUN__)
|
|
}
|
|
function addOnPreRun(cb) {
|
|
__ATPRERUN__.unshift(cb)
|
|
}
|
|
function addOnInit(cb) {
|
|
__ATINIT__.unshift(cb)
|
|
}
|
|
function addOnPostRun(cb) {
|
|
__ATPOSTRUN__.unshift(cb)
|
|
}
|
|
var runDependencies = 0
|
|
var runDependencyWatcher = null
|
|
var dependenciesFulfilled = null
|
|
function getUniqueRunDependency(id) {
|
|
return id
|
|
}
|
|
function addRunDependency(id) {
|
|
runDependencies++
|
|
Module["monitorRunDependencies"]?.(runDependencies)
|
|
}
|
|
function removeRunDependency(id) {
|
|
runDependencies--
|
|
Module["monitorRunDependencies"]?.(runDependencies)
|
|
if (runDependencies == 0) {
|
|
if (runDependencyWatcher !== null) {
|
|
clearInterval(runDependencyWatcher)
|
|
runDependencyWatcher = null
|
|
}
|
|
if (dependenciesFulfilled) {
|
|
var callback = dependenciesFulfilled
|
|
dependenciesFulfilled = null
|
|
callback()
|
|
}
|
|
}
|
|
}
|
|
function abort(what) {
|
|
Module["onAbort"]?.(what)
|
|
what = "Aborted(" + what + ")"
|
|
err(what)
|
|
ABORT = true
|
|
what += ". Build with -sASSERTIONS for more info."
|
|
var e = new WebAssembly.RuntimeError(what)
|
|
readyPromiseReject(e)
|
|
throw e
|
|
}
|
|
var dataURIPrefix = "data:application/octet-stream;base64,"
|
|
var isDataURI = (filename) => filename.startsWith(dataURIPrefix)
|
|
var isFileURI = (filename) => filename.startsWith("file://")
|
|
function findWasmBinary() {
|
|
var f = "libheif.wasm"
|
|
if (!isDataURI(f)) {
|
|
return locateFile(f)
|
|
}
|
|
return f
|
|
}
|
|
var wasmBinaryFile
|
|
function getBinarySync(file) {
|
|
if (file == wasmBinaryFile && wasmBinary) {
|
|
return new Uint8Array(wasmBinary)
|
|
}
|
|
if (readBinary) {
|
|
return readBinary(file)
|
|
}
|
|
throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'
|
|
}
|
|
function instantiateSync(file, info) {
|
|
var module
|
|
var binary = getBinarySync(file)
|
|
module = new WebAssembly.Module(binary)
|
|
var instance = new WebAssembly.Instance(module, info)
|
|
return [instance, module]
|
|
}
|
|
function getWasmImports() {
|
|
return { a: wasmImports }
|
|
}
|
|
function createWasm() {
|
|
var info = getWasmImports()
|
|
function receiveInstance(instance, module) {
|
|
wasmExports = instance.exports
|
|
wasmMemory = wasmExports["Q"]
|
|
updateMemoryViews()
|
|
wasmTable = wasmExports["S"]
|
|
addOnInit(wasmExports["R"])
|
|
removeRunDependency("wasm-instantiate")
|
|
return wasmExports
|
|
}
|
|
addRunDependency("wasm-instantiate")
|
|
if (Module["instantiateWasm"]) {
|
|
try {
|
|
return Module["instantiateWasm"](info, receiveInstance)
|
|
} catch (e) {
|
|
err(`Module.instantiateWasm callback failed with error: ${e}`)
|
|
readyPromiseReject(e)
|
|
}
|
|
}
|
|
if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary()
|
|
var result = instantiateSync(wasmBinaryFile, info)
|
|
return receiveInstance(result[0])
|
|
}
|
|
var tempDouble
|
|
var tempI64
|
|
var callRuntimeCallbacks = (callbacks) => {
|
|
while (callbacks.length > 0) {
|
|
callbacks.shift()(Module)
|
|
}
|
|
}
|
|
var noExitRuntime = Module["noExitRuntime"] || true
|
|
var UTF8Decoder =
|
|
typeof TextDecoder != "undefined" ? new TextDecoder() : undefined
|
|
var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {
|
|
var endIdx = idx + maxBytesToRead
|
|
var endPtr = idx
|
|
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr
|
|
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
|
|
return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr))
|
|
}
|
|
var str = ""
|
|
while (idx < endPtr) {
|
|
var u0 = heapOrArray[idx++]
|
|
if (!(u0 & 128)) {
|
|
str += String.fromCharCode(u0)
|
|
continue
|
|
}
|
|
var u1 = heapOrArray[idx++] & 63
|
|
if ((u0 & 224) == 192) {
|
|
str += String.fromCharCode(((u0 & 31) << 6) | u1)
|
|
continue
|
|
}
|
|
var u2 = heapOrArray[idx++] & 63
|
|
if ((u0 & 240) == 224) {
|
|
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2
|
|
} else {
|
|
u0 =
|
|
((u0 & 7) << 18) |
|
|
(u1 << 12) |
|
|
(u2 << 6) |
|
|
(heapOrArray[idx++] & 63)
|
|
}
|
|
if (u0 < 65536) {
|
|
str += String.fromCharCode(u0)
|
|
} else {
|
|
var ch = u0 - 65536
|
|
str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))
|
|
}
|
|
}
|
|
return str
|
|
}
|
|
var UTF8ToString = (ptr, maxBytesToRead) =>
|
|
ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""
|
|
var ___assert_fail = (condition, filename, line, func) => {
|
|
abort(
|
|
`Assertion failed: ${UTF8ToString(condition)}, at: ` +
|
|
[
|
|
filename ? UTF8ToString(filename) : "unknown filename",
|
|
line,
|
|
func ? UTF8ToString(func) : "unknown function",
|
|
],
|
|
)
|
|
}
|
|
class ExceptionInfo {
|
|
constructor(excPtr) {
|
|
this.excPtr = excPtr
|
|
this.ptr = excPtr - 24
|
|
}
|
|
set_type(type) {
|
|
HEAPU32[(this.ptr + 4) >> 2] = type
|
|
}
|
|
get_type() {
|
|
return HEAPU32[(this.ptr + 4) >> 2]
|
|
}
|
|
set_destructor(destructor) {
|
|
HEAPU32[(this.ptr + 8) >> 2] = destructor
|
|
}
|
|
get_destructor() {
|
|
return HEAPU32[(this.ptr + 8) >> 2]
|
|
}
|
|
set_caught(caught) {
|
|
caught = caught ? 1 : 0
|
|
HEAP8[this.ptr + 12] = caught
|
|
}
|
|
get_caught() {
|
|
return HEAP8[this.ptr + 12] != 0
|
|
}
|
|
set_rethrown(rethrown) {
|
|
rethrown = rethrown ? 1 : 0
|
|
HEAP8[this.ptr + 13] = rethrown
|
|
}
|
|
get_rethrown() {
|
|
return HEAP8[this.ptr + 13] != 0
|
|
}
|
|
init(type, destructor) {
|
|
this.set_adjusted_ptr(0)
|
|
this.set_type(type)
|
|
this.set_destructor(destructor)
|
|
}
|
|
set_adjusted_ptr(adjustedPtr) {
|
|
HEAPU32[(this.ptr + 16) >> 2] = adjustedPtr
|
|
}
|
|
get_adjusted_ptr() {
|
|
return HEAPU32[(this.ptr + 16) >> 2]
|
|
}
|
|
}
|
|
var exceptionLast = 0
|
|
var uncaughtExceptionCount = 0
|
|
var ___cxa_throw = (ptr, type, destructor) => {
|
|
var info = new ExceptionInfo(ptr)
|
|
info.init(type, destructor)
|
|
exceptionLast = ptr
|
|
uncaughtExceptionCount++
|
|
throw exceptionLast
|
|
}
|
|
function syscallGetVarargI() {
|
|
var ret = HEAP32[+SYSCALLS.varargs >> 2]
|
|
SYSCALLS.varargs += 4
|
|
return ret
|
|
}
|
|
var syscallGetVarargP = syscallGetVarargI
|
|
var PATH = {
|
|
isAbs: (path) => path.charAt(0) === "/",
|
|
splitPath: (filename) => {
|
|
var splitPathRe =
|
|
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/
|
|
return splitPathRe.exec(filename).slice(1)
|
|
},
|
|
normalizeArray: (parts, allowAboveRoot) => {
|
|
var up = 0
|
|
for (var i = parts.length - 1; i >= 0; i--) {
|
|
var last = parts[i]
|
|
if (last === ".") {
|
|
parts.splice(i, 1)
|
|
} else if (last === "..") {
|
|
parts.splice(i, 1)
|
|
up++
|
|
} else if (up) {
|
|
parts.splice(i, 1)
|
|
up--
|
|
}
|
|
}
|
|
if (allowAboveRoot) {
|
|
for (; up; up--) {
|
|
parts.unshift("..")
|
|
}
|
|
}
|
|
return parts
|
|
},
|
|
normalize: (path) => {
|
|
var isAbsolute = PATH.isAbs(path),
|
|
trailingSlash = path.substr(-1) === "/"
|
|
path = PATH.normalizeArray(
|
|
path.split("/").filter((p) => !!p),
|
|
!isAbsolute,
|
|
).join("/")
|
|
if (!path && !isAbsolute) {
|
|
path = "."
|
|
}
|
|
if (path && trailingSlash) {
|
|
path += "/"
|
|
}
|
|
return (isAbsolute ? "/" : "") + path
|
|
},
|
|
dirname: (path) => {
|
|
var result = PATH.splitPath(path),
|
|
root = result[0],
|
|
dir = result[1]
|
|
if (!root && !dir) {
|
|
return "."
|
|
}
|
|
if (dir) {
|
|
dir = dir.substr(0, dir.length - 1)
|
|
}
|
|
return root + dir
|
|
},
|
|
basename: (path) => {
|
|
if (path === "/") return "/"
|
|
path = PATH.normalize(path)
|
|
path = path.replace(/\/$/, "")
|
|
var lastSlash = path.lastIndexOf("/")
|
|
if (lastSlash === -1) return path
|
|
return path.substr(lastSlash + 1)
|
|
},
|
|
join: (...paths) => PATH.normalize(paths.join("/")),
|
|
join2: (l, r) => PATH.normalize(l + "/" + r),
|
|
}
|
|
var initRandomFill = () => {
|
|
if (
|
|
typeof crypto == "object" &&
|
|
typeof crypto["getRandomValues"] == "function"
|
|
) {
|
|
return (view) => crypto.getRandomValues(view)
|
|
} else if (ENVIRONMENT_IS_NODE) {
|
|
try {
|
|
var crypto_module = require("crypto")
|
|
var randomFillSync = crypto_module["randomFillSync"]
|
|
if (randomFillSync) {
|
|
return (view) => crypto_module["randomFillSync"](view)
|
|
}
|
|
var randomBytes = crypto_module["randomBytes"]
|
|
return (view) => (view.set(randomBytes(view.byteLength)), view)
|
|
} catch (e) {}
|
|
}
|
|
abort("initRandomDevice")
|
|
}
|
|
var randomFill = (view) => (randomFill = initRandomFill())(view)
|
|
var PATH_FS = {
|
|
resolve: (...args) => {
|
|
var resolvedPath = "",
|
|
resolvedAbsolute = false
|
|
for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
var path = i >= 0 ? args[i] : FS.cwd()
|
|
if (typeof path != "string") {
|
|
throw new TypeError("Arguments to path.resolve must be strings")
|
|
} else if (!path) {
|
|
return ""
|
|
}
|
|
resolvedPath = path + "/" + resolvedPath
|
|
resolvedAbsolute = PATH.isAbs(path)
|
|
}
|
|
resolvedPath = PATH.normalizeArray(
|
|
resolvedPath.split("/").filter((p) => !!p),
|
|
!resolvedAbsolute,
|
|
).join("/")
|
|
return (resolvedAbsolute ? "/" : "") + resolvedPath || "."
|
|
},
|
|
relative: (from, to) => {
|
|
from = PATH_FS.resolve(from).substr(1)
|
|
to = PATH_FS.resolve(to).substr(1)
|
|
function trim(arr) {
|
|
var start = 0
|
|
for (; start < arr.length; start++) {
|
|
if (arr[start] !== "") break
|
|
}
|
|
var end = arr.length - 1
|
|
for (; end >= 0; end--) {
|
|
if (arr[end] !== "") break
|
|
}
|
|
if (start > end) return []
|
|
return arr.slice(start, end - start + 1)
|
|
}
|
|
var fromParts = trim(from.split("/"))
|
|
var toParts = trim(to.split("/"))
|
|
var length = Math.min(fromParts.length, toParts.length)
|
|
var samePartsLength = length
|
|
for (var i = 0; i < length; i++) {
|
|
if (fromParts[i] !== toParts[i]) {
|
|
samePartsLength = i
|
|
break
|
|
}
|
|
}
|
|
var outputParts = []
|
|
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
outputParts.push("..")
|
|
}
|
|
outputParts = outputParts.concat(toParts.slice(samePartsLength))
|
|
return outputParts.join("/")
|
|
},
|
|
}
|
|
var FS_stdin_getChar_buffer = []
|
|
var lengthBytesUTF8 = (str) => {
|
|
var len = 0
|
|
for (var i = 0; i < str.length; ++i) {
|
|
var c = str.charCodeAt(i)
|
|
if (c <= 127) {
|
|
len++
|
|
} else if (c <= 2047) {
|
|
len += 2
|
|
} else if (c >= 55296 && c <= 57343) {
|
|
len += 4
|
|
++i
|
|
} else {
|
|
len += 3
|
|
}
|
|
}
|
|
return len
|
|
}
|
|
var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
|
|
if (!(maxBytesToWrite > 0)) return 0
|
|
var startIdx = outIdx
|
|
var endIdx = outIdx + maxBytesToWrite - 1
|
|
for (var i = 0; i < str.length; ++i) {
|
|
var u = str.charCodeAt(i)
|
|
if (u >= 55296 && u <= 57343) {
|
|
var u1 = str.charCodeAt(++i)
|
|
u = (65536 + ((u & 1023) << 10)) | (u1 & 1023)
|
|
}
|
|
if (u <= 127) {
|
|
if (outIdx >= endIdx) break
|
|
heap[outIdx++] = u
|
|
} else if (u <= 2047) {
|
|
if (outIdx + 1 >= endIdx) break
|
|
heap[outIdx++] = 192 | (u >> 6)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
} else if (u <= 65535) {
|
|
if (outIdx + 2 >= endIdx) break
|
|
heap[outIdx++] = 224 | (u >> 12)
|
|
heap[outIdx++] = 128 | ((u >> 6) & 63)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
} else {
|
|
if (outIdx + 3 >= endIdx) break
|
|
heap[outIdx++] = 240 | (u >> 18)
|
|
heap[outIdx++] = 128 | ((u >> 12) & 63)
|
|
heap[outIdx++] = 128 | ((u >> 6) & 63)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
}
|
|
}
|
|
heap[outIdx] = 0
|
|
return outIdx - startIdx
|
|
}
|
|
function intArrayFromString(stringy, dontAddNull, length) {
|
|
var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1
|
|
var u8array = new Array(len)
|
|
var numBytesWritten = stringToUTF8Array(
|
|
stringy,
|
|
u8array,
|
|
0,
|
|
u8array.length,
|
|
)
|
|
if (dontAddNull) u8array.length = numBytesWritten
|
|
return u8array
|
|
}
|
|
var FS_stdin_getChar = () => {
|
|
if (!FS_stdin_getChar_buffer.length) {
|
|
var result = null
|
|
if (ENVIRONMENT_IS_NODE) {
|
|
var BUFSIZE = 256
|
|
var buf = Buffer.alloc(BUFSIZE)
|
|
var bytesRead = 0
|
|
var fd = process.stdin.fd
|
|
try {
|
|
bytesRead = fs.readSync(fd, buf, 0, BUFSIZE)
|
|
} catch (e) {
|
|
if (e.toString().includes("EOF")) bytesRead = 0
|
|
else throw e
|
|
}
|
|
if (bytesRead > 0) {
|
|
result = buf.slice(0, bytesRead).toString("utf-8")
|
|
}
|
|
} else if (
|
|
typeof window != "undefined" &&
|
|
typeof window.prompt == "function"
|
|
) {
|
|
result = window.prompt("Input: ")
|
|
if (result !== null) {
|
|
result += "\n"
|
|
}
|
|
} else {
|
|
}
|
|
if (!result) {
|
|
return null
|
|
}
|
|
FS_stdin_getChar_buffer = intArrayFromString(result, true)
|
|
}
|
|
return FS_stdin_getChar_buffer.shift()
|
|
}
|
|
var TTY = {
|
|
ttys: [],
|
|
init() {},
|
|
shutdown() {},
|
|
register(dev, ops) {
|
|
TTY.ttys[dev] = { input: [], output: [], ops }
|
|
FS.registerDevice(dev, TTY.stream_ops)
|
|
},
|
|
stream_ops: {
|
|
open(stream) {
|
|
var tty = TTY.ttys[stream.node.rdev]
|
|
if (!tty) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
stream.tty = tty
|
|
stream.seekable = false
|
|
},
|
|
close(stream) {
|
|
stream.tty.ops.fsync(stream.tty)
|
|
},
|
|
fsync(stream) {
|
|
stream.tty.ops.fsync(stream.tty)
|
|
},
|
|
read(stream, buffer, offset, length, pos) {
|
|
if (!stream.tty || !stream.tty.ops.get_char) {
|
|
throw new FS.ErrnoError(60)
|
|
}
|
|
var bytesRead = 0
|
|
for (var i = 0; i < length; i++) {
|
|
var result
|
|
try {
|
|
result = stream.tty.ops.get_char(stream.tty)
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (result === undefined && bytesRead === 0) {
|
|
throw new FS.ErrnoError(6)
|
|
}
|
|
if (result === null || result === undefined) break
|
|
bytesRead++
|
|
buffer[offset + i] = result
|
|
}
|
|
if (bytesRead) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return bytesRead
|
|
},
|
|
write(stream, buffer, offset, length, pos) {
|
|
if (!stream.tty || !stream.tty.ops.put_char) {
|
|
throw new FS.ErrnoError(60)
|
|
}
|
|
try {
|
|
for (var i = 0; i < length; i++) {
|
|
stream.tty.ops.put_char(stream.tty, buffer[offset + i])
|
|
}
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (length) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return i
|
|
},
|
|
},
|
|
default_tty_ops: {
|
|
get_char(tty) {
|
|
return FS_stdin_getChar()
|
|
},
|
|
put_char(tty, val) {
|
|
if (val === null || val === 10) {
|
|
out(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
} else {
|
|
if (val != 0) tty.output.push(val)
|
|
}
|
|
},
|
|
fsync(tty) {
|
|
if (tty.output && tty.output.length > 0) {
|
|
out(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
}
|
|
},
|
|
ioctl_tcgets(tty) {
|
|
return {
|
|
c_iflag: 25856,
|
|
c_oflag: 5,
|
|
c_cflag: 191,
|
|
c_lflag: 35387,
|
|
c_cc: [
|
|
3, 28, 127, 21, 4, 0, 1, 0, 17, 19, 26, 0, 18, 15, 23, 22, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
],
|
|
}
|
|
},
|
|
ioctl_tcsets(tty, optional_actions, data) {
|
|
return 0
|
|
},
|
|
ioctl_tiocgwinsz(tty) {
|
|
return [24, 80]
|
|
},
|
|
},
|
|
default_tty1_ops: {
|
|
put_char(tty, val) {
|
|
if (val === null || val === 10) {
|
|
err(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
} else {
|
|
if (val != 0) tty.output.push(val)
|
|
}
|
|
},
|
|
fsync(tty) {
|
|
if (tty.output && tty.output.length > 0) {
|
|
err(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
}
|
|
},
|
|
},
|
|
}
|
|
var alignMemory = (size, alignment) =>
|
|
Math.ceil(size / alignment) * alignment
|
|
var mmapAlloc = (size) => {
|
|
abort()
|
|
}
|
|
var MEMFS = {
|
|
ops_table: null,
|
|
mount(mount) {
|
|
return MEMFS.createNode(null, "/", 16384 | 511, 0)
|
|
},
|
|
createNode(parent, name, mode, dev) {
|
|
if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
MEMFS.ops_table ||= {
|
|
dir: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
lookup: MEMFS.node_ops.lookup,
|
|
mknod: MEMFS.node_ops.mknod,
|
|
rename: MEMFS.node_ops.rename,
|
|
unlink: MEMFS.node_ops.unlink,
|
|
rmdir: MEMFS.node_ops.rmdir,
|
|
readdir: MEMFS.node_ops.readdir,
|
|
symlink: MEMFS.node_ops.symlink,
|
|
},
|
|
stream: { llseek: MEMFS.stream_ops.llseek },
|
|
},
|
|
file: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
},
|
|
stream: {
|
|
llseek: MEMFS.stream_ops.llseek,
|
|
read: MEMFS.stream_ops.read,
|
|
write: MEMFS.stream_ops.write,
|
|
allocate: MEMFS.stream_ops.allocate,
|
|
mmap: MEMFS.stream_ops.mmap,
|
|
msync: MEMFS.stream_ops.msync,
|
|
},
|
|
},
|
|
link: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
readlink: MEMFS.node_ops.readlink,
|
|
},
|
|
stream: {},
|
|
},
|
|
chrdev: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
},
|
|
stream: FS.chrdev_stream_ops,
|
|
},
|
|
}
|
|
var node = FS.createNode(parent, name, mode, dev)
|
|
if (FS.isDir(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.dir.node
|
|
node.stream_ops = MEMFS.ops_table.dir.stream
|
|
node.contents = {}
|
|
} else if (FS.isFile(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.file.node
|
|
node.stream_ops = MEMFS.ops_table.file.stream
|
|
node.usedBytes = 0
|
|
node.contents = null
|
|
} else if (FS.isLink(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.link.node
|
|
node.stream_ops = MEMFS.ops_table.link.stream
|
|
} else if (FS.isChrdev(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.chrdev.node
|
|
node.stream_ops = MEMFS.ops_table.chrdev.stream
|
|
}
|
|
node.timestamp = Date.now()
|
|
if (parent) {
|
|
parent.contents[name] = node
|
|
parent.timestamp = node.timestamp
|
|
}
|
|
return node
|
|
},
|
|
getFileDataAsTypedArray(node) {
|
|
if (!node.contents) return new Uint8Array(0)
|
|
if (node.contents.subarray)
|
|
return node.contents.subarray(0, node.usedBytes)
|
|
return new Uint8Array(node.contents)
|
|
},
|
|
expandFileStorage(node, newCapacity) {
|
|
var prevCapacity = node.contents ? node.contents.length : 0
|
|
if (prevCapacity >= newCapacity) return
|
|
var CAPACITY_DOUBLING_MAX = 1024 * 1024
|
|
newCapacity = Math.max(
|
|
newCapacity,
|
|
(prevCapacity *
|
|
(prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>>
|
|
0,
|
|
)
|
|
if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256)
|
|
var oldContents = node.contents
|
|
node.contents = new Uint8Array(newCapacity)
|
|
if (node.usedBytes > 0)
|
|
node.contents.set(oldContents.subarray(0, node.usedBytes), 0)
|
|
},
|
|
resizeFileStorage(node, newSize) {
|
|
if (node.usedBytes == newSize) return
|
|
if (newSize == 0) {
|
|
node.contents = null
|
|
node.usedBytes = 0
|
|
} else {
|
|
var oldContents = node.contents
|
|
node.contents = new Uint8Array(newSize)
|
|
if (oldContents) {
|
|
node.contents.set(
|
|
oldContents.subarray(0, Math.min(newSize, node.usedBytes)),
|
|
)
|
|
}
|
|
node.usedBytes = newSize
|
|
}
|
|
},
|
|
node_ops: {
|
|
getattr(node) {
|
|
var attr = {}
|
|
attr.dev = FS.isChrdev(node.mode) ? node.id : 1
|
|
attr.ino = node.id
|
|
attr.mode = node.mode
|
|
attr.nlink = 1
|
|
attr.uid = 0
|
|
attr.gid = 0
|
|
attr.rdev = node.rdev
|
|
if (FS.isDir(node.mode)) {
|
|
attr.size = 4096
|
|
} else if (FS.isFile(node.mode)) {
|
|
attr.size = node.usedBytes
|
|
} else if (FS.isLink(node.mode)) {
|
|
attr.size = node.link.length
|
|
} else {
|
|
attr.size = 0
|
|
}
|
|
attr.atime = new Date(node.timestamp)
|
|
attr.mtime = new Date(node.timestamp)
|
|
attr.ctime = new Date(node.timestamp)
|
|
attr.blksize = 4096
|
|
attr.blocks = Math.ceil(attr.size / attr.blksize)
|
|
return attr
|
|
},
|
|
setattr(node, attr) {
|
|
if (attr.mode !== undefined) {
|
|
node.mode = attr.mode
|
|
}
|
|
if (attr.timestamp !== undefined) {
|
|
node.timestamp = attr.timestamp
|
|
}
|
|
if (attr.size !== undefined) {
|
|
MEMFS.resizeFileStorage(node, attr.size)
|
|
}
|
|
},
|
|
lookup(parent, name) {
|
|
throw FS.genericErrors[44]
|
|
},
|
|
mknod(parent, name, mode, dev) {
|
|
return MEMFS.createNode(parent, name, mode, dev)
|
|
},
|
|
rename(old_node, new_dir, new_name) {
|
|
if (FS.isDir(old_node.mode)) {
|
|
var new_node
|
|
try {
|
|
new_node = FS.lookupNode(new_dir, new_name)
|
|
} catch (e) {}
|
|
if (new_node) {
|
|
for (var i in new_node.contents) {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
}
|
|
}
|
|
delete old_node.parent.contents[old_node.name]
|
|
old_node.parent.timestamp = Date.now()
|
|
old_node.name = new_name
|
|
new_dir.contents[new_name] = old_node
|
|
new_dir.timestamp = old_node.parent.timestamp
|
|
},
|
|
unlink(parent, name) {
|
|
delete parent.contents[name]
|
|
parent.timestamp = Date.now()
|
|
},
|
|
rmdir(parent, name) {
|
|
var node = FS.lookupNode(parent, name)
|
|
for (var i in node.contents) {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
delete parent.contents[name]
|
|
parent.timestamp = Date.now()
|
|
},
|
|
readdir(node) {
|
|
var entries = [".", ".."]
|
|
for (var key of Object.keys(node.contents)) {
|
|
entries.push(key)
|
|
}
|
|
return entries
|
|
},
|
|
symlink(parent, newname, oldpath) {
|
|
var node = MEMFS.createNode(parent, newname, 511 | 40960, 0)
|
|
node.link = oldpath
|
|
return node
|
|
},
|
|
readlink(node) {
|
|
if (!FS.isLink(node.mode)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return node.link
|
|
},
|
|
},
|
|
stream_ops: {
|
|
read(stream, buffer, offset, length, position) {
|
|
var contents = stream.node.contents
|
|
if (position >= stream.node.usedBytes) return 0
|
|
var size = Math.min(stream.node.usedBytes - position, length)
|
|
if (size > 8 && contents.subarray) {
|
|
buffer.set(contents.subarray(position, position + size), offset)
|
|
} else {
|
|
for (var i = 0; i < size; i++)
|
|
buffer[offset + i] = contents[position + i]
|
|
}
|
|
return size
|
|
},
|
|
write(stream, buffer, offset, length, position, canOwn) {
|
|
if (buffer.buffer === HEAP8.buffer) {
|
|
canOwn = false
|
|
}
|
|
if (!length) return 0
|
|
var node = stream.node
|
|
node.timestamp = Date.now()
|
|
if (buffer.subarray && (!node.contents || node.contents.subarray)) {
|
|
if (canOwn) {
|
|
node.contents = buffer.subarray(offset, offset + length)
|
|
node.usedBytes = length
|
|
return length
|
|
} else if (node.usedBytes === 0 && position === 0) {
|
|
node.contents = buffer.slice(offset, offset + length)
|
|
node.usedBytes = length
|
|
return length
|
|
} else if (position + length <= node.usedBytes) {
|
|
node.contents.set(
|
|
buffer.subarray(offset, offset + length),
|
|
position,
|
|
)
|
|
return length
|
|
}
|
|
}
|
|
MEMFS.expandFileStorage(node, position + length)
|
|
if (node.contents.subarray && buffer.subarray) {
|
|
node.contents.set(
|
|
buffer.subarray(offset, offset + length),
|
|
position,
|
|
)
|
|
} else {
|
|
for (var i = 0; i < length; i++) {
|
|
node.contents[position + i] = buffer[offset + i]
|
|
}
|
|
}
|
|
node.usedBytes = Math.max(node.usedBytes, position + length)
|
|
return length
|
|
},
|
|
llseek(stream, offset, whence) {
|
|
var position = offset
|
|
if (whence === 1) {
|
|
position += stream.position
|
|
} else if (whence === 2) {
|
|
if (FS.isFile(stream.node.mode)) {
|
|
position += stream.node.usedBytes
|
|
}
|
|
}
|
|
if (position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return position
|
|
},
|
|
allocate(stream, offset, length) {
|
|
MEMFS.expandFileStorage(stream.node, offset + length)
|
|
stream.node.usedBytes = Math.max(
|
|
stream.node.usedBytes,
|
|
offset + length,
|
|
)
|
|
},
|
|
mmap(stream, length, position, prot, flags) {
|
|
if (!FS.isFile(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
var ptr
|
|
var allocated
|
|
var contents = stream.node.contents
|
|
if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) {
|
|
allocated = false
|
|
ptr = contents.byteOffset
|
|
} else {
|
|
allocated = true
|
|
ptr = mmapAlloc(length)
|
|
if (!ptr) {
|
|
throw new FS.ErrnoError(48)
|
|
}
|
|
if (contents) {
|
|
if (position > 0 || position + length < contents.length) {
|
|
if (contents.subarray) {
|
|
contents = contents.subarray(position, position + length)
|
|
} else {
|
|
contents = Array.prototype.slice.call(
|
|
contents,
|
|
position,
|
|
position + length,
|
|
)
|
|
}
|
|
}
|
|
HEAP8.set(contents, ptr)
|
|
}
|
|
}
|
|
return { ptr, allocated }
|
|
},
|
|
msync(stream, buffer, offset, length, mmapFlags) {
|
|
MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false)
|
|
return 0
|
|
},
|
|
},
|
|
}
|
|
var asyncLoad = (url, onload, onerror, noRunDep) => {
|
|
var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""
|
|
readAsync(url).then(
|
|
(arrayBuffer) => {
|
|
onload(new Uint8Array(arrayBuffer))
|
|
if (dep) removeRunDependency(dep)
|
|
},
|
|
(err) => {
|
|
if (onerror) {
|
|
onerror()
|
|
} else {
|
|
throw `Loading data file "${url}" failed.`
|
|
}
|
|
},
|
|
)
|
|
if (dep) addRunDependency(dep)
|
|
}
|
|
var FS_createDataFile = (
|
|
parent,
|
|
name,
|
|
fileData,
|
|
canRead,
|
|
canWrite,
|
|
canOwn,
|
|
) => {
|
|
FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn)
|
|
}
|
|
var preloadPlugins = Module["preloadPlugins"] || []
|
|
var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => {
|
|
if (typeof Browser != "undefined") Browser.init()
|
|
var handled = false
|
|
preloadPlugins.forEach((plugin) => {
|
|
if (handled) return
|
|
if (plugin["canHandle"](fullname)) {
|
|
plugin["handle"](byteArray, fullname, finish, onerror)
|
|
handled = true
|
|
}
|
|
})
|
|
return handled
|
|
}
|
|
var FS_createPreloadedFile = (
|
|
parent,
|
|
name,
|
|
url,
|
|
canRead,
|
|
canWrite,
|
|
onload,
|
|
onerror,
|
|
dontCreateFile,
|
|
canOwn,
|
|
preFinish,
|
|
) => {
|
|
var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent
|
|
var dep = getUniqueRunDependency(`cp ${fullname}`)
|
|
function processData(byteArray) {
|
|
function finish(byteArray) {
|
|
preFinish?.()
|
|
if (!dontCreateFile) {
|
|
FS_createDataFile(
|
|
parent,
|
|
name,
|
|
byteArray,
|
|
canRead,
|
|
canWrite,
|
|
canOwn,
|
|
)
|
|
}
|
|
onload?.()
|
|
removeRunDependency(dep)
|
|
}
|
|
if (
|
|
FS_handledByPreloadPlugin(byteArray, fullname, finish, () => {
|
|
onerror?.()
|
|
removeRunDependency(dep)
|
|
})
|
|
) {
|
|
return
|
|
}
|
|
finish(byteArray)
|
|
}
|
|
addRunDependency(dep)
|
|
if (typeof url == "string") {
|
|
asyncLoad(url, processData, onerror)
|
|
} else {
|
|
processData(url)
|
|
}
|
|
}
|
|
var FS_modeStringToFlags = (str) => {
|
|
var flagModes = {
|
|
r: 0,
|
|
"r+": 2,
|
|
w: 512 | 64 | 1,
|
|
"w+": 512 | 64 | 2,
|
|
a: 1024 | 64 | 1,
|
|
"a+": 1024 | 64 | 2,
|
|
}
|
|
var flags = flagModes[str]
|
|
if (typeof flags == "undefined") {
|
|
throw new Error(`Unknown file open mode: ${str}`)
|
|
}
|
|
return flags
|
|
}
|
|
var FS_getMode = (canRead, canWrite) => {
|
|
var mode = 0
|
|
if (canRead) mode |= 292 | 73
|
|
if (canWrite) mode |= 146
|
|
return mode
|
|
}
|
|
var FS = {
|
|
root: null,
|
|
mounts: [],
|
|
devices: {},
|
|
streams: [],
|
|
nextInode: 1,
|
|
nameTable: null,
|
|
currentPath: "/",
|
|
initialized: false,
|
|
ignorePermissions: true,
|
|
ErrnoError: class {
|
|
constructor(errno) {
|
|
this.name = "ErrnoError"
|
|
this.errno = errno
|
|
}
|
|
},
|
|
genericErrors: {},
|
|
filesystems: null,
|
|
syncFSRequests: 0,
|
|
FSStream: class {
|
|
constructor() {
|
|
this.shared = {}
|
|
}
|
|
get object() {
|
|
return this.node
|
|
}
|
|
set object(val) {
|
|
this.node = val
|
|
}
|
|
get isRead() {
|
|
return (this.flags & 2097155) !== 1
|
|
}
|
|
get isWrite() {
|
|
return (this.flags & 2097155) !== 0
|
|
}
|
|
get isAppend() {
|
|
return this.flags & 1024
|
|
}
|
|
get flags() {
|
|
return this.shared.flags
|
|
}
|
|
set flags(val) {
|
|
this.shared.flags = val
|
|
}
|
|
get position() {
|
|
return this.shared.position
|
|
}
|
|
set position(val) {
|
|
this.shared.position = val
|
|
}
|
|
},
|
|
FSNode: class {
|
|
constructor(parent, name, mode, rdev) {
|
|
if (!parent) {
|
|
parent = this
|
|
}
|
|
this.parent = parent
|
|
this.mount = parent.mount
|
|
this.mounted = null
|
|
this.id = FS.nextInode++
|
|
this.name = name
|
|
this.mode = mode
|
|
this.node_ops = {}
|
|
this.stream_ops = {}
|
|
this.rdev = rdev
|
|
this.readMode = 292 | 73
|
|
this.writeMode = 146
|
|
}
|
|
get read() {
|
|
return (this.mode & this.readMode) === this.readMode
|
|
}
|
|
set read(val) {
|
|
val ? (this.mode |= this.readMode) : (this.mode &= ~this.readMode)
|
|
}
|
|
get write() {
|
|
return (this.mode & this.writeMode) === this.writeMode
|
|
}
|
|
set write(val) {
|
|
val ? (this.mode |= this.writeMode) : (this.mode &= ~this.writeMode)
|
|
}
|
|
get isFolder() {
|
|
return FS.isDir(this.mode)
|
|
}
|
|
get isDevice() {
|
|
return FS.isChrdev(this.mode)
|
|
}
|
|
},
|
|
lookupPath(path, opts = {}) {
|
|
path = PATH_FS.resolve(path)
|
|
if (!path) return { path: "", node: null }
|
|
var defaults = { follow_mount: true, recurse_count: 0 }
|
|
opts = Object.assign(defaults, opts)
|
|
if (opts.recurse_count > 8) {
|
|
throw new FS.ErrnoError(32)
|
|
}
|
|
var parts = path.split("/").filter((p) => !!p)
|
|
var current = FS.root
|
|
var current_path = "/"
|
|
for (var i = 0; i < parts.length; i++) {
|
|
var islast = i === parts.length - 1
|
|
if (islast && opts.parent) {
|
|
break
|
|
}
|
|
current = FS.lookupNode(current, parts[i])
|
|
current_path = PATH.join2(current_path, parts[i])
|
|
if (FS.isMountpoint(current)) {
|
|
if (!islast || (islast && opts.follow_mount)) {
|
|
current = current.mounted.root
|
|
}
|
|
}
|
|
if (!islast || opts.follow) {
|
|
var count = 0
|
|
while (FS.isLink(current.mode)) {
|
|
var link = FS.readlink(current_path)
|
|
current_path = PATH_FS.resolve(PATH.dirname(current_path), link)
|
|
var lookup = FS.lookupPath(current_path, {
|
|
recurse_count: opts.recurse_count + 1,
|
|
})
|
|
current = lookup.node
|
|
if (count++ > 40) {
|
|
throw new FS.ErrnoError(32)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return { path: current_path, node: current }
|
|
},
|
|
getPath(node) {
|
|
var path
|
|
while (true) {
|
|
if (FS.isRoot(node)) {
|
|
var mount = node.mount.mountpoint
|
|
if (!path) return mount
|
|
return mount[mount.length - 1] !== "/"
|
|
? `${mount}/${path}`
|
|
: mount + path
|
|
}
|
|
path = path ? `${node.name}/${path}` : node.name
|
|
node = node.parent
|
|
}
|
|
},
|
|
hashName(parentid, name) {
|
|
var hash = 0
|
|
for (var i = 0; i < name.length; i++) {
|
|
hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0
|
|
}
|
|
return ((parentid + hash) >>> 0) % FS.nameTable.length
|
|
},
|
|
hashAddNode(node) {
|
|
var hash = FS.hashName(node.parent.id, node.name)
|
|
node.name_next = FS.nameTable[hash]
|
|
FS.nameTable[hash] = node
|
|
},
|
|
hashRemoveNode(node) {
|
|
var hash = FS.hashName(node.parent.id, node.name)
|
|
if (FS.nameTable[hash] === node) {
|
|
FS.nameTable[hash] = node.name_next
|
|
} else {
|
|
var current = FS.nameTable[hash]
|
|
while (current) {
|
|
if (current.name_next === node) {
|
|
current.name_next = node.name_next
|
|
break
|
|
}
|
|
current = current.name_next
|
|
}
|
|
}
|
|
},
|
|
lookupNode(parent, name) {
|
|
var errCode = FS.mayLookup(parent)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
var hash = FS.hashName(parent.id, name)
|
|
for (var node = FS.nameTable[hash]; node; node = node.name_next) {
|
|
var nodeName = node.name
|
|
if (node.parent.id === parent.id && nodeName === name) {
|
|
return node
|
|
}
|
|
}
|
|
return FS.lookup(parent, name)
|
|
},
|
|
createNode(parent, name, mode, rdev) {
|
|
var node = new FS.FSNode(parent, name, mode, rdev)
|
|
FS.hashAddNode(node)
|
|
return node
|
|
},
|
|
destroyNode(node) {
|
|
FS.hashRemoveNode(node)
|
|
},
|
|
isRoot(node) {
|
|
return node === node.parent
|
|
},
|
|
isMountpoint(node) {
|
|
return !!node.mounted
|
|
},
|
|
isFile(mode) {
|
|
return (mode & 61440) === 32768
|
|
},
|
|
isDir(mode) {
|
|
return (mode & 61440) === 16384
|
|
},
|
|
isLink(mode) {
|
|
return (mode & 61440) === 40960
|
|
},
|
|
isChrdev(mode) {
|
|
return (mode & 61440) === 8192
|
|
},
|
|
isBlkdev(mode) {
|
|
return (mode & 61440) === 24576
|
|
},
|
|
isFIFO(mode) {
|
|
return (mode & 61440) === 4096
|
|
},
|
|
isSocket(mode) {
|
|
return (mode & 49152) === 49152
|
|
},
|
|
flagsToPermissionString(flag) {
|
|
var perms = ["r", "w", "rw"][flag & 3]
|
|
if (flag & 512) {
|
|
perms += "w"
|
|
}
|
|
return perms
|
|
},
|
|
nodePermissions(node, perms) {
|
|
if (FS.ignorePermissions) {
|
|
return 0
|
|
}
|
|
if (perms.includes("r") && !(node.mode & 292)) {
|
|
return 2
|
|
} else if (perms.includes("w") && !(node.mode & 146)) {
|
|
return 2
|
|
} else if (perms.includes("x") && !(node.mode & 73)) {
|
|
return 2
|
|
}
|
|
return 0
|
|
},
|
|
mayLookup(dir) {
|
|
if (!FS.isDir(dir.mode)) return 54
|
|
var errCode = FS.nodePermissions(dir, "x")
|
|
if (errCode) return errCode
|
|
if (!dir.node_ops.lookup) return 2
|
|
return 0
|
|
},
|
|
mayCreate(dir, name) {
|
|
try {
|
|
var node = FS.lookupNode(dir, name)
|
|
return 20
|
|
} catch (e) {}
|
|
return FS.nodePermissions(dir, "wx")
|
|
},
|
|
mayDelete(dir, name, isdir) {
|
|
var node
|
|
try {
|
|
node = FS.lookupNode(dir, name)
|
|
} catch (e) {
|
|
return e.errno
|
|
}
|
|
var errCode = FS.nodePermissions(dir, "wx")
|
|
if (errCode) {
|
|
return errCode
|
|
}
|
|
if (isdir) {
|
|
if (!FS.isDir(node.mode)) {
|
|
return 54
|
|
}
|
|
if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
|
|
return 10
|
|
}
|
|
} else {
|
|
if (FS.isDir(node.mode)) {
|
|
return 31
|
|
}
|
|
}
|
|
return 0
|
|
},
|
|
mayOpen(node, flags) {
|
|
if (!node) {
|
|
return 44
|
|
}
|
|
if (FS.isLink(node.mode)) {
|
|
return 32
|
|
} else if (FS.isDir(node.mode)) {
|
|
if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
|
|
return 31
|
|
}
|
|
}
|
|
return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
|
|
},
|
|
MAX_OPEN_FDS: 4096,
|
|
nextfd() {
|
|
for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {
|
|
if (!FS.streams[fd]) {
|
|
return fd
|
|
}
|
|
}
|
|
throw new FS.ErrnoError(33)
|
|
},
|
|
getStreamChecked(fd) {
|
|
var stream = FS.getStream(fd)
|
|
if (!stream) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
return stream
|
|
},
|
|
getStream: (fd) => FS.streams[fd],
|
|
createStream(stream, fd = -1) {
|
|
stream = Object.assign(new FS.FSStream(), stream)
|
|
if (fd == -1) {
|
|
fd = FS.nextfd()
|
|
}
|
|
stream.fd = fd
|
|
FS.streams[fd] = stream
|
|
return stream
|
|
},
|
|
closeStream(fd) {
|
|
FS.streams[fd] = null
|
|
},
|
|
dupStream(origStream, fd = -1) {
|
|
var stream = FS.createStream(origStream, fd)
|
|
stream.stream_ops?.dup?.(stream)
|
|
return stream
|
|
},
|
|
chrdev_stream_ops: {
|
|
open(stream) {
|
|
var device = FS.getDevice(stream.node.rdev)
|
|
stream.stream_ops = device.stream_ops
|
|
stream.stream_ops.open?.(stream)
|
|
},
|
|
llseek() {
|
|
throw new FS.ErrnoError(70)
|
|
},
|
|
},
|
|
major: (dev) => dev >> 8,
|
|
minor: (dev) => dev & 255,
|
|
makedev: (ma, mi) => (ma << 8) | mi,
|
|
registerDevice(dev, ops) {
|
|
FS.devices[dev] = { stream_ops: ops }
|
|
},
|
|
getDevice: (dev) => FS.devices[dev],
|
|
getMounts(mount) {
|
|
var mounts = []
|
|
var check = [mount]
|
|
while (check.length) {
|
|
var m = check.pop()
|
|
mounts.push(m)
|
|
check.push(...m.mounts)
|
|
}
|
|
return mounts
|
|
},
|
|
syncfs(populate, callback) {
|
|
if (typeof populate == "function") {
|
|
callback = populate
|
|
populate = false
|
|
}
|
|
FS.syncFSRequests++
|
|
if (FS.syncFSRequests > 1) {
|
|
err(
|
|
`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`,
|
|
)
|
|
}
|
|
var mounts = FS.getMounts(FS.root.mount)
|
|
var completed = 0
|
|
function doCallback(errCode) {
|
|
FS.syncFSRequests--
|
|
return callback(errCode)
|
|
}
|
|
function done(errCode) {
|
|
if (errCode) {
|
|
if (!done.errored) {
|
|
done.errored = true
|
|
return doCallback(errCode)
|
|
}
|
|
return
|
|
}
|
|
if (++completed >= mounts.length) {
|
|
doCallback(null)
|
|
}
|
|
}
|
|
mounts.forEach((mount) => {
|
|
if (!mount.type.syncfs) {
|
|
return done(null)
|
|
}
|
|
mount.type.syncfs(mount, populate, done)
|
|
})
|
|
},
|
|
mount(type, opts, mountpoint) {
|
|
var root = mountpoint === "/"
|
|
var pseudo = !mountpoint
|
|
var node
|
|
if (root && FS.root) {
|
|
throw new FS.ErrnoError(10)
|
|
} else if (!root && !pseudo) {
|
|
var lookup = FS.lookupPath(mountpoint, { follow_mount: false })
|
|
mountpoint = lookup.path
|
|
node = lookup.node
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
if (!FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
}
|
|
var mount = { type, opts, mountpoint, mounts: [] }
|
|
var mountRoot = type.mount(mount)
|
|
mountRoot.mount = mount
|
|
mount.root = mountRoot
|
|
if (root) {
|
|
FS.root = mountRoot
|
|
} else if (node) {
|
|
node.mounted = mount
|
|
if (node.mount) {
|
|
node.mount.mounts.push(mount)
|
|
}
|
|
}
|
|
return mountRoot
|
|
},
|
|
unmount(mountpoint) {
|
|
var lookup = FS.lookupPath(mountpoint, { follow_mount: false })
|
|
if (!FS.isMountpoint(lookup.node)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
var node = lookup.node
|
|
var mount = node.mounted
|
|
var mounts = FS.getMounts(mount)
|
|
Object.keys(FS.nameTable).forEach((hash) => {
|
|
var current = FS.nameTable[hash]
|
|
while (current) {
|
|
var next = current.name_next
|
|
if (mounts.includes(current.mount)) {
|
|
FS.destroyNode(current)
|
|
}
|
|
current = next
|
|
}
|
|
})
|
|
node.mounted = null
|
|
var idx = node.mount.mounts.indexOf(mount)
|
|
node.mount.mounts.splice(idx, 1)
|
|
},
|
|
lookup(parent, name) {
|
|
return parent.node_ops.lookup(parent, name)
|
|
},
|
|
mknod(path, mode, dev) {
|
|
var lookup = FS.lookupPath(path, { parent: true })
|
|
var parent = lookup.node
|
|
var name = PATH.basename(path)
|
|
if (!name || name === "." || name === "..") {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
var errCode = FS.mayCreate(parent, name)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.mknod) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return parent.node_ops.mknod(parent, name, mode, dev)
|
|
},
|
|
create(path, mode) {
|
|
mode = mode !== undefined ? mode : 438
|
|
mode &= 4095
|
|
mode |= 32768
|
|
return FS.mknod(path, mode, 0)
|
|
},
|
|
mkdir(path, mode) {
|
|
mode = mode !== undefined ? mode : 511
|
|
mode &= 511 | 512
|
|
mode |= 16384
|
|
return FS.mknod(path, mode, 0)
|
|
},
|
|
mkdirTree(path, mode) {
|
|
var dirs = path.split("/")
|
|
var d = ""
|
|
for (var i = 0; i < dirs.length; ++i) {
|
|
if (!dirs[i]) continue
|
|
d += "/" + dirs[i]
|
|
try {
|
|
FS.mkdir(d, mode)
|
|
} catch (e) {
|
|
if (e.errno != 20) throw e
|
|
}
|
|
}
|
|
},
|
|
mkdev(path, mode, dev) {
|
|
if (typeof dev == "undefined") {
|
|
dev = mode
|
|
mode = 438
|
|
}
|
|
mode |= 8192
|
|
return FS.mknod(path, mode, dev)
|
|
},
|
|
symlink(oldpath, newpath) {
|
|
if (!PATH_FS.resolve(oldpath)) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
var lookup = FS.lookupPath(newpath, { parent: true })
|
|
var parent = lookup.node
|
|
if (!parent) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
var newname = PATH.basename(newpath)
|
|
var errCode = FS.mayCreate(parent, newname)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.symlink) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return parent.node_ops.symlink(parent, newname, oldpath)
|
|
},
|
|
rename(old_path, new_path) {
|
|
var old_dirname = PATH.dirname(old_path)
|
|
var new_dirname = PATH.dirname(new_path)
|
|
var old_name = PATH.basename(old_path)
|
|
var new_name = PATH.basename(new_path)
|
|
var lookup, old_dir, new_dir
|
|
lookup = FS.lookupPath(old_path, { parent: true })
|
|
old_dir = lookup.node
|
|
lookup = FS.lookupPath(new_path, { parent: true })
|
|
new_dir = lookup.node
|
|
if (!old_dir || !new_dir) throw new FS.ErrnoError(44)
|
|
if (old_dir.mount !== new_dir.mount) {
|
|
throw new FS.ErrnoError(75)
|
|
}
|
|
var old_node = FS.lookupNode(old_dir, old_name)
|
|
var relative = PATH_FS.relative(old_path, new_dirname)
|
|
if (relative.charAt(0) !== ".") {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
relative = PATH_FS.relative(new_path, old_dirname)
|
|
if (relative.charAt(0) !== ".") {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
var new_node
|
|
try {
|
|
new_node = FS.lookupNode(new_dir, new_name)
|
|
} catch (e) {}
|
|
if (old_node === new_node) {
|
|
return
|
|
}
|
|
var isdir = FS.isDir(old_node.mode)
|
|
var errCode = FS.mayDelete(old_dir, old_name, isdir)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
errCode = new_node
|
|
? FS.mayDelete(new_dir, new_name, isdir)
|
|
: FS.mayCreate(new_dir, new_name)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!old_dir.node_ops.rename) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (
|
|
FS.isMountpoint(old_node) ||
|
|
(new_node && FS.isMountpoint(new_node))
|
|
) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
if (new_dir !== old_dir) {
|
|
errCode = FS.nodePermissions(old_dir, "w")
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
}
|
|
FS.hashRemoveNode(old_node)
|
|
try {
|
|
old_dir.node_ops.rename(old_node, new_dir, new_name)
|
|
old_node.parent = new_dir
|
|
} catch (e) {
|
|
throw e
|
|
} finally {
|
|
FS.hashAddNode(old_node)
|
|
}
|
|
},
|
|
rmdir(path) {
|
|
var lookup = FS.lookupPath(path, { parent: true })
|
|
var parent = lookup.node
|
|
var name = PATH.basename(path)
|
|
var node = FS.lookupNode(parent, name)
|
|
var errCode = FS.mayDelete(parent, name, true)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.rmdir) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
parent.node_ops.rmdir(parent, name)
|
|
FS.destroyNode(node)
|
|
},
|
|
readdir(path) {
|
|
var lookup = FS.lookupPath(path, { follow: true })
|
|
var node = lookup.node
|
|
if (!node.node_ops.readdir) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
return node.node_ops.readdir(node)
|
|
},
|
|
unlink(path) {
|
|
var lookup = FS.lookupPath(path, { parent: true })
|
|
var parent = lookup.node
|
|
if (!parent) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
var name = PATH.basename(path)
|
|
var node = FS.lookupNode(parent, name)
|
|
var errCode = FS.mayDelete(parent, name, false)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.unlink) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
parent.node_ops.unlink(parent, name)
|
|
FS.destroyNode(node)
|
|
},
|
|
readlink(path) {
|
|
var lookup = FS.lookupPath(path)
|
|
var link = lookup.node
|
|
if (!link) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!link.node_ops.readlink) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return PATH_FS.resolve(
|
|
FS.getPath(link.parent),
|
|
link.node_ops.readlink(link),
|
|
)
|
|
},
|
|
stat(path, dontFollow) {
|
|
var lookup = FS.lookupPath(path, { follow: !dontFollow })
|
|
var node = lookup.node
|
|
if (!node) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!node.node_ops.getattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return node.node_ops.getattr(node)
|
|
},
|
|
lstat(path) {
|
|
return FS.stat(path, true)
|
|
},
|
|
chmod(path, mode, dontFollow) {
|
|
var node
|
|
if (typeof path == "string") {
|
|
var lookup = FS.lookupPath(path, { follow: !dontFollow })
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
node.node_ops.setattr(node, {
|
|
mode: (mode & 4095) | (node.mode & ~4095),
|
|
timestamp: Date.now(),
|
|
})
|
|
},
|
|
lchmod(path, mode) {
|
|
FS.chmod(path, mode, true)
|
|
},
|
|
fchmod(fd, mode) {
|
|
var stream = FS.getStreamChecked(fd)
|
|
FS.chmod(stream.node, mode)
|
|
},
|
|
chown(path, uid, gid, dontFollow) {
|
|
var node
|
|
if (typeof path == "string") {
|
|
var lookup = FS.lookupPath(path, { follow: !dontFollow })
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
node.node_ops.setattr(node, { timestamp: Date.now() })
|
|
},
|
|
lchown(path, uid, gid) {
|
|
FS.chown(path, uid, gid, true)
|
|
},
|
|
fchown(fd, uid, gid) {
|
|
var stream = FS.getStreamChecked(fd)
|
|
FS.chown(stream.node, uid, gid)
|
|
},
|
|
truncate(path, len) {
|
|
if (len < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
var node
|
|
if (typeof path == "string") {
|
|
var lookup = FS.lookupPath(path, { follow: true })
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!FS.isFile(node.mode)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
var errCode = FS.nodePermissions(node, "w")
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
node.node_ops.setattr(node, { size: len, timestamp: Date.now() })
|
|
},
|
|
ftruncate(fd, len) {
|
|
var stream = FS.getStreamChecked(fd)
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
FS.truncate(stream.node, len)
|
|
},
|
|
utime(path, atime, mtime) {
|
|
var lookup = FS.lookupPath(path, { follow: true })
|
|
var node = lookup.node
|
|
node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) })
|
|
},
|
|
open(path, flags, mode) {
|
|
if (path === "") {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags
|
|
if (flags & 64) {
|
|
mode = typeof mode == "undefined" ? 438 : mode
|
|
mode = (mode & 4095) | 32768
|
|
} else {
|
|
mode = 0
|
|
}
|
|
var node
|
|
if (typeof path == "object") {
|
|
node = path
|
|
} else {
|
|
path = PATH.normalize(path)
|
|
try {
|
|
var lookup = FS.lookupPath(path, { follow: !(flags & 131072) })
|
|
node = lookup.node
|
|
} catch (e) {}
|
|
}
|
|
var created = false
|
|
if (flags & 64) {
|
|
if (node) {
|
|
if (flags & 128) {
|
|
throw new FS.ErrnoError(20)
|
|
}
|
|
} else {
|
|
node = FS.mknod(path, mode, 0)
|
|
created = true
|
|
}
|
|
}
|
|
if (!node) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (FS.isChrdev(node.mode)) {
|
|
flags &= ~512
|
|
}
|
|
if (flags & 65536 && !FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
if (!created) {
|
|
var errCode = FS.mayOpen(node, flags)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
}
|
|
if (flags & 512 && !created) {
|
|
FS.truncate(node, 0)
|
|
}
|
|
flags &= ~(128 | 512 | 131072)
|
|
var stream = FS.createStream({
|
|
node,
|
|
path: FS.getPath(node),
|
|
flags,
|
|
seekable: true,
|
|
position: 0,
|
|
stream_ops: node.stream_ops,
|
|
ungotten: [],
|
|
error: false,
|
|
})
|
|
if (stream.stream_ops.open) {
|
|
stream.stream_ops.open(stream)
|
|
}
|
|
if (Module["logReadFiles"] && !(flags & 1)) {
|
|
if (!FS.readFiles) FS.readFiles = {}
|
|
if (!(path in FS.readFiles)) {
|
|
FS.readFiles[path] = 1
|
|
}
|
|
}
|
|
return stream
|
|
},
|
|
close(stream) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (stream.getdents) stream.getdents = null
|
|
try {
|
|
if (stream.stream_ops.close) {
|
|
stream.stream_ops.close(stream)
|
|
}
|
|
} catch (e) {
|
|
throw e
|
|
} finally {
|
|
FS.closeStream(stream.fd)
|
|
}
|
|
stream.fd = null
|
|
},
|
|
isClosed(stream) {
|
|
return stream.fd === null
|
|
},
|
|
llseek(stream, offset, whence) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (!stream.seekable || !stream.stream_ops.llseek) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
if (whence != 0 && whence != 1 && whence != 2) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
stream.position = stream.stream_ops.llseek(stream, offset, whence)
|
|
stream.ungotten = []
|
|
return stream.position
|
|
},
|
|
read(stream, buffer, offset, length, position) {
|
|
if (length < 0 || position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if ((stream.flags & 2097155) === 1) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!stream.stream_ops.read) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
var seeking = typeof position != "undefined"
|
|
if (!seeking) {
|
|
position = stream.position
|
|
} else if (!stream.seekable) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
var bytesRead = stream.stream_ops.read(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position,
|
|
)
|
|
if (!seeking) stream.position += bytesRead
|
|
return bytesRead
|
|
},
|
|
write(stream, buffer, offset, length, position, canOwn) {
|
|
if (length < 0 || position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!stream.stream_ops.write) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (stream.seekable && stream.flags & 1024) {
|
|
FS.llseek(stream, 0, 2)
|
|
}
|
|
var seeking = typeof position != "undefined"
|
|
if (!seeking) {
|
|
position = stream.position
|
|
} else if (!stream.seekable) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
var bytesWritten = stream.stream_ops.write(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position,
|
|
canOwn,
|
|
)
|
|
if (!seeking) stream.position += bytesWritten
|
|
return bytesWritten
|
|
},
|
|
allocate(stream, offset, length) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (offset < 0 || length <= 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
if (!stream.stream_ops.allocate) {
|
|
throw new FS.ErrnoError(138)
|
|
}
|
|
stream.stream_ops.allocate(stream, offset, length)
|
|
},
|
|
mmap(stream, length, position, prot, flags) {
|
|
if (
|
|
(prot & 2) !== 0 &&
|
|
(flags & 2) === 0 &&
|
|
(stream.flags & 2097155) !== 2
|
|
) {
|
|
throw new FS.ErrnoError(2)
|
|
}
|
|
if ((stream.flags & 2097155) === 1) {
|
|
throw new FS.ErrnoError(2)
|
|
}
|
|
if (!stream.stream_ops.mmap) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
if (!length) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return stream.stream_ops.mmap(stream, length, position, prot, flags)
|
|
},
|
|
msync(stream, buffer, offset, length, mmapFlags) {
|
|
if (!stream.stream_ops.msync) {
|
|
return 0
|
|
}
|
|
return stream.stream_ops.msync(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
mmapFlags,
|
|
)
|
|
},
|
|
ioctl(stream, cmd, arg) {
|
|
if (!stream.stream_ops.ioctl) {
|
|
throw new FS.ErrnoError(59)
|
|
}
|
|
return stream.stream_ops.ioctl(stream, cmd, arg)
|
|
},
|
|
readFile(path, opts = {}) {
|
|
opts.flags = opts.flags || 0
|
|
opts.encoding = opts.encoding || "binary"
|
|
if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
|
|
throw new Error(`Invalid encoding type "${opts.encoding}"`)
|
|
}
|
|
var ret
|
|
var stream = FS.open(path, opts.flags)
|
|
var stat = FS.stat(path)
|
|
var length = stat.size
|
|
var buf = new Uint8Array(length)
|
|
FS.read(stream, buf, 0, length, 0)
|
|
if (opts.encoding === "utf8") {
|
|
ret = UTF8ArrayToString(buf, 0)
|
|
} else if (opts.encoding === "binary") {
|
|
ret = buf
|
|
}
|
|
FS.close(stream)
|
|
return ret
|
|
},
|
|
writeFile(path, data, opts = {}) {
|
|
opts.flags = opts.flags || 577
|
|
var stream = FS.open(path, opts.flags, opts.mode)
|
|
if (typeof data == "string") {
|
|
var buf = new Uint8Array(lengthBytesUTF8(data) + 1)
|
|
var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length)
|
|
FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn)
|
|
} else if (ArrayBuffer.isView(data)) {
|
|
FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn)
|
|
} else {
|
|
throw new Error("Unsupported data type")
|
|
}
|
|
FS.close(stream)
|
|
},
|
|
cwd: () => FS.currentPath,
|
|
chdir(path) {
|
|
var lookup = FS.lookupPath(path, { follow: true })
|
|
if (lookup.node === null) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!FS.isDir(lookup.node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
var errCode = FS.nodePermissions(lookup.node, "x")
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
FS.currentPath = lookup.path
|
|
},
|
|
createDefaultDirectories() {
|
|
FS.mkdir("/tmp")
|
|
FS.mkdir("/home")
|
|
FS.mkdir("/home/web_user")
|
|
},
|
|
createDefaultDevices() {
|
|
FS.mkdir("/dev")
|
|
FS.registerDevice(FS.makedev(1, 3), {
|
|
read: () => 0,
|
|
write: (stream, buffer, offset, length, pos) => length,
|
|
})
|
|
FS.mkdev("/dev/null", FS.makedev(1, 3))
|
|
TTY.register(FS.makedev(5, 0), TTY.default_tty_ops)
|
|
TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops)
|
|
FS.mkdev("/dev/tty", FS.makedev(5, 0))
|
|
FS.mkdev("/dev/tty1", FS.makedev(6, 0))
|
|
var randomBuffer = new Uint8Array(1024),
|
|
randomLeft = 0
|
|
var randomByte = () => {
|
|
if (randomLeft === 0) {
|
|
randomLeft = randomFill(randomBuffer).byteLength
|
|
}
|
|
return randomBuffer[--randomLeft]
|
|
}
|
|
FS.createDevice("/dev", "random", randomByte)
|
|
FS.createDevice("/dev", "urandom", randomByte)
|
|
FS.mkdir("/dev/shm")
|
|
FS.mkdir("/dev/shm/tmp")
|
|
},
|
|
createSpecialDirectories() {
|
|
FS.mkdir("/proc")
|
|
var proc_self = FS.mkdir("/proc/self")
|
|
FS.mkdir("/proc/self/fd")
|
|
FS.mount(
|
|
{
|
|
mount() {
|
|
var node = FS.createNode(proc_self, "fd", 16384 | 511, 73)
|
|
node.node_ops = {
|
|
lookup(parent, name) {
|
|
var fd = +name
|
|
var stream = FS.getStreamChecked(fd)
|
|
var ret = {
|
|
parent: null,
|
|
mount: { mountpoint: "fake" },
|
|
node_ops: { readlink: () => stream.path },
|
|
}
|
|
ret.parent = ret
|
|
return ret
|
|
},
|
|
}
|
|
return node
|
|
},
|
|
},
|
|
{},
|
|
"/proc/self/fd",
|
|
)
|
|
},
|
|
createStandardStreams(input, output, error) {
|
|
if (input) {
|
|
FS.createDevice("/dev", "stdin", input)
|
|
} else {
|
|
FS.symlink("/dev/tty", "/dev/stdin")
|
|
}
|
|
if (output) {
|
|
FS.createDevice("/dev", "stdout", null, output)
|
|
} else {
|
|
FS.symlink("/dev/tty", "/dev/stdout")
|
|
}
|
|
if (error) {
|
|
FS.createDevice("/dev", "stderr", null, error)
|
|
} else {
|
|
FS.symlink("/dev/tty1", "/dev/stderr")
|
|
}
|
|
var stdin = FS.open("/dev/stdin", 0)
|
|
var stdout = FS.open("/dev/stdout", 1)
|
|
var stderr = FS.open("/dev/stderr", 1)
|
|
},
|
|
staticInit() {
|
|
;[44].forEach((code) => {
|
|
FS.genericErrors[code] = new FS.ErrnoError(code)
|
|
FS.genericErrors[code].stack = "<generic error, no stack>"
|
|
})
|
|
FS.nameTable = new Array(4096)
|
|
FS.mount(MEMFS, {}, "/")
|
|
FS.createDefaultDirectories()
|
|
FS.createDefaultDevices()
|
|
FS.createSpecialDirectories()
|
|
FS.filesystems = { MEMFS }
|
|
},
|
|
init(input, output, error) {
|
|
FS.initialized = true
|
|
input ??= Module["stdin"]
|
|
output ??= Module["stdout"]
|
|
error ??= Module["stderr"]
|
|
FS.createStandardStreams(input, output, error)
|
|
},
|
|
quit() {
|
|
FS.initialized = false
|
|
for (var i = 0; i < FS.streams.length; i++) {
|
|
var stream = FS.streams[i]
|
|
if (!stream) {
|
|
continue
|
|
}
|
|
FS.close(stream)
|
|
}
|
|
},
|
|
findObject(path, dontResolveLastLink) {
|
|
var ret = FS.analyzePath(path, dontResolveLastLink)
|
|
if (!ret.exists) {
|
|
return null
|
|
}
|
|
return ret.object
|
|
},
|
|
analyzePath(path, dontResolveLastLink) {
|
|
try {
|
|
var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink })
|
|
path = lookup.path
|
|
} catch (e) {}
|
|
var ret = {
|
|
isRoot: false,
|
|
exists: false,
|
|
error: 0,
|
|
name: null,
|
|
path: null,
|
|
object: null,
|
|
parentExists: false,
|
|
parentPath: null,
|
|
parentObject: null,
|
|
}
|
|
try {
|
|
var lookup = FS.lookupPath(path, { parent: true })
|
|
ret.parentExists = true
|
|
ret.parentPath = lookup.path
|
|
ret.parentObject = lookup.node
|
|
ret.name = PATH.basename(path)
|
|
lookup = FS.lookupPath(path, { follow: !dontResolveLastLink })
|
|
ret.exists = true
|
|
ret.path = lookup.path
|
|
ret.object = lookup.node
|
|
ret.name = lookup.node.name
|
|
ret.isRoot = lookup.path === "/"
|
|
} catch (e) {
|
|
ret.error = e.errno
|
|
}
|
|
return ret
|
|
},
|
|
createPath(parent, path, canRead, canWrite) {
|
|
parent = typeof parent == "string" ? parent : FS.getPath(parent)
|
|
var parts = path.split("/").reverse()
|
|
while (parts.length) {
|
|
var part = parts.pop()
|
|
if (!part) continue
|
|
var current = PATH.join2(parent, part)
|
|
try {
|
|
FS.mkdir(current)
|
|
} catch (e) {}
|
|
parent = current
|
|
}
|
|
return current
|
|
},
|
|
createFile(parent, name, properties, canRead, canWrite) {
|
|
var path = PATH.join2(
|
|
typeof parent == "string" ? parent : FS.getPath(parent),
|
|
name,
|
|
)
|
|
var mode = FS_getMode(canRead, canWrite)
|
|
return FS.create(path, mode)
|
|
},
|
|
createDataFile(parent, name, data, canRead, canWrite, canOwn) {
|
|
var path = name
|
|
if (parent) {
|
|
parent = typeof parent == "string" ? parent : FS.getPath(parent)
|
|
path = name ? PATH.join2(parent, name) : parent
|
|
}
|
|
var mode = FS_getMode(canRead, canWrite)
|
|
var node = FS.create(path, mode)
|
|
if (data) {
|
|
if (typeof data == "string") {
|
|
var arr = new Array(data.length)
|
|
for (var i = 0, len = data.length; i < len; ++i)
|
|
arr[i] = data.charCodeAt(i)
|
|
data = arr
|
|
}
|
|
FS.chmod(node, mode | 146)
|
|
var stream = FS.open(node, 577)
|
|
FS.write(stream, data, 0, data.length, 0, canOwn)
|
|
FS.close(stream)
|
|
FS.chmod(node, mode)
|
|
}
|
|
},
|
|
createDevice(parent, name, input, output) {
|
|
var path = PATH.join2(
|
|
typeof parent == "string" ? parent : FS.getPath(parent),
|
|
name,
|
|
)
|
|
var mode = FS_getMode(!!input, !!output)
|
|
if (!FS.createDevice.major) FS.createDevice.major = 64
|
|
var dev = FS.makedev(FS.createDevice.major++, 0)
|
|
FS.registerDevice(dev, {
|
|
open(stream) {
|
|
stream.seekable = false
|
|
},
|
|
close(stream) {
|
|
if (output?.buffer?.length) {
|
|
output(10)
|
|
}
|
|
},
|
|
read(stream, buffer, offset, length, pos) {
|
|
var bytesRead = 0
|
|
for (var i = 0; i < length; i++) {
|
|
var result
|
|
try {
|
|
result = input()
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (result === undefined && bytesRead === 0) {
|
|
throw new FS.ErrnoError(6)
|
|
}
|
|
if (result === null || result === undefined) break
|
|
bytesRead++
|
|
buffer[offset + i] = result
|
|
}
|
|
if (bytesRead) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return bytesRead
|
|
},
|
|
write(stream, buffer, offset, length, pos) {
|
|
for (var i = 0; i < length; i++) {
|
|
try {
|
|
output(buffer[offset + i])
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
}
|
|
if (length) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return i
|
|
},
|
|
})
|
|
return FS.mkdev(path, mode, dev)
|
|
},
|
|
forceLoadFile(obj) {
|
|
if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
|
|
return true
|
|
if (typeof XMLHttpRequest != "undefined") {
|
|
throw new Error(
|
|
"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.",
|
|
)
|
|
} else {
|
|
try {
|
|
obj.contents = readBinary(obj.url)
|
|
obj.usedBytes = obj.contents.length
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
}
|
|
},
|
|
createLazyFile(parent, name, url, canRead, canWrite) {
|
|
class LazyUint8Array {
|
|
constructor() {
|
|
this.lengthKnown = false
|
|
this.chunks = []
|
|
}
|
|
get(idx) {
|
|
if (idx > this.length - 1 || idx < 0) {
|
|
return undefined
|
|
}
|
|
var chunkOffset = idx % this.chunkSize
|
|
var chunkNum = (idx / this.chunkSize) | 0
|
|
return this.getter(chunkNum)[chunkOffset]
|
|
}
|
|
setDataGetter(getter) {
|
|
this.getter = getter
|
|
}
|
|
cacheLength() {
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open("HEAD", url, false)
|
|
xhr.send(null)
|
|
if (
|
|
!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
|
|
)
|
|
throw new Error(
|
|
"Couldn't load " + url + ". Status: " + xhr.status,
|
|
)
|
|
var datalength = Number(xhr.getResponseHeader("Content-length"))
|
|
var header
|
|
var hasByteServing =
|
|
(header = xhr.getResponseHeader("Accept-Ranges")) &&
|
|
header === "bytes"
|
|
var usesGzip =
|
|
(header = xhr.getResponseHeader("Content-Encoding")) &&
|
|
header === "gzip"
|
|
var chunkSize = 1024 * 1024
|
|
if (!hasByteServing) chunkSize = datalength
|
|
var doXHR = (from, to) => {
|
|
if (from > to)
|
|
throw new Error(
|
|
"invalid range (" +
|
|
from +
|
|
", " +
|
|
to +
|
|
") or no bytes requested!",
|
|
)
|
|
if (to > datalength - 1)
|
|
throw new Error(
|
|
"only " + datalength + " bytes available! programmer error!",
|
|
)
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open("GET", url, false)
|
|
if (datalength !== chunkSize)
|
|
xhr.setRequestHeader("Range", "bytes=" + from + "-" + to)
|
|
xhr.responseType = "arraybuffer"
|
|
if (xhr.overrideMimeType) {
|
|
xhr.overrideMimeType("text/plain; charset=x-user-defined")
|
|
}
|
|
xhr.send(null)
|
|
if (
|
|
!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
|
|
)
|
|
throw new Error(
|
|
"Couldn't load " + url + ". Status: " + xhr.status,
|
|
)
|
|
if (xhr.response !== undefined) {
|
|
return new Uint8Array(xhr.response || [])
|
|
}
|
|
return intArrayFromString(xhr.responseText || "", true)
|
|
}
|
|
var lazyArray = this
|
|
lazyArray.setDataGetter((chunkNum) => {
|
|
var start = chunkNum * chunkSize
|
|
var end = (chunkNum + 1) * chunkSize - 1
|
|
end = Math.min(end, datalength - 1)
|
|
if (typeof lazyArray.chunks[chunkNum] == "undefined") {
|
|
lazyArray.chunks[chunkNum] = doXHR(start, end)
|
|
}
|
|
if (typeof lazyArray.chunks[chunkNum] == "undefined")
|
|
throw new Error("doXHR failed!")
|
|
return lazyArray.chunks[chunkNum]
|
|
})
|
|
if (usesGzip || !datalength) {
|
|
chunkSize = datalength = 1
|
|
datalength = this.getter(0).length
|
|
chunkSize = datalength
|
|
out(
|
|
"LazyFiles on gzip forces download of the whole file when length is accessed",
|
|
)
|
|
}
|
|
this._length = datalength
|
|
this._chunkSize = chunkSize
|
|
this.lengthKnown = true
|
|
}
|
|
get length() {
|
|
if (!this.lengthKnown) {
|
|
this.cacheLength()
|
|
}
|
|
return this._length
|
|
}
|
|
get chunkSize() {
|
|
if (!this.lengthKnown) {
|
|
this.cacheLength()
|
|
}
|
|
return this._chunkSize
|
|
}
|
|
}
|
|
if (typeof XMLHttpRequest != "undefined") {
|
|
if (!ENVIRONMENT_IS_WORKER)
|
|
throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"
|
|
var lazyArray = new LazyUint8Array()
|
|
var properties = { isDevice: false, contents: lazyArray }
|
|
} else {
|
|
var properties = { isDevice: false, url }
|
|
}
|
|
var node = FS.createFile(parent, name, properties, canRead, canWrite)
|
|
if (properties.contents) {
|
|
node.contents = properties.contents
|
|
} else if (properties.url) {
|
|
node.contents = null
|
|
node.url = properties.url
|
|
}
|
|
Object.defineProperties(node, {
|
|
usedBytes: {
|
|
get: function () {
|
|
return this.contents.length
|
|
},
|
|
},
|
|
})
|
|
var stream_ops = {}
|
|
var keys = Object.keys(node.stream_ops)
|
|
keys.forEach((key) => {
|
|
var fn = node.stream_ops[key]
|
|
stream_ops[key] = (...args) => {
|
|
FS.forceLoadFile(node)
|
|
return fn(...args)
|
|
}
|
|
})
|
|
function writeChunks(stream, buffer, offset, length, position) {
|
|
var contents = stream.node.contents
|
|
if (position >= contents.length) return 0
|
|
var size = Math.min(contents.length - position, length)
|
|
if (contents.slice) {
|
|
for (var i = 0; i < size; i++) {
|
|
buffer[offset + i] = contents[position + i]
|
|
}
|
|
} else {
|
|
for (var i = 0; i < size; i++) {
|
|
buffer[offset + i] = contents.get(position + i)
|
|
}
|
|
}
|
|
return size
|
|
}
|
|
stream_ops.read = (stream, buffer, offset, length, position) => {
|
|
FS.forceLoadFile(node)
|
|
return writeChunks(stream, buffer, offset, length, position)
|
|
}
|
|
stream_ops.mmap = (stream, length, position, prot, flags) => {
|
|
FS.forceLoadFile(node)
|
|
var ptr = mmapAlloc(length)
|
|
if (!ptr) {
|
|
throw new FS.ErrnoError(48)
|
|
}
|
|
writeChunks(stream, HEAP8, ptr, length, position)
|
|
return { ptr, allocated: true }
|
|
}
|
|
node.stream_ops = stream_ops
|
|
return node
|
|
},
|
|
}
|
|
var SYSCALLS = {
|
|
DEFAULT_POLLMASK: 5,
|
|
calculateAt(dirfd, path, allowEmpty) {
|
|
if (PATH.isAbs(path)) {
|
|
return path
|
|
}
|
|
var dir
|
|
if (dirfd === -100) {
|
|
dir = FS.cwd()
|
|
} else {
|
|
var dirstream = SYSCALLS.getStreamFromFD(dirfd)
|
|
dir = dirstream.path
|
|
}
|
|
if (path.length == 0) {
|
|
if (!allowEmpty) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
return dir
|
|
}
|
|
return PATH.join2(dir, path)
|
|
},
|
|
doStat(func, path, buf) {
|
|
var stat = func(path)
|
|
HEAP32[buf >> 2] = stat.dev
|
|
HEAP32[(buf + 4) >> 2] = stat.mode
|
|
HEAPU32[(buf + 8) >> 2] = stat.nlink
|
|
HEAP32[(buf + 12) >> 2] = stat.uid
|
|
HEAP32[(buf + 16) >> 2] = stat.gid
|
|
HEAP32[(buf + 20) >> 2] = stat.rdev
|
|
;(tempI64 = [
|
|
stat.size >>> 0,
|
|
((tempDouble = stat.size),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[(buf + 24) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 28) >> 2] = tempI64[1])
|
|
HEAP32[(buf + 32) >> 2] = 4096
|
|
HEAP32[(buf + 36) >> 2] = stat.blocks
|
|
var atime = stat.atime.getTime()
|
|
var mtime = stat.mtime.getTime()
|
|
var ctime = stat.ctime.getTime()
|
|
;(tempI64 = [
|
|
Math.floor(atime / 1e3) >>> 0,
|
|
((tempDouble = Math.floor(atime / 1e3)),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[(buf + 40) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 44) >> 2] = tempI64[1])
|
|
HEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3 * 1e3
|
|
;(tempI64 = [
|
|
Math.floor(mtime / 1e3) >>> 0,
|
|
((tempDouble = Math.floor(mtime / 1e3)),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[(buf + 56) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 60) >> 2] = tempI64[1])
|
|
HEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3 * 1e3
|
|
;(tempI64 = [
|
|
Math.floor(ctime / 1e3) >>> 0,
|
|
((tempDouble = Math.floor(ctime / 1e3)),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[(buf + 72) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 76) >> 2] = tempI64[1])
|
|
HEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3 * 1e3
|
|
;(tempI64 = [
|
|
stat.ino >>> 0,
|
|
((tempDouble = stat.ino),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[(buf + 88) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 92) >> 2] = tempI64[1])
|
|
return 0
|
|
},
|
|
doMsync(addr, stream, len, flags, offset) {
|
|
if (!FS.isFile(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
if (flags & 2) {
|
|
return 0
|
|
}
|
|
var buffer = HEAPU8.slice(addr, addr + len)
|
|
FS.msync(stream, buffer, offset, len, flags)
|
|
},
|
|
getStreamFromFD(fd) {
|
|
var stream = FS.getStreamChecked(fd)
|
|
return stream
|
|
},
|
|
varargs: undefined,
|
|
getStr(ptr) {
|
|
var ret = UTF8ToString(ptr)
|
|
return ret
|
|
},
|
|
}
|
|
function ___syscall_fcntl64(fd, cmd, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
switch (cmd) {
|
|
case 0: {
|
|
var arg = syscallGetVarargI()
|
|
if (arg < 0) {
|
|
return -28
|
|
}
|
|
while (FS.streams[arg]) {
|
|
arg++
|
|
}
|
|
var newStream
|
|
newStream = FS.dupStream(stream, arg)
|
|
return newStream.fd
|
|
}
|
|
case 1:
|
|
case 2:
|
|
return 0
|
|
case 3:
|
|
return stream.flags
|
|
case 4: {
|
|
var arg = syscallGetVarargI()
|
|
stream.flags |= arg
|
|
return 0
|
|
}
|
|
case 12: {
|
|
var arg = syscallGetVarargP()
|
|
var offset = 0
|
|
HEAP16[(arg + offset) >> 1] = 2
|
|
return 0
|
|
}
|
|
case 13:
|
|
case 14:
|
|
return 0
|
|
}
|
|
return -28
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return -e.errno
|
|
}
|
|
}
|
|
function ___syscall_ioctl(fd, op, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
switch (op) {
|
|
case 21509: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21505: {
|
|
if (!stream.tty) return -59
|
|
if (stream.tty.ops.ioctl_tcgets) {
|
|
var termios = stream.tty.ops.ioctl_tcgets(stream)
|
|
var argp = syscallGetVarargP()
|
|
HEAP32[argp >> 2] = termios.c_iflag || 0
|
|
HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0
|
|
HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0
|
|
HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0
|
|
for (var i = 0; i < 32; i++) {
|
|
HEAP8[argp + i + 17] = termios.c_cc[i] || 0
|
|
}
|
|
return 0
|
|
}
|
|
return 0
|
|
}
|
|
case 21510:
|
|
case 21511:
|
|
case 21512: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21506:
|
|
case 21507:
|
|
case 21508: {
|
|
if (!stream.tty) return -59
|
|
if (stream.tty.ops.ioctl_tcsets) {
|
|
var argp = syscallGetVarargP()
|
|
var c_iflag = HEAP32[argp >> 2]
|
|
var c_oflag = HEAP32[(argp + 4) >> 2]
|
|
var c_cflag = HEAP32[(argp + 8) >> 2]
|
|
var c_lflag = HEAP32[(argp + 12) >> 2]
|
|
var c_cc = []
|
|
for (var i = 0; i < 32; i++) {
|
|
c_cc.push(HEAP8[argp + i + 17])
|
|
}
|
|
return stream.tty.ops.ioctl_tcsets(stream.tty, op, {
|
|
c_iflag,
|
|
c_oflag,
|
|
c_cflag,
|
|
c_lflag,
|
|
c_cc,
|
|
})
|
|
}
|
|
return 0
|
|
}
|
|
case 21519: {
|
|
if (!stream.tty) return -59
|
|
var argp = syscallGetVarargP()
|
|
HEAP32[argp >> 2] = 0
|
|
return 0
|
|
}
|
|
case 21520: {
|
|
if (!stream.tty) return -59
|
|
return -28
|
|
}
|
|
case 21531: {
|
|
var argp = syscallGetVarargP()
|
|
return FS.ioctl(stream, op, argp)
|
|
}
|
|
case 21523: {
|
|
if (!stream.tty) return -59
|
|
if (stream.tty.ops.ioctl_tiocgwinsz) {
|
|
var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty)
|
|
var argp = syscallGetVarargP()
|
|
HEAP16[argp >> 1] = winsize[0]
|
|
HEAP16[(argp + 2) >> 1] = winsize[1]
|
|
}
|
|
return 0
|
|
}
|
|
case 21524: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21515: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
default:
|
|
return -28
|
|
}
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return -e.errno
|
|
}
|
|
}
|
|
function ___syscall_openat(dirfd, path, flags, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
path = SYSCALLS.calculateAt(dirfd, path)
|
|
var mode = varargs ? syscallGetVarargI() : 0
|
|
return FS.open(path, flags, mode).fd
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return -e.errno
|
|
}
|
|
}
|
|
function ___syscall_unlinkat(dirfd, path, flags) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
path = SYSCALLS.calculateAt(dirfd, path)
|
|
if (flags === 0) {
|
|
FS.unlink(path)
|
|
} else if (flags === 512) {
|
|
FS.rmdir(path)
|
|
} else {
|
|
abort("Invalid flags passed to unlinkat")
|
|
}
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return -e.errno
|
|
}
|
|
}
|
|
var __abort_js = () => {
|
|
abort("")
|
|
}
|
|
var structRegistrations = {}
|
|
var runDestructors = (destructors) => {
|
|
while (destructors.length) {
|
|
var ptr = destructors.pop()
|
|
var del = destructors.pop()
|
|
del(ptr)
|
|
}
|
|
}
|
|
function readPointer(pointer) {
|
|
return this["fromWireType"](HEAPU32[pointer >> 2])
|
|
}
|
|
var awaitingDependencies = {}
|
|
var registeredTypes = {}
|
|
var typeDependencies = {}
|
|
var InternalError
|
|
var throwInternalError = (message) => {
|
|
throw new InternalError(message)
|
|
}
|
|
var whenDependentTypesAreResolved = (
|
|
myTypes,
|
|
dependentTypes,
|
|
getTypeConverters,
|
|
) => {
|
|
myTypes.forEach((type) => (typeDependencies[type] = dependentTypes))
|
|
function onComplete(typeConverters) {
|
|
var myTypeConverters = getTypeConverters(typeConverters)
|
|
if (myTypeConverters.length !== myTypes.length) {
|
|
throwInternalError("Mismatched type converter count")
|
|
}
|
|
for (var i = 0; i < myTypes.length; ++i) {
|
|
registerType(myTypes[i], myTypeConverters[i])
|
|
}
|
|
}
|
|
var typeConverters = new Array(dependentTypes.length)
|
|
var unregisteredTypes = []
|
|
var registered = 0
|
|
dependentTypes.forEach((dt, i) => {
|
|
if (registeredTypes.hasOwnProperty(dt)) {
|
|
typeConverters[i] = registeredTypes[dt]
|
|
} else {
|
|
unregisteredTypes.push(dt)
|
|
if (!awaitingDependencies.hasOwnProperty(dt)) {
|
|
awaitingDependencies[dt] = []
|
|
}
|
|
awaitingDependencies[dt].push(() => {
|
|
typeConverters[i] = registeredTypes[dt]
|
|
++registered
|
|
if (registered === unregisteredTypes.length) {
|
|
onComplete(typeConverters)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
if (0 === unregisteredTypes.length) {
|
|
onComplete(typeConverters)
|
|
}
|
|
}
|
|
var __embind_finalize_value_object = (structType) => {
|
|
var reg = structRegistrations[structType]
|
|
delete structRegistrations[structType]
|
|
var rawConstructor = reg.rawConstructor
|
|
var rawDestructor = reg.rawDestructor
|
|
var fieldRecords = reg.fields
|
|
var fieldTypes = fieldRecords
|
|
.map((field) => field.getterReturnType)
|
|
.concat(fieldRecords.map((field) => field.setterArgumentType))
|
|
whenDependentTypesAreResolved([structType], fieldTypes, (fieldTypes) => {
|
|
var fields = {}
|
|
fieldRecords.forEach((field, i) => {
|
|
var fieldName = field.fieldName
|
|
var getterReturnType = fieldTypes[i]
|
|
var getter = field.getter
|
|
var getterContext = field.getterContext
|
|
var setterArgumentType = fieldTypes[i + fieldRecords.length]
|
|
var setter = field.setter
|
|
var setterContext = field.setterContext
|
|
fields[fieldName] = {
|
|
read: (ptr) =>
|
|
getterReturnType["fromWireType"](getter(getterContext, ptr)),
|
|
write: (ptr, o) => {
|
|
var destructors = []
|
|
setter(
|
|
setterContext,
|
|
ptr,
|
|
setterArgumentType["toWireType"](destructors, o),
|
|
)
|
|
runDestructors(destructors)
|
|
},
|
|
}
|
|
})
|
|
return [
|
|
{
|
|
name: reg.name,
|
|
fromWireType: (ptr) => {
|
|
var rv = {}
|
|
for (var i in fields) {
|
|
rv[i] = fields[i].read(ptr)
|
|
}
|
|
rawDestructor(ptr)
|
|
return rv
|
|
},
|
|
toWireType: (destructors, o) => {
|
|
for (var fieldName in fields) {
|
|
if (!(fieldName in o)) {
|
|
throw new TypeError(`Missing field: "${fieldName}"`)
|
|
}
|
|
}
|
|
var ptr = rawConstructor()
|
|
for (fieldName in fields) {
|
|
fields[fieldName].write(ptr, o[fieldName])
|
|
}
|
|
if (destructors !== null) {
|
|
destructors.push(rawDestructor, ptr)
|
|
}
|
|
return ptr
|
|
},
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: readPointer,
|
|
destructorFunction: rawDestructor,
|
|
},
|
|
]
|
|
})
|
|
}
|
|
var __embind_register_bigint = (
|
|
primitiveType,
|
|
name,
|
|
size,
|
|
minRange,
|
|
maxRange,
|
|
) => {}
|
|
var embind_init_charCodes = () => {
|
|
var codes = new Array(256)
|
|
for (var i = 0; i < 256; ++i) {
|
|
codes[i] = String.fromCharCode(i)
|
|
}
|
|
embind_charCodes = codes
|
|
}
|
|
var embind_charCodes
|
|
var readLatin1String = (ptr) => {
|
|
var ret = ""
|
|
var c = ptr
|
|
while (HEAPU8[c]) {
|
|
ret += embind_charCodes[HEAPU8[c++]]
|
|
}
|
|
return ret
|
|
}
|
|
var BindingError
|
|
var throwBindingError = (message) => {
|
|
throw new BindingError(message)
|
|
}
|
|
function sharedRegisterType(rawType, registeredInstance, options = {}) {
|
|
var name = registeredInstance.name
|
|
if (!rawType) {
|
|
throwBindingError(
|
|
`type "${name}" must have a positive integer typeid pointer`,
|
|
)
|
|
}
|
|
if (registeredTypes.hasOwnProperty(rawType)) {
|
|
if (options.ignoreDuplicateRegistrations) {
|
|
return
|
|
} else {
|
|
throwBindingError(`Cannot register type '${name}' twice`)
|
|
}
|
|
}
|
|
registeredTypes[rawType] = registeredInstance
|
|
delete typeDependencies[rawType]
|
|
if (awaitingDependencies.hasOwnProperty(rawType)) {
|
|
var callbacks = awaitingDependencies[rawType]
|
|
delete awaitingDependencies[rawType]
|
|
callbacks.forEach((cb) => cb())
|
|
}
|
|
}
|
|
function registerType(rawType, registeredInstance, options = {}) {
|
|
return sharedRegisterType(rawType, registeredInstance, options)
|
|
}
|
|
var GenericWireTypeSize = 8
|
|
var __embind_register_bool = (rawType, name, trueValue, falseValue) => {
|
|
name = readLatin1String(name)
|
|
registerType(rawType, {
|
|
name,
|
|
fromWireType: function (wt) {
|
|
return !!wt
|
|
},
|
|
toWireType: function (destructors, o) {
|
|
return o ? trueValue : falseValue
|
|
},
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: function (pointer) {
|
|
return this["fromWireType"](HEAPU8[pointer])
|
|
},
|
|
destructorFunction: null,
|
|
})
|
|
}
|
|
var shallowCopyInternalPointer = (o) => ({
|
|
count: o.count,
|
|
deleteScheduled: o.deleteScheduled,
|
|
preservePointerOnDelete: o.preservePointerOnDelete,
|
|
ptr: o.ptr,
|
|
ptrType: o.ptrType,
|
|
smartPtr: o.smartPtr,
|
|
smartPtrType: o.smartPtrType,
|
|
})
|
|
var throwInstanceAlreadyDeleted = (obj) => {
|
|
function getInstanceTypeName(handle) {
|
|
return handle.$$.ptrType.registeredClass.name
|
|
}
|
|
throwBindingError(getInstanceTypeName(obj) + " instance already deleted")
|
|
}
|
|
var finalizationRegistry = false
|
|
var detachFinalizer = (handle) => {}
|
|
var runDestructor = ($$) => {
|
|
if ($$.smartPtr) {
|
|
$$.smartPtrType.rawDestructor($$.smartPtr)
|
|
} else {
|
|
$$.ptrType.registeredClass.rawDestructor($$.ptr)
|
|
}
|
|
}
|
|
var releaseClassHandle = ($$) => {
|
|
$$.count.value -= 1
|
|
var toDelete = 0 === $$.count.value
|
|
if (toDelete) {
|
|
runDestructor($$)
|
|
}
|
|
}
|
|
var downcastPointer = (ptr, ptrClass, desiredClass) => {
|
|
if (ptrClass === desiredClass) {
|
|
return ptr
|
|
}
|
|
if (undefined === desiredClass.baseClass) {
|
|
return null
|
|
}
|
|
var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass)
|
|
if (rv === null) {
|
|
return null
|
|
}
|
|
return desiredClass.downcast(rv)
|
|
}
|
|
var registeredPointers = {}
|
|
var getInheritedInstanceCount = () =>
|
|
Object.keys(registeredInstances).length
|
|
var getLiveInheritedInstances = () => {
|
|
var rv = []
|
|
for (var k in registeredInstances) {
|
|
if (registeredInstances.hasOwnProperty(k)) {
|
|
rv.push(registeredInstances[k])
|
|
}
|
|
}
|
|
return rv
|
|
}
|
|
var deletionQueue = []
|
|
var flushPendingDeletes = () => {
|
|
while (deletionQueue.length) {
|
|
var obj = deletionQueue.pop()
|
|
obj.$$.deleteScheduled = false
|
|
obj["delete"]()
|
|
}
|
|
}
|
|
var delayFunction
|
|
var setDelayFunction = (fn) => {
|
|
delayFunction = fn
|
|
if (deletionQueue.length && delayFunction) {
|
|
delayFunction(flushPendingDeletes)
|
|
}
|
|
}
|
|
var init_embind = () => {
|
|
Module["getInheritedInstanceCount"] = getInheritedInstanceCount
|
|
Module["getLiveInheritedInstances"] = getLiveInheritedInstances
|
|
Module["flushPendingDeletes"] = flushPendingDeletes
|
|
Module["setDelayFunction"] = setDelayFunction
|
|
}
|
|
var registeredInstances = {}
|
|
var getBasestPointer = (class_, ptr) => {
|
|
if (ptr === undefined) {
|
|
throwBindingError("ptr should not be undefined")
|
|
}
|
|
while (class_.baseClass) {
|
|
ptr = class_.upcast(ptr)
|
|
class_ = class_.baseClass
|
|
}
|
|
return ptr
|
|
}
|
|
var getInheritedInstance = (class_, ptr) => {
|
|
ptr = getBasestPointer(class_, ptr)
|
|
return registeredInstances[ptr]
|
|
}
|
|
var makeClassHandle = (prototype, record) => {
|
|
if (!record.ptrType || !record.ptr) {
|
|
throwInternalError("makeClassHandle requires ptr and ptrType")
|
|
}
|
|
var hasSmartPtrType = !!record.smartPtrType
|
|
var hasSmartPtr = !!record.smartPtr
|
|
if (hasSmartPtrType !== hasSmartPtr) {
|
|
throwInternalError("Both smartPtrType and smartPtr must be specified")
|
|
}
|
|
record.count = { value: 1 }
|
|
return attachFinalizer(
|
|
Object.create(prototype, { $$: { value: record, writable: true } }),
|
|
)
|
|
}
|
|
function RegisteredPointer_fromWireType(ptr) {
|
|
var rawPointer = this.getPointee(ptr)
|
|
if (!rawPointer) {
|
|
this.destructor(ptr)
|
|
return null
|
|
}
|
|
var registeredInstance = getInheritedInstance(
|
|
this.registeredClass,
|
|
rawPointer,
|
|
)
|
|
if (undefined !== registeredInstance) {
|
|
if (0 === registeredInstance.$$.count.value) {
|
|
registeredInstance.$$.ptr = rawPointer
|
|
registeredInstance.$$.smartPtr = ptr
|
|
return registeredInstance["clone"]()
|
|
} else {
|
|
var rv = registeredInstance["clone"]()
|
|
this.destructor(ptr)
|
|
return rv
|
|
}
|
|
}
|
|
function makeDefaultHandle() {
|
|
if (this.isSmartPointer) {
|
|
return makeClassHandle(this.registeredClass.instancePrototype, {
|
|
ptrType: this.pointeeType,
|
|
ptr: rawPointer,
|
|
smartPtrType: this,
|
|
smartPtr: ptr,
|
|
})
|
|
} else {
|
|
return makeClassHandle(this.registeredClass.instancePrototype, {
|
|
ptrType: this,
|
|
ptr,
|
|
})
|
|
}
|
|
}
|
|
var actualType = this.registeredClass.getActualType(rawPointer)
|
|
var registeredPointerRecord = registeredPointers[actualType]
|
|
if (!registeredPointerRecord) {
|
|
return makeDefaultHandle.call(this)
|
|
}
|
|
var toType
|
|
if (this.isConst) {
|
|
toType = registeredPointerRecord.constPointerType
|
|
} else {
|
|
toType = registeredPointerRecord.pointerType
|
|
}
|
|
var dp = downcastPointer(
|
|
rawPointer,
|
|
this.registeredClass,
|
|
toType.registeredClass,
|
|
)
|
|
if (dp === null) {
|
|
return makeDefaultHandle.call(this)
|
|
}
|
|
if (this.isSmartPointer) {
|
|
return makeClassHandle(toType.registeredClass.instancePrototype, {
|
|
ptrType: toType,
|
|
ptr: dp,
|
|
smartPtrType: this,
|
|
smartPtr: ptr,
|
|
})
|
|
} else {
|
|
return makeClassHandle(toType.registeredClass.instancePrototype, {
|
|
ptrType: toType,
|
|
ptr: dp,
|
|
})
|
|
}
|
|
}
|
|
var attachFinalizer = (handle) => {
|
|
if ("undefined" === typeof FinalizationRegistry) {
|
|
attachFinalizer = (handle) => handle
|
|
return handle
|
|
}
|
|
finalizationRegistry = new FinalizationRegistry((info) => {
|
|
releaseClassHandle(info.$$)
|
|
})
|
|
attachFinalizer = (handle) => {
|
|
var $$ = handle.$$
|
|
var hasSmartPtr = !!$$.smartPtr
|
|
if (hasSmartPtr) {
|
|
var info = { $$ }
|
|
finalizationRegistry.register(handle, info, handle)
|
|
}
|
|
return handle
|
|
}
|
|
detachFinalizer = (handle) => finalizationRegistry.unregister(handle)
|
|
return attachFinalizer(handle)
|
|
}
|
|
var init_ClassHandle = () => {
|
|
Object.assign(ClassHandle.prototype, {
|
|
isAliasOf(other) {
|
|
if (!(this instanceof ClassHandle)) {
|
|
return false
|
|
}
|
|
if (!(other instanceof ClassHandle)) {
|
|
return false
|
|
}
|
|
var leftClass = this.$$.ptrType.registeredClass
|
|
var left = this.$$.ptr
|
|
other.$$ = other.$$
|
|
var rightClass = other.$$.ptrType.registeredClass
|
|
var right = other.$$.ptr
|
|
while (leftClass.baseClass) {
|
|
left = leftClass.upcast(left)
|
|
leftClass = leftClass.baseClass
|
|
}
|
|
while (rightClass.baseClass) {
|
|
right = rightClass.upcast(right)
|
|
rightClass = rightClass.baseClass
|
|
}
|
|
return leftClass === rightClass && left === right
|
|
},
|
|
clone() {
|
|
if (!this.$$.ptr) {
|
|
throwInstanceAlreadyDeleted(this)
|
|
}
|
|
if (this.$$.preservePointerOnDelete) {
|
|
this.$$.count.value += 1
|
|
return this
|
|
} else {
|
|
var clone = attachFinalizer(
|
|
Object.create(Object.getPrototypeOf(this), {
|
|
$$: { value: shallowCopyInternalPointer(this.$$) },
|
|
}),
|
|
)
|
|
clone.$$.count.value += 1
|
|
clone.$$.deleteScheduled = false
|
|
return clone
|
|
}
|
|
},
|
|
delete() {
|
|
if (!this.$$.ptr) {
|
|
throwInstanceAlreadyDeleted(this)
|
|
}
|
|
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
|
|
throwBindingError("Object already scheduled for deletion")
|
|
}
|
|
detachFinalizer(this)
|
|
releaseClassHandle(this.$$)
|
|
if (!this.$$.preservePointerOnDelete) {
|
|
this.$$.smartPtr = undefined
|
|
this.$$.ptr = undefined
|
|
}
|
|
},
|
|
isDeleted() {
|
|
return !this.$$.ptr
|
|
},
|
|
deleteLater() {
|
|
if (!this.$$.ptr) {
|
|
throwInstanceAlreadyDeleted(this)
|
|
}
|
|
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
|
|
throwBindingError("Object already scheduled for deletion")
|
|
}
|
|
deletionQueue.push(this)
|
|
if (deletionQueue.length === 1 && delayFunction) {
|
|
delayFunction(flushPendingDeletes)
|
|
}
|
|
this.$$.deleteScheduled = true
|
|
return this
|
|
},
|
|
})
|
|
}
|
|
function ClassHandle() {}
|
|
var createNamedFunction = (name, body) =>
|
|
Object.defineProperty(body, "name", { value: name })
|
|
var ensureOverloadTable = (proto, methodName, humanName) => {
|
|
if (undefined === proto[methodName].overloadTable) {
|
|
var prevFunc = proto[methodName]
|
|
proto[methodName] = function (...args) {
|
|
if (!proto[methodName].overloadTable.hasOwnProperty(args.length)) {
|
|
throwBindingError(
|
|
`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`,
|
|
)
|
|
}
|
|
return proto[methodName].overloadTable[args.length].apply(this, args)
|
|
}
|
|
proto[methodName].overloadTable = []
|
|
proto[methodName].overloadTable[prevFunc.argCount] = prevFunc
|
|
}
|
|
}
|
|
var exposePublicSymbol = (name, value, numArguments) => {
|
|
if (Module.hasOwnProperty(name)) {
|
|
if (
|
|
undefined === numArguments ||
|
|
(undefined !== Module[name].overloadTable &&
|
|
undefined !== Module[name].overloadTable[numArguments])
|
|
) {
|
|
throwBindingError(`Cannot register public name '${name}' twice`)
|
|
}
|
|
ensureOverloadTable(Module, name, name)
|
|
if (Module.hasOwnProperty(numArguments)) {
|
|
throwBindingError(
|
|
`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`,
|
|
)
|
|
}
|
|
Module[name].overloadTable[numArguments] = value
|
|
} else {
|
|
Module[name] = value
|
|
if (undefined !== numArguments) {
|
|
Module[name].numArguments = numArguments
|
|
}
|
|
}
|
|
}
|
|
var char_0 = 48
|
|
var char_9 = 57
|
|
var makeLegalFunctionName = (name) => {
|
|
if (undefined === name) {
|
|
return "_unknown"
|
|
}
|
|
name = name.replace(/[^a-zA-Z0-9_]/g, "$")
|
|
var f = name.charCodeAt(0)
|
|
if (f >= char_0 && f <= char_9) {
|
|
return `_${name}`
|
|
}
|
|
return name
|
|
}
|
|
function RegisteredClass(
|
|
name,
|
|
constructor,
|
|
instancePrototype,
|
|
rawDestructor,
|
|
baseClass,
|
|
getActualType,
|
|
upcast,
|
|
downcast,
|
|
) {
|
|
this.name = name
|
|
this.constructor = constructor
|
|
this.instancePrototype = instancePrototype
|
|
this.rawDestructor = rawDestructor
|
|
this.baseClass = baseClass
|
|
this.getActualType = getActualType
|
|
this.upcast = upcast
|
|
this.downcast = downcast
|
|
this.pureVirtualFunctions = []
|
|
}
|
|
var upcastPointer = (ptr, ptrClass, desiredClass) => {
|
|
while (ptrClass !== desiredClass) {
|
|
if (!ptrClass.upcast) {
|
|
throwBindingError(
|
|
`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`,
|
|
)
|
|
}
|
|
ptr = ptrClass.upcast(ptr)
|
|
ptrClass = ptrClass.baseClass
|
|
}
|
|
return ptr
|
|
}
|
|
function constNoSmartPtrRawPointerToWireType(destructors, handle) {
|
|
if (handle === null) {
|
|
if (this.isReference) {
|
|
throwBindingError(`null is not a valid ${this.name}`)
|
|
}
|
|
return 0
|
|
}
|
|
if (!handle.$$) {
|
|
throwBindingError(
|
|
`Cannot pass "${embindRepr(handle)}" as a ${this.name}`,
|
|
)
|
|
}
|
|
if (!handle.$$.ptr) {
|
|
throwBindingError(
|
|
`Cannot pass deleted object as a pointer of type ${this.name}`,
|
|
)
|
|
}
|
|
var handleClass = handle.$$.ptrType.registeredClass
|
|
var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass)
|
|
return ptr
|
|
}
|
|
function genericPointerToWireType(destructors, handle) {
|
|
var ptr
|
|
if (handle === null) {
|
|
if (this.isReference) {
|
|
throwBindingError(`null is not a valid ${this.name}`)
|
|
}
|
|
if (this.isSmartPointer) {
|
|
ptr = this.rawConstructor()
|
|
if (destructors !== null) {
|
|
destructors.push(this.rawDestructor, ptr)
|
|
}
|
|
return ptr
|
|
} else {
|
|
return 0
|
|
}
|
|
}
|
|
if (!handle || !handle.$$) {
|
|
throwBindingError(
|
|
`Cannot pass "${embindRepr(handle)}" as a ${this.name}`,
|
|
)
|
|
}
|
|
if (!handle.$$.ptr) {
|
|
throwBindingError(
|
|
`Cannot pass deleted object as a pointer of type ${this.name}`,
|
|
)
|
|
}
|
|
if (!this.isConst && handle.$$.ptrType.isConst) {
|
|
throwBindingError(
|
|
`Cannot convert argument of type ${
|
|
handle.$$.smartPtrType
|
|
? handle.$$.smartPtrType.name
|
|
: handle.$$.ptrType.name
|
|
} to parameter type ${this.name}`,
|
|
)
|
|
}
|
|
var handleClass = handle.$$.ptrType.registeredClass
|
|
ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass)
|
|
if (this.isSmartPointer) {
|
|
if (undefined === handle.$$.smartPtr) {
|
|
throwBindingError("Passing raw pointer to smart pointer is illegal")
|
|
}
|
|
switch (this.sharingPolicy) {
|
|
case 0:
|
|
if (handle.$$.smartPtrType === this) {
|
|
ptr = handle.$$.smartPtr
|
|
} else {
|
|
throwBindingError(
|
|
`Cannot convert argument of type ${
|
|
handle.$$.smartPtrType
|
|
? handle.$$.smartPtrType.name
|
|
: handle.$$.ptrType.name
|
|
} to parameter type ${this.name}`,
|
|
)
|
|
}
|
|
break
|
|
case 1:
|
|
ptr = handle.$$.smartPtr
|
|
break
|
|
case 2:
|
|
if (handle.$$.smartPtrType === this) {
|
|
ptr = handle.$$.smartPtr
|
|
} else {
|
|
var clonedHandle = handle["clone"]()
|
|
ptr = this.rawShare(
|
|
ptr,
|
|
Emval.toHandle(() => clonedHandle["delete"]()),
|
|
)
|
|
if (destructors !== null) {
|
|
destructors.push(this.rawDestructor, ptr)
|
|
}
|
|
}
|
|
break
|
|
default:
|
|
throwBindingError("Unsupporting sharing policy")
|
|
}
|
|
}
|
|
return ptr
|
|
}
|
|
function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
|
|
if (handle === null) {
|
|
if (this.isReference) {
|
|
throwBindingError(`null is not a valid ${this.name}`)
|
|
}
|
|
return 0
|
|
}
|
|
if (!handle.$$) {
|
|
throwBindingError(
|
|
`Cannot pass "${embindRepr(handle)}" as a ${this.name}`,
|
|
)
|
|
}
|
|
if (!handle.$$.ptr) {
|
|
throwBindingError(
|
|
`Cannot pass deleted object as a pointer of type ${this.name}`,
|
|
)
|
|
}
|
|
if (handle.$$.ptrType.isConst) {
|
|
throwBindingError(
|
|
`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`,
|
|
)
|
|
}
|
|
var handleClass = handle.$$.ptrType.registeredClass
|
|
var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass)
|
|
return ptr
|
|
}
|
|
var init_RegisteredPointer = () => {
|
|
Object.assign(RegisteredPointer.prototype, {
|
|
getPointee(ptr) {
|
|
if (this.rawGetPointee) {
|
|
ptr = this.rawGetPointee(ptr)
|
|
}
|
|
return ptr
|
|
},
|
|
destructor(ptr) {
|
|
this.rawDestructor?.(ptr)
|
|
},
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: readPointer,
|
|
fromWireType: RegisteredPointer_fromWireType,
|
|
})
|
|
}
|
|
function RegisteredPointer(
|
|
name,
|
|
registeredClass,
|
|
isReference,
|
|
isConst,
|
|
isSmartPointer,
|
|
pointeeType,
|
|
sharingPolicy,
|
|
rawGetPointee,
|
|
rawConstructor,
|
|
rawShare,
|
|
rawDestructor,
|
|
) {
|
|
this.name = name
|
|
this.registeredClass = registeredClass
|
|
this.isReference = isReference
|
|
this.isConst = isConst
|
|
this.isSmartPointer = isSmartPointer
|
|
this.pointeeType = pointeeType
|
|
this.sharingPolicy = sharingPolicy
|
|
this.rawGetPointee = rawGetPointee
|
|
this.rawConstructor = rawConstructor
|
|
this.rawShare = rawShare
|
|
this.rawDestructor = rawDestructor
|
|
if (!isSmartPointer && registeredClass.baseClass === undefined) {
|
|
if (isConst) {
|
|
this["toWireType"] = constNoSmartPtrRawPointerToWireType
|
|
this.destructorFunction = null
|
|
} else {
|
|
this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType
|
|
this.destructorFunction = null
|
|
}
|
|
} else {
|
|
this["toWireType"] = genericPointerToWireType
|
|
}
|
|
}
|
|
var replacePublicSymbol = (name, value, numArguments) => {
|
|
if (!Module.hasOwnProperty(name)) {
|
|
throwInternalError("Replacing nonexistent public symbol")
|
|
}
|
|
if (
|
|
undefined !== Module[name].overloadTable &&
|
|
undefined !== numArguments
|
|
) {
|
|
Module[name].overloadTable[numArguments] = value
|
|
} else {
|
|
Module[name] = value
|
|
Module[name].argCount = numArguments
|
|
}
|
|
}
|
|
var dynCallLegacy = (sig, ptr, args) => {
|
|
sig = sig.replace(/p/g, "i")
|
|
var f = Module["dynCall_" + sig]
|
|
return f(ptr, ...args)
|
|
}
|
|
var wasmTableMirror = []
|
|
var wasmTable
|
|
var getWasmTableEntry = (funcPtr) => {
|
|
var func = wasmTableMirror[funcPtr]
|
|
if (!func) {
|
|
if (funcPtr >= wasmTableMirror.length)
|
|
wasmTableMirror.length = funcPtr + 1
|
|
wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr)
|
|
}
|
|
return func
|
|
}
|
|
var dynCall = (sig, ptr, args = []) => {
|
|
if (sig.includes("j")) {
|
|
return dynCallLegacy(sig, ptr, args)
|
|
}
|
|
var rtn = getWasmTableEntry(ptr)(...args)
|
|
return rtn
|
|
}
|
|
var getDynCaller =
|
|
(sig, ptr) =>
|
|
(...args) =>
|
|
dynCall(sig, ptr, args)
|
|
var embind__requireFunction = (signature, rawFunction) => {
|
|
signature = readLatin1String(signature)
|
|
function makeDynCaller() {
|
|
if (signature.includes("j")) {
|
|
return getDynCaller(signature, rawFunction)
|
|
}
|
|
return getWasmTableEntry(rawFunction)
|
|
}
|
|
var fp = makeDynCaller()
|
|
if (typeof fp != "function") {
|
|
throwBindingError(
|
|
`unknown function pointer with signature ${signature}: ${rawFunction}`,
|
|
)
|
|
}
|
|
return fp
|
|
}
|
|
var extendError = (baseErrorType, errorName) => {
|
|
var errorClass = createNamedFunction(errorName, function (message) {
|
|
this.name = errorName
|
|
this.message = message
|
|
var stack = new Error(message).stack
|
|
if (stack !== undefined) {
|
|
this.stack =
|
|
this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, "")
|
|
}
|
|
})
|
|
errorClass.prototype = Object.create(baseErrorType.prototype)
|
|
errorClass.prototype.constructor = errorClass
|
|
errorClass.prototype.toString = function () {
|
|
if (this.message === undefined) {
|
|
return this.name
|
|
} else {
|
|
return `${this.name}: ${this.message}`
|
|
}
|
|
}
|
|
return errorClass
|
|
}
|
|
var UnboundTypeError
|
|
var getTypeName = (type) => {
|
|
var ptr = ___getTypeName(type)
|
|
var rv = readLatin1String(ptr)
|
|
_free(ptr)
|
|
return rv
|
|
}
|
|
var throwUnboundTypeError = (message, types) => {
|
|
var unboundTypes = []
|
|
var seen = {}
|
|
function visit(type) {
|
|
if (seen[type]) {
|
|
return
|
|
}
|
|
if (registeredTypes[type]) {
|
|
return
|
|
}
|
|
if (typeDependencies[type]) {
|
|
typeDependencies[type].forEach(visit)
|
|
return
|
|
}
|
|
unboundTypes.push(type)
|
|
seen[type] = true
|
|
}
|
|
types.forEach(visit)
|
|
throw new UnboundTypeError(
|
|
`${message}: ` + unboundTypes.map(getTypeName).join([", "]),
|
|
)
|
|
}
|
|
var __embind_register_class = (
|
|
rawType,
|
|
rawPointerType,
|
|
rawConstPointerType,
|
|
baseClassRawType,
|
|
getActualTypeSignature,
|
|
getActualType,
|
|
upcastSignature,
|
|
upcast,
|
|
downcastSignature,
|
|
downcast,
|
|
name,
|
|
destructorSignature,
|
|
rawDestructor,
|
|
) => {
|
|
name = readLatin1String(name)
|
|
getActualType = embind__requireFunction(
|
|
getActualTypeSignature,
|
|
getActualType,
|
|
)
|
|
upcast &&= embind__requireFunction(upcastSignature, upcast)
|
|
downcast &&= embind__requireFunction(downcastSignature, downcast)
|
|
rawDestructor = embind__requireFunction(
|
|
destructorSignature,
|
|
rawDestructor,
|
|
)
|
|
var legalFunctionName = makeLegalFunctionName(name)
|
|
exposePublicSymbol(legalFunctionName, function () {
|
|
throwUnboundTypeError(`Cannot construct ${name} due to unbound types`, [
|
|
baseClassRawType,
|
|
])
|
|
})
|
|
whenDependentTypesAreResolved(
|
|
[rawType, rawPointerType, rawConstPointerType],
|
|
baseClassRawType ? [baseClassRawType] : [],
|
|
(base) => {
|
|
base = base[0]
|
|
var baseClass
|
|
var basePrototype
|
|
if (baseClassRawType) {
|
|
baseClass = base.registeredClass
|
|
basePrototype = baseClass.instancePrototype
|
|
} else {
|
|
basePrototype = ClassHandle.prototype
|
|
}
|
|
var constructor = createNamedFunction(name, function (...args) {
|
|
if (Object.getPrototypeOf(this) !== instancePrototype) {
|
|
throw new BindingError("Use 'new' to construct " + name)
|
|
}
|
|
if (undefined === registeredClass.constructor_body) {
|
|
throw new BindingError(name + " has no accessible constructor")
|
|
}
|
|
var body = registeredClass.constructor_body[args.length]
|
|
if (undefined === body) {
|
|
throw new BindingError(
|
|
`Tried to invoke ctor of ${name} with invalid number of parameters (${
|
|
args.length
|
|
}) - expected (${Object.keys(
|
|
registeredClass.constructor_body,
|
|
).toString()}) parameters instead!`,
|
|
)
|
|
}
|
|
return body.apply(this, args)
|
|
})
|
|
var instancePrototype = Object.create(basePrototype, {
|
|
constructor: { value: constructor },
|
|
})
|
|
constructor.prototype = instancePrototype
|
|
var registeredClass = new RegisteredClass(
|
|
name,
|
|
constructor,
|
|
instancePrototype,
|
|
rawDestructor,
|
|
baseClass,
|
|
getActualType,
|
|
upcast,
|
|
downcast,
|
|
)
|
|
if (registeredClass.baseClass) {
|
|
registeredClass.baseClass.__derivedClasses ??= []
|
|
registeredClass.baseClass.__derivedClasses.push(registeredClass)
|
|
}
|
|
var referenceConverter = new RegisteredPointer(
|
|
name,
|
|
registeredClass,
|
|
true,
|
|
false,
|
|
false,
|
|
)
|
|
var pointerConverter = new RegisteredPointer(
|
|
name + "*",
|
|
registeredClass,
|
|
false,
|
|
false,
|
|
false,
|
|
)
|
|
var constPointerConverter = new RegisteredPointer(
|
|
name + " const*",
|
|
registeredClass,
|
|
false,
|
|
true,
|
|
false,
|
|
)
|
|
registeredPointers[rawType] = {
|
|
pointerType: pointerConverter,
|
|
constPointerType: constPointerConverter,
|
|
}
|
|
replacePublicSymbol(legalFunctionName, constructor)
|
|
return [referenceConverter, pointerConverter, constPointerConverter]
|
|
},
|
|
)
|
|
}
|
|
var emval_freelist = []
|
|
var emval_handles = []
|
|
var __emval_decref = (handle) => {
|
|
if (handle > 9 && 0 === --emval_handles[handle + 1]) {
|
|
emval_handles[handle] = undefined
|
|
emval_freelist.push(handle)
|
|
}
|
|
}
|
|
var count_emval_handles = () =>
|
|
emval_handles.length / 2 - 5 - emval_freelist.length
|
|
var init_emval = () => {
|
|
emval_handles.push(0, 1, undefined, 1, null, 1, true, 1, false, 1)
|
|
Module["count_emval_handles"] = count_emval_handles
|
|
}
|
|
var Emval = {
|
|
toValue: (handle) => {
|
|
if (!handle) {
|
|
throwBindingError("Cannot use deleted val. handle = " + handle)
|
|
}
|
|
return emval_handles[handle]
|
|
},
|
|
toHandle: (value) => {
|
|
switch (value) {
|
|
case undefined:
|
|
return 2
|
|
case null:
|
|
return 4
|
|
case true:
|
|
return 6
|
|
case false:
|
|
return 8
|
|
default: {
|
|
const handle = emval_freelist.pop() || emval_handles.length
|
|
emval_handles[handle] = value
|
|
emval_handles[handle + 1] = 1
|
|
return handle
|
|
}
|
|
}
|
|
},
|
|
}
|
|
var EmValType = {
|
|
name: "emscripten::val",
|
|
fromWireType: (handle) => {
|
|
var rv = Emval.toValue(handle)
|
|
__emval_decref(handle)
|
|
return rv
|
|
},
|
|
toWireType: (destructors, value) => Emval.toHandle(value),
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: readPointer,
|
|
destructorFunction: null,
|
|
}
|
|
var __embind_register_emval = (rawType) => registerType(rawType, EmValType)
|
|
var enumReadValueFromPointer = (name, width, signed) => {
|
|
switch (width) {
|
|
case 1:
|
|
return signed
|
|
? function (pointer) {
|
|
return this["fromWireType"](HEAP8[pointer])
|
|
}
|
|
: function (pointer) {
|
|
return this["fromWireType"](HEAPU8[pointer])
|
|
}
|
|
case 2:
|
|
return signed
|
|
? function (pointer) {
|
|
return this["fromWireType"](HEAP16[pointer >> 1])
|
|
}
|
|
: function (pointer) {
|
|
return this["fromWireType"](HEAPU16[pointer >> 1])
|
|
}
|
|
case 4:
|
|
return signed
|
|
? function (pointer) {
|
|
return this["fromWireType"](HEAP32[pointer >> 2])
|
|
}
|
|
: function (pointer) {
|
|
return this["fromWireType"](HEAPU32[pointer >> 2])
|
|
}
|
|
default:
|
|
throw new TypeError(`invalid integer width (${width}): ${name}`)
|
|
}
|
|
}
|
|
var __embind_register_enum = (rawType, name, size, isSigned) => {
|
|
name = readLatin1String(name)
|
|
function ctor() {}
|
|
ctor.values = {}
|
|
registerType(rawType, {
|
|
name,
|
|
constructor: ctor,
|
|
fromWireType: function (c) {
|
|
return this.constructor.values[c]
|
|
},
|
|
toWireType: (destructors, c) => c.value,
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: enumReadValueFromPointer(name, size, isSigned),
|
|
destructorFunction: null,
|
|
})
|
|
exposePublicSymbol(name, ctor)
|
|
}
|
|
var requireRegisteredType = (rawType, humanName) => {
|
|
var impl = registeredTypes[rawType]
|
|
if (undefined === impl) {
|
|
throwBindingError(
|
|
`${humanName} has unknown type ${getTypeName(rawType)}`,
|
|
)
|
|
}
|
|
return impl
|
|
}
|
|
var __embind_register_enum_value = (rawEnumType, name, enumValue) => {
|
|
var enumType = requireRegisteredType(rawEnumType, "enum")
|
|
name = readLatin1String(name)
|
|
var Enum = enumType.constructor
|
|
var Value = Object.create(enumType.constructor.prototype, {
|
|
value: { value: enumValue },
|
|
constructor: {
|
|
value: createNamedFunction(
|
|
`${enumType.name}_${name}`,
|
|
function () {},
|
|
),
|
|
},
|
|
})
|
|
Enum.values[enumValue] = Value
|
|
Enum[name] = Value
|
|
}
|
|
var embindRepr = (v) => {
|
|
if (v === null) {
|
|
return "null"
|
|
}
|
|
var t = typeof v
|
|
if (t === "object" || t === "array" || t === "function") {
|
|
return v.toString()
|
|
} else {
|
|
return "" + v
|
|
}
|
|
}
|
|
var floatReadValueFromPointer = (name, width) => {
|
|
switch (width) {
|
|
case 4:
|
|
return function (pointer) {
|
|
return this["fromWireType"](HEAPF32[pointer >> 2])
|
|
}
|
|
case 8:
|
|
return function (pointer) {
|
|
return this["fromWireType"](HEAPF64[pointer >> 3])
|
|
}
|
|
default:
|
|
throw new TypeError(`invalid float width (${width}): ${name}`)
|
|
}
|
|
}
|
|
var __embind_register_float = (rawType, name, size) => {
|
|
name = readLatin1String(name)
|
|
registerType(rawType, {
|
|
name,
|
|
fromWireType: (value) => value,
|
|
toWireType: (destructors, value) => value,
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: floatReadValueFromPointer(name, size),
|
|
destructorFunction: null,
|
|
})
|
|
}
|
|
function usesDestructorStack(argTypes) {
|
|
for (var i = 1; i < argTypes.length; ++i) {
|
|
if (
|
|
argTypes[i] !== null &&
|
|
argTypes[i].destructorFunction === undefined
|
|
) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
function newFunc(constructor, argumentList) {
|
|
if (!(constructor instanceof Function)) {
|
|
throw new TypeError(
|
|
`new_ called with constructor type ${typeof constructor} which is not a function`,
|
|
)
|
|
}
|
|
var dummy = createNamedFunction(
|
|
constructor.name || "unknownFunctionName",
|
|
function () {},
|
|
)
|
|
dummy.prototype = constructor.prototype
|
|
var obj = new dummy()
|
|
var r = constructor.apply(obj, argumentList)
|
|
return r instanceof Object ? r : obj
|
|
}
|
|
function createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync) {
|
|
var needsDestructorStack = usesDestructorStack(argTypes)
|
|
var argCount = argTypes.length - 2
|
|
var argsList = []
|
|
var argsListWired = ["fn"]
|
|
if (isClassMethodFunc) {
|
|
argsListWired.push("thisWired")
|
|
}
|
|
for (var i = 0; i < argCount; ++i) {
|
|
argsList.push(`arg${i}`)
|
|
argsListWired.push(`arg${i}Wired`)
|
|
}
|
|
argsList = argsList.join(",")
|
|
argsListWired = argsListWired.join(",")
|
|
var invokerFnBody = `\n return function (${argsList}) {\n if (arguments.length !== ${argCount}) {\n throwBindingError('function ' + humanName + ' called with ' + arguments.length + ' arguments, expected ${argCount}');\n }`
|
|
if (needsDestructorStack) {
|
|
invokerFnBody += "var destructors = [];\n"
|
|
}
|
|
var dtorStack = needsDestructorStack ? "destructors" : "null"
|
|
var args1 = [
|
|
"humanName",
|
|
"throwBindingError",
|
|
"invoker",
|
|
"fn",
|
|
"runDestructors",
|
|
"retType",
|
|
"classParam",
|
|
]
|
|
if (isClassMethodFunc) {
|
|
invokerFnBody += `var thisWired = classParam['toWireType'](${dtorStack}, this);\n`
|
|
}
|
|
for (var i = 0; i < argCount; ++i) {
|
|
invokerFnBody += `var arg${i}Wired = argType${i}['toWireType'](${dtorStack}, arg${i});\n`
|
|
args1.push(`argType${i}`)
|
|
}
|
|
invokerFnBody +=
|
|
(returns || isAsync ? "var rv = " : "") + `invoker(${argsListWired});\n`
|
|
if (needsDestructorStack) {
|
|
invokerFnBody += "runDestructors(destructors);\n"
|
|
} else {
|
|
for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
|
|
var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired"
|
|
if (argTypes[i].destructorFunction !== null) {
|
|
invokerFnBody += `${paramName}_dtor(${paramName});\n`
|
|
args1.push(`${paramName}_dtor`)
|
|
}
|
|
}
|
|
}
|
|
if (returns) {
|
|
invokerFnBody +=
|
|
"var ret = retType['fromWireType'](rv);\n" + "return ret;\n"
|
|
} else {
|
|
}
|
|
invokerFnBody += "}\n"
|
|
return [args1, invokerFnBody]
|
|
}
|
|
function craftInvokerFunction(
|
|
humanName,
|
|
argTypes,
|
|
classType,
|
|
cppInvokerFunc,
|
|
cppTargetFunc,
|
|
isAsync,
|
|
) {
|
|
var argCount = argTypes.length
|
|
if (argCount < 2) {
|
|
throwBindingError(
|
|
"argTypes array size mismatch! Must at least get return value and 'this' types!",
|
|
)
|
|
}
|
|
var isClassMethodFunc = argTypes[1] !== null && classType !== null
|
|
var needsDestructorStack = usesDestructorStack(argTypes)
|
|
var returns = argTypes[0].name !== "void"
|
|
var closureArgs = [
|
|
humanName,
|
|
throwBindingError,
|
|
cppInvokerFunc,
|
|
cppTargetFunc,
|
|
runDestructors,
|
|
argTypes[0],
|
|
argTypes[1],
|
|
]
|
|
for (var i = 0; i < argCount - 2; ++i) {
|
|
closureArgs.push(argTypes[i + 2])
|
|
}
|
|
if (!needsDestructorStack) {
|
|
for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
|
|
if (argTypes[i].destructorFunction !== null) {
|
|
closureArgs.push(argTypes[i].destructorFunction)
|
|
}
|
|
}
|
|
}
|
|
let [args, invokerFnBody] = createJsInvoker(
|
|
argTypes,
|
|
isClassMethodFunc,
|
|
returns,
|
|
isAsync,
|
|
)
|
|
args.push(invokerFnBody)
|
|
var invokerFn = newFunc(Function, args)(...closureArgs)
|
|
return createNamedFunction(humanName, invokerFn)
|
|
}
|
|
var heap32VectorToArray = (count, firstElement) => {
|
|
var array = []
|
|
for (var i = 0; i < count; i++) {
|
|
array.push(HEAPU32[(firstElement + i * 4) >> 2])
|
|
}
|
|
return array
|
|
}
|
|
var getFunctionName = (signature) => {
|
|
signature = signature.trim()
|
|
const argsIndex = signature.indexOf("(")
|
|
if (argsIndex !== -1) {
|
|
return signature.substr(0, argsIndex)
|
|
} else {
|
|
return signature
|
|
}
|
|
}
|
|
var __embind_register_function = (
|
|
name,
|
|
argCount,
|
|
rawArgTypesAddr,
|
|
signature,
|
|
rawInvoker,
|
|
fn,
|
|
isAsync,
|
|
) => {
|
|
var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr)
|
|
name = readLatin1String(name)
|
|
name = getFunctionName(name)
|
|
rawInvoker = embind__requireFunction(signature, rawInvoker)
|
|
exposePublicSymbol(
|
|
name,
|
|
function () {
|
|
throwUnboundTypeError(
|
|
`Cannot call ${name} due to unbound types`,
|
|
argTypes,
|
|
)
|
|
},
|
|
argCount - 1,
|
|
)
|
|
whenDependentTypesAreResolved([], argTypes, (argTypes) => {
|
|
var invokerArgsArray = [argTypes[0], null].concat(argTypes.slice(1))
|
|
replacePublicSymbol(
|
|
name,
|
|
craftInvokerFunction(
|
|
name,
|
|
invokerArgsArray,
|
|
null,
|
|
rawInvoker,
|
|
fn,
|
|
isAsync,
|
|
),
|
|
argCount - 1,
|
|
)
|
|
return []
|
|
})
|
|
}
|
|
var integerReadValueFromPointer = (name, width, signed) => {
|
|
switch (width) {
|
|
case 1:
|
|
return signed
|
|
? (pointer) => HEAP8[pointer]
|
|
: (pointer) => HEAPU8[pointer]
|
|
case 2:
|
|
return signed
|
|
? (pointer) => HEAP16[pointer >> 1]
|
|
: (pointer) => HEAPU16[pointer >> 1]
|
|
case 4:
|
|
return signed
|
|
? (pointer) => HEAP32[pointer >> 2]
|
|
: (pointer) => HEAPU32[pointer >> 2]
|
|
default:
|
|
throw new TypeError(`invalid integer width (${width}): ${name}`)
|
|
}
|
|
}
|
|
var __embind_register_integer = (
|
|
primitiveType,
|
|
name,
|
|
size,
|
|
minRange,
|
|
maxRange,
|
|
) => {
|
|
name = readLatin1String(name)
|
|
if (maxRange === -1) {
|
|
maxRange = 4294967295
|
|
}
|
|
var fromWireType = (value) => value
|
|
if (minRange === 0) {
|
|
var bitshift = 32 - 8 * size
|
|
fromWireType = (value) => (value << bitshift) >>> bitshift
|
|
}
|
|
var isUnsignedType = name.includes("unsigned")
|
|
var checkAssertions = (value, toTypeName) => {}
|
|
var toWireType
|
|
if (isUnsignedType) {
|
|
toWireType = function (destructors, value) {
|
|
checkAssertions(value, this.name)
|
|
return value >>> 0
|
|
}
|
|
} else {
|
|
toWireType = function (destructors, value) {
|
|
checkAssertions(value, this.name)
|
|
return value
|
|
}
|
|
}
|
|
registerType(primitiveType, {
|
|
name,
|
|
fromWireType,
|
|
toWireType,
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: integerReadValueFromPointer(
|
|
name,
|
|
size,
|
|
minRange !== 0,
|
|
),
|
|
destructorFunction: null,
|
|
})
|
|
}
|
|
var __embind_register_memory_view = (rawType, dataTypeIndex, name) => {
|
|
var typeMapping = [
|
|
Int8Array,
|
|
Uint8Array,
|
|
Int16Array,
|
|
Uint16Array,
|
|
Int32Array,
|
|
Uint32Array,
|
|
Float32Array,
|
|
Float64Array,
|
|
]
|
|
var TA = typeMapping[dataTypeIndex]
|
|
function decodeMemoryView(handle) {
|
|
var size = HEAPU32[handle >> 2]
|
|
var data = HEAPU32[(handle + 4) >> 2]
|
|
return new TA(HEAP8.buffer, data, size)
|
|
}
|
|
name = readLatin1String(name)
|
|
registerType(
|
|
rawType,
|
|
{
|
|
name,
|
|
fromWireType: decodeMemoryView,
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: decodeMemoryView,
|
|
},
|
|
{ ignoreDuplicateRegistrations: true },
|
|
)
|
|
}
|
|
var stringToUTF8 = (str, outPtr, maxBytesToWrite) =>
|
|
stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
|
|
var __embind_register_std_string = (rawType, name) => {
|
|
name = readLatin1String(name)
|
|
var stdStringIsUTF8 = name === "std::string"
|
|
registerType(rawType, {
|
|
name,
|
|
fromWireType(value) {
|
|
var length = HEAPU32[value >> 2]
|
|
var payload = value + 4
|
|
var str
|
|
if (stdStringIsUTF8) {
|
|
var decodeStartPtr = payload
|
|
for (var i = 0; i <= length; ++i) {
|
|
var currentBytePtr = payload + i
|
|
if (i == length || HEAPU8[currentBytePtr] == 0) {
|
|
var maxRead = currentBytePtr - decodeStartPtr
|
|
var stringSegment = UTF8ToString(decodeStartPtr, maxRead)
|
|
if (str === undefined) {
|
|
str = stringSegment
|
|
} else {
|
|
str += String.fromCharCode(0)
|
|
str += stringSegment
|
|
}
|
|
decodeStartPtr = currentBytePtr + 1
|
|
}
|
|
}
|
|
} else {
|
|
var a = new Array(length)
|
|
for (var i = 0; i < length; ++i) {
|
|
a[i] = String.fromCharCode(HEAPU8[payload + i])
|
|
}
|
|
str = a.join("")
|
|
}
|
|
_free(value)
|
|
return str
|
|
},
|
|
toWireType(destructors, value) {
|
|
if (value instanceof ArrayBuffer) {
|
|
value = new Uint8Array(value)
|
|
}
|
|
var length
|
|
var valueIsOfTypeString = typeof value == "string"
|
|
if (
|
|
!(
|
|
valueIsOfTypeString ||
|
|
value instanceof Uint8Array ||
|
|
value instanceof Uint8ClampedArray ||
|
|
value instanceof Int8Array
|
|
)
|
|
) {
|
|
throwBindingError("Cannot pass non-string to std::string")
|
|
}
|
|
if (stdStringIsUTF8 && valueIsOfTypeString) {
|
|
length = lengthBytesUTF8(value)
|
|
} else {
|
|
length = value.length
|
|
}
|
|
var base = _malloc(4 + length + 1)
|
|
var ptr = base + 4
|
|
HEAPU32[base >> 2] = length
|
|
if (stdStringIsUTF8 && valueIsOfTypeString) {
|
|
stringToUTF8(value, ptr, length + 1)
|
|
} else {
|
|
if (valueIsOfTypeString) {
|
|
for (var i = 0; i < length; ++i) {
|
|
var charCode = value.charCodeAt(i)
|
|
if (charCode > 255) {
|
|
_free(ptr)
|
|
throwBindingError(
|
|
"String has UTF-16 code units that do not fit in 8 bits",
|
|
)
|
|
}
|
|
HEAPU8[ptr + i] = charCode
|
|
}
|
|
} else {
|
|
for (var i = 0; i < length; ++i) {
|
|
HEAPU8[ptr + i] = value[i]
|
|
}
|
|
}
|
|
}
|
|
if (destructors !== null) {
|
|
destructors.push(_free, base)
|
|
}
|
|
return base
|
|
},
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: readPointer,
|
|
destructorFunction(ptr) {
|
|
_free(ptr)
|
|
},
|
|
})
|
|
}
|
|
var UTF16Decoder =
|
|
typeof TextDecoder != "undefined"
|
|
? new TextDecoder("utf-16le")
|
|
: undefined
|
|
var UTF16ToString = (ptr, maxBytesToRead) => {
|
|
var endPtr = ptr
|
|
var idx = endPtr >> 1
|
|
var maxIdx = idx + maxBytesToRead / 2
|
|
while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx
|
|
endPtr = idx << 1
|
|
if (endPtr - ptr > 32 && UTF16Decoder)
|
|
return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr))
|
|
var str = ""
|
|
for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
|
|
var codeUnit = HEAP16[(ptr + i * 2) >> 1]
|
|
if (codeUnit == 0) break
|
|
str += String.fromCharCode(codeUnit)
|
|
}
|
|
return str
|
|
}
|
|
var stringToUTF16 = (str, outPtr, maxBytesToWrite) => {
|
|
maxBytesToWrite ??= 2147483647
|
|
if (maxBytesToWrite < 2) return 0
|
|
maxBytesToWrite -= 2
|
|
var startPtr = outPtr
|
|
var numCharsToWrite =
|
|
maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length
|
|
for (var i = 0; i < numCharsToWrite; ++i) {
|
|
var codeUnit = str.charCodeAt(i)
|
|
HEAP16[outPtr >> 1] = codeUnit
|
|
outPtr += 2
|
|
}
|
|
HEAP16[outPtr >> 1] = 0
|
|
return outPtr - startPtr
|
|
}
|
|
var lengthBytesUTF16 = (str) => str.length * 2
|
|
var UTF32ToString = (ptr, maxBytesToRead) => {
|
|
var i = 0
|
|
var str = ""
|
|
while (!(i >= maxBytesToRead / 4)) {
|
|
var utf32 = HEAP32[(ptr + i * 4) >> 2]
|
|
if (utf32 == 0) break
|
|
++i
|
|
if (utf32 >= 65536) {
|
|
var ch = utf32 - 65536
|
|
str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))
|
|
} else {
|
|
str += String.fromCharCode(utf32)
|
|
}
|
|
}
|
|
return str
|
|
}
|
|
var stringToUTF32 = (str, outPtr, maxBytesToWrite) => {
|
|
maxBytesToWrite ??= 2147483647
|
|
if (maxBytesToWrite < 4) return 0
|
|
var startPtr = outPtr
|
|
var endPtr = startPtr + maxBytesToWrite - 4
|
|
for (var i = 0; i < str.length; ++i) {
|
|
var codeUnit = str.charCodeAt(i)
|
|
if (codeUnit >= 55296 && codeUnit <= 57343) {
|
|
var trailSurrogate = str.charCodeAt(++i)
|
|
codeUnit =
|
|
(65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023)
|
|
}
|
|
HEAP32[outPtr >> 2] = codeUnit
|
|
outPtr += 4
|
|
if (outPtr + 4 > endPtr) break
|
|
}
|
|
HEAP32[outPtr >> 2] = 0
|
|
return outPtr - startPtr
|
|
}
|
|
var lengthBytesUTF32 = (str) => {
|
|
var len = 0
|
|
for (var i = 0; i < str.length; ++i) {
|
|
var codeUnit = str.charCodeAt(i)
|
|
if (codeUnit >= 55296 && codeUnit <= 57343) ++i
|
|
len += 4
|
|
}
|
|
return len
|
|
}
|
|
var __embind_register_std_wstring = (rawType, charSize, name) => {
|
|
name = readLatin1String(name)
|
|
var decodeString, encodeString, readCharAt, lengthBytesUTF
|
|
if (charSize === 2) {
|
|
decodeString = UTF16ToString
|
|
encodeString = stringToUTF16
|
|
lengthBytesUTF = lengthBytesUTF16
|
|
readCharAt = (pointer) => HEAPU16[pointer >> 1]
|
|
} else if (charSize === 4) {
|
|
decodeString = UTF32ToString
|
|
encodeString = stringToUTF32
|
|
lengthBytesUTF = lengthBytesUTF32
|
|
readCharAt = (pointer) => HEAPU32[pointer >> 2]
|
|
}
|
|
registerType(rawType, {
|
|
name,
|
|
fromWireType: (value) => {
|
|
var length = HEAPU32[value >> 2]
|
|
var str
|
|
var decodeStartPtr = value + 4
|
|
for (var i = 0; i <= length; ++i) {
|
|
var currentBytePtr = value + 4 + i * charSize
|
|
if (i == length || readCharAt(currentBytePtr) == 0) {
|
|
var maxReadBytes = currentBytePtr - decodeStartPtr
|
|
var stringSegment = decodeString(decodeStartPtr, maxReadBytes)
|
|
if (str === undefined) {
|
|
str = stringSegment
|
|
} else {
|
|
str += String.fromCharCode(0)
|
|
str += stringSegment
|
|
}
|
|
decodeStartPtr = currentBytePtr + charSize
|
|
}
|
|
}
|
|
_free(value)
|
|
return str
|
|
},
|
|
toWireType: (destructors, value) => {
|
|
if (!(typeof value == "string")) {
|
|
throwBindingError(
|
|
`Cannot pass non-string to C++ string type ${name}`,
|
|
)
|
|
}
|
|
var length = lengthBytesUTF(value)
|
|
var ptr = _malloc(4 + length + charSize)
|
|
HEAPU32[ptr >> 2] = length / charSize
|
|
encodeString(value, ptr + 4, length + charSize)
|
|
if (destructors !== null) {
|
|
destructors.push(_free, ptr)
|
|
}
|
|
return ptr
|
|
},
|
|
argPackAdvance: GenericWireTypeSize,
|
|
readValueFromPointer: readPointer,
|
|
destructorFunction(ptr) {
|
|
_free(ptr)
|
|
},
|
|
})
|
|
}
|
|
var __embind_register_value_object = (
|
|
rawType,
|
|
name,
|
|
constructorSignature,
|
|
rawConstructor,
|
|
destructorSignature,
|
|
rawDestructor,
|
|
) => {
|
|
structRegistrations[rawType] = {
|
|
name: readLatin1String(name),
|
|
rawConstructor: embind__requireFunction(
|
|
constructorSignature,
|
|
rawConstructor,
|
|
),
|
|
rawDestructor: embind__requireFunction(
|
|
destructorSignature,
|
|
rawDestructor,
|
|
),
|
|
fields: [],
|
|
}
|
|
}
|
|
var __embind_register_value_object_field = (
|
|
structType,
|
|
fieldName,
|
|
getterReturnType,
|
|
getterSignature,
|
|
getter,
|
|
getterContext,
|
|
setterArgumentType,
|
|
setterSignature,
|
|
setter,
|
|
setterContext,
|
|
) => {
|
|
structRegistrations[structType].fields.push({
|
|
fieldName: readLatin1String(fieldName),
|
|
getterReturnType,
|
|
getter: embind__requireFunction(getterSignature, getter),
|
|
getterContext,
|
|
setterArgumentType,
|
|
setter: embind__requireFunction(setterSignature, setter),
|
|
setterContext,
|
|
})
|
|
}
|
|
var __embind_register_void = (rawType, name) => {
|
|
name = readLatin1String(name)
|
|
registerType(rawType, {
|
|
isVoid: true,
|
|
name,
|
|
argPackAdvance: 0,
|
|
fromWireType: () => undefined,
|
|
toWireType: (destructors, o) => undefined,
|
|
})
|
|
}
|
|
var __emscripten_memcpy_js = (dest, src, num) =>
|
|
HEAPU8.copyWithin(dest, src, src + num)
|
|
var emval_symbols = {}
|
|
var getStringOrSymbol = (address) => {
|
|
var symbol = emval_symbols[address]
|
|
if (symbol === undefined) {
|
|
return readLatin1String(address)
|
|
}
|
|
return symbol
|
|
}
|
|
var emval_methodCallers = []
|
|
var __emval_call_method = (
|
|
caller,
|
|
objHandle,
|
|
methodName,
|
|
destructorsRef,
|
|
args,
|
|
) => {
|
|
caller = emval_methodCallers[caller]
|
|
objHandle = Emval.toValue(objHandle)
|
|
methodName = getStringOrSymbol(methodName)
|
|
return caller(objHandle, objHandle[methodName], destructorsRef, args)
|
|
}
|
|
var emval_addMethodCaller = (caller) => {
|
|
var id = emval_methodCallers.length
|
|
emval_methodCallers.push(caller)
|
|
return id
|
|
}
|
|
var emval_lookupTypes = (argCount, argTypes) => {
|
|
var a = new Array(argCount)
|
|
for (var i = 0; i < argCount; ++i) {
|
|
a[i] = requireRegisteredType(
|
|
HEAPU32[(argTypes + i * 4) >> 2],
|
|
"parameter " + i,
|
|
)
|
|
}
|
|
return a
|
|
}
|
|
var reflectConstruct = Reflect.construct
|
|
var emval_returnValue = (returnType, destructorsRef, handle) => {
|
|
var destructors = []
|
|
var result = returnType["toWireType"](destructors, handle)
|
|
if (destructors.length) {
|
|
HEAPU32[destructorsRef >> 2] = Emval.toHandle(destructors)
|
|
}
|
|
return result
|
|
}
|
|
var __emval_get_method_caller = (argCount, argTypes, kind) => {
|
|
var types = emval_lookupTypes(argCount, argTypes)
|
|
var retType = types.shift()
|
|
argCount--
|
|
var functionBody = `return function (obj, func, destructorsRef, args) {\n`
|
|
var offset = 0
|
|
var argsList = []
|
|
if (kind === 0) {
|
|
argsList.push("obj")
|
|
}
|
|
var params = ["retType"]
|
|
var args = [retType]
|
|
for (var i = 0; i < argCount; ++i) {
|
|
argsList.push("arg" + i)
|
|
params.push("argType" + i)
|
|
args.push(types[i])
|
|
functionBody += ` var arg${i} = argType${i}.readValueFromPointer(args${
|
|
offset ? "+" + offset : ""
|
|
});\n`
|
|
offset += types[i].argPackAdvance
|
|
}
|
|
var invoker = kind === 1 ? "new func" : "func.call"
|
|
functionBody += ` var rv = ${invoker}(${argsList.join(", ")});\n`
|
|
if (!retType.isVoid) {
|
|
params.push("emval_returnValue")
|
|
args.push(emval_returnValue)
|
|
functionBody +=
|
|
" return emval_returnValue(retType, destructorsRef, rv);\n"
|
|
}
|
|
functionBody += "};\n"
|
|
params.push(functionBody)
|
|
var invokerFunction = newFunc(Function, params)(...args)
|
|
var functionName = `methodCaller<(${types
|
|
.map((t) => t.name)
|
|
.join(", ")}) => ${retType.name}>`
|
|
return emval_addMethodCaller(
|
|
createNamedFunction(functionName, invokerFunction),
|
|
)
|
|
}
|
|
var __emval_incref = (handle) => {
|
|
if (handle > 9) {
|
|
emval_handles[handle + 1] += 1
|
|
}
|
|
}
|
|
var __emval_new_array = () => Emval.toHandle([])
|
|
var __emval_new_cstring = (v) => Emval.toHandle(getStringOrSymbol(v))
|
|
var __emval_new_object = () => Emval.toHandle({})
|
|
var __emval_run_destructors = (handle) => {
|
|
var destructors = Emval.toValue(handle)
|
|
runDestructors(destructors)
|
|
__emval_decref(handle)
|
|
}
|
|
var __emval_set_property = (handle, key, value) => {
|
|
handle = Emval.toValue(handle)
|
|
key = Emval.toValue(key)
|
|
value = Emval.toValue(value)
|
|
handle[key] = value
|
|
}
|
|
var __emval_take_value = (type, arg) => {
|
|
type = requireRegisteredType(type, "_emval_take_value")
|
|
var v = type["readValueFromPointer"](arg)
|
|
return Emval.toHandle(v)
|
|
}
|
|
var __tzset_js = (timezone, daylight, std_name, dst_name) => {
|
|
var currentYear = new Date().getFullYear()
|
|
var winter = new Date(currentYear, 0, 1)
|
|
var summer = new Date(currentYear, 6, 1)
|
|
var winterOffset = winter.getTimezoneOffset()
|
|
var summerOffset = summer.getTimezoneOffset()
|
|
var stdTimezoneOffset = Math.max(winterOffset, summerOffset)
|
|
HEAPU32[timezone >> 2] = stdTimezoneOffset * 60
|
|
HEAP32[daylight >> 2] = Number(winterOffset != summerOffset)
|
|
var extractZone = (timezoneOffset) => {
|
|
var sign = timezoneOffset >= 0 ? "-" : "+"
|
|
var absOffset = Math.abs(timezoneOffset)
|
|
var hours = String(Math.floor(absOffset / 60)).padStart(2, "0")
|
|
var minutes = String(absOffset % 60).padStart(2, "0")
|
|
return `UTC${sign}${hours}${minutes}`
|
|
}
|
|
var winterName = extractZone(winterOffset)
|
|
var summerName = extractZone(summerOffset)
|
|
if (summerOffset < winterOffset) {
|
|
stringToUTF8(winterName, std_name, 17)
|
|
stringToUTF8(summerName, dst_name, 17)
|
|
} else {
|
|
stringToUTF8(winterName, dst_name, 17)
|
|
stringToUTF8(summerName, std_name, 17)
|
|
}
|
|
}
|
|
var getHeapMax = () => 2147483648
|
|
var growMemory = (size) => {
|
|
var b = wasmMemory.buffer
|
|
var pages = (size - b.byteLength + 65535) / 65536
|
|
try {
|
|
wasmMemory.grow(pages)
|
|
updateMemoryViews()
|
|
return 1
|
|
} catch (e) {}
|
|
}
|
|
var _emscripten_resize_heap = (requestedSize) => {
|
|
var oldSize = HEAPU8.length
|
|
requestedSize >>>= 0
|
|
var maxHeapSize = getHeapMax()
|
|
if (requestedSize > maxHeapSize) {
|
|
return false
|
|
}
|
|
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
|
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown)
|
|
overGrownHeapSize = Math.min(
|
|
overGrownHeapSize,
|
|
requestedSize + 100663296,
|
|
)
|
|
var newSize = Math.min(
|
|
maxHeapSize,
|
|
alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536),
|
|
)
|
|
var replacement = growMemory(newSize)
|
|
if (replacement) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
var ENV = {}
|
|
var getExecutableName = () => thisProgram || "./this.program"
|
|
var getEnvStrings = () => {
|
|
if (!getEnvStrings.strings) {
|
|
var lang =
|
|
(
|
|
(typeof navigator == "object" &&
|
|
navigator.languages &&
|
|
navigator.languages[0]) ||
|
|
"C"
|
|
).replace("-", "_") + ".UTF-8"
|
|
var env = {
|
|
USER: "web_user",
|
|
LOGNAME: "web_user",
|
|
PATH: "/",
|
|
PWD: "/",
|
|
HOME: "/home/web_user",
|
|
LANG: lang,
|
|
_: getExecutableName(),
|
|
}
|
|
for (var x in ENV) {
|
|
if (ENV[x] === undefined) delete env[x]
|
|
else env[x] = ENV[x]
|
|
}
|
|
var strings = []
|
|
for (var x in env) {
|
|
strings.push(`${x}=${env[x]}`)
|
|
}
|
|
getEnvStrings.strings = strings
|
|
}
|
|
return getEnvStrings.strings
|
|
}
|
|
var stringToAscii = (str, buffer) => {
|
|
for (var i = 0; i < str.length; ++i) {
|
|
HEAP8[buffer++] = str.charCodeAt(i)
|
|
}
|
|
HEAP8[buffer] = 0
|
|
}
|
|
var _environ_get = (__environ, environ_buf) => {
|
|
var bufSize = 0
|
|
getEnvStrings().forEach((string, i) => {
|
|
var ptr = environ_buf + bufSize
|
|
HEAPU32[(__environ + i * 4) >> 2] = ptr
|
|
stringToAscii(string, ptr)
|
|
bufSize += string.length + 1
|
|
})
|
|
return 0
|
|
}
|
|
var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
|
|
var strings = getEnvStrings()
|
|
HEAPU32[penviron_count >> 2] = strings.length
|
|
var bufSize = 0
|
|
strings.forEach((string) => (bufSize += string.length + 1))
|
|
HEAPU32[penviron_buf_size >> 2] = bufSize
|
|
return 0
|
|
}
|
|
function _fd_close(fd) {
|
|
try {
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
FS.close(stream)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return e.errno
|
|
}
|
|
}
|
|
var doReadv = (stream, iov, iovcnt, offset) => {
|
|
var ret = 0
|
|
for (var i = 0; i < iovcnt; i++) {
|
|
var ptr = HEAPU32[iov >> 2]
|
|
var len = HEAPU32[(iov + 4) >> 2]
|
|
iov += 8
|
|
var curr = FS.read(stream, HEAP8, ptr, len, offset)
|
|
if (curr < 0) return -1
|
|
ret += curr
|
|
if (curr < len) break
|
|
if (typeof offset != "undefined") {
|
|
offset += curr
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
function _fd_read(fd, iov, iovcnt, pnum) {
|
|
try {
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
var num = doReadv(stream, iov, iovcnt)
|
|
HEAPU32[pnum >> 2] = num
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return e.errno
|
|
}
|
|
}
|
|
var convertI32PairToI53Checked = (lo, hi) =>
|
|
(hi + 2097152) >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN
|
|
function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
|
|
var offset = convertI32PairToI53Checked(offset_low, offset_high)
|
|
try {
|
|
if (isNaN(offset)) return 61
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
FS.llseek(stream, offset, whence)
|
|
;(tempI64 = [
|
|
stream.position >>> 0,
|
|
((tempDouble = stream.position),
|
|
+Math.abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? +Math.floor(tempDouble / 4294967296) >>> 0
|
|
: ~~+Math.ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296,
|
|
) >>> 0
|
|
: 0),
|
|
]),
|
|
(HEAP32[newOffset >> 2] = tempI64[0]),
|
|
(HEAP32[(newOffset + 4) >> 2] = tempI64[1])
|
|
if (stream.getdents && offset === 0 && whence === 0)
|
|
stream.getdents = null
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return e.errno
|
|
}
|
|
}
|
|
var doWritev = (stream, iov, iovcnt, offset) => {
|
|
var ret = 0
|
|
for (var i = 0; i < iovcnt; i++) {
|
|
var ptr = HEAPU32[iov >> 2]
|
|
var len = HEAPU32[(iov + 4) >> 2]
|
|
iov += 8
|
|
var curr = FS.write(stream, HEAP8, ptr, len, offset)
|
|
if (curr < 0) return -1
|
|
ret += curr
|
|
if (curr < len) {
|
|
break
|
|
}
|
|
if (typeof offset != "undefined") {
|
|
offset += curr
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
function _fd_write(fd, iov, iovcnt, pnum) {
|
|
try {
|
|
var stream = SYSCALLS.getStreamFromFD(fd)
|
|
var num = doWritev(stream, iov, iovcnt)
|
|
HEAPU32[pnum >> 2] = num
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e
|
|
return e.errno
|
|
}
|
|
}
|
|
FS.createPreloadedFile = FS_createPreloadedFile
|
|
FS.staticInit()
|
|
InternalError = Module["InternalError"] = class InternalError extends (
|
|
Error
|
|
) {
|
|
constructor(message) {
|
|
super(message)
|
|
this.name = "InternalError"
|
|
}
|
|
}
|
|
embind_init_charCodes()
|
|
BindingError = Module["BindingError"] = class BindingError extends Error {
|
|
constructor(message) {
|
|
super(message)
|
|
this.name = "BindingError"
|
|
}
|
|
}
|
|
init_ClassHandle()
|
|
init_embind()
|
|
init_RegisteredPointer()
|
|
UnboundTypeError = Module["UnboundTypeError"] = extendError(
|
|
Error,
|
|
"UnboundTypeError",
|
|
)
|
|
init_emval()
|
|
var wasmImports = {
|
|
b: ___assert_fail,
|
|
p: ___cxa_throw,
|
|
r: ___syscall_fcntl64,
|
|
D: ___syscall_ioctl,
|
|
H: ___syscall_openat,
|
|
G: ___syscall_unlinkat,
|
|
E: __abort_js,
|
|
w: __embind_finalize_value_object,
|
|
z: __embind_register_bigint,
|
|
K: __embind_register_bool,
|
|
m: __embind_register_class,
|
|
J: __embind_register_emval,
|
|
j: __embind_register_enum,
|
|
a: __embind_register_enum_value,
|
|
v: __embind_register_float,
|
|
f: __embind_register_function,
|
|
i: __embind_register_integer,
|
|
d: __embind_register_memory_view,
|
|
u: __embind_register_std_string,
|
|
o: __embind_register_std_wstring,
|
|
x: __embind_register_value_object,
|
|
l: __embind_register_value_object_field,
|
|
L: __embind_register_void,
|
|
I: __emscripten_memcpy_js,
|
|
N: __emval_call_method,
|
|
c: __emval_decref,
|
|
O: __emval_get_method_caller,
|
|
P: __emval_incref,
|
|
q: __emval_new_array,
|
|
h: __emval_new_cstring,
|
|
k: __emval_new_object,
|
|
M: __emval_run_destructors,
|
|
g: __emval_set_property,
|
|
e: __emval_take_value,
|
|
A: __tzset_js,
|
|
F: _emscripten_resize_heap,
|
|
B: _environ_get,
|
|
C: _environ_sizes_get,
|
|
s: _fd_close,
|
|
t: _fd_read,
|
|
y: _fd_seek,
|
|
n: _fd_write,
|
|
}
|
|
var wasmExports = createWasm()
|
|
var ___wasm_call_ctors = wasmExports["R"]
|
|
var _memcpy = (Module["_memcpy"] = wasmExports["T"])
|
|
var _heif_color_conversion_options_set_defaults = (Module[
|
|
"_heif_color_conversion_options_set_defaults"
|
|
] = wasmExports["U"])
|
|
var _malloc = (Module["_malloc"] = wasmExports["V"])
|
|
var _heif_nclx_color_profile_set_color_primaries = (Module[
|
|
"_heif_nclx_color_profile_set_color_primaries"
|
|
] = wasmExports["W"])
|
|
var _free = (Module["_free"] = wasmExports["X"])
|
|
var _heif_nclx_color_profile_set_transfer_characteristics = (Module[
|
|
"_heif_nclx_color_profile_set_transfer_characteristics"
|
|
] = wasmExports["Y"])
|
|
var _heif_nclx_color_profile_set_matrix_coefficients = (Module[
|
|
"_heif_nclx_color_profile_set_matrix_coefficients"
|
|
] = wasmExports["Z"])
|
|
var _heif_init = (Module["_heif_init"] = wasmExports["_"])
|
|
var _heif_deinit = (Module["_heif_deinit"] = wasmExports["$"])
|
|
var _heif_load_plugin = (Module["_heif_load_plugin"] = wasmExports["aa"])
|
|
var _heif_unload_plugin = (Module["_heif_unload_plugin"] =
|
|
wasmExports["ba"])
|
|
var _heif_load_plugins = (Module["_heif_load_plugins"] = wasmExports["ca"])
|
|
var _heif_get_plugin_directories = (Module["_heif_get_plugin_directories"] =
|
|
wasmExports["da"])
|
|
var _heif_free_plugin_directories = (Module[
|
|
"_heif_free_plugin_directories"
|
|
] = wasmExports["ea"])
|
|
var _heif_get_version = (Module["_heif_get_version"] = wasmExports["fa"])
|
|
var _heif_get_version_number = (Module["_heif_get_version_number"] =
|
|
wasmExports["ga"])
|
|
var _heif_get_version_number_major = (Module[
|
|
"_heif_get_version_number_major"
|
|
] = wasmExports["ha"])
|
|
var _heif_get_version_number_minor = (Module[
|
|
"_heif_get_version_number_minor"
|
|
] = wasmExports["ia"])
|
|
var _heif_get_version_number_maintenance = (Module[
|
|
"_heif_get_version_number_maintenance"
|
|
] = wasmExports["ja"])
|
|
var _heif_check_filetype = (Module["_heif_check_filetype"] =
|
|
wasmExports["ka"])
|
|
var _heif_read_main_brand = (Module["_heif_read_main_brand"] =
|
|
wasmExports["la"])
|
|
var _heif_has_compatible_filetype = (Module[
|
|
"_heif_has_compatible_filetype"
|
|
] = wasmExports["ma"])
|
|
var _heif_list_compatible_brands = (Module["_heif_list_compatible_brands"] =
|
|
wasmExports["na"])
|
|
var _heif_free_list_of_compatible_brands = (Module[
|
|
"_heif_free_list_of_compatible_brands"
|
|
] = wasmExports["oa"])
|
|
var _heif_check_jpeg_filetype = (Module["_heif_check_jpeg_filetype"] =
|
|
wasmExports["pa"])
|
|
var _heif_main_brand = (Module["_heif_main_brand"] = wasmExports["qa"])
|
|
var _heif_fourcc_to_brand = (Module["_heif_fourcc_to_brand"] =
|
|
wasmExports["ra"])
|
|
var _heif_read_minor_version_brand = (Module[
|
|
"_heif_read_minor_version_brand"
|
|
] = wasmExports["sa"])
|
|
var _heif_brand_to_fourcc = (Module["_heif_brand_to_fourcc"] =
|
|
wasmExports["ta"])
|
|
var _heif_has_compatible_brand = (Module["_heif_has_compatible_brand"] =
|
|
wasmExports["ua"])
|
|
var _heif_get_global_security_limits = (Module[
|
|
"_heif_get_global_security_limits"
|
|
] = wasmExports["va"])
|
|
var _heif_get_file_mime_type = (Module["_heif_get_file_mime_type"] =
|
|
wasmExports["wa"])
|
|
var _heif_get_disabled_security_limits = (Module[
|
|
"_heif_get_disabled_security_limits"
|
|
] = wasmExports["xa"])
|
|
var _heif_context_get_security_limits = (Module[
|
|
"_heif_context_get_security_limits"
|
|
] = wasmExports["ya"])
|
|
var _heif_context_set_security_limits = (Module[
|
|
"_heif_context_set_security_limits"
|
|
] = wasmExports["za"])
|
|
var _heif_context_alloc = (Module["_heif_context_alloc"] =
|
|
wasmExports["Aa"])
|
|
var _heif_context_free = (Module["_heif_context_free"] = wasmExports["Ba"])
|
|
var _heif_context_read_from_file = (Module["_heif_context_read_from_file"] =
|
|
wasmExports["Ca"])
|
|
var _heif_context_read_from_memory = (Module[
|
|
"_heif_context_read_from_memory"
|
|
] = wasmExports["Da"])
|
|
var _heif_context_read_from_memory_without_copy = (Module[
|
|
"_heif_context_read_from_memory_without_copy"
|
|
] = wasmExports["Ea"])
|
|
var _heif_context_read_from_reader = (Module[
|
|
"_heif_context_read_from_reader"
|
|
] = wasmExports["Fa"])
|
|
var _heif_context_debug_dump_boxes_to_file = (Module[
|
|
"_heif_context_debug_dump_boxes_to_file"
|
|
] = wasmExports["Ga"])
|
|
var _heif_context_get_primary_image_handle = (Module[
|
|
"_heif_context_get_primary_image_handle"
|
|
] = wasmExports["Ha"])
|
|
var _heif_context_get_primary_image_ID = (Module[
|
|
"_heif_context_get_primary_image_ID"
|
|
] = wasmExports["Ia"])
|
|
var _heif_context_is_top_level_image_ID = (Module[
|
|
"_heif_context_is_top_level_image_ID"
|
|
] = wasmExports["Ja"])
|
|
var _heif_context_get_number_of_top_level_images = (Module[
|
|
"_heif_context_get_number_of_top_level_images"
|
|
] = wasmExports["Ka"])
|
|
var _heif_context_get_list_of_top_level_image_IDs = (Module[
|
|
"_heif_context_get_list_of_top_level_image_IDs"
|
|
] = wasmExports["La"])
|
|
var _heif_context_get_image_handle = (Module[
|
|
"_heif_context_get_image_handle"
|
|
] = wasmExports["Ma"])
|
|
var _heif_image_handle_is_primary_image = (Module[
|
|
"_heif_image_handle_is_primary_image"
|
|
] = wasmExports["Na"])
|
|
var _heif_image_handle_get_item_id = (Module[
|
|
"_heif_image_handle_get_item_id"
|
|
] = wasmExports["Oa"])
|
|
var _heif_image_handle_get_number_of_thumbnails = (Module[
|
|
"_heif_image_handle_get_number_of_thumbnails"
|
|
] = wasmExports["Pa"])
|
|
var _heif_image_handle_get_list_of_thumbnail_IDs = (Module[
|
|
"_heif_image_handle_get_list_of_thumbnail_IDs"
|
|
] = wasmExports["Qa"])
|
|
var _heif_image_handle_get_thumbnail = (Module[
|
|
"_heif_image_handle_get_thumbnail"
|
|
] = wasmExports["Ra"])
|
|
var _heif_image_handle_get_number_of_auxiliary_images = (Module[
|
|
"_heif_image_handle_get_number_of_auxiliary_images"
|
|
] = wasmExports["Sa"])
|
|
var _heif_image_handle_get_list_of_auxiliary_image_IDs = (Module[
|
|
"_heif_image_handle_get_list_of_auxiliary_image_IDs"
|
|
] = wasmExports["Ta"])
|
|
var _heif_image_handle_get_auxiliary_type = (Module[
|
|
"_heif_image_handle_get_auxiliary_type"
|
|
] = wasmExports["Ua"])
|
|
var _heif_image_handle_release_auxiliary_type = (Module[
|
|
"_heif_image_handle_release_auxiliary_type"
|
|
] = wasmExports["Va"])
|
|
var _heif_image_handle_free_auxiliary_types = (Module[
|
|
"_heif_image_handle_free_auxiliary_types"
|
|
] = wasmExports["Wa"])
|
|
var _heif_image_handle_get_auxiliary_image_handle = (Module[
|
|
"_heif_image_handle_get_auxiliary_image_handle"
|
|
] = wasmExports["Xa"])
|
|
var _heif_image_handle_get_width = (Module["_heif_image_handle_get_width"] =
|
|
wasmExports["Ya"])
|
|
var _heif_image_handle_get_height = (Module[
|
|
"_heif_image_handle_get_height"
|
|
] = wasmExports["Za"])
|
|
var _heif_image_handle_get_ispe_width = (Module[
|
|
"_heif_image_handle_get_ispe_width"
|
|
] = wasmExports["_a"])
|
|
var _heif_image_handle_get_ispe_height = (Module[
|
|
"_heif_image_handle_get_ispe_height"
|
|
] = wasmExports["$a"])
|
|
var _heif_image_handle_get_context = (Module[
|
|
"_heif_image_handle_get_context"
|
|
] = wasmExports["ab"])
|
|
var _heif_image_handle_get_image_tiling = (Module[
|
|
"_heif_image_handle_get_image_tiling"
|
|
] = wasmExports["bb"])
|
|
var _heif_image_handle_get_grid_image_tile_id = (Module[
|
|
"_heif_image_handle_get_grid_image_tile_id"
|
|
] = wasmExports["cb"])
|
|
var _heif_context_get_entity_groups = (Module[
|
|
"_heif_context_get_entity_groups"
|
|
] = wasmExports["db"])
|
|
var _heif_entity_groups_release = (Module["_heif_entity_groups_release"] =
|
|
wasmExports["eb"])
|
|
var _heif_image_handle_get_preferred_decoding_colorspace = (Module[
|
|
"_heif_image_handle_get_preferred_decoding_colorspace"
|
|
] = wasmExports["fb"])
|
|
var _heif_image_handle_has_alpha_channel = (Module[
|
|
"_heif_image_handle_has_alpha_channel"
|
|
] = wasmExports["gb"])
|
|
var _heif_image_handle_is_premultiplied_alpha = (Module[
|
|
"_heif_image_handle_is_premultiplied_alpha"
|
|
] = wasmExports["hb"])
|
|
var _heif_image_handle_get_luma_bits_per_pixel = (Module[
|
|
"_heif_image_handle_get_luma_bits_per_pixel"
|
|
] = wasmExports["ib"])
|
|
var _heif_image_handle_get_chroma_bits_per_pixel = (Module[
|
|
"_heif_image_handle_get_chroma_bits_per_pixel"
|
|
] = wasmExports["jb"])
|
|
var _heif_image_handle_has_depth_image = (Module[
|
|
"_heif_image_handle_has_depth_image"
|
|
] = wasmExports["kb"])
|
|
var _heif_depth_representation_info_free = (Module[
|
|
"_heif_depth_representation_info_free"
|
|
] = wasmExports["lb"])
|
|
var _heif_image_handle_get_depth_image_representation_info = (Module[
|
|
"_heif_image_handle_get_depth_image_representation_info"
|
|
] = wasmExports["mb"])
|
|
var _heif_image_handle_get_number_of_depth_images = (Module[
|
|
"_heif_image_handle_get_number_of_depth_images"
|
|
] = wasmExports["nb"])
|
|
var _heif_image_handle_get_list_of_depth_image_IDs = (Module[
|
|
"_heif_image_handle_get_list_of_depth_image_IDs"
|
|
] = wasmExports["ob"])
|
|
var _heif_image_handle_get_depth_image_handle = (Module[
|
|
"_heif_image_handle_get_depth_image_handle"
|
|
] = wasmExports["pb"])
|
|
var _heif_decoding_options_alloc = (Module["_heif_decoding_options_alloc"] =
|
|
wasmExports["qb"])
|
|
var _heif_decoding_options_free = (Module["_heif_decoding_options_free"] =
|
|
wasmExports["rb"])
|
|
var _heif_decode_image = (Module["_heif_decode_image"] = wasmExports["sb"])
|
|
var _heif_image_handle_decode_image_tile = (Module[
|
|
"_heif_image_handle_decode_image_tile"
|
|
] = wasmExports["tb"])
|
|
var _heif_image_create = (Module["_heif_image_create"] = wasmExports["ub"])
|
|
var _heif_image_get_decoding_warnings = (Module[
|
|
"_heif_image_get_decoding_warnings"
|
|
] = wasmExports["vb"])
|
|
var _heif_image_add_decoding_warning = (Module[
|
|
"_heif_image_add_decoding_warning"
|
|
] = wasmExports["wb"])
|
|
var _heif_image_has_content_light_level = (Module[
|
|
"_heif_image_has_content_light_level"
|
|
] = wasmExports["xb"])
|
|
var _heif_image_get_content_light_level = (Module[
|
|
"_heif_image_get_content_light_level"
|
|
] = wasmExports["yb"])
|
|
var _heif_image_handle_get_content_light_level = (Module[
|
|
"_heif_image_handle_get_content_light_level"
|
|
] = wasmExports["zb"])
|
|
var _heif_image_set_content_light_level = (Module[
|
|
"_heif_image_set_content_light_level"
|
|
] = wasmExports["Ab"])
|
|
var _heif_image_has_mastering_display_colour_volume = (Module[
|
|
"_heif_image_has_mastering_display_colour_volume"
|
|
] = wasmExports["Bb"])
|
|
var _heif_image_get_mastering_display_colour_volume = (Module[
|
|
"_heif_image_get_mastering_display_colour_volume"
|
|
] = wasmExports["Cb"])
|
|
var _heif_image_handle_get_mastering_display_colour_volume = (Module[
|
|
"_heif_image_handle_get_mastering_display_colour_volume"
|
|
] = wasmExports["Db"])
|
|
var _heif_image_set_mastering_display_colour_volume = (Module[
|
|
"_heif_image_set_mastering_display_colour_volume"
|
|
] = wasmExports["Eb"])
|
|
var _heif_mastering_display_colour_volume_decode = (Module[
|
|
"_heif_mastering_display_colour_volume_decode"
|
|
] = wasmExports["Fb"])
|
|
var _heif_image_get_pixel_aspect_ratio = (Module[
|
|
"_heif_image_get_pixel_aspect_ratio"
|
|
] = wasmExports["Gb"])
|
|
var _heif_image_handle_get_pixel_aspect_ratio = (Module[
|
|
"_heif_image_handle_get_pixel_aspect_ratio"
|
|
] = wasmExports["Hb"])
|
|
var _heif_image_set_pixel_aspect_ratio = (Module[
|
|
"_heif_image_set_pixel_aspect_ratio"
|
|
] = wasmExports["Ib"])
|
|
var _heif_image_release = (Module["_heif_image_release"] =
|
|
wasmExports["Jb"])
|
|
var _heif_image_handle_release = (Module["_heif_image_handle_release"] =
|
|
wasmExports["Kb"])
|
|
var _heif_image_get_colorspace = (Module["_heif_image_get_colorspace"] =
|
|
wasmExports["Lb"])
|
|
var _heif_image_get_chroma_format = (Module[
|
|
"_heif_image_get_chroma_format"
|
|
] = wasmExports["Mb"])
|
|
var _heif_image_get_width = (Module["_heif_image_get_width"] =
|
|
wasmExports["Nb"])
|
|
var _heif_image_get_height = (Module["_heif_image_get_height"] =
|
|
wasmExports["Ob"])
|
|
var _heif_image_get_primary_width = (Module[
|
|
"_heif_image_get_primary_width"
|
|
] = wasmExports["Pb"])
|
|
var _heif_image_get_primary_height = (Module[
|
|
"_heif_image_get_primary_height"
|
|
] = wasmExports["Qb"])
|
|
var _heif_image_crop = (Module["_heif_image_crop"] = wasmExports["Rb"])
|
|
var _heif_image_get_bits_per_pixel = (Module[
|
|
"_heif_image_get_bits_per_pixel"
|
|
] = wasmExports["Sb"])
|
|
var _heif_image_get_bits_per_pixel_range = (Module[
|
|
"_heif_image_get_bits_per_pixel_range"
|
|
] = wasmExports["Tb"])
|
|
var _heif_image_has_channel = (Module["_heif_image_has_channel"] =
|
|
wasmExports["Ub"])
|
|
var _heif_image_add_plane = (Module["_heif_image_add_plane"] =
|
|
wasmExports["Vb"])
|
|
var _heif_image_get_plane_readonly = (Module[
|
|
"_heif_image_get_plane_readonly"
|
|
] = wasmExports["Wb"])
|
|
var _heif_image_get_plane = (Module["_heif_image_get_plane"] =
|
|
wasmExports["Xb"])
|
|
var _heif_image_set_premultiplied_alpha = (Module[
|
|
"_heif_image_set_premultiplied_alpha"
|
|
] = wasmExports["Yb"])
|
|
var _heif_image_is_premultiplied_alpha = (Module[
|
|
"_heif_image_is_premultiplied_alpha"
|
|
] = wasmExports["Zb"])
|
|
var _heif_image_extend_padding_to_size = (Module[
|
|
"_heif_image_extend_padding_to_size"
|
|
] = wasmExports["_b"])
|
|
var _heif_image_scale_image = (Module["_heif_image_scale_image"] =
|
|
wasmExports["$b"])
|
|
var _heif_image_extend_to_size_fill_with_zero = (Module[
|
|
"_heif_image_extend_to_size_fill_with_zero"
|
|
] = wasmExports["ac"])
|
|
var _heif_image_set_raw_color_profile = (Module[
|
|
"_heif_image_set_raw_color_profile"
|
|
] = wasmExports["bc"])
|
|
var _heif_image_set_nclx_color_profile = (Module[
|
|
"_heif_image_set_nclx_color_profile"
|
|
] = wasmExports["cc"])
|
|
var _heif_image_handle_get_number_of_metadata_blocks = (Module[
|
|
"_heif_image_handle_get_number_of_metadata_blocks"
|
|
] = wasmExports["dc"])
|
|
var _heif_image_handle_get_list_of_metadata_block_IDs = (Module[
|
|
"_heif_image_handle_get_list_of_metadata_block_IDs"
|
|
] = wasmExports["ec"])
|
|
var _heif_image_handle_get_metadata_type = (Module[
|
|
"_heif_image_handle_get_metadata_type"
|
|
] = wasmExports["fc"])
|
|
var _heif_image_handle_get_metadata_content_type = (Module[
|
|
"_heif_image_handle_get_metadata_content_type"
|
|
] = wasmExports["gc"])
|
|
var _heif_image_handle_get_metadata_item_uri_type = (Module[
|
|
"_heif_image_handle_get_metadata_item_uri_type"
|
|
] = wasmExports["hc"])
|
|
var _heif_image_handle_get_metadata_size = (Module[
|
|
"_heif_image_handle_get_metadata_size"
|
|
] = wasmExports["ic"])
|
|
var _heif_image_handle_get_metadata = (Module[
|
|
"_heif_image_handle_get_metadata"
|
|
] = wasmExports["jc"])
|
|
var _heif_image_handle_get_color_profile_type = (Module[
|
|
"_heif_image_handle_get_color_profile_type"
|
|
] = wasmExports["kc"])
|
|
var _heif_image_handle_get_raw_color_profile_size = (Module[
|
|
"_heif_image_handle_get_raw_color_profile_size"
|
|
] = wasmExports["lc"])
|
|
var _heif_image_handle_get_nclx_color_profile = (Module[
|
|
"_heif_image_handle_get_nclx_color_profile"
|
|
] = wasmExports["mc"])
|
|
var _heif_image_handle_get_raw_color_profile = (Module[
|
|
"_heif_image_handle_get_raw_color_profile"
|
|
] = wasmExports["nc"])
|
|
var _heif_image_get_color_profile_type = (Module[
|
|
"_heif_image_get_color_profile_type"
|
|
] = wasmExports["oc"])
|
|
var _heif_image_get_raw_color_profile_size = (Module[
|
|
"_heif_image_get_raw_color_profile_size"
|
|
] = wasmExports["pc"])
|
|
var _heif_image_get_raw_color_profile = (Module[
|
|
"_heif_image_get_raw_color_profile"
|
|
] = wasmExports["qc"])
|
|
var _heif_image_get_nclx_color_profile = (Module[
|
|
"_heif_image_get_nclx_color_profile"
|
|
] = wasmExports["rc"])
|
|
var _heif_nclx_color_profile_alloc = (Module[
|
|
"_heif_nclx_color_profile_alloc"
|
|
] = wasmExports["sc"])
|
|
var _heif_nclx_color_profile_free = (Module[
|
|
"_heif_nclx_color_profile_free"
|
|
] = wasmExports["tc"])
|
|
var _heif_image_handle_has_camera_intrinsic_matrix = (Module[
|
|
"_heif_image_handle_has_camera_intrinsic_matrix"
|
|
] = wasmExports["uc"])
|
|
var _heif_image_handle_get_camera_intrinsic_matrix = (Module[
|
|
"_heif_image_handle_get_camera_intrinsic_matrix"
|
|
] = wasmExports["vc"])
|
|
var _heif_image_handle_has_camera_extrinsic_matrix = (Module[
|
|
"_heif_image_handle_has_camera_extrinsic_matrix"
|
|
] = wasmExports["wc"])
|
|
var _heif_image_handle_get_camera_extrinsic_matrix = (Module[
|
|
"_heif_image_handle_get_camera_extrinsic_matrix"
|
|
] = wasmExports["xc"])
|
|
var _heif_camera_extrinsic_matrix_release = (Module[
|
|
"_heif_camera_extrinsic_matrix_release"
|
|
] = wasmExports["yc"])
|
|
var _heif_camera_extrinsic_matrix_get_rotation_matrix = (Module[
|
|
"_heif_camera_extrinsic_matrix_get_rotation_matrix"
|
|
] = wasmExports["zc"])
|
|
var _heif_register_decoder = (Module["_heif_register_decoder"] =
|
|
wasmExports["Ac"])
|
|
var _heif_register_decoder_plugin = (Module[
|
|
"_heif_register_decoder_plugin"
|
|
] = wasmExports["Bc"])
|
|
var _heif_register_encoder_plugin = (Module[
|
|
"_heif_register_encoder_plugin"
|
|
] = wasmExports["Cc"])
|
|
var _heif_context_write_to_file = (Module["_heif_context_write_to_file"] =
|
|
wasmExports["Dc"])
|
|
var _heif_context_write = (Module["_heif_context_write"] =
|
|
wasmExports["Ec"])
|
|
var _heif_context_add_compatible_brand = (Module[
|
|
"_heif_context_add_compatible_brand"
|
|
] = wasmExports["Fc"])
|
|
var _heif_context_get_encoder_descriptors = (Module[
|
|
"_heif_context_get_encoder_descriptors"
|
|
] = wasmExports["Gc"])
|
|
var _heif_get_encoder_descriptors = (Module[
|
|
"_heif_get_encoder_descriptors"
|
|
] = wasmExports["Hc"])
|
|
var _heif_encoder_descriptor_get_name = (Module[
|
|
"_heif_encoder_descriptor_get_name"
|
|
] = wasmExports["Ic"])
|
|
var _heif_encoder_descriptor_get_id_name = (Module[
|
|
"_heif_encoder_descriptor_get_id_name"
|
|
] = wasmExports["Jc"])
|
|
var _heif_get_decoder_descriptors = (Module[
|
|
"_heif_get_decoder_descriptors"
|
|
] = wasmExports["Kc"])
|
|
var _heif_decoder_descriptor_get_name = (Module[
|
|
"_heif_decoder_descriptor_get_name"
|
|
] = wasmExports["Lc"])
|
|
var _heif_decoder_descriptor_get_id_name = (Module[
|
|
"_heif_decoder_descriptor_get_id_name"
|
|
] = wasmExports["Mc"])
|
|
var _heif_encoder_descriptor_get_compression_format = (Module[
|
|
"_heif_encoder_descriptor_get_compression_format"
|
|
] = wasmExports["Nc"])
|
|
var _heif_encoder_descriptor_supports_lossy_compression = (Module[
|
|
"_heif_encoder_descriptor_supports_lossy_compression"
|
|
] = wasmExports["Oc"])
|
|
var _heif_encoder_descriptor_supports_lossless_compression = (Module[
|
|
"_heif_encoder_descriptor_supports_lossless_compression"
|
|
] = wasmExports["Pc"])
|
|
var _heif_encoder_descriptor_supportes_lossy_compression = (Module[
|
|
"_heif_encoder_descriptor_supportes_lossy_compression"
|
|
] = wasmExports["Qc"])
|
|
var _heif_encoder_descriptor_supportes_lossless_compression = (Module[
|
|
"_heif_encoder_descriptor_supportes_lossless_compression"
|
|
] = wasmExports["Rc"])
|
|
var _heif_encoder_get_name = (Module["_heif_encoder_get_name"] =
|
|
wasmExports["Sc"])
|
|
var _heif_context_get_encoder = (Module["_heif_context_get_encoder"] =
|
|
wasmExports["Tc"])
|
|
var _heif_have_decoder_for_format = (Module[
|
|
"_heif_have_decoder_for_format"
|
|
] = wasmExports["Uc"])
|
|
var _heif_have_encoder_for_format = (Module[
|
|
"_heif_have_encoder_for_format"
|
|
] = wasmExports["Vc"])
|
|
var _heif_context_get_encoder_for_format = (Module[
|
|
"_heif_context_get_encoder_for_format"
|
|
] = wasmExports["Wc"])
|
|
var _heif_encoder_release = (Module["_heif_encoder_release"] =
|
|
wasmExports["Xc"])
|
|
var _heif_encoder_set_lossy_quality = (Module[
|
|
"_heif_encoder_set_lossy_quality"
|
|
] = wasmExports["Yc"])
|
|
var _heif_encoder_set_lossless = (Module["_heif_encoder_set_lossless"] =
|
|
wasmExports["Zc"])
|
|
var _heif_encoder_set_logging_level = (Module[
|
|
"_heif_encoder_set_logging_level"
|
|
] = wasmExports["_c"])
|
|
var _heif_encoder_list_parameters = (Module[
|
|
"_heif_encoder_list_parameters"
|
|
] = wasmExports["$c"])
|
|
var _heif_encoder_parameter_get_name = (Module[
|
|
"_heif_encoder_parameter_get_name"
|
|
] = wasmExports["ad"])
|
|
var _heif_encoder_parameter_get_type = (Module[
|
|
"_heif_encoder_parameter_get_type"
|
|
] = wasmExports["bd"])
|
|
var _heif_encoder_set_parameter_integer = (Module[
|
|
"_heif_encoder_set_parameter_integer"
|
|
] = wasmExports["cd"])
|
|
var _heif_encoder_parameter_get_valid_integer_values = (Module[
|
|
"_heif_encoder_parameter_get_valid_integer_values"
|
|
] = wasmExports["dd"])
|
|
var _heif_encoder_get_parameter_integer = (Module[
|
|
"_heif_encoder_get_parameter_integer"
|
|
] = wasmExports["ed"])
|
|
var _heif_encoder_parameter_get_valid_integer_range = (Module[
|
|
"_heif_encoder_parameter_get_valid_integer_range"
|
|
] = wasmExports["fd"])
|
|
var _heif_encoder_parameter_get_valid_string_values = (Module[
|
|
"_heif_encoder_parameter_get_valid_string_values"
|
|
] = wasmExports["gd"])
|
|
var _heif_encoder_parameter_integer_valid_range = (Module[
|
|
"_heif_encoder_parameter_integer_valid_range"
|
|
] = wasmExports["hd"])
|
|
var _heif_encoder_set_parameter_boolean = (Module[
|
|
"_heif_encoder_set_parameter_boolean"
|
|
] = wasmExports["id"])
|
|
var _heif_encoder_get_parameter_boolean = (Module[
|
|
"_heif_encoder_get_parameter_boolean"
|
|
] = wasmExports["jd"])
|
|
var _heif_encoder_set_parameter_string = (Module[
|
|
"_heif_encoder_set_parameter_string"
|
|
] = wasmExports["kd"])
|
|
var _heif_encoder_get_parameter_string = (Module[
|
|
"_heif_encoder_get_parameter_string"
|
|
] = wasmExports["ld"])
|
|
var _heif_encoder_parameter_string_valid_values = (Module[
|
|
"_heif_encoder_parameter_string_valid_values"
|
|
] = wasmExports["md"])
|
|
var _heif_encoder_parameter_integer_valid_values = (Module[
|
|
"_heif_encoder_parameter_integer_valid_values"
|
|
] = wasmExports["nd"])
|
|
var _heif_encoder_set_parameter = (Module["_heif_encoder_set_parameter"] =
|
|
wasmExports["od"])
|
|
var _heif_encoder_get_parameter = (Module["_heif_encoder_get_parameter"] =
|
|
wasmExports["pd"])
|
|
var _heif_encoder_has_default = (Module["_heif_encoder_has_default"] =
|
|
wasmExports["qd"])
|
|
var _heif_encoding_options_alloc = (Module["_heif_encoding_options_alloc"] =
|
|
wasmExports["rd"])
|
|
var _heif_encoding_options_free = (Module["_heif_encoding_options_free"] =
|
|
wasmExports["sd"])
|
|
var _heif_context_encode_image = (Module["_heif_context_encode_image"] =
|
|
wasmExports["td"])
|
|
var _heif_context_encode_grid = (Module["_heif_context_encode_grid"] =
|
|
wasmExports["ud"])
|
|
var _heif_context_add_grid_image = (Module["_heif_context_add_grid_image"] =
|
|
wasmExports["vd"])
|
|
var _heif_context_add_overlay_image = (Module[
|
|
"_heif_context_add_overlay_image"
|
|
] = wasmExports["wd"])
|
|
var _heif_context_add_image_tile = (Module["_heif_context_add_image_tile"] =
|
|
wasmExports["xd"])
|
|
var _heif_context_assign_thumbnail = (Module[
|
|
"_heif_context_assign_thumbnail"
|
|
] = wasmExports["yd"])
|
|
var _heif_context_encode_thumbnail = (Module[
|
|
"_heif_context_encode_thumbnail"
|
|
] = wasmExports["zd"])
|
|
var _heif_context_set_primary_image = (Module[
|
|
"_heif_context_set_primary_image"
|
|
] = wasmExports["Ad"])
|
|
var _heif_context_add_exif_metadata = (Module[
|
|
"_heif_context_add_exif_metadata"
|
|
] = wasmExports["Bd"])
|
|
var _heif_context_add_XMP_metadata = (Module[
|
|
"_heif_context_add_XMP_metadata"
|
|
] = wasmExports["Cd"])
|
|
var _heif_context_add_XMP_metadata2 = (Module[
|
|
"_heif_context_add_XMP_metadata2"
|
|
] = wasmExports["Dd"])
|
|
var _heif_context_add_generic_metadata = (Module[
|
|
"_heif_context_add_generic_metadata"
|
|
] = wasmExports["Ed"])
|
|
var _heif_context_add_generic_uri_metadata = (Module[
|
|
"_heif_context_add_generic_uri_metadata"
|
|
] = wasmExports["Fd"])
|
|
var _heif_context_set_maximum_image_size_limit = (Module[
|
|
"_heif_context_set_maximum_image_size_limit"
|
|
] = wasmExports["Gd"])
|
|
var _heif_context_set_max_decoding_threads = (Module[
|
|
"_heif_context_set_max_decoding_threads"
|
|
] = wasmExports["Hd"])
|
|
var _heif_image_handle_get_number_of_region_items = (Module[
|
|
"_heif_image_handle_get_number_of_region_items"
|
|
] = wasmExports["Id"])
|
|
var _heif_image_handle_get_list_of_region_item_ids = (Module[
|
|
"_heif_image_handle_get_list_of_region_item_ids"
|
|
] = wasmExports["Jd"])
|
|
var _heif_context_get_region_item = (Module[
|
|
"_heif_context_get_region_item"
|
|
] = wasmExports["Kd"])
|
|
var _heif_region_item_get_id = (Module["_heif_region_item_get_id"] =
|
|
wasmExports["Ld"])
|
|
var _heif_region_item_release = (Module["_heif_region_item_release"] =
|
|
wasmExports["Md"])
|
|
var _heif_region_item_get_reference_size = (Module[
|
|
"_heif_region_item_get_reference_size"
|
|
] = wasmExports["Nd"])
|
|
var _heif_region_item_get_number_of_regions = (Module[
|
|
"_heif_region_item_get_number_of_regions"
|
|
] = wasmExports["Od"])
|
|
var _heif_region_item_get_list_of_regions = (Module[
|
|
"_heif_region_item_get_list_of_regions"
|
|
] = wasmExports["Pd"])
|
|
var _heif_image_handle_add_region_item = (Module[
|
|
"_heif_image_handle_add_region_item"
|
|
] = wasmExports["Qd"])
|
|
var _heif_region_item_add_region_point = (Module[
|
|
"_heif_region_item_add_region_point"
|
|
] = wasmExports["Rd"])
|
|
var _heif_region_item_add_region_rectangle = (Module[
|
|
"_heif_region_item_add_region_rectangle"
|
|
] = wasmExports["Sd"])
|
|
var _heif_region_item_add_region_ellipse = (Module[
|
|
"_heif_region_item_add_region_ellipse"
|
|
] = wasmExports["Td"])
|
|
var _heif_region_item_add_region_polygon = (Module[
|
|
"_heif_region_item_add_region_polygon"
|
|
] = wasmExports["Ud"])
|
|
var _heif_region_item_add_region_polyline = (Module[
|
|
"_heif_region_item_add_region_polyline"
|
|
] = wasmExports["Vd"])
|
|
var _heif_region_item_add_region_referenced_mask = (Module[
|
|
"_heif_region_item_add_region_referenced_mask"
|
|
] = wasmExports["Wd"])
|
|
var _heif_region_item_add_region_inline_mask_data = (Module[
|
|
"_heif_region_item_add_region_inline_mask_data"
|
|
] = wasmExports["Xd"])
|
|
var _heif_region_item_add_region_inline_mask = (Module[
|
|
"_heif_region_item_add_region_inline_mask"
|
|
] = wasmExports["Yd"])
|
|
var _heif_region_release = (Module["_heif_region_release"] =
|
|
wasmExports["Zd"])
|
|
var _heif_region_release_many = (Module["_heif_region_release_many"] =
|
|
wasmExports["_d"])
|
|
var _heif_region_get_type = (Module["_heif_region_get_type"] =
|
|
wasmExports["$d"])
|
|
var _heif_region_get_point = (Module["_heif_region_get_point"] =
|
|
wasmExports["ae"])
|
|
var _heif_region_get_point_transformed = (Module[
|
|
"_heif_region_get_point_transformed"
|
|
] = wasmExports["be"])
|
|
var _heif_region_get_rectangle = (Module["_heif_region_get_rectangle"] =
|
|
wasmExports["ce"])
|
|
var _heif_region_get_rectangle_transformed = (Module[
|
|
"_heif_region_get_rectangle_transformed"
|
|
] = wasmExports["de"])
|
|
var _heif_region_get_ellipse = (Module["_heif_region_get_ellipse"] =
|
|
wasmExports["ee"])
|
|
var _heif_region_get_ellipse_transformed = (Module[
|
|
"_heif_region_get_ellipse_transformed"
|
|
] = wasmExports["fe"])
|
|
var _heif_region_get_polygon_num_points = (Module[
|
|
"_heif_region_get_polygon_num_points"
|
|
] = wasmExports["ge"])
|
|
var _heif_region_get_polyline_num_points = (Module[
|
|
"_heif_region_get_polyline_num_points"
|
|
] = wasmExports["he"])
|
|
var _heif_region_get_polygon_points = (Module[
|
|
"_heif_region_get_polygon_points"
|
|
] = wasmExports["ie"])
|
|
var _heif_region_get_polyline_points = (Module[
|
|
"_heif_region_get_polyline_points"
|
|
] = wasmExports["je"])
|
|
var _heif_region_get_polygon_points_transformed = (Module[
|
|
"_heif_region_get_polygon_points_transformed"
|
|
] = wasmExports["ke"])
|
|
var _heif_region_get_polyline_points_transformed = (Module[
|
|
"_heif_region_get_polyline_points_transformed"
|
|
] = wasmExports["le"])
|
|
var _heif_region_get_referenced_mask_ID = (Module[
|
|
"_heif_region_get_referenced_mask_ID"
|
|
] = wasmExports["me"])
|
|
var _heif_region_get_inline_mask_data_len = (Module[
|
|
"_heif_region_get_inline_mask_data_len"
|
|
] = wasmExports["ne"])
|
|
var _heif_region_get_inline_mask_data = (Module[
|
|
"_heif_region_get_inline_mask_data"
|
|
] = wasmExports["oe"])
|
|
var _heif_region_get_mask_image = (Module["_heif_region_get_mask_image"] =
|
|
wasmExports["pe"])
|
|
var _heif_item_get_properties_of_type = (Module[
|
|
"_heif_item_get_properties_of_type"
|
|
] = wasmExports["qe"])
|
|
var _heif_item_get_transformation_properties = (Module[
|
|
"_heif_item_get_transformation_properties"
|
|
] = wasmExports["re"])
|
|
var _heif_item_get_property_type = (Module["_heif_item_get_property_type"] =
|
|
wasmExports["se"])
|
|
var _heif_item_get_property_user_description = (Module[
|
|
"_heif_item_get_property_user_description"
|
|
] = wasmExports["te"])
|
|
var _heif_item_add_property_user_description = (Module[
|
|
"_heif_item_add_property_user_description"
|
|
] = wasmExports["ue"])
|
|
var _heif_item_get_property_transform_mirror = (Module[
|
|
"_heif_item_get_property_transform_mirror"
|
|
] = wasmExports["ve"])
|
|
var _heif_item_get_property_transform_rotation_ccw = (Module[
|
|
"_heif_item_get_property_transform_rotation_ccw"
|
|
] = wasmExports["we"])
|
|
var _heif_item_get_property_transform_crop_borders = (Module[
|
|
"_heif_item_get_property_transform_crop_borders"
|
|
] = wasmExports["xe"])
|
|
var _heif_property_user_description_release = (Module[
|
|
"_heif_property_user_description_release"
|
|
] = wasmExports["ye"])
|
|
var _heif_item_add_raw_property = (Module["_heif_item_add_raw_property"] =
|
|
wasmExports["ze"])
|
|
var _heif_item_get_property_raw_size = (Module[
|
|
"_heif_item_get_property_raw_size"
|
|
] = wasmExports["Ae"])
|
|
var _heif_item_get_property_raw_data = (Module[
|
|
"_heif_item_get_property_raw_data"
|
|
] = wasmExports["Be"])
|
|
var _heif_item_get_property_uuid_type = (Module[
|
|
"_heif_item_get_property_uuid_type"
|
|
] = wasmExports["Ce"])
|
|
var _heif_context_get_number_of_items = (Module[
|
|
"_heif_context_get_number_of_items"
|
|
] = wasmExports["De"])
|
|
var _heif_context_get_list_of_item_IDs = (Module[
|
|
"_heif_context_get_list_of_item_IDs"
|
|
] = wasmExports["Ee"])
|
|
var _heif_item_get_item_type = (Module["_heif_item_get_item_type"] =
|
|
wasmExports["Fe"])
|
|
var _heif_item_is_item_hidden = (Module["_heif_item_is_item_hidden"] =
|
|
wasmExports["Ge"])
|
|
var _heif_item_get_mime_item_content_type = (Module[
|
|
"_heif_item_get_mime_item_content_type"
|
|
] = wasmExports["He"])
|
|
var _heif_item_get_mime_item_content_encoding = (Module[
|
|
"_heif_item_get_mime_item_content_encoding"
|
|
] = wasmExports["Ie"])
|
|
var _heif_item_get_uri_item_uri_type = (Module[
|
|
"_heif_item_get_uri_item_uri_type"
|
|
] = wasmExports["Je"])
|
|
var _heif_item_get_item_name = (Module["_heif_item_get_item_name"] =
|
|
wasmExports["Ke"])
|
|
var _heif_item_get_item_data = (Module["_heif_item_get_item_data"] =
|
|
wasmExports["Le"])
|
|
var _heif_release_item_data = (Module["_heif_release_item_data"] =
|
|
wasmExports["Me"])
|
|
var _heif_context_get_item_references = (Module[
|
|
"_heif_context_get_item_references"
|
|
] = wasmExports["Ne"])
|
|
var _heif_release_item_references = (Module[
|
|
"_heif_release_item_references"
|
|
] = wasmExports["Oe"])
|
|
var _heif_context_add_item = (Module["_heif_context_add_item"] =
|
|
wasmExports["Pe"])
|
|
var _heif_context_add_mime_item = (Module["_heif_context_add_mime_item"] =
|
|
wasmExports["Qe"])
|
|
var _heif_context_add_precompressed_mime_item = (Module[
|
|
"_heif_context_add_precompressed_mime_item"
|
|
] = wasmExports["Re"])
|
|
var _heif_context_add_uri_item = (Module["_heif_context_add_uri_item"] =
|
|
wasmExports["Se"])
|
|
var _heif_context_add_item_reference = (Module[
|
|
"_heif_context_add_item_reference"
|
|
] = wasmExports["Te"])
|
|
var _heif_context_add_item_references = (Module[
|
|
"_heif_context_add_item_references"
|
|
] = wasmExports["Ue"])
|
|
var _heif_item_set_item_name = (Module["_heif_item_set_item_name"] =
|
|
wasmExports["Ve"])
|
|
var _de265_get_version = (Module["_de265_get_version"] = wasmExports["We"])
|
|
var _de265_init = (Module["_de265_init"] = wasmExports["Xe"])
|
|
var _de265_free = (Module["_de265_free"] = wasmExports["Ye"])
|
|
var _de265_new_decoder = (Module["_de265_new_decoder"] = wasmExports["Ze"])
|
|
var _de265_set_parameter_bool = (Module["_de265_set_parameter_bool"] =
|
|
wasmExports["_e"])
|
|
var _de265_free_decoder = (Module["_de265_free_decoder"] =
|
|
wasmExports["$e"])
|
|
var _de265_push_NAL = (Module["_de265_push_NAL"] = wasmExports["af"])
|
|
var _de265_flush_data = (Module["_de265_flush_data"] = wasmExports["bf"])
|
|
var _de265_decode = (Module["_de265_decode"] = wasmExports["cf"])
|
|
var _de265_get_next_picture = (Module["_de265_get_next_picture"] =
|
|
wasmExports["df"])
|
|
var _de265_get_chroma_format = (Module["_de265_get_chroma_format"] =
|
|
wasmExports["ef"])
|
|
var _de265_get_image_width = (Module["_de265_get_image_width"] =
|
|
wasmExports["ff"])
|
|
var _de265_get_image_height = (Module["_de265_get_image_height"] =
|
|
wasmExports["gf"])
|
|
var _de265_get_bits_per_pixel = (Module["_de265_get_bits_per_pixel"] =
|
|
wasmExports["hf"])
|
|
var _de265_get_image_plane = (Module["_de265_get_image_plane"] =
|
|
wasmExports["jf"])
|
|
var _de265_get_image_colour_primaries = (Module[
|
|
"_de265_get_image_colour_primaries"
|
|
] = wasmExports["kf"])
|
|
var _de265_get_image_transfer_characteristics = (Module[
|
|
"_de265_get_image_transfer_characteristics"
|
|
] = wasmExports["lf"])
|
|
var _de265_get_image_matrix_coefficients = (Module[
|
|
"_de265_get_image_matrix_coefficients"
|
|
] = wasmExports["mf"])
|
|
var _de265_get_image_full_range_flag = (Module[
|
|
"_de265_get_image_full_range_flag"
|
|
] = wasmExports["nf"])
|
|
var _de265_release_next_picture = (Module["_de265_release_next_picture"] =
|
|
wasmExports["of"])
|
|
var ___getTypeName = wasmExports["pf"]
|
|
var dynCall_ji = (Module["dynCall_ji"] = wasmExports["qf"])
|
|
var dynCall_iij = (Module["dynCall_iij"] = wasmExports["rf"])
|
|
var dynCall_jijj = (Module["dynCall_jijj"] = wasmExports["sf"])
|
|
var dynCall_vijj = (Module["dynCall_vijj"] = wasmExports["tf"])
|
|
var dynCall_jiji = (Module["dynCall_jiji"] = wasmExports["uf"])
|
|
var dynCall_viijii = (Module["dynCall_viijii"] = wasmExports["vf"])
|
|
var dynCall_iiiiij = (Module["dynCall_iiiiij"] = wasmExports["wf"])
|
|
var dynCall_iiiiijj = (Module["dynCall_iiiiijj"] = wasmExports["xf"])
|
|
var dynCall_iiiiiijj = (Module["dynCall_iiiiiijj"] = wasmExports["yf"])
|
|
var _heif_error_ok = (Module["_heif_error_ok"] = 80156)
|
|
var _heif_error_success = (Module["_heif_error_success"] = 79580)
|
|
var _heif_error_invalid_parameter_value = (Module[
|
|
"_heif_error_invalid_parameter_value"
|
|
] = 80180)
|
|
var _heif_error_unsupported_parameter = (Module[
|
|
"_heif_error_unsupported_parameter"
|
|
] = 80168)
|
|
var calledRun
|
|
dependenciesFulfilled = function runCaller() {
|
|
if (!calledRun) run()
|
|
if (!calledRun) dependenciesFulfilled = runCaller
|
|
}
|
|
function run() {
|
|
if (runDependencies > 0) {
|
|
return
|
|
}
|
|
preRun()
|
|
if (runDependencies > 0) {
|
|
return
|
|
}
|
|
function doRun() {
|
|
if (calledRun) return
|
|
calledRun = true
|
|
Module["calledRun"] = true
|
|
if (ABORT) return
|
|
initRuntime()
|
|
readyPromiseResolve(Module)
|
|
Module["onRuntimeInitialized"]?.()
|
|
postRun()
|
|
}
|
|
if (Module["setStatus"]) {
|
|
Module["setStatus"]("Running...")
|
|
setTimeout(() => {
|
|
setTimeout(() => Module["setStatus"](""), 1)
|
|
doRun()
|
|
}, 1)
|
|
} else {
|
|
doRun()
|
|
}
|
|
}
|
|
if (Module["preInit"]) {
|
|
if (typeof Module["preInit"] == "function")
|
|
Module["preInit"] = [Module["preInit"]]
|
|
while (Module["preInit"].length > 0) {
|
|
Module["preInit"].pop()()
|
|
}
|
|
}
|
|
run()
|
|
function StringToArrayBuffer(str) {
|
|
var buf = new ArrayBuffer(str.length)
|
|
var bufView = new Uint8Array(buf)
|
|
for (var i = 0, strLen = str.length; i < strLen; i++) {
|
|
bufView[i] = str.charCodeAt(i)
|
|
}
|
|
return buf
|
|
}
|
|
var HeifImage = function (handle) {
|
|
this.handle = handle
|
|
this.img = null
|
|
}
|
|
HeifImage.prototype.free = function () {
|
|
if (this.handle) {
|
|
Module.heif_image_handle_release(this.handle)
|
|
this.handle = null
|
|
}
|
|
}
|
|
HeifImage.prototype._ensureImage = function () {
|
|
if (this.img) {
|
|
return
|
|
}
|
|
var img = Module.heif_js_decode_image(
|
|
this.handle,
|
|
Module.heif_colorspace.heif_colorspace_YCbCr,
|
|
Module.heif_chroma.heif_chroma_420,
|
|
)
|
|
if (!img || img.code) {
|
|
console.log("Decoding image failed", this.handle, img)
|
|
return
|
|
}
|
|
this.data = new Uint8Array(StringToArrayBuffer(img.data))
|
|
delete img.data
|
|
this.img = img
|
|
if (img.alpha !== undefined) {
|
|
this.alpha = new Uint8Array(StringToArrayBuffer(img.alpha))
|
|
delete img.alpha
|
|
}
|
|
}
|
|
HeifImage.prototype.get_width = function () {
|
|
return Module.heif_image_handle_get_width(this.handle)
|
|
}
|
|
HeifImage.prototype.get_height = function () {
|
|
return Module.heif_image_handle_get_height(this.handle)
|
|
}
|
|
HeifImage.prototype.is_primary = function () {
|
|
return !!heif_image_handle_is_primary_image(this.handle)
|
|
}
|
|
HeifImage.prototype.display = function (image_data, callback) {
|
|
var w = this.get_width()
|
|
var h = this.get_height()
|
|
setTimeout(
|
|
function () {
|
|
if (!this.img) {
|
|
var img = Module.heif_js_decode_image2(
|
|
this.handle,
|
|
Module.heif_colorspace.heif_colorspace_RGB,
|
|
Module.heif_chroma.heif_chroma_interleaved_RGBA,
|
|
)
|
|
if (!img || img.code) {
|
|
console.log("Decoding image failed", this.handle, img)
|
|
callback(null)
|
|
return
|
|
}
|
|
for (let c of img.channels) {
|
|
if (c.id == Module.heif_channel.heif_channel_interleaved) {
|
|
if (c.stride == c.width * 4) {
|
|
image_data.data.set(c.data)
|
|
} else {
|
|
for (let y = 0; y < c.height; y++) {
|
|
let slice = c.data.slice(
|
|
y * c.stride,
|
|
y * c.stride + c.width * 4,
|
|
)
|
|
let offset = y * c.width * 4
|
|
image_data.data.set(slice, offset)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Module.heif_image_release(img.image)
|
|
}
|
|
callback(image_data)
|
|
}.bind(this),
|
|
0,
|
|
)
|
|
}
|
|
var HeifDecoder = function () {
|
|
this.decoder = null
|
|
}
|
|
HeifDecoder.prototype.decode = function (buffer) {
|
|
if (this.decoder) {
|
|
Module.heif_context_free(this.decoder)
|
|
}
|
|
this.decoder = Module.heif_context_alloc()
|
|
if (!this.decoder) {
|
|
console.log("Could not create HEIF context")
|
|
return []
|
|
}
|
|
var error = Module.heif_context_read_from_memory(this.decoder, buffer)
|
|
if (error.code !== Module.heif_error_code.heif_error_Ok) {
|
|
console.log("Could not parse HEIF file", error.message)
|
|
return []
|
|
}
|
|
var ids = Module.heif_js_context_get_list_of_top_level_image_IDs(
|
|
this.decoder,
|
|
)
|
|
if (!ids || ids.code) {
|
|
console.log("Error loading image ids", ids)
|
|
return []
|
|
} else if (!ids.length) {
|
|
console.log("No images found")
|
|
return []
|
|
}
|
|
var result = []
|
|
for (var i = 0; i < ids.length; i++) {
|
|
var handle = Module.heif_js_context_get_image_handle(
|
|
this.decoder,
|
|
ids[i],
|
|
)
|
|
if (!handle || handle.code) {
|
|
console.log("Could not get image data for id", ids[i], handle)
|
|
continue
|
|
}
|
|
result.push(new HeifImage(handle))
|
|
}
|
|
return result
|
|
}
|
|
var fourcc = function (s) {
|
|
return (
|
|
(s.charCodeAt(0) << 24) |
|
|
(s.charCodeAt(1) << 16) |
|
|
(s.charCodeAt(2) << 8) |
|
|
s.charCodeAt(3)
|
|
)
|
|
}
|
|
Module.HeifImage = HeifImage
|
|
Module.HeifDecoder = HeifDecoder
|
|
Module.fourcc = fourcc
|
|
const enums = [
|
|
"heif_error_code",
|
|
"heif_suberror_code",
|
|
"heif_compression_format",
|
|
"heif_chroma",
|
|
"heif_colorspace",
|
|
"heif_channel",
|
|
]
|
|
for (const e of enums) {
|
|
for (const key in Module[e]) {
|
|
if (!Module[e].hasOwnProperty(key) || key === "values") {
|
|
continue
|
|
}
|
|
Module[key] = Module[e][key]
|
|
}
|
|
}
|
|
for (const key in Module) {
|
|
if (key.indexOf("_heif_") !== 0 || Module[key.slice(1)] !== undefined) {
|
|
continue
|
|
}
|
|
Module[key.slice(1)] = Module[key]
|
|
}
|
|
moduleRtn = Module
|
|
|
|
return moduleRtn
|
|
}
|
|
})()
|
|
if (typeof exports === "object" && typeof module === "object")
|
|
module.exports = libheif
|
|
else if (typeof define === "function" && define["amd"])
|
|
define([], () => libheif)
|