summaryrefslogtreecommitdiff
path: root/src/tools/spectest-interp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/spectest-interp.cc')
-rw-r--r--src/tools/spectest-interp.cc329
1 files changed, 145 insertions, 184 deletions
diff --git a/src/tools/spectest-interp.cc b/src/tools/spectest-interp.cc
index 1cda45a3..8779f44f 100644
--- a/src/tools/spectest-interp.cc
+++ b/src/tools/spectest-interp.cc
@@ -765,10 +765,9 @@ class CommandRunner {
private:
void WABT_PRINTF_FORMAT(3, 4)
PrintError(uint32_t line_number, const char* format, ...);
- wabt::Result RunAction(int line_number,
- const Action* action,
- ExecResult* out_result,
- RunVerbosity verbose);
+ ExecResult RunAction(int line_number,
+ const Action* action,
+ RunVerbosity verbose);
wabt::Result OnModuleCommand(const ModuleCommand*);
wabt::Result OnActionCommand(const ActionCommand*);
@@ -784,6 +783,8 @@ class CommandRunner {
wabt::Result OnAssertTrapCommand(const AssertTrapCommand*);
wabt::Result OnAssertExhaustionCommand(const AssertExhaustionCommand*);
+ void TallyCommand(wabt::Result);
+
wabt::Result ReadInvalidTextModule(const char* module_filename,
Environment* env,
ErrorHandler* error_handler);
@@ -938,7 +939,7 @@ wabt::Result CommandRunner::Run(const Script& script) {
break;
case CommandType::Action:
- OnActionCommand(cast<ActionCommand>(command.get()));
+ TallyCommand(OnActionCommand(cast<ActionCommand>(command.get())));
break;
case CommandType::Register:
@@ -946,42 +947,48 @@ wabt::Result CommandRunner::Run(const Script& script) {
break;
case CommandType::AssertMalformed:
- OnAssertMalformedCommand(cast<AssertMalformedCommand>(command.get()));
+ TallyCommand(OnAssertMalformedCommand(
+ cast<AssertMalformedCommand>(command.get())));
break;
case CommandType::AssertInvalid:
- OnAssertInvalidCommand(cast<AssertInvalidCommand>(command.get()));
+ TallyCommand(
+ OnAssertInvalidCommand(cast<AssertInvalidCommand>(command.get())));
break;
case CommandType::AssertUnlinkable:
- OnAssertUnlinkableCommand(cast<AssertUnlinkableCommand>(command.get()));
+ TallyCommand(OnAssertUnlinkableCommand(
+ cast<AssertUnlinkableCommand>(command.get())));
break;
case CommandType::AssertUninstantiable:
- OnAssertUninstantiableCommand(
- cast<AssertUninstantiableCommand>(command.get()));
+ TallyCommand(OnAssertUninstantiableCommand(
+ cast<AssertUninstantiableCommand>(command.get())));
break;
case CommandType::AssertReturn:
- OnAssertReturnCommand(cast<AssertReturnCommand>(command.get()));
+ TallyCommand(
+ OnAssertReturnCommand(cast<AssertReturnCommand>(command.get())));
break;
case CommandType::AssertReturnCanonicalNan:
- OnAssertReturnNanCommand(
- cast<AssertReturnCanonicalNanCommand>(command.get()));
+ TallyCommand(OnAssertReturnNanCommand(
+ cast<AssertReturnCanonicalNanCommand>(command.get())));
break;
case CommandType::AssertReturnArithmeticNan:
- OnAssertReturnNanCommand(
- cast<AssertReturnArithmeticNanCommand>(command.get()));
+ TallyCommand(OnAssertReturnNanCommand(
+ cast<AssertReturnArithmeticNanCommand>(command.get())));
break;
case CommandType::AssertTrap:
- OnAssertTrapCommand(cast<AssertTrapCommand>(command.get()));
+ TallyCommand(
+ OnAssertTrapCommand(cast<AssertTrapCommand>(command.get())));
break;
case CommandType::AssertExhaustion:
- OnAssertExhaustionCommand(cast<AssertExhaustionCommand>(command.get()));
+ TallyCommand(OnAssertExhaustionCommand(
+ cast<AssertExhaustionCommand>(command.get())));
break;
}
}
@@ -1007,12 +1014,9 @@ static ExecResult GetGlobalExportByName(Environment* env,
return ExecResult(interp::Result::Ok, {global->typed_value});
}
-wabt::Result CommandRunner::RunAction(int line_number,
- const Action* action,
- ExecResult* out_exec_result,
- RunVerbosity verbose) {
- out_exec_result->values.clear();
-
+ExecResult CommandRunner::RunAction(int line_number,
+ const Action* action,
+ RunVerbosity verbose) {
interp::Module* module;
if (!action->module_name.empty()) {
module = env_.FindModule(action->module_name);
@@ -1021,28 +1025,27 @@ wabt::Result CommandRunner::RunAction(int line_number,
}
assert(module);
+ ExecResult exec_result;
+
switch (action->type) {
case ActionType::Invoke:
- *out_exec_result =
+ exec_result =
executor_.RunExportByName(module, action->field_name, action->args);
if (verbose == RunVerbosity::Verbose) {
WriteCall(s_stdout_stream.get(), string_view(), action->field_name,
- action->args, out_exec_result->values,
- out_exec_result->result);
+ action->args, exec_result.values, exec_result.result);
}
- return wabt::Result::Ok;
+ break;
- case ActionType::Get: {
- *out_exec_result =
- GetGlobalExportByName(&env_, module, action->field_name);
- return wabt::Result::Ok;
- }
+ case ActionType::Get:
+ exec_result = GetGlobalExportByName(&env_, module, action->field_name);
+ break;
default:
- PrintError(line_number, "invalid action type %d",
- static_cast<int>(action->type));
- return wabt::Result::Error;
+ WABT_UNREACHABLE;
}
+
+ return exec_result;
}
wabt::Result CommandRunner::ReadInvalidTextModule(const char* module_filename,
@@ -1141,26 +1144,21 @@ wabt::Result CommandRunner::OnModuleCommand(const ModuleCommand* command) {
env_.EmplaceModuleBinding(command->name,
Binding(env_.GetModuleCount() - 1));
}
+
return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnActionCommand(const ActionCommand* command) {
- ExecResult exec_result;
+ ExecResult exec_result =
+ RunAction(command->line, &command->action, RunVerbosity::Verbose);
- total_++;
- wabt::Result result = RunAction(command->line, &command->action, &exec_result,
- RunVerbosity::Verbose);
- if (Succeeded(result)) {
- if (exec_result.result == interp::Result::Ok) {
- passed_++;
- } else {
- PrintError(command->line, "unexpected trap: %s",
- ResultToString(exec_result.result));
- result = wabt::Result::Error;
- }
+ if (exec_result.result != interp::Result::Ok) {
+ PrintError(command->line, "unexpected trap: %s",
+ ResultToString(exec_result.result));
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnAssertMalformedCommand(
@@ -1168,20 +1166,16 @@ wabt::Result CommandRunner::OnAssertMalformedCommand(
Environment env;
InitEnvironment(&env);
- total_++;
wabt::Result result =
ReadInvalidModule(command->line, command->filename.c_str(), &env,
command->type, "assert_malformed");
- if (Failed(result)) {
- passed_++;
- result = wabt::Result::Ok;
- } else {
+ if (Succeeded(result)) {
PrintError(command->line, "expected module to be malformed: \"%s\"",
command->filename.c_str());
- result = wabt::Result::Error;
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnRegisterCommand(const RegisterCommand* command) {
@@ -1203,23 +1197,19 @@ wabt::Result CommandRunner::OnRegisterCommand(const RegisterCommand* command) {
wabt::Result CommandRunner::OnAssertUnlinkableCommand(
const AssertUnlinkableCommand* command) {
- total_++;
Environment::MarkPoint mark = env_.Mark();
wabt::Result result =
ReadInvalidModule(command->line, command->filename.c_str(), &env_,
command->type, "assert_unlinkable");
env_.ResetToMarkPoint(mark);
- if (Failed(result)) {
- passed_++;
- result = wabt::Result::Ok;
- } else {
+ if (Succeeded(result)) {
PrintError(command->line, "expected module to be unlinkable: \"%s\"",
command->filename.c_str());
- result = wabt::Result::Error;
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnAssertInvalidCommand(
@@ -1227,26 +1217,21 @@ wabt::Result CommandRunner::OnAssertInvalidCommand(
Environment env;
InitEnvironment(&env);
- total_++;
wabt::Result result =
ReadInvalidModule(command->line, command->filename.c_str(), &env,
command->type, "assert_invalid");
- if (Failed(result)) {
- passed_++;
- result = wabt::Result::Ok;
- } else {
+ if (Succeeded(result)) {
PrintError(command->line, "expected module to be invalid: \"%s\"",
command->filename.c_str());
- result = wabt::Result::Error;
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnAssertUninstantiableCommand(
const AssertUninstantiableCommand* command) {
ErrorHandlerFile error_handler(Location::Type::Binary);
- total_++;
DefinedModule* module;
Environment::MarkPoint mark = env_.Mark();
wabt::Result result =
@@ -1259,7 +1244,6 @@ wabt::Result CommandRunner::OnAssertUninstantiableCommand(
command->filename.c_str());
result = wabt::Result::Error;
} else {
- passed_++;
result = wabt::Result::Ok;
}
} else {
@@ -1272,19 +1256,19 @@ wabt::Result CommandRunner::OnAssertUninstantiableCommand(
return result;
}
-static bool TypedValuesAreEqual(const TypedValue* tv1, const TypedValue* tv2) {
- if (tv1->type != tv2->type)
+static bool TypedValuesAreEqual(const TypedValue& tv1, const TypedValue& tv2) {
+ if (tv1.type != tv2.type)
return false;
- switch (tv1->type) {
+ switch (tv1.type) {
case Type::I32:
- return tv1->value.i32 == tv2->value.i32;
+ return tv1.value.i32 == tv2.value.i32;
case Type::F32:
- return tv1->value.f32_bits == tv2->value.f32_bits;
+ return tv1.value.f32_bits == tv2.value.f32_bits;
case Type::I64:
- return tv1->value.i64 == tv2->value.i64;
+ return tv1.value.i64 == tv2.value.i64;
case Type::F64:
- return tv1->value.f64_bits == tv2->value.f64_bits;
+ return tv1.value.f64_bits == tv2.value.f64_bits;
default:
WABT_UNREACHABLE;
}
@@ -1292,146 +1276,123 @@ static bool TypedValuesAreEqual(const TypedValue* tv1, const TypedValue* tv2) {
wabt::Result CommandRunner::OnAssertReturnCommand(
const AssertReturnCommand* command) {
- ExecResult exec_result;
+ ExecResult exec_result =
+ RunAction(command->line, &command->action, RunVerbosity::Quiet);
- total_++;
- wabt::Result result = RunAction(command->line, &command->action, &exec_result,
- RunVerbosity::Quiet);
+ if (exec_result.result != interp::Result::Ok) {
+ PrintError(command->line, "unexpected trap: %s",
+ ResultToString(exec_result.result));
+ return wabt::Result::Error;
+ }
- if (Succeeded(result)) {
- if (exec_result.result == interp::Result::Ok) {
- if (exec_result.values.size() == command->expected.size()) {
- for (size_t i = 0; i < exec_result.values.size(); ++i) {
- const TypedValue* expected_tv = &command->expected[i];
- const TypedValue* actual_tv = &exec_result.values[i];
- if (!TypedValuesAreEqual(expected_tv, actual_tv)) {
- PrintError(command->line,
- "mismatch in result %" PRIzd
- " of assert_return: expected %s, got %s",
- i, TypedValueToString(*expected_tv).c_str(),
- TypedValueToString(*actual_tv).c_str());
- result = wabt::Result::Error;
- }
- }
- } else {
- PrintError(command->line,
- "result length mismatch in assert_return: expected %" PRIzd
- ", got %" PRIzd,
- command->expected.size(), exec_result.values.size());
- result = wabt::Result::Error;
- }
- } else {
- PrintError(command->line, "unexpected trap: %s",
- ResultToString(exec_result.result));
+ if (exec_result.values.size() != command->expected.size()) {
+ PrintError(command->line,
+ "result length mismatch in assert_return: expected %" PRIzd
+ ", got %" PRIzd,
+ command->expected.size(), exec_result.values.size());
+ return wabt::Result::Error;
+ }
+
+ wabt::Result result = wabt::Result::Ok;
+ for (size_t i = 0; i < exec_result.values.size(); ++i) {
+ const TypedValue& expected_tv = command->expected[i];
+ const TypedValue& actual_tv = exec_result.values[i];
+ if (!TypedValuesAreEqual(expected_tv, actual_tv)) {
+ PrintError(command->line,
+ "mismatch in result %" PRIzd
+ " of assert_return: expected %s, got %s",
+ i, TypedValueToString(expected_tv).c_str(),
+ TypedValueToString(actual_tv).c_str());
result = wabt::Result::Error;
}
}
- if (Succeeded(result))
- passed_++;
-
return result;
}
template <typename NanCommand>
wabt::Result CommandRunner::OnAssertReturnNanCommand(
const NanCommand* command) {
+ ExecResult exec_result =
+ RunAction(command->line, &command->action, RunVerbosity::Quiet);
+
+ if (exec_result.result != interp::Result::Ok) {
+ PrintError(command->line, "unexpected trap: %s",
+ ResultToString(exec_result.result));
+ return wabt::Result::Error;
+ }
+
+ if (exec_result.values.size() != 1) {
+ PrintError(command->line, "expected one result, got %" PRIzd,
+ exec_result.values.size());
+ return wabt::Result::Error;
+ }
+
const bool is_canonical =
command->type == CommandType::AssertReturnCanonicalNan;
- ExecResult exec_result;
- total_++;
- wabt::Result result = RunAction(command->line, &command->action, &exec_result,
- RunVerbosity::Quiet);
- if (Succeeded(result)) {
- if (exec_result.result == interp::Result::Ok) {
- if (exec_result.values.size() != 1) {
- PrintError(command->line, "expected one result, got %" PRIzd,
- exec_result.values.size());
- result = wabt::Result::Error;
+ const TypedValue& actual = exec_result.values[0];
+ switch (actual.type) {
+ case Type::F32: {
+ bool is_nan = is_canonical ? IsCanonicalNan(actual.value.f32_bits)
+ : IsArithmeticNan(actual.value.f32_bits);
+ if (!is_nan) {
+ PrintError(command->line, "expected result to be nan, got %s",
+ TypedValueToString(actual).c_str());
+ return wabt::Result::Error;
}
+ break;
+ }
- const TypedValue& actual = exec_result.values[0];
- switch (actual.type) {
- case Type::F32: {
- bool is_nan = is_canonical ? IsCanonicalNan(actual.value.f32_bits)
- : IsArithmeticNan(actual.value.f32_bits);
- if (!is_nan) {
- PrintError(command->line, "expected result to be nan, got %s",
- TypedValueToString(actual).c_str());
- result = wabt::Result::Error;
- }
- break;
- }
-
- case Type::F64: {
- bool is_nan = is_canonical ? IsCanonicalNan(actual.value.f64_bits)
- : IsArithmeticNan(actual.value.f64_bits);
- if (!is_nan) {
- PrintError(command->line, "expected result to be nan, got %s",
- TypedValueToString(actual).c_str());
- result = wabt::Result::Error;
- }
- break;
- }
-
- default:
- PrintError(command->line,
- "expected result type to be f32 or f64, got %s",
- GetTypeName(actual.type));
- result = wabt::Result::Error;
- break;
+ case Type::F64: {
+ bool is_nan = is_canonical ? IsCanonicalNan(actual.value.f64_bits)
+ : IsArithmeticNan(actual.value.f64_bits);
+ if (!is_nan) {
+ PrintError(command->line, "expected result to be nan, got %s",
+ TypedValueToString(actual).c_str());
+ return wabt::Result::Error;
}
- } else {
- PrintError(command->line, "unexpected trap: %s",
- ResultToString(exec_result.result));
- result = wabt::Result::Error;
+ break;
}
- }
- if (Succeeded(result))
- passed_++;
+ default:
+ PrintError(command->line, "expected result type to be f32 or f64, got %s",
+ GetTypeName(actual.type));
+ return wabt::Result::Error;
+ }
return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnAssertTrapCommand(
const AssertTrapCommand* command) {
- ExecResult exec_result;
-
- total_++;
- wabt::Result result = RunAction(command->line, &command->action, &exec_result,
- RunVerbosity::Quiet);
- if (Succeeded(result)) {
- if (exec_result.result != interp::Result::Ok) {
- passed_++;
- } else {
- PrintError(command->line, "expected trap: \"%s\"", command->text.c_str());
- result = wabt::Result::Error;
- }
+ ExecResult exec_result =
+ RunAction(command->line, &command->action, RunVerbosity::Quiet);
+ if (exec_result.result == interp::Result::Ok) {
+ PrintError(command->line, "expected trap: \"%s\"", command->text.c_str());
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
}
wabt::Result CommandRunner::OnAssertExhaustionCommand(
const AssertExhaustionCommand* command) {
- ExecResult exec_result;
-
- total_++;
- wabt::Result result = RunAction(command->line, &command->action, &exec_result,
- RunVerbosity::Quiet);
- if (Succeeded(result)) {
- if (exec_result.result == interp::Result::TrapCallStackExhausted ||
- exec_result.result == interp::Result::TrapValueStackExhausted) {
- passed_++;
- } else {
- PrintError(command->line, "expected call stack exhaustion");
- result = wabt::Result::Error;
- }
+ ExecResult exec_result =
+ RunAction(command->line, &command->action, RunVerbosity::Quiet);
+ if (exec_result.result != interp::Result::TrapCallStackExhausted &&
+ exec_result.result != interp::Result::TrapValueStackExhausted) {
+ PrintError(command->line, "expected call stack exhaustion");
+ return wabt::Result::Error;
}
- return result;
+ return wabt::Result::Ok;
+}
+
+void CommandRunner::TallyCommand(wabt::Result result) {
+ if (Succeeded(result))
+ passed_++;
+ total_++;
}
static wabt::Result ReadAndRunSpecJSON(const char* spec_json_filename) {