-
Notifications
You must be signed in to change notification settings - Fork 0
/
gofmt.patch
411 lines (404 loc) · 13.1 KB
/
gofmt.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
diff --git a/gofmt.js b/gofmt.js
index c430cc2..fc0a1b7 100644
--- a/gofmt.js
+++ b/gofmt.js
@@ -3,137 +3,12 @@
// license that can be found in the LICENSE file.
//
// This file has been modified for use by the TinyGo compiler.
-
-(() => {
- // Map multiple JavaScript environments to a single common API,
- // preferring web standards over Node.js API.
- //
- // Environments considered:
- // - Browsers
- // - Node.js
- // - Electron
- // - Parcel
-
- if (typeof global !== "undefined") {
- // global already exists
- } else if (typeof window !== "undefined") {
- window.global = window;
- } else if (typeof self !== "undefined") {
- self.global = self;
- } else {
- throw new Error("cannot export Go (neither global, window nor self is defined)");
- }
-
- if (!global.require && typeof require !== "undefined") {
- global.require = require;
- }
-
- if (!global.fs && global.require) {
- global.fs = require("node:fs");
- }
-
- const enosys = () => {
- const err = new Error("not implemented");
- err.code = "ENOSYS";
- return err;
- };
-
- if (!global.fs) {
- let outputBuf = "";
- global.fs = {
- constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused
- writeSync(fd, buf) {
- outputBuf += decoder.decode(buf);
- const nl = outputBuf.lastIndexOf("\n");
- if (nl != -1) {
- console.log(outputBuf.substr(0, nl));
- outputBuf = outputBuf.substr(nl + 1);
- }
- return buf.length;
- },
- write(fd, buf, offset, length, position, callback) {
- if (offset !== 0 || length !== buf.length || position !== null) {
- callback(enosys());
- return;
- }
- const n = this.writeSync(fd, buf);
- callback(null, n);
- },
- chmod(path, mode, callback) { callback(enosys()); },
- chown(path, uid, gid, callback) { callback(enosys()); },
- close(fd, callback) { callback(enosys()); },
- fchmod(fd, mode, callback) { callback(enosys()); },
- fchown(fd, uid, gid, callback) { callback(enosys()); },
- fstat(fd, callback) { callback(enosys()); },
- fsync(fd, callback) { callback(null); },
- ftruncate(fd, length, callback) { callback(enosys()); },
- lchown(path, uid, gid, callback) { callback(enosys()); },
- link(path, link, callback) { callback(enosys()); },
- lstat(path, callback) { callback(enosys()); },
- mkdir(path, perm, callback) { callback(enosys()); },
- open(path, flags, mode, callback) { callback(enosys()); },
- read(fd, buffer, offset, length, position, callback) { callback(enosys()); },
- readdir(path, callback) { callback(enosys()); },
- readlink(path, callback) { callback(enosys()); },
- rename(from, to, callback) { callback(enosys()); },
- rmdir(path, callback) { callback(enosys()); },
- stat(path, callback) { callback(enosys()); },
- symlink(path, link, callback) { callback(enosys()); },
- truncate(path, length, callback) { callback(enosys()); },
- unlink(path, callback) { callback(enosys()); },
- utimes(path, atime, mtime, callback) { callback(enosys()); },
- };
- }
-
- if (!global.process) {
- global.process = {
- getuid() { return -1; },
- getgid() { return -1; },
- geteuid() { return -1; },
- getegid() { return -1; },
- getgroups() { throw enosys(); },
- pid: -1,
- ppid: -1,
- umask() { throw enosys(); },
- cwd() { throw enosys(); },
- chdir() { throw enosys(); },
- }
- }
-
- if (!global.crypto) {
- const nodeCrypto = require("node:crypto");
- global.crypto = {
- getRandomValues(b) {
- nodeCrypto.randomFillSync(b);
- },
- };
- }
-
- if (!global.performance) {
- global.performance = {
- now() {
- const [sec, nsec] = process.hrtime();
- return sec * 1000 + nsec / 1000000;
- },
- };
- }
-
- if (!global.TextEncoder) {
- global.TextEncoder = require("node:util").TextEncoder;
- }
-
- if (!global.TextDecoder) {
- global.TextDecoder = require("node:util").TextDecoder;
- }
-
- // End of polyfills for common API.
-
const encoder = new TextEncoder("utf-8");
const decoder = new TextDecoder("utf-8");
let reinterpretBuf = new DataView(new ArrayBuffer(8));
var logLine = [];
- global.Go = class {
+ class Go {
constructor() {
this._callbackTimeouts = new Map();
this._nextCallbackTimeoutID = 1;
@@ -239,46 +114,7 @@
this.importObject = {
wasi_snapshot_preview1: {
// https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write
- fd_write: function(fd, iovs_ptr, iovs_len, nwritten_ptr) {
- let nwritten = 0;
- if (fd == 1) {
- for (let iovs_i=0; iovs_i<iovs_len;iovs_i++) {
- let iov_ptr = iovs_ptr+iovs_i*8; // assuming wasm32
- let ptr = mem().getUint32(iov_ptr + 0, true);
- let len = mem().getUint32(iov_ptr + 4, true);
- nwritten += len;
- for (let i=0; i<len; i++) {
- let c = mem().getUint8(ptr+i);
- if (c == 13) { // CR
- // ignore
- } else if (c == 10) { // LF
- // write line
- let line = decoder.decode(new Uint8Array(logLine));
- logLine = [];
- console.log(line);
- } else {
- logLine.push(c);
- }
- }
- }
- } else {
- console.error('invalid file descriptor:', fd);
- }
- mem().setUint32(nwritten_ptr, nwritten, true);
- return 0;
- },
- fd_close: () => 0, // dummy
- fd_fdstat_get: () => 0, // dummy
- fd_seek: () => 0, // dummy
- "proc_exit": (code) => {
- if (global.process) {
- // Node.js
- process.exit(code);
- } else {
- // Can't exit in a browser.
- throw 'trying to exit with code ' + code;
- }
- },
+ fd_write: () => 0, // dummy
random_get: (bufPtr, bufLen) => {
crypto.getRandomValues(loadSlice(bufPtr, bufLen));
return 0;
@@ -290,17 +126,21 @@
return timeOrigin + performance.now();
},
- // func sleepTicks(timeout float64)
- "runtime.sleepTicks": (timeout) => {
- // Do not sleep, only reactivate scheduler after the given timeout.
- setTimeout(this._inst.exports.go_scheduler, timeout);
- },
-
// func finalizeRef(v ref)
"syscall/js.finalizeRef": (v_ref) => {
- // Note: TinyGo does not support finalizers so this should never be
- // called.
- console.error('syscall/js.finalizeRef not implemented');
+ reinterpretBuf.setBigInt64(0, v_ref, true);
+ const f = reinterpretBuf.getFloat64(0, true);
+ if (f === 0 || !isNaN(f)) {
+ return;
+ }
+ const id = v_ref & 0xffffffffn;
+ this._goRefCounts[id]--;
+ if (this._goRefCounts[id] === 0) {
+ const v = this._values[id];
+ this._values[id] = null;
+ this._ids.delete(v);
+ this._idPool.push(id);
+ }
},
// func stringVal(value string) ref
@@ -325,13 +165,6 @@
Reflect.set(v, p, x);
},
- // func valueDelete(v ref, p string)
- "syscall/js.valueDelete": (v_ref, p_ptr, p_len) => {
- const v = unboxValue(v_ref);
- const p = loadString(p_ptr, p_len);
- Reflect.deleteProperty(v, p);
- },
-
// func valueIndex(v ref, i int) ref
"syscall/js.valueIndex": (v_ref, i) => {
return boxValue(Reflect.get(unboxValue(v_ref), i));
@@ -357,19 +190,6 @@
}
},
- // func valueInvoke(v ref, args []ref) (ref, bool)
- "syscall/js.valueInvoke": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
- try {
- const v = unboxValue(v_ref);
- const args = loadSliceOfValues(args_ptr, args_len, args_cap);
- storeValue(ret_addr, Reflect.apply(v, undefined, args));
- mem().setUint8(ret_addr + 8, 1);
- } catch (err) {
- storeValue(ret_addr, err);
- mem().setUint8(ret_addr + 8, 0);
- }
- },
-
// func valueNew(v ref, args []ref) (ref, bool)
"syscall/js.valueNew": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
const v = unboxValue(v_ref);
@@ -401,47 +221,6 @@
const str = unboxValue(v_ref);
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
},
-
- // func valueInstanceOf(v ref, t ref) bool
- "syscall/js.valueInstanceOf": (v_ref, t_ref) => {
- return unboxValue(v_ref) instanceof unboxValue(t_ref);
- },
-
- // func copyBytesToGo(dst []byte, src ref) (int, bool)
- "syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => {
- let num_bytes_copied_addr = ret_addr;
- let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
-
- const dst = loadSlice(dest_addr, dest_len);
- const src = unboxValue(src_ref);
- if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
- mem().setUint8(returned_status_addr, 0); // Return "not ok" status
- return;
- }
- const toCopy = src.subarray(0, dst.length);
- dst.set(toCopy);
- mem().setUint32(num_bytes_copied_addr, toCopy.length, true);
- mem().setUint8(returned_status_addr, 1); // Return "ok" status
- },
-
- // copyBytesToJS(dst ref, src []byte) (int, bool)
- // Originally copied from upstream Go project, then modified:
- // https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
- "syscall/js.copyBytesToJS": (ret_addr, dst_ref, src_addr, src_len, src_cap) => {
- let num_bytes_copied_addr = ret_addr;
- let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
-
- const dst = unboxValue(dst_ref);
- const src = loadSlice(src_addr, src_len);
- if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
- mem().setUint8(returned_status_addr, 0); // Return "not ok" status
- return;
- }
- const toCopy = src.subarray(0, dst.length);
- dst.set(toCopy);
- mem().setUint32(num_bytes_copied_addr, toCopy.length, true);
- mem().setUint8(returned_status_addr, 1); // Return "ok" status
- },
}
};
@@ -458,7 +237,12 @@
null,
true,
false,
- global,
+ // fake global
+ {
+ set format(fn){ instance.format = fn; },
+ Array,
+ Object,
+ },
this,
];
this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id
@@ -497,24 +281,71 @@
}
}
- if (
- global.require &&
- global.require.main === module &&
- global.process &&
- global.process.versions &&
- !global.process.versions.electron
- ) {
- if (process.argv.length != 3) {
- console.error("usage: go_js_wasm_exec [wasm binary] [arguments]");
- process.exit(1);
- }
-
- const go = new Go();
- WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => {
- return go.run(result.instance);
- }).catch((err) => {
- console.error(err);
- process.exit(1);
- });
- }
-})();
+/**
+ * ================== End of wasm_exec.js ==================
+ */
+/**/let wasm;
+/**/async function __load(module, imports) {
+/**/ if (typeof Response === 'function' && module instanceof Response) {
+/**/ if (typeof WebAssembly.instantiateStreaming === 'function') {
+/**/ try { return await WebAssembly.instantiateStreaming(module, imports); }
+/**/ catch (e) {
+/**/ if (module.headers.get('Content-Type') != 'application/wasm') {
+/**/ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
+/**/ } else { throw e; }
+/**/ }
+/**/ }
+/**/ const bytes = await module.arrayBuffer();
+/**/ return await WebAssembly.instantiate(bytes, imports);
+/**/ } else {
+/**/ const instance = await WebAssembly.instantiate(module, imports);
+/**/ if (instance instanceof WebAssembly.Instance) return { instance, module };
+/**/ else return instance;
+/**/ }
+/**/}
+/**/function __finalize_init(instance) {
+/**/ return wasm = instance;
+/**/}
+/**/function __init_memory(imports, maybe_memory) { }
+/**/export function initSync(module) {
+/**/ if (wasm !== undefined) return wasm;
+/**/
+/**/ const go = new Go;
+/**/ const imports = go.importObject;
+/**/
+/**/ __init_memory(imports);
+/**/
+/**/ if (!(module instanceof WebAssembly.Module)) module = new WebAssembly.Module(module);
+/**/
+/**/ const instance = new WebAssembly.Instance(module, imports);
+/**/
+/**/ go.run(instance);
+/**/ return __finalize_init(instance, module);
+/**/}
+/**/export default async function initAsync(input) {
+/**/ if (wasm !== undefined) return wasm;
+/**/
+/**/ if (typeof input === 'undefined') input = new URL('gofmt.wasm', import.meta.url);
+/**/
+/**/ const go = new Go;
+/**/ const imports = go.importObject;
+/**/
+/**/ if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
+/**/ input = fetch(input);
+/**/ }
+/**/
+/**/ __init_memory(imports);
+/**/
+/**/ const { instance, module } = await __load(await input, imports);
+/**/
+/**/ go.run(instance);
+/**/ return __finalize_init(instance, module);
+/**/}
+/**/export function format(input) {
+/**/ const [err, result] = wasm.format(input);
+/**/ if (err) {
+/**/ throw new Error(result);
+/**/ }
+/**/ return result;
+/**/}
+/**/