Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions targets/wasm_exec.js
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@
wasi_snapshot_preview1: {
// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md
fd_write: function(fd, iovs_ptr, iovs_len, nwritten_ptr) {
iovs_ptr >>>= 0;
iovs_len >>>= 0;
nwritten_ptr >>>= 0;
let nwritten = 0;
if (fd == 1) {
for (let iovs_i=0; iovs_i<iovs_len;iovs_i++) {
Expand Down Expand Up @@ -284,6 +287,8 @@
throw wasmExit;
},
random_get: (bufPtr, bufLen) => {
bufPtr >>>= 0;
bufLen >>>= 0;
crypto.getRandomValues(loadSlice(bufPtr, bufLen));
return 0;
},
Expand All @@ -296,6 +301,8 @@

// func getRandomData(r []byte)
"runtime.getRandomData": (slice_ptr, slice_len, slice_cap) => {
slice_ptr >>>= 0;
slice_len >>>= 0;
crypto.getRandomValues(loadSlice(slice_ptr, slice_len, slice_cap));
},

Expand Down Expand Up @@ -333,12 +340,15 @@
// func stringVal(value string) ref
"syscall/js.stringVal": (value_ptr, value_len) => {
value_ptr >>>= 0;
value_len >>>= 0;
const s = loadString(value_ptr, value_len);
return boxValue(s);
},

// func valueGet(v ref, p string) ref
"syscall/js.valueGet": (v_ref, p_ptr, p_len) => {
p_ptr >>>= 0;
p_len >>>= 0;
let prop = loadString(p_ptr, p_len);
let v = unboxValue(v_ref);
let result = Reflect.get(v, prop);
Expand All @@ -347,6 +357,8 @@

// func valueSet(v ref, p string, x ref)
"syscall/js.valueSet": (v_ref, p_ptr, p_len, x_ref) => {
p_ptr >>>= 0;
p_len >>>= 0;
const v = unboxValue(v_ref);
const p = loadString(p_ptr, p_len);
const x = unboxValue(x_ref);
Expand All @@ -355,6 +367,8 @@

// func valueDelete(v ref, p string)
"syscall/js.valueDelete": (v_ref, p_ptr, p_len) => {
p_ptr >>>= 0;
p_len >>>= 0;
const v = unboxValue(v_ref);
const p = loadString(p_ptr, p_len);
Reflect.deleteProperty(v, p);
Expand All @@ -372,6 +386,11 @@

// func valueCall(v ref, m string, args []ref) (ref, bool)
"syscall/js.valueCall": (ret_addr, v_ref, m_ptr, m_len, args_ptr, args_len, args_cap) => {
ret_addr >>>= 0;
m_ptr >>>= 0;
m_len >>>= 0;
args_ptr >>>= 0;
args_len >>>= 0;
const v = unboxValue(v_ref);
const name = loadString(m_ptr, m_len);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
Expand All @@ -387,6 +406,9 @@

// func valueInvoke(v ref, args []ref) (ref, bool)
"syscall/js.valueInvoke": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
ret_addr >>>= 0;
args_ptr >>>= 0;
args_len >>>= 0;
try {
const v = unboxValue(v_ref);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
Expand All @@ -400,6 +422,9 @@

// func valueNew(v ref, args []ref) (ref, bool)
"syscall/js.valueNew": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
ret_addr >>>= 0;
args_ptr >>>= 0;
args_len >>>= 0;
const v = unboxValue(v_ref);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
try {
Expand All @@ -418,6 +443,7 @@

// valuePrepareString(v ref) (ref, int)
"syscall/js.valuePrepareString": (ret_addr, v_ref) => {
ret_addr >>>= 0;
const s = String(unboxValue(v_ref));
const str = encoder.encode(s);
storeValue(ret_addr, str);
Expand All @@ -426,6 +452,8 @@

// valueLoadString(v ref, b []byte)
"syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => {
slice_ptr >>>= 0;
slice_len >>>= 0;
const str = unboxValue(v_ref);
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
},
Expand All @@ -437,6 +465,9 @@

// func copyBytesToGo(dst []byte, src ref) (int, bool)
"syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => {
ret_addr >>>= 0;
dest_addr >>>= 0;
dest_len >>>= 0;
let num_bytes_copied_addr = ret_addr;
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable

Expand All @@ -456,6 +487,9 @@
// 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) => {
ret_addr >>>= 0;
src_addr >>>= 0;
src_len >>>= 0;
let num_bytes_copied_addr = ret_addr;
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable

Expand Down