@wasm-fmt/gofmt 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/gofmt.js +69 -141
  2. package/gofmt.wasm +0 -0
  3. package/package.json +2 -5
package/gofmt.js CHANGED
@@ -5,6 +5,8 @@
5
5
  // This file has been modified for use by the TinyGo compiler.
6
6
  const encoder = new TextEncoder("utf-8");
7
7
  const decoder = new TextDecoder("utf-8");
8
+ let reinterpretBuf = new DataView(new ArrayBuffer(8));
9
+ var logLine = [];
8
10
 
9
11
  class Go {
10
12
  constructor() {
@@ -16,19 +18,9 @@
16
18
  return new DataView(this._inst.exports.memory.buffer);
17
19
  }
18
20
 
19
- const setInt64 = (addr, v) => {
20
- mem().setUint32(addr + 0, v, true);
21
- mem().setUint32(addr + 4, Math.floor(v / 4294967296), true);
22
- }
23
-
24
- const getInt64 = (addr) => {
25
- const low = mem().getUint32(addr + 0, true);
26
- const high = mem().getInt32(addr + 4, true);
27
- return low + high * 4294967296;
28
- }
29
-
30
- const loadValue = (addr) => {
31
- const f = mem().getFloat64(addr, true);
21
+ const unboxValue = (v_ref) => {
22
+ reinterpretBuf.setBigInt64(0, v_ref, true);
23
+ const f = reinterpretBuf.getFloat64(0, true);
32
24
  if (f === 0) {
33
25
  return undefined;
34
26
  }
@@ -36,71 +28,70 @@
36
28
  return f;
37
29
  }
38
30
 
39
- const id = mem().getUint32(addr, true);
31
+ const id = v_ref & 0xffffffffn;
40
32
  return this._values[id];
41
33
  }
42
34
 
43
- const storeValue = (addr, v) => {
44
- const nanHead = 0x7FF80000;
35
+
36
+ const loadValue = (addr) => {
37
+ let v_ref = mem().getBigUint64(addr, true);
38
+ return unboxValue(v_ref);
39
+ }
40
+
41
+ const boxValue = (v) => {
42
+ const nanHead = 0x7FF80000n;
45
43
 
46
44
  if (typeof v === "number") {
47
45
  if (isNaN(v)) {
48
- mem().setUint32(addr + 4, nanHead, true);
49
- mem().setUint32(addr, 0, true);
50
- return;
46
+ return nanHead << 32n;
51
47
  }
52
48
  if (v === 0) {
53
- mem().setUint32(addr + 4, nanHead, true);
54
- mem().setUint32(addr, 1, true);
55
- return;
49
+ return (nanHead << 32n) | 1n;
56
50
  }
57
- mem().setFloat64(addr, v, true);
58
- return;
51
+ reinterpretBuf.setFloat64(0, v, true);
52
+ return reinterpretBuf.getBigInt64(0, true);
59
53
  }
60
54
 
61
55
  switch (v) {
62
56
  case undefined:
63
- mem().setFloat64(addr, 0, true);
64
- return;
57
+ return 0n;
65
58
  case null:
66
- mem().setUint32(addr + 4, nanHead, true);
67
- mem().setUint32(addr, 2, true);
68
- return;
59
+ return (nanHead << 32n) | 2n;
69
60
  case true:
70
- mem().setUint32(addr + 4, nanHead, true);
71
- mem().setUint32(addr, 3, true);
72
- return;
61
+ return (nanHead << 32n) | 3n;
73
62
  case false:
74
- mem().setUint32(addr + 4, nanHead, true);
75
- mem().setUint32(addr, 4, true);
76
- return;
63
+ return (nanHead << 32n) | 4n;
77
64
  }
78
65
 
79
66
  let id = this._ids.get(v);
80
67
  if (id === undefined) {
81
68
  id = this._idPool.pop();
82
69
  if (id === undefined) {
83
- id = this._values.length;
70
+ id = BigInt(this._values.length);
84
71
  }
85
72
  this._values[id] = v;
86
73
  this._goRefCounts[id] = 0;
87
74
  this._ids.set(v, id);
88
75
  }
89
76
  this._goRefCounts[id]++;
90
- let typeFlag = 1;
77
+ let typeFlag = 1n;
91
78
  switch (typeof v) {
92
79
  case "string":
93
- typeFlag = 2;
80
+ typeFlag = 2n;
94
81
  break;
95
82
  case "symbol":
96
- typeFlag = 3;
83
+ typeFlag = 3n;
97
84
  break;
98
85
  case "function":
99
- typeFlag = 4;
86
+ typeFlag = 4n;
100
87
  break;
101
88
  }
102
- mem().setUint32(addr + 4, nanHead | typeFlag, true);
103
- mem().setUint32(addr, id, true);
89
+ return id | ((nanHead | typeFlag) << 32n);
90
+ }
91
+
92
+ const storeValue = (addr, v) => {
93
+ let v_ref = boxValue(v);
94
+ mem().setBigUint64(addr, v_ref, true);
104
95
  }
105
96
 
106
97
  const loadSlice = (array, len, cap) => {
@@ -124,27 +115,21 @@
124
115
  wasi_snapshot_preview1: {
125
116
  // https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write
126
117
  fd_write() {},
127
- fd_close() {},
128
- fd_fdstat_get() {},
129
- fd_seek() {},
130
- proc_exit() {},
131
- random_get() {}
132
118
  },
133
- env: {
119
+ gojs: {
134
120
  // func ticks() float64
135
121
  "runtime.ticks": () => {
136
122
  return timeOrigin + performance.now();
137
123
  },
138
124
 
139
- // func sleepTicks(timeout float64)
140
- "runtime.sleepTicks": (timeout) => {
141
- // Do not sleep, only reactivate scheduler after the given timeout.
142
- setTimeout(this._inst.exports.go_scheduler, timeout);
143
- },
144
-
145
125
  // func finalizeRef(v ref)
146
- "syscall/js.finalizeRef": (v_addr) => {
147
- const id = mem().getUint32(v_addr, true);
126
+ "syscall/js.finalizeRef": (v_ref) => {
127
+ reinterpretBuf.setBigInt64(0, v_ref, true);
128
+ const f = reinterpretBuf.getFloat64(0, true);
129
+ if (f === 0 || !isNaN(f)) {
130
+ return;
131
+ }
132
+ const id = v_ref & 0xffffffffn;
148
133
  this._goRefCounts[id]--;
149
134
  if (this._goRefCounts[id] === 0) {
150
135
  const v = this._values[id];
@@ -155,47 +140,40 @@
155
140
  },
156
141
 
157
142
  // func stringVal(value string) ref
158
- "syscall/js.stringVal": (ret_ptr, value_ptr, value_len) => {
143
+ "syscall/js.stringVal": (value_ptr, value_len) => {
159
144
  const s = loadString(value_ptr, value_len);
160
- storeValue(ret_ptr, s);
145
+ return boxValue(s);
161
146
  },
162
147
 
163
148
  // func valueGet(v ref, p string) ref
164
- "syscall/js.valueGet": (retval, v_addr, p_ptr, p_len) => {
149
+ "syscall/js.valueGet": (v_ref, p_ptr, p_len) => {
165
150
  let prop = loadString(p_ptr, p_len);
166
- let value = loadValue(v_addr);
167
- let result = Reflect.get(value, prop);
168
- storeValue(retval, result);
151
+ let v = unboxValue(v_ref);
152
+ let result = Reflect.get(v, prop);
153
+ return boxValue(result);
169
154
  },
170
155
 
171
156
  // func valueSet(v ref, p string, x ref)
172
- "syscall/js.valueSet": (v_addr, p_ptr, p_len, x_addr) => {
173
- const v = loadValue(v_addr);
157
+ "syscall/js.valueSet": (v_ref, p_ptr, p_len, x_ref) => {
158
+ const v = unboxValue(v_ref);
174
159
  const p = loadString(p_ptr, p_len);
175
- const x = loadValue(x_addr);
160
+ const x = unboxValue(x_ref);
176
161
  Reflect.set(v, p, x);
177
162
  },
178
163
 
179
- // func valueDelete(v ref, p string)
180
- "syscall/js.valueDelete": (v_addr, p_ptr, p_len) => {
181
- const v = loadValue(v_addr);
182
- const p = loadString(p_ptr, p_len);
183
- Reflect.deleteProperty(v, p);
184
- },
185
-
186
164
  // func valueIndex(v ref, i int) ref
187
- "syscall/js.valueIndex": (ret_addr, v_addr, i) => {
188
- storeValue(ret_addr, Reflect.get(loadValue(v_addr), i));
165
+ "syscall/js.valueIndex": (v_ref, i) => {
166
+ return boxValue(Reflect.get(unboxValue(v_ref), i));
189
167
  },
190
168
 
191
169
  // valueSetIndex(v ref, i int, x ref)
192
- "syscall/js.valueSetIndex": (v_addr, i, x_addr) => {
193
- Reflect.set(loadValue(v_addr), i, loadValue(x_addr));
170
+ "syscall/js.valueSetIndex": (v_ref, i, x_ref) => {
171
+ Reflect.set(unboxValue(v_ref), i, unboxValue(x_ref));
194
172
  },
195
173
 
196
174
  // func valueCall(v ref, m string, args []ref) (ref, bool)
197
- "syscall/js.valueCall": (ret_addr, v_addr, m_ptr, m_len, args_ptr, args_len, args_cap) => {
198
- const v = loadValue(v_addr);
175
+ "syscall/js.valueCall": (ret_addr, v_ref, m_ptr, m_len, args_ptr, args_len, args_cap) => {
176
+ const v = unboxValue(v_ref);
199
177
  const name = loadString(m_ptr, m_len);
200
178
  const args = loadSliceOfValues(args_ptr, args_len, args_cap);
201
179
  try {
@@ -208,22 +186,9 @@
208
186
  }
209
187
  },
210
188
 
211
- // func valueInvoke(v ref, args []ref) (ref, bool)
212
- "syscall/js.valueInvoke": (ret_addr, v_addr, args_ptr, args_len, args_cap) => {
213
- try {
214
- const v = loadValue(v_addr);
215
- const args = loadSliceOfValues(args_ptr, args_len, args_cap);
216
- storeValue(ret_addr, Reflect.apply(v, undefined, args));
217
- mem().setUint8(ret_addr + 8, 1);
218
- } catch (err) {
219
- storeValue(ret_addr, err);
220
- mem().setUint8(ret_addr + 8, 0);
221
- }
222
- },
223
-
224
189
  // func valueNew(v ref, args []ref) (ref, bool)
225
- "syscall/js.valueNew": (ret_addr, v_addr, args_ptr, args_len, args_cap) => {
226
- const v = loadValue(v_addr);
190
+ "syscall/js.valueNew": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
191
+ const v = unboxValue(v_ref);
227
192
  const args = loadSliceOfValues(args_ptr, args_len, args_cap);
228
193
  try {
229
194
  storeValue(ret_addr, Reflect.construct(v, args));
@@ -235,66 +200,29 @@
235
200
  },
236
201
 
237
202
  // func valueLength(v ref) int
238
- "syscall/js.valueLength": (v_addr) => {
239
- return loadValue(v_addr).length;
203
+ "syscall/js.valueLength": (v_ref) => {
204
+ return unboxValue(v_ref).length;
240
205
  },
241
206
 
242
207
  // valuePrepareString(v ref) (ref, int)
243
- "syscall/js.valuePrepareString": (ret_addr, v_addr) => {
244
- const s = String(loadValue(v_addr));
208
+ "syscall/js.valuePrepareString": (ret_addr, v_ref) => {
209
+ const s = String(unboxValue(v_ref));
245
210
  const str = encoder.encode(s);
246
211
  storeValue(ret_addr, str);
247
- setInt64(ret_addr + 8, str.length);
212
+ mem().setInt32(ret_addr + 8, str.length, true);
248
213
  },
249
214
 
250
215
  // valueLoadString(v ref, b []byte)
251
- "syscall/js.valueLoadString": (v_addr, slice_ptr, slice_len, slice_cap) => {
252
- const str = loadValue(v_addr);
216
+ "syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => {
217
+ const str = unboxValue(v_ref);
253
218
  loadSlice(slice_ptr, slice_len, slice_cap).set(str);
254
219
  },
255
-
256
- // func valueInstanceOf(v ref, t ref) bool
257
- "syscall/js.valueInstanceOf": (v_addr, t_addr) => {
258
- return loadValue(v_addr) instanceof loadValue(t_addr);
259
- },
260
-
261
- // func copyBytesToGo(dst []byte, src ref) (int, bool)
262
- "syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, source_addr) => {
263
- let num_bytes_copied_addr = ret_addr;
264
- let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
265
-
266
- const dst = loadSlice(dest_addr, dest_len);
267
- const src = loadValue(source_addr);
268
- if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
269
- mem().setUint8(returned_status_addr, 0); // Return "not ok" status
270
- return;
271
- }
272
- const toCopy = src.subarray(0, dst.length);
273
- dst.set(toCopy);
274
- setInt64(num_bytes_copied_addr, toCopy.length);
275
- mem().setUint8(returned_status_addr, 1); // Return "ok" status
276
- },
277
-
278
- // copyBytesToJS(dst ref, src []byte) (int, bool)
279
- // Originally copied from upstream Go project, then modified:
280
- // https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
281
- "syscall/js.copyBytesToJS": (ret_addr, dest_addr, source_addr, source_len, source_cap) => {
282
- let num_bytes_copied_addr = ret_addr;
283
- let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
284
-
285
- const dst = loadValue(dest_addr);
286
- const src = loadSlice(source_addr, source_len);
287
- if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
288
- mem().setUint8(returned_status_addr, 0); // Return "not ok" status
289
- return;
290
- }
291
- const toCopy = src.subarray(0, dst.length);
292
- dst.set(toCopy);
293
- setInt64(num_bytes_copied_addr, toCopy.length);
294
- mem().setUint8(returned_status_addr, 1); // Return "ok" status
295
- },
296
220
  }
297
221
  };
222
+
223
+ // Go 1.20 uses 'env'. Go 1.21 uses 'gojs'.
224
+ // For compatibility, we use both as long as Go 1.20 is supported.
225
+ this.importObject.env = this.importObject.gojs;
298
226
  }
299
227
 
300
228
  async run(instance) {
package/gofmt.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@wasm-fmt/gofmt",
3
3
  "description": "A wasm based golang formatter",
4
4
  "author": "magic-akari <akari.ccino@gamil.com>",
5
- "version": "0.4.2",
5
+ "version": "0.4.3",
6
6
  "license": "MIT",
7
7
  "keywords": [
8
8
  "wasm",
@@ -34,10 +34,7 @@
34
34
  "./*": "./*"
35
35
  },
36
36
  "scripts": {
37
- "gofmt": "cp $(tinygo env TINYGOROOT)/targets/wasm_exec.js ./gofmt.js",
38
- "patch": "git apply ./gofmt.patch",
39
- "build": "tinygo build -o=gofmt.wasm -target=wasm -no-debug -stack-size=24kb ./src/lib.go",
40
- "postbuild": "npm run gofmt && npm run patch",
37
+ "build": "./scripts/build.sh",
41
38
  "test:node": "node --test test_node",
42
39
  "test:deno": "deno test test_deno --allow-read",
43
40
  "test:bun": "bun test test_bun"