1010namespace node {
1111namespace wasi {
1212
13+ struct WasmMemory {
14+ char * data;
15+ size_t size;
16+ };
1317
1418class 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_;
0 commit comments