summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Smith <binji@chromium.org>2020-02-20 14:06:20 -0800
committerGitHub <noreply@github.com>2020-02-20 14:06:19 -0800
commit94ad3e84817c546b1313e161da565d181b1a470c (patch)
tree77b94ab9dd8a06fbad94e2931e489950eecd2155 /src
parent09d712be32398d2ab4174f36228dcac5fbb5f672 (diff)
downloadwabt-94ad3e84817c546b1313e161da565d181b1a470c.tar.gz
wabt-94ad3e84817c546b1313e161da565d181b1a470c.tar.bz2
wabt-94ad3e84817c546b1313e161da565d181b1a470c.zip
Always run ResolveNames after parsing .wast/.wat (#1337)
Resolving names (i.e. remapping variable names to indexes) is meant to be part of the parsing process. The spec even considers an unmapped variable name to be "malformed" text. This PR moves in that direction, by always running ResolveNames after parsing text. The next step would be to integrate this more closely with the parser itself.
Diffstat (limited to 'src')
-rw-r--r--src/emscripten-exported.json1
-rw-r--r--src/emscripten-helpers.cc6
-rw-r--r--src/tools/spectest-interp.cc10
-rw-r--r--src/tools/wast2json.cc40
-rw-r--r--src/tools/wat2wasm.cc26
-rw-r--r--src/wast-parser.cc9
6 files changed, 39 insertions, 53 deletions
diff --git a/src/emscripten-exported.json b/src/emscripten-exported.json
index 9935abc6..261e8e6b 100644
--- a/src/emscripten-exported.json
+++ b/src/emscripten-exported.json
@@ -31,7 +31,6 @@
"_wabt_read_binary_result_get_result",
"_wabt_read_binary_result_release_module",
"_wabt_reference_types_enabled",
-"_wabt_resolve_names_module",
"_wabt_sat_float_to_int_enabled",
"_wabt_set_bulk_memory_enabled",
"_wabt_set_exceptions_enabled",
diff --git a/src/emscripten-helpers.cc b/src/emscripten-helpers.cc
index 0a0a2ac7..f7c3b459 100644
--- a/src/emscripten-helpers.cc
+++ b/src/emscripten-helpers.cc
@@ -36,7 +36,6 @@
#include "src/filenames.h"
#include "src/generate-names.h"
#include "src/ir.h"
-#include "src/resolve-names.h"
#include "src/stream.h"
#include "src/validator.h"
#include "src/wast-lexer.h"
@@ -144,11 +143,6 @@ WabtReadBinaryResult* wabt_read_binary(const void* data,
return result;
}
-wabt::Result::Enum wabt_resolve_names_module(wabt::Module* module,
- wabt::Errors* errors) {
- return ResolveNamesModule(module, errors);
-}
-
wabt::Result::Enum wabt_validate_module(wabt::Module* module,
wabt::Features* features,
wabt::Errors* errors) {
diff --git a/src/tools/spectest-interp.cc b/src/tools/spectest-interp.cc
index 4e310d68..f29bb0ab 100644
--- a/src/tools/spectest-interp.cc
+++ b/src/tools/spectest-interp.cc
@@ -32,7 +32,6 @@
#include "src/interp/interp.h"
#include "src/literal.h"
#include "src/option-parser.h"
-#include "src/resolve-names.h"
#include "src/stream.h"
#include "src/validator.h"
#include "src/wast-lexer.h"
@@ -1073,12 +1072,9 @@ wabt::Result CommandRunner::ReadInvalidTextModule(string_view module_filename,
result = ParseWastScript(lexer.get(), &script, &errors, &options);
if (Succeeded(result)) {
wabt::Module* module = script->GetFirstModule();
- result = ResolveNamesModule(module, &errors);
- if (Succeeded(result)) {
- ValidateOptions options(s_features);
- // Don't do a full validation, just validate the function signatures.
- result = ValidateFuncSignatures(module, &errors, options);
- }
+ ValidateOptions options(s_features);
+ // Don't do a full validation, just validate the function signatures.
+ result = ValidateFuncSignatures(module, &errors, options);
}
}
diff --git a/src/tools/wast2json.cc b/src/tools/wast2json.cc
index 1ed8367d..62548084 100644
--- a/src/tools/wast2json.cc
+++ b/src/tools/wast2json.cc
@@ -115,34 +115,30 @@ int ProgramMain(int argc, char** argv) {
WastParseOptions parse_wast_options(s_features);
result = ParseWastScript(lexer.get(), &script, &errors, &parse_wast_options);
- if (Succeeded(result)) {
- result = ResolveNamesScript(script.get(), &errors);
+ if (Succeeded(result) && s_validate) {
+ ValidateOptions options(s_features);
+ result = ValidateScript(script.get(), &errors, options);
+ }
- if (Succeeded(result) && s_validate) {
- ValidateOptions options(s_features);
- result = ValidateScript(script.get(), &errors, options);
+ if (Succeeded(result)) {
+ if (s_outfile.empty()) {
+ s_outfile = DefaultOuputName(s_infile);
}
- if (Succeeded(result)) {
- if (s_outfile.empty()) {
- s_outfile = DefaultOuputName(s_infile);
- }
-
- std::vector<FilenameMemoryStreamPair> module_streams;
- MemoryStream json_stream;
+ std::vector<FilenameMemoryStreamPair> module_streams;
+ MemoryStream json_stream;
- std::string output_basename = StripExtension(s_outfile).to_string();
- s_write_binary_options.features = s_features;
- result = WriteBinarySpecScript(
- &json_stream, script.get(), s_infile, output_basename,
- s_write_binary_options, &module_streams, s_log_stream.get());
+ std::string output_basename = StripExtension(s_outfile).to_string();
+ s_write_binary_options.features = s_features;
+ result = WriteBinarySpecScript(&json_stream, script.get(), s_infile,
+ output_basename, s_write_binary_options,
+ &module_streams, s_log_stream.get());
- json_stream.WriteToFile(s_outfile);
+ json_stream.WriteToFile(s_outfile);
- for (auto iter = module_streams.begin(); iter != module_streams.end();
- ++iter) {
- iter->stream->WriteToFile(iter->filename);
- }
+ for (auto iter = module_streams.begin(); iter != module_streams.end();
+ ++iter) {
+ iter->stream->WriteToFile(iter->filename);
}
}
diff --git a/src/tools/wat2wasm.cc b/src/tools/wat2wasm.cc
index e1bb192a..e664d589 100644
--- a/src/tools/wat2wasm.cc
+++ b/src/tools/wat2wasm.cc
@@ -139,25 +139,21 @@ int ProgramMain(int argc, char** argv) {
WastParseOptions parse_wast_options(s_features);
result = ParseWatModule(lexer.get(), &module, &errors, &parse_wast_options);
- if (Succeeded(result)) {
- result = ResolveNamesModule(module.get(), &errors);
+ if (Succeeded(result) && s_validate) {
+ ValidateOptions options(s_features);
+ result = ValidateModule(module.get(), &errors, options);
+ }
- if (Succeeded(result) && s_validate) {
- ValidateOptions options(s_features);
- result = ValidateModule(module.get(), &errors, options);
- }
+ if (Succeeded(result)) {
+ MemoryStream stream(s_log_stream.get());
+ s_write_binary_options.features = s_features;
+ result = WriteBinaryModule(&stream, module.get(), s_write_binary_options);
if (Succeeded(result)) {
- MemoryStream stream(s_log_stream.get());
- s_write_binary_options.features = s_features;
- result = WriteBinaryModule(&stream, module.get(), s_write_binary_options);
-
- if (Succeeded(result)) {
- if (s_outfile.empty()) {
- s_outfile = DefaultOuputName(s_infile);
- }
- WriteBufferToFile(s_outfile.c_str(), stream.output_buffer());
+ if (s_outfile.empty()) {
+ s_outfile = DefaultOuputName(s_infile);
}
+ WriteBufferToFile(s_outfile.c_str(), stream.output_buffer());
}
}
diff --git a/src/wast-parser.cc b/src/wast-parser.cc
index 4f86b0dd..c8e3e871 100644
--- a/src/wast-parser.cc
+++ b/src/wast-parser.cc
@@ -21,6 +21,7 @@
#include "src/cast.h"
#include "src/expr-visitor.h"
#include "src/make-unique.h"
+#include "src/resolve-names.h"
#include "src/stream.h"
#include "src/utf8.h"
@@ -2805,7 +2806,9 @@ Result ParseWatModule(WastLexer* lexer,
assert(out_module != nullptr);
assert(options != nullptr);
WastParser parser(lexer, errors, options);
- return parser.ParseModule(out_module);
+ CHECK_RESULT(parser.ParseModule(out_module));
+ CHECK_RESULT(ResolveNamesModule(out_module->get(), errors));
+ return Result::Ok;
}
Result ParseWastScript(WastLexer* lexer,
@@ -2815,7 +2818,9 @@ Result ParseWastScript(WastLexer* lexer,
assert(out_script != nullptr);
assert(options != nullptr);
WastParser parser(lexer, errors, options);
- return parser.ParseScript(out_script);
+ CHECK_RESULT(parser.ParseScript(out_script));
+ CHECK_RESULT(ResolveNamesScript(out_script->get(), errors));
+ return Result::Ok;
}
} // namespace wabt