summaryrefslogtreecommitdiff
path: root/src/wasm-s-parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-s-parser.h')
-rw-r--r--src/wasm-s-parser.h31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 93a650ca5..e35f081c4 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -3,6 +3,8 @@
// Parses WebAssembly code in S-Expression format, as in .wast files.
//
+#include <sstream>
+
#include "wasm.h"
#include "mixed_arena.h"
@@ -491,12 +493,31 @@ private:
Expression* makeConst(Element& s, WasmType type) {
auto ret = allocator.alloc<Const>();
ret->type = ret->value.type = type;
- const char *value = s[1]->c_str();
+ const char *str = s[1]->c_str();
+ std::istringstream istr(str);
switch (type) {
- case i32: ret->value.i32 = atoi(value); break;
- case i64: ret->value.i64 = atol(value); break;
- case f32: ret->value.f32 = atof(value); break;
- case f64: ret->value.f64 = atof(value); break;
+ case i32: {
+ int32_t temp;
+ if (str[0] == '0' && str[1] == 'x') {
+ istr >> std::hex >> temp;
+ } else {
+ istr >> temp;
+ }
+ ret->value.i32 = temp;
+ break;
+ }
+ case i64: {
+ int64_t temp;
+ if (str[0] == '0' && str[1] == 'x') {
+ istr >> std::hex >> temp;
+ } else {
+ istr >> temp;
+ }
+ ret->value.i64 = temp;
+ break;
+ }
+ case f32: istr >> ret->value.f32; break;
+ case f64: istr >> ret->value.f64; break;
default: abort();
}
return ret;