10
10
namespace node {
11
11
namespace wasi {
12
12
13
+ struct WasmMemory {
14
+ char * data;
15
+ size_t size;
16
+ };
13
17
14
18
class WASI : public BaseObject ,
15
19
public mem::NgLibMemoryManager<WASI, uvwasi_mem_t > {
@@ -23,33 +27,42 @@ class WASI : public BaseObject,
23
27
SET_MEMORY_INFO_NAME (WASI)
24
28
SET_SELF_SIZE (WASI)
25
29
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 );
49
61
static void FdRead (const v8::FunctionCallbackInfo<v8::Value>& args);
50
62
static void FdReaddir (const v8::FunctionCallbackInfo<v8::Value>& args);
51
63
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 );
53
66
static void FdSync (const v8::FunctionCallbackInfo<v8::Value>& args);
54
67
static void FdTell (const v8::FunctionCallbackInfo<v8::Value>& args);
55
68
static void FdWrite (const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -69,11 +82,19 @@ class WASI : public BaseObject,
69
82
static void PollOneoff (const v8::FunctionCallbackInfo<v8::Value>& args);
70
83
static void ProcExit (const v8::FunctionCallbackInfo<v8::Value>& args);
71
84
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 );
77
98
78
99
static void _SetMemory (const v8::FunctionCallbackInfo<v8::Value>& args);
79
100
@@ -82,17 +103,30 @@ class WASI : public BaseObject,
82
103
void IncreaseAllocatedSize (size_t size);
83
104
void DecreaseAllocatedSize (size_t size);
84
105
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
+
85
128
private:
86
129
~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);
96
130
uvwasi_t uvw_;
97
131
v8::Global<v8::WasmMemoryObject> memory_;
98
132
uvwasi_mem_t alloc_info_;
0 commit comments