summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer/simple_ast.h
diff options
context:
space:
mode:
authormagic-akari <akari.ccino@gmail.com>2022-03-18 01:27:28 +0800
committerGitHub <noreply@github.com>2022-03-17 17:27:28 +0000
commitb7e1989553a645968399ad379a86b809e04c0ae2 (patch)
tree714472a3d156ad55f1a8ba1618426426b7295433 /src/emscripten-optimizer/simple_ast.h
parent86acb00c7095017f8bded15def3c928909099731 (diff)
downloadbinaryen-b7e1989553a645968399ad379a86b809e04c0ae2.tar.gz
binaryen-b7e1989553a645968399ad379a86b809e04c0ae2.tar.bz2
binaryen-b7e1989553a645968399ad379a86b809e04c0ae2.zip
[wasm2js] Support exports of Globals (#4523)
Export an object with a `.value` property like the wasm JS API does in browsers, and implement them with a getter and setter. Fixes #4522
Diffstat (limited to 'src/emscripten-optimizer/simple_ast.h')
-rw-r--r--src/emscripten-optimizer/simple_ast.h54
1 files changed, 49 insertions, 5 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h
index 7644daac3..64db04d79 100644
--- a/src/emscripten-optimizer/simple_ast.h
+++ b/src/emscripten-optimizer/simple_ast.h
@@ -1463,12 +1463,24 @@ struct JSPrinter {
newline();
}
bool needQuote = false;
+ const char* getterSetter = nullptr;
+ const char* setterParam = nullptr;
const char* str;
if (args[i][0]->isArray()) {
- assert(args[i][0][0] == STRING);
- // A quoted string.
- needQuote = true;
- str = args[i][0][1]->getCString();
+ if (args[i][0][0] == STRING) {
+ // A quoted string.
+ needQuote = true;
+ str = args[i][0][1]->getCString();
+ } else if (args[i][0][0] == GETTER) {
+ getterSetter = GETTER.c_str();
+ str = args[i][0][1]->getCString();
+ } else if (args[i][0][0] == SETTER) {
+ getterSetter = SETTER.c_str();
+ str = args[i][0][1]->getCString();
+ setterParam = args[i][0][2]->getCString();
+ } else {
+ abort();
+ }
} else {
// Just a raw string, no quotes.
str = args[i][0]->getCString();
@@ -1481,6 +1493,10 @@ struct JSPrinter {
}
check++;
}
+ if (getterSetter != nullptr) {
+ emit(getterSetter);
+ space();
+ }
if (needQuote) {
emit('"');
}
@@ -1488,7 +1504,15 @@ struct JSPrinter {
if (needQuote) {
emit('"');
}
- emit(":");
+ if (getterSetter != nullptr) {
+ emit('(');
+ if (setterParam != nullptr) {
+ emit(setterParam);
+ }
+ emit(')');
+ } else {
+ emit(":");
+ }
space();
print(args[i][1]);
}
@@ -1828,6 +1852,26 @@ public:
&makeRawArray(2)->push_back(makeString(key)).push_back(value));
}
+ static void appendToObjectAsGetter(Ref array, IString key, Ref value) {
+ assert(array[0] == OBJECT);
+ array[1]->push_back(&makeRawArray(2)
+ ->push_back(&makeRawArray(2)
+ ->push_back(makeRawString(GETTER))
+ .push_back(makeRawString(key)))
+ .push_back(value));
+ }
+
+ static void
+ appendToObjectAsSetter(Ref array, IString key, IString param, Ref value) {
+ assert(array[0] == OBJECT);
+ array[1]->push_back(&makeRawArray(2)
+ ->push_back(&makeRawArray(3)
+ ->push_back(makeRawString(SETTER))
+ .push_back(makeRawString(key))
+ .push_back(makeRawString(param)))
+ .push_back(value));
+ }
+
static Ref makeSub(Ref obj, Ref index) {
return &makeRawArray(2)
->push_back(makeRawString(SUB))