mirror of
				https://github.com/taigrr/wasm-experiments
				synced 2025-01-18 04:03:21 -08:00 
			
		
		
		
	Update html folder for new wasm-go structure
This commit is contained in:
		
							parent
							
								
									e16f079d16
								
							
						
					
					
						commit
						0bc494b8b2
					
				
							
								
								
									
										1
									
								
								html/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								html/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					test.wasm
 | 
				
			||||||
@ -1,4 +1,9 @@
 | 
				
			|||||||
<!doctype html>
 | 
					<!doctype html>
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					Copyright 2018 The Go Authors. All rights reserved.
 | 
				
			||||||
 | 
					Use of this source code is governed by a BSD-style
 | 
				
			||||||
 | 
					license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
<html>
 | 
					<html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<head>
 | 
					<head>
 | 
				
			||||||
@ -12,13 +17,14 @@
 | 
				
			|||||||
    async function loadAndCompile() {
 | 
					    async function loadAndCompile() {
 | 
				
			||||||
      let resp = await fetch("test.wasm");
 | 
					      let resp = await fetch("test.wasm");
 | 
				
			||||||
      let bytes = await resp.arrayBuffer();
 | 
					      let bytes = await resp.arrayBuffer();
 | 
				
			||||||
      await compile(bytes);
 | 
					      await go.compile(bytes);
 | 
				
			||||||
      document.getElementById("runButton").disabled = false;
 | 
					      document.getElementById("runButton").disabled = false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    loadAndCompile();
 | 
					    loadAndCompile();
 | 
				
			||||||
  </script>
 | 
					  </script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <button onClick="console.clear(); run();" id="runButton" disabled>Run</button>
 | 
					  <button onClick="console.clear(); go.run();" id="runButton" disabled>Run</button>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,19 @@
 | 
				
			|||||||
let args = ["js"];
 | 
					// Copyright 2018 The Go Authors. All rights reserved.
 | 
				
			||||||
let trace = false;
 | 
					// Use of this source code is governed by a BSD-style
 | 
				
			||||||
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (typeof process !== "undefined") {
 | 
					(function () {
 | 
				
			||||||
 | 
						let args = ["js"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Map web browser API and Node.js API to a single common API (preferring web standards over Node.js API).
 | 
				
			||||||
 | 
						const isNodeJS = typeof process !== "undefined";
 | 
				
			||||||
 | 
						if (isNodeJS) {
 | 
				
			||||||
		if (process.argv.length < 3) {
 | 
							if (process.argv.length < 3) {
 | 
				
			||||||
			process.stderr.write("usage: go_js_wasm_exec [wasm binary]\n");
 | 
								process.stderr.write("usage: go_js_wasm_exec [wasm binary]\n");
 | 
				
			||||||
			process.exit(1);
 | 
								process.exit(1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		args = args.concat(process.argv.slice(3));
 | 
							args = args.concat(process.argv.slice(3));
 | 
				
			||||||
  trace = process.env.TRACE === "1";
 | 
					 | 
				
			||||||
		global.require = require;
 | 
							global.require = require;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		global.fs = require("fs");
 | 
							global.fs = require("fs");
 | 
				
			||||||
@ -32,10 +37,6 @@ if (typeof process !== "undefined") {
 | 
				
			|||||||
		const util = require("util");
 | 
							const util = require("util");
 | 
				
			||||||
		global.TextEncoder = util.TextEncoder;
 | 
							global.TextEncoder = util.TextEncoder;
 | 
				
			||||||
		global.TextDecoder = util.TextDecoder;
 | 
							global.TextDecoder = util.TextDecoder;
 | 
				
			||||||
 | 
					 | 
				
			||||||
  compileAndRun(fs.readFileSync(process.argv[2])).catch((err) => {
 | 
					 | 
				
			||||||
    console.error(err);
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		window.global = window;
 | 
							window.global = window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -67,11 +68,11 @@ const encoder = new TextEncoder("utf-8");
 | 
				
			|||||||
	const decoder = new TextDecoder("utf-8");
 | 
						const decoder = new TextDecoder("utf-8");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let mod, inst;
 | 
						let mod, inst;
 | 
				
			||||||
let names = [];
 | 
						let values = []; // TODO: garbage collection
 | 
				
			||||||
let prevSP = 0;
 | 
						let resolveResume = function () { };
 | 
				
			||||||
let values = []; // TODO: GC
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function mem() {
 | 
						function mem() {
 | 
				
			||||||
 | 
							// The buffer may change when requesting more memory.
 | 
				
			||||||
		return new DataView(inst.exports.mem.buffer);
 | 
							return new DataView(inst.exports.mem.buffer);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -131,25 +132,29 @@ function loadString(addr) {
 | 
				
			|||||||
		return decoder.decode(new DataView(inst.exports.mem.buffer, saddr, len));
 | 
							return decoder.decode(new DataView(inst.exports.mem.buffer, saddr, len));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function compileAndRun(source) {
 | 
						global.go = {
 | 
				
			||||||
  await compile(source);
 | 
							exited: false,
 | 
				
			||||||
  await run();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function compile(source) {
 | 
							compileAndRun: async function (source) {
 | 
				
			||||||
 | 
								await go.compile(source);
 | 
				
			||||||
 | 
								await go.run();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							compile: async function (source) {
 | 
				
			||||||
			mod = await WebAssembly.compile(source);
 | 
								mod = await WebAssembly.compile(source);
 | 
				
			||||||
}
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function run() {
 | 
							run: async function () {
 | 
				
			||||||
			let importObject = {
 | 
								let importObject = {
 | 
				
			||||||
    js: {
 | 
									go: {
 | 
				
			||||||
      // func wasmexit(code int32)
 | 
										// func wasmExit(code int32)
 | 
				
			||||||
      "runtime.wasmexit": function (sp) {
 | 
										"runtime.wasmExit": function (sp) {
 | 
				
			||||||
 | 
											go.exited = true;
 | 
				
			||||||
						process.exit(mem().getInt32(sp + 8, true));
 | 
											process.exit(mem().getInt32(sp + 8, true));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // func wasmwrite(fd uintptr, p unsafe.Pointer, n int32)
 | 
										// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)
 | 
				
			||||||
      "runtime.wasmwrite": function (sp) {
 | 
										"runtime.wasmWrite": function (sp) {
 | 
				
			||||||
						const fd = getInt64(sp + 8);
 | 
											const fd = getInt64(sp + 8);
 | 
				
			||||||
						const p = getInt64(sp + 16);
 | 
											const p = getInt64(sp + 16);
 | 
				
			||||||
						const n = mem().getInt32(sp + 24, true);
 | 
											const n = mem().getInt32(sp + 24, true);
 | 
				
			||||||
@ -169,47 +174,47 @@ async function run() {
 | 
				
			|||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func boolVal(value bool) Value
 | 
										// func boolVal(value bool) Value
 | 
				
			||||||
      "runtime/js.boolVal": function (sp) {
 | 
										"syscall/js.boolVal": function (sp) {
 | 
				
			||||||
						storeValue(sp + 16, mem().getUint8(sp + 8) !== 0);
 | 
											storeValue(sp + 16, mem().getUint8(sp + 8) !== 0);
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func intVal(value int) Value
 | 
										// func intVal(value int) Value
 | 
				
			||||||
      "runtime/js.intVal": function (sp) {
 | 
										"syscall/js.intVal": function (sp) {
 | 
				
			||||||
						storeValue(sp + 16, getInt64(sp + 8));
 | 
											storeValue(sp + 16, getInt64(sp + 8));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func floatVal(value float64) Value
 | 
										// func floatVal(value float64) Value
 | 
				
			||||||
      "runtime/js.floatVal": function (sp) {
 | 
										"syscall/js.floatVal": function (sp) {
 | 
				
			||||||
						storeValue(sp + 16, mem().getFloat64(sp + 8, true));
 | 
											storeValue(sp + 16, mem().getFloat64(sp + 8, true));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func stringVal(value string) Value
 | 
										// func stringVal(value string) Value
 | 
				
			||||||
      "runtime/js.stringVal": function (sp) {
 | 
										"syscall/js.stringVal": function (sp) {
 | 
				
			||||||
						storeValue(sp + 24, loadString(sp + 8));
 | 
											storeValue(sp + 24, loadString(sp + 8));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Get(key string) Value
 | 
										// func (v Value) Get(key string) Value
 | 
				
			||||||
      "runtime/js.Value.Get": function (sp) {
 | 
										"syscall/js.Value.Get": function (sp) {
 | 
				
			||||||
						storeValue(sp + 32, Reflect.get(loadValue(sp + 8), loadString(sp + 16)));
 | 
											storeValue(sp + 32, Reflect.get(loadValue(sp + 8), loadString(sp + 16)));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) set(key string, value Value)
 | 
										// func (v Value) set(key string, value Value)
 | 
				
			||||||
      "runtime/js.Value.set": function (sp) {
 | 
										"syscall/js.Value.set": function (sp) {
 | 
				
			||||||
						Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));
 | 
											Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Index(i int) Value
 | 
										// func (v Value) Index(i int) Value
 | 
				
			||||||
      "runtime/js.Value.Index": function (sp) {
 | 
										"syscall/js.Value.Index": function (sp) {
 | 
				
			||||||
						storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));
 | 
											storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) setIndex(i int, value Value)
 | 
										// func (v Value) setIndex(i int, value Value)
 | 
				
			||||||
      "runtime/js.Value.setIndex": function (sp) {
 | 
										"syscall/js.Value.setIndex": function (sp) {
 | 
				
			||||||
						Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24));
 | 
											Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) call(name string, args []Value) (Value, bool)
 | 
										// func (v Value) call(name string, args []Value) (Value, bool)
 | 
				
			||||||
      "runtime/js.Value.call": function (sp) {
 | 
										"syscall/js.Value.call": function (sp) {
 | 
				
			||||||
						try {
 | 
											try {
 | 
				
			||||||
							const v = loadValue(sp + 8);
 | 
												const v = loadValue(sp + 8);
 | 
				
			||||||
							const m = Reflect.get(v, loadString(sp + 16));
 | 
												const m = Reflect.get(v, loadString(sp + 16));
 | 
				
			||||||
@ -223,7 +228,7 @@ async function run() {
 | 
				
			|||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) invoke(args []Value) (Value, bool)
 | 
										// func (v Value) invoke(args []Value) (Value, bool)
 | 
				
			||||||
      "runtime/js.Value.invoke": function (sp) {
 | 
										"syscall/js.Value.invoke": function (sp) {
 | 
				
			||||||
						try {
 | 
											try {
 | 
				
			||||||
							const v = loadValue(sp + 8);
 | 
												const v = loadValue(sp + 8);
 | 
				
			||||||
							const args = loadSliceOfValues(sp + 16);
 | 
												const args = loadSliceOfValues(sp + 16);
 | 
				
			||||||
@ -235,8 +240,8 @@ async function run() {
 | 
				
			|||||||
						}
 | 
											}
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // func (v Value) wasmnew(args []Value) (Value, bool)
 | 
										// func (v Value) new(args []Value) (Value, bool)
 | 
				
			||||||
      "runtime/js.Value.wasmnew": function (sp) {
 | 
										"syscall/js.Value.new": function (sp) {
 | 
				
			||||||
						try {
 | 
											try {
 | 
				
			||||||
							const v = loadValue(sp + 8);
 | 
												const v = loadValue(sp + 8);
 | 
				
			||||||
							const args = loadSliceOfValues(sp + 16);
 | 
												const args = loadSliceOfValues(sp + 16);
 | 
				
			||||||
@ -249,71 +254,54 @@ async function run() {
 | 
				
			|||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Float() float64
 | 
										// func (v Value) Float() float64
 | 
				
			||||||
      "runtime/js.Value.Float": function (sp) {
 | 
										"syscall/js.Value.Float": function (sp) {
 | 
				
			||||||
						mem().setFloat64(sp + 16, parseFloat(loadValue(sp + 8)), true);
 | 
											mem().setFloat64(sp + 16, parseFloat(loadValue(sp + 8)), true);
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Int() int
 | 
										// func (v Value) Int() int
 | 
				
			||||||
      "runtime/js.Value.Int": function (sp) {
 | 
										"syscall/js.Value.Int": function (sp) {
 | 
				
			||||||
						setInt64(sp + 16, parseInt(loadValue(sp + 8)));
 | 
											setInt64(sp + 16, parseInt(loadValue(sp + 8)));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Bool() bool
 | 
										// func (v Value) Bool() bool
 | 
				
			||||||
      "runtime/js.Value.Bool": function (sp) {
 | 
										"syscall/js.Value.Bool": function (sp) {
 | 
				
			||||||
						mem().setUint8(sp + 16, !!loadValue(sp + 8));
 | 
											mem().setUint8(sp + 16, !!loadValue(sp + 8));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) Length() int
 | 
										// func (v Value) Length() int
 | 
				
			||||||
      "runtime/js.Value.Length": function (sp) {
 | 
										"syscall/js.Value.Length": function (sp) {
 | 
				
			||||||
						setInt64(sp + 16, parseInt(loadValue(sp + 8).length));
 | 
											setInt64(sp + 16, parseInt(loadValue(sp + 8).length));
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) prepareString() (Value, int)
 | 
										// func (v Value) prepareString() (Value, int)
 | 
				
			||||||
      "runtime/js.Value.prepareString": function (sp) {
 | 
										"syscall/js.Value.prepareString": function (sp) {
 | 
				
			||||||
						const str = encoder.encode(String(loadValue(sp + 8)));
 | 
											const str = encoder.encode(String(loadValue(sp + 8)));
 | 
				
			||||||
						storeValue(sp + 16, str);
 | 
											storeValue(sp + 16, str);
 | 
				
			||||||
						setInt64(sp + 24, str.length);
 | 
											setInt64(sp + 24, str.length);
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// func (v Value) loadString(b []byte)
 | 
										// func (v Value) loadString(b []byte)
 | 
				
			||||||
      "runtime/js.Value.loadString": function (sp) {
 | 
										"syscall/js.Value.loadString": function (sp) {
 | 
				
			||||||
						const str = loadValue(sp + 8);
 | 
											const str = loadValue(sp + 8);
 | 
				
			||||||
						loadSlice(sp + 16).set(str);
 | 
											loadSlice(sp + 16).set(str);
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      "trace": function (pcF, pcB, sp) {
 | 
										"debug": function (value) {
 | 
				
			||||||
        console.log(
 | 
											console.log(value);
 | 
				
			||||||
          `trace`,
 | 
					 | 
				
			||||||
          String(sp).padStart(10),
 | 
					 | 
				
			||||||
          String(pcF).padStart(10),
 | 
					 | 
				
			||||||
          String(pcB).padStart(10),
 | 
					 | 
				
			||||||
          sp <= prevSP ? "->" : "<-",
 | 
					 | 
				
			||||||
          names[pcF],
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        prevSP = sp;
 | 
					 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const nameSec = new SimpleStream(new Uint8Array(WebAssembly.Module.customSections(mod, "name")[0]));
 | 
					 | 
				
			||||||
  while (!nameSec.atEnd()) {
 | 
					 | 
				
			||||||
    const nameType = nameSec.readByte();
 | 
					 | 
				
			||||||
    const namePayloadLen = nameSec.readUleb128();
 | 
					 | 
				
			||||||
    const namePayloadData = new SimpleStream(nameSec.read(namePayloadLen));
 | 
					 | 
				
			||||||
    if (nameType === 1) { // function names
 | 
					 | 
				
			||||||
      const count = namePayloadData.readUleb128();
 | 
					 | 
				
			||||||
      for (let i = 0; i < count; i++) {
 | 
					 | 
				
			||||||
        const index = namePayloadData.readUleb128();
 | 
					 | 
				
			||||||
        const nameLen = namePayloadData.readUleb128();
 | 
					 | 
				
			||||||
        const nameStr = String.fromCharCode.apply(null, namePayloadData.read(nameLen));
 | 
					 | 
				
			||||||
        names[index] = nameStr;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			inst = await WebAssembly.instantiate(mod, importObject);
 | 
								inst = await WebAssembly.instantiate(mod, importObject);
 | 
				
			||||||
  values = [undefined, null, global, inst.exports.mem];
 | 
								values = [
 | 
				
			||||||
 | 
									undefined,
 | 
				
			||||||
 | 
									null,
 | 
				
			||||||
 | 
									global,
 | 
				
			||||||
 | 
									inst.exports.mem,
 | 
				
			||||||
 | 
									function () { resolveResume(); },
 | 
				
			||||||
 | 
								];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.
 | 
				
			||||||
			let offset = 4096;
 | 
								let offset = 4096;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			const strPtr = (str) => {
 | 
								const strPtr = (str) => {
 | 
				
			||||||
@ -344,44 +332,26 @@ async function run() {
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
    inst.exports.run(argc, argv, trace);
 | 
									while (true) {
 | 
				
			||||||
 | 
										inst.exports.run(argc, argv);
 | 
				
			||||||
 | 
										if (go.exited) {
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										await new Promise((resolve) => {
 | 
				
			||||||
 | 
											resolveResume = resolve;
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			} catch (err) {
 | 
								} catch (err) {
 | 
				
			||||||
				console.error(err);
 | 
									console.error(err);
 | 
				
			||||||
				process.exit(1);
 | 
									process.exit(1);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SimpleStream {
 | 
						if (isNodeJS) {
 | 
				
			||||||
  constructor(array) {
 | 
							go.compileAndRun(fs.readFileSync(process.argv[2])).catch((err) => {
 | 
				
			||||||
    this.array = array;
 | 
								console.error(err);
 | 
				
			||||||
    this.offset = 0;
 | 
								process.exit(1);
 | 
				
			||||||
  }
 | 
							});
 | 
				
			||||||
 | 
					 | 
				
			||||||
  atEnd() {
 | 
					 | 
				
			||||||
    return this.offset >= this.array.length;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  read(len) {
 | 
					 | 
				
			||||||
    const a = this.array.subarray(this.offset, this.offset + len);
 | 
					 | 
				
			||||||
    this.offset += len;
 | 
					 | 
				
			||||||
    return a;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  readByte() {
 | 
					 | 
				
			||||||
    const b = this.array[this.offset];
 | 
					 | 
				
			||||||
    this.offset++;
 | 
					 | 
				
			||||||
    return b;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  readUleb128() {
 | 
					 | 
				
			||||||
    let value = 0;
 | 
					 | 
				
			||||||
    let shift = 0;
 | 
					 | 
				
			||||||
    while (true) {
 | 
					 | 
				
			||||||
      let byte = this.readByte();
 | 
					 | 
				
			||||||
      value |= (byte & 0x7F) << shift;
 | 
					 | 
				
			||||||
      if ((byte & 0x80) === 0) { break; }
 | 
					 | 
				
			||||||
      shift += 7;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return value;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					})();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user