Skip to content

Commit 0bf8869

Browse files
committed
wasi: fast calls
1 parent 7233b18 commit 0bf8869

28 files changed

+526
-631
lines changed

β€Žsrc/node_wasi.cc

Lines changed: 450 additions & 591 deletions
Large diffs are not rendered by default.

β€Žsrc/node_wasi.h

Lines changed: 72 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
namespace node {
1111
namespace wasi {
1212

13+
struct WasmMemory {
14+
char* data;
15+
size_t size;
16+
};
1317

1418
class WASI : public BaseObject,
1519
public mem::NgLibMemoryManager<WASI, uvwasi_mem_t> {
@@ -23,33 +27,42 @@ class WASI : public BaseObject,
2327
SET_MEMORY_INFO_NAME(WASI)
2428
SET_SELF_SIZE(WASI)
2529

26-
static void ArgsGet(const v8::FunctionCallbackInfo<v8::Value>& args);
27-
static void ArgsSizesGet(const v8::FunctionCallbackInfo<v8::Value>& args);
28-
static void ClockResGet(const v8::FunctionCallbackInfo<v8::Value>& args);
29-
static void ClockTimeGet(const v8::FunctionCallbackInfo<v8::Value>& args);
30-
static void EnvironGet(const v8::FunctionCallbackInfo<v8::Value>& args);
31-
static void EnvironSizesGet(const v8::FunctionCallbackInfo<v8::Value>& args);
32-
static void FdAdvise(const v8::FunctionCallbackInfo<v8::Value>& args);
33-
static void FdAllocate(const v8::FunctionCallbackInfo<v8::Value>& args);
34-
static void FdClose(const v8::FunctionCallbackInfo<v8::Value>& args);
35-
static void FdDatasync(const v8::FunctionCallbackInfo<v8::Value>& args);
36-
static void FdFdstatGet(const v8::FunctionCallbackInfo<v8::Value>& args);
37-
static void FdFdstatSetFlags(const v8::FunctionCallbackInfo<v8::Value>& args);
38-
static void FdFdstatSetRights(
39-
const v8::FunctionCallbackInfo<v8::Value>& args);
40-
static void FdFilestatGet(const v8::FunctionCallbackInfo<v8::Value>& args);
41-
static void FdFilestatSetSize(
42-
const v8::FunctionCallbackInfo<v8::Value>& args);
43-
static void FdFilestatSetTimes(
44-
const v8::FunctionCallbackInfo<v8::Value>& args);
45-
static void FdPread(const v8::FunctionCallbackInfo<v8::Value>& args);
46-
static void FdPrestatGet(const v8::FunctionCallbackInfo<v8::Value>& args);
47-
static void FdPrestatDirName(const v8::FunctionCallbackInfo<v8::Value>& args);
48-
static void FdPwrite(const v8::FunctionCallbackInfo<v8::Value>& args);
30+
static uint32_t ArgsGet(WASI&, WasmMemory, uint32_t, uint32_t);
31+
static uint32_t ArgsSizesGet(WASI&, WasmMemory, uint32_t, uint32_t);
32+
static uint32_t ClockResGet(WASI&, WasmMemory, uint32_t, uint32_t);
33+
static uint32_t ClockTimeGet(WASI&, WasmMemory, uint32_t, uint64_t, uint32_t);
34+
static uint32_t EnvironGet(WASI&, WasmMemory, uint32_t, uint32_t);
35+
static uint32_t EnvironSizesGet(WASI&, WasmMemory, uint32_t, uint32_t);
36+
static uint32_t FdAdvise(
37+
WASI&, WasmMemory, uint32_t, uint64_t, uint64_t, uint32_t);
38+
static uint32_t FdAllocate(WASI&, WasmMemory, uint32_t, uint64_t, uint64_t);
39+
static uint32_t FdClose(WASI&, WasmMemory, uint32_t);
40+
static uint32_t FdDatasync(WASI&, WasmMemory, uint32_t);
41+
static uint32_t FdFdstatGet(WASI&, WasmMemory, uint32_t, uint32_t);
42+
static uint32_t FdFdstatSetFlags(WASI&, WasmMemory, uint32_t, uint32_t);
43+
static uint32_t FdFdstatSetRights(
44+
WASI&, WasmMemory, uint32_t, uint64_t, uint64_t);
45+
static uint32_t FdFilestatGet(WASI&, WasmMemory, uint32_t, uint32_t);
46+
static uint32_t FdFilestatSetSize(WASI&, WasmMemory, uint32_t, uint64_t);
47+
static uint32_t FdFilestatSetTimes(
48+
WASI&, WasmMemory, uint32_t, uint64_t, uint64_t, uint32_t);
49+
static uint32_t FdPread(WASI&,
50+
WasmMemory memory,
51+
uint32_t,
52+
uint32_t,
53+
uint32_t,
54+
uint64_t,
55+
uint32_t);
56+
static uint32_t FdPrestatGet(WASI&, WasmMemory, uint32_t, uint32_t);
57+
static uint32_t FdPrestatDirName(
58+
WASI&, WasmMemory, uint32_t, uint32_t, uint32_t);
59+
static uint32_t FdPwrite(
60+
WASI&, WasmMemory, uint32_t, uint32_t, uint32_t, uint64_t, uint32_t);
4961
static void FdRead(const v8::FunctionCallbackInfo<v8::Value>& args);
5062
static void FdReaddir(const v8::FunctionCallbackInfo<v8::Value>& args);
5163
static void FdRenumber(const v8::FunctionCallbackInfo<v8::Value>& args);
52-
static void FdSeek(const v8::FunctionCallbackInfo<v8::Value>& args);
64+
static uint32_t FdSeek(
65+
WASI&, WasmMemory, uint32_t, int64_t, uint32_t, uint32_t);
5366
static void FdSync(const v8::FunctionCallbackInfo<v8::Value>& args);
5467
static void FdTell(const v8::FunctionCallbackInfo<v8::Value>& args);
5568
static void FdWrite(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -69,11 +82,19 @@ class WASI : public BaseObject,
6982
static void PollOneoff(const v8::FunctionCallbackInfo<v8::Value>& args);
7083
static void ProcExit(const v8::FunctionCallbackInfo<v8::Value>& args);
7184
static void ProcRaise(const v8::FunctionCallbackInfo<v8::Value>& args);
72-
static void RandomGet(const v8::FunctionCallbackInfo<v8::Value>& args);
73-
static void SchedYield(const v8::FunctionCallbackInfo<v8::Value>& args);
74-
static void SockRecv(const v8::FunctionCallbackInfo<v8::Value>& args);
75-
static void SockSend(const v8::FunctionCallbackInfo<v8::Value>& args);
76-
static void SockShutdown(const v8::FunctionCallbackInfo<v8::Value>& args);
85+
static uint32_t RandomGet(WASI&, WasmMemory, uint32_t, uint32_t);
86+
static uint32_t SchedYield(WASI&, WasmMemory);
87+
static uint32_t SockRecv(WASI&,
88+
WasmMemory,
89+
uint32_t,
90+
uint32_t,
91+
uint32_t,
92+
uint32_t,
93+
uint32_t,
94+
uint32_t);
95+
static uint32_t SockSend(
96+
WASI&, WasmMemory, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
97+
static uint32_t SockShutdown(WASI&, WasmMemory, uint32_t, uint32_t);
7798

7899
static void _SetMemory(const v8::FunctionCallbackInfo<v8::Value>& args);
79100

@@ -82,17 +103,30 @@ class WASI : public BaseObject,
82103
void IncreaseAllocatedSize(size_t size);
83104
void DecreaseAllocatedSize(size_t size);
84105

106+
// <typename FT, FT F> as a C++14 desugaring of `<auto F>`
107+
template <typename FT, FT F, typename R, typename... Args>
108+
class WasiFunction {
109+
public:
110+
static void SetFunction(Environment*,
111+
const char*,
112+
v8::Local<v8::FunctionTemplate>);
113+
114+
private:
115+
static R FastCallback(v8::Local<v8::Object> receiver,
116+
Args...,
117+
v8::FastApiCallbackOptions&);
118+
119+
static void SlowCallback(const v8::FunctionCallbackInfo<v8::Value>&);
120+
121+
// Another hack, SlowCallback is just a dumb wrapper that expands
122+
// `InnerSlowCallback<Indices...>` from `Args...` :(
123+
template <size_t... Indices>
124+
static void InnerSlowCallback(std::index_sequence<Indices...>,
125+
const v8::FunctionCallbackInfo<v8::Value>&);
126+
};
127+
85128
private:
86129
~WASI() override;
87-
inline void readUInt8(char* memory, uint8_t* value, uint32_t offset);
88-
inline void readUInt16(char* memory, uint16_t* value, uint32_t offset);
89-
inline void readUInt32(char* memory, uint32_t* value, uint32_t offset);
90-
inline void readUInt64(char* memory, uint64_t* value, uint32_t offset);
91-
inline void writeUInt8(char* memory, uint8_t value, uint32_t offset);
92-
inline void writeUInt16(char* memory, uint16_t value, uint32_t offset);
93-
inline void writeUInt32(char* memory, uint32_t value, uint32_t offset);
94-
inline void writeUInt64(char* memory, uint64_t value, uint32_t offset);
95-
uvwasi_errno_t backingStore(char** store, size_t* byte_length);
96130
uvwasi_t uvw_;
97131
v8::Global<v8::WasmMemoryObject> memory_;
98132
uvwasi_mem_t alloc_info_;

β€Žtest/wasi/Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
CC = /opt/wasi-sdk/bin/clang
2-
TARGET = wasm32-unknown-wasi
2+
TARGET = wasm32-wasi
33
SYSROOT =
4+
CFLAGS = -D_WASI_EMULATED_PROCESS_CLOCKS -lwasi-emulated-process-clocks
45

56
OBJ = $(patsubst c/%.c, wasm/%.wasm, $(wildcard c/*.c))
67
all: $(OBJ)
78

89
wasm/%.wasm : c/%.c
9-
$(CC) $< --target=$(TARGET) --sysroot=$(SYSROOT) -s -o $@
10+
$(CC) $< $(CFLAGS) --target=$(TARGET) --sysroot=$(SYSROOT) -s -o $@
1011

1112
.PHONY clean:
1213
rm -f $(OBJ)

β€Žtest/wasi/test-wasi.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ if (process.argv[2] === 'wasi-child') {
5050
opts.input = options.stdin;
5151

5252
const child = cp.spawnSync(process.execPath, [
53+
...process.argv.slice(1, -1),
5354
'--experimental-wasi-unstable-preview1',
5455
__filename,
5556
'wasi-child',

β€Žtest/wasi/wasm/cant_dotdot.wasm

-1.83 KB
Binary file not shown.

β€Žtest/wasi/wasm/clock_getres.wasm

-11.5 KB
Binary file not shown.

β€Žtest/wasi/wasm/create_symlink.wasm

-2.72 KB
Binary file not shown.

β€Žtest/wasi/wasm/exitcode.wasm

-11.6 KB
Binary file not shown.
-11.5 KB
Binary file not shown.

β€Žtest/wasi/wasm/follow_symlink.wasm

-2.9 KB
Binary file not shown.

0 commit comments

Comments
Β (0)