summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/shared-constants.h1
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm-s-parser.h38
-rw-r--r--src/wasm.cpp1
-rw-r--r--src/wasm.h1
5 files changed, 37 insertions, 5 deletions
diff --git a/src/shared-constants.h b/src/shared-constants.h
index 2d656f0eb..923ccc7de 100644
--- a/src/shared-constants.h
+++ b/src/shared-constants.h
@@ -47,6 +47,7 @@ extern Name GROW_WASM_MEMORY,
BR,
ANYFUNC,
FAKE_RETURN,
+ MUT,
SPECTEST,
PRINT,
EXIT;
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 9b8451b98..147746c82 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1653,6 +1653,7 @@ public:
auto curr = new Global;
curr->type = getWasmType();
curr->init = readExpression();
+ curr->mutable_ = true; // TODO
wasm.addGlobal(curr);
}
}
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 5acae1e6b..b4fcd3466 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -383,7 +383,10 @@ private:
void preParseImports(Element& curr) {
IString id = curr[0]->str();
if (id == IMPORT) parseImport(curr);
- if (id == FUNC && isImport(curr)) parseFunction(curr, true /* preParseImport */);
+ if (isImport(curr)) {
+ if (id == FUNC) parseFunction(curr, true /* preParseImport */);
+ else throw ParseException("fancy import we don't support yet", curr.line, curr.col);
+ }
}
void parseModuleElement(Element& curr) {
@@ -1022,6 +1025,7 @@ private:
Expression* makeSetGlobal(Element& s) {
auto ret = allocator.alloc<SetGlobal>();
ret->name = s[1]->str();
+ if (wasm.checkGlobal(ret->name) && !wasm.checkGlobal(ret->name)->mutable_) throw ParseException("set_global of immutable", s.line, s.col);
ret->value = parseExpression(s[2]);
return ret;
}
@@ -1513,6 +1517,8 @@ private:
ex->kind = Export::Table;
} else if (inner[0]->str() == GLOBAL) {
ex->kind = Export::Global;
+ auto* global = wasm.getGlobal(ex->value);
+ if (global->mutable_) throw ParseException("cannot export a mutable global", s.line, s.col);
} else {
WASM_UNREACHABLE();
}
@@ -1609,7 +1615,14 @@ private:
}
im->functionType = ensureFunctionType(getSig(type.get()), &wasm);
} else if (im->kind == Import::Global) {
- im->globalType = stringToWasmType(inner[j]->str());
+ if (inner[j]->isStr()) {
+ im->globalType = stringToWasmType(inner[j]->str());
+ } else {
+ auto& inner2 = *inner[j];
+ assert(inner2[0]->str() == MUT);
+ im->globalType = stringToWasmType(inner2[1]->str());
+ throw ParseException("cannot import a mutable global", s.line, s.col);
+ }
}
wasm.addImport(im.release());
}
@@ -1623,7 +1636,10 @@ private:
global->name = Name::fromInt(globalCounter);
}
globalCounter++;
- if (s[i]->isList()) {
+ bool mutable_ = false;
+ WasmType type = none;
+ bool exported = false;
+ while (s[i]->isList()) {
auto& inner = *s[i];
if (inner[0]->str() == EXPORT) {
auto ex = make_unique<Export>();
@@ -1632,13 +1648,25 @@ private:
ex->kind = Export::Global;
if (wasm.checkExport(ex->name)) throw ParseException("duplicate export", s.line, s.col);
wasm.addExport(ex.release());
+ exported = true;
+ i++;
+ } else if (inner[0]->str() == IMPORT) {
+ throw ParseException("TODO: import in the middle of a global definition", s.line, s.col);
+ } else if (inner[0]->str() == MUT) {
+ mutable_ = true;
+ type = stringToWasmType(inner[1]->str());
i++;
} else {
- WASM_UNREACHABLE();
+ break;
}
}
- global->type = stringToWasmType(s[i++]->str());
+ if (exported && mutable_) throw ParseException("cannot export a mutable global", s.line, s.col);
+ if (type == none) {
+ type = stringToWasmType(s[i++]->str());
+ }
+ global->type = type;
global->init = parseExpression(s[i++]);
+ global->mutable_ = mutable_;
assert(i == s.size());
wasm.addGlobal(global.release());
}
diff --git a/src/wasm.cpp b/src/wasm.cpp
index 8badaa6be..a910575f0 100644
--- a/src/wasm.cpp
+++ b/src/wasm.cpp
@@ -72,6 +72,7 @@ Name GROW_WASM_MEMORY("__growWasmMemory"),
BR("br"),
ANYFUNC("anyfunc"),
FAKE_RETURN("fake_return_waka123"),
+ MUT("mut"),
SPECTEST("spectest"),
PRINT("print"),
EXIT("exit");
diff --git a/src/wasm.h b/src/wasm.h
index 1bce0bac9..5c20a3a10 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -1523,6 +1523,7 @@ public:
Name name;
WasmType type;
Expression* init;
+ bool mutable_;
};
class Module {