This repository was archived by the owner on Dec 10, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathoptions.cc
126 lines (115 loc) · 3.87 KB
/
options.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "options.h"
namespace SSVM {
namespace NAPI {
namespace {
bool parseWasiStartFlag(const Napi::Object &Options) {
if (Options.Has("EnableWasiStartFunction") &&
Options.Get("EnableWasiStartFunction").IsBoolean()) {
return Options.Get("EnableWasiStartFunction").As<Napi::Boolean>().Value();
}
return false;
}
bool parseCmdArgs(std::vector<std::string> &CmdArgs,
const Napi::Object &Options) {
CmdArgs.clear();
if (Options.Has("args") && Options.Get("args").IsArray()) {
Napi::Array Args = Options.Get("args").As<Napi::Array>();
for (uint32_t i = 0; i < Args.Length(); i++) {
Napi::Value Arg = Args[i];
if (Arg.IsNumber()) {
CmdArgs.push_back(std::to_string(Arg.As<Napi::Number>().Uint32Value()));
} else if (Arg.IsString()) {
CmdArgs.push_back(Arg.As<Napi::String>().Utf8Value());
} else if (Arg.IsTypedArray() &&
Arg.As<Napi::TypedArray>().TypedArrayType() ==
napi_uint8_array) {
Napi::ArrayBuffer DataBuffer = Arg.As<Napi::TypedArray>().ArrayBuffer();
std::string ArrayArg = std::string(
static_cast<char *>(DataBuffer.Data()),
static_cast<char *>(DataBuffer.Data()) + DataBuffer.ByteLength());
CmdArgs.push_back(ArrayArg);
} else {
// TODO: support other types
return false;
}
}
}
return true;
}
bool parseDirs(std::vector<std::string> &Dirs, const Napi::Object &Options) {
Dirs.clear();
if (Options.Has("preopens") && Options.Get("preopens").IsObject()) {
Napi::Object Preopens = Options.Get("preopens").As<Napi::Object>();
Napi::Array Keys = Preopens.GetPropertyNames();
for (uint32_t i = 0; i < Keys.Length(); i++) {
// Dir format: <guest_path>:<host_path>
Napi::Value Key = Keys[i];
if (!Key.IsString()) {
// host path must be a string
return false;
}
std::string Dir = Key.As<Napi::String>().Utf8Value();
Dir.append(":");
Napi::Value Value = Preopens.Get(Key);
if (!Value.IsString()) {
// guest path must be a string
return false;
}
Dir.append(Value.As<Napi::String>().Utf8Value());
Dirs.push_back(Dir);
}
}
return true;
}
bool parseEnvs(std::vector<std::string> &Envs, const Napi::Object &Options) {
Envs.clear();
if (Options.Has("env") && Options.Get("env").IsObject()) {
Napi::Object Environs = Options.Get("env").As<Napi::Object>();
Napi::Array Keys = Environs.GetPropertyNames();
for (uint32_t i = 0; i < Keys.Length(); i++) {
// Environ format: <KEY>=<VALUE>
Napi::Value Key = Keys[i];
if (!Key.IsString()) {
// key must be a string
return false;
}
std::string Env = Key.As<Napi::String>().Utf8Value();
Env.append("=");
Napi::Value Value = Environs.Get(Key);
if (!Value.IsString()) {
// value must be a string
return false;
}
Env.append(Value.As<Napi::String>().Utf8Value());
Envs.push_back(Env);
}
}
return true;
}
bool parseAOTConfig(const Napi::Object &Options) {
if (Options.Has("EnableAOT") && Options.Get("EnableAOT").IsBoolean()) {
return Options.Get("EnableAOT").As<Napi::Boolean>().Value();
}
return false;
}
bool parseMeasure(const Napi::Object &Options) {
if (Options.Has("EnableMeasurement") &&
Options.Get("EnableMeasurement").IsBoolean()) {
return Options.Get("EnableMeasurement").As<Napi::Boolean>().Value();
}
return false;
}
} // namespace
bool SSVMOptions::parse(const Napi::Object &Options) {
if (!parseCmdArgs(getWasiCmdArgs(), Options) ||
!parseDirs(getWasiDirs(), Options) ||
!parseEnvs(getWasiEnvs(), Options)) {
return false;
}
setReactorMode(!parseWasiStartFlag(Options));
setAOTMode(parseAOTConfig(Options));
setMeasure(parseMeasure(Options));
return true;
}
} // namespace NAPI
} // namespace SSVM