summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm-interpreter.h24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index f2deed039..28a3e8e6d 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -31,8 +31,11 @@
#ifdef WASM_INTERPRETER_DEBUG
#include "wasm-printing.h"
+
+int indent = 0;
#endif
+
namespace wasm {
using namespace cashew;
@@ -75,15 +78,14 @@ typedef std::vector<Literal> LiteralList;
// Debugging helpers
#ifdef WASM_INTERPRETER_DEBUG
struct IndentHandler {
- int& indent;
const char *name;
- IndentHandler(int& indent, const char *name, Expression *expression) : indent(indent), name(name) {
+ IndentHandler(const char *name, Expression *expression) : name(name) {
doIndent(std::cout, indent);
std::cout << "visit " << name << " :\n";
indent++;
#if WASM_INTERPRETER_DEBUG == 2
doIndent(std::cout, indent);
- std::cout << "\n" << expression << '\n';
+ if (expression) std::cout << "\n" << expression << '\n';
indent++;
#endif
}
@@ -96,12 +98,14 @@ struct IndentHandler {
std::cout << "exit " << name << '\n';
}
};
-#define NOTE_ENTER(x) IndentHandler indentHandler(instance.indent, x, curr);
-#define NOTE_NAME(p0) { doIndent(std::cout, instance.indent); std::cout << "name in " << indentHandler.name << '(' << Name(p0) << ")\n"; }
-#define NOTE_EVAL1(p0) { doIndent(std::cout, instance.indent); std::cout << "eval in " << indentHandler.name << '(' << p0 << ")\n"; }
-#define NOTE_EVAL2(p0, p1) { doIndent(std::cout, instance.indent); std::cout << "eval in " << indentHandler.name << '(' << p0 << ", " << p1 << ")\n"; }
+#define NOTE_ENTER(x) IndentHandler indentHandler(x, curr);
+#define NOTE_ENTER_(x) IndentHandler indentHandler(x, nullptr);
+#define NOTE_NAME(p0) { doIndent(std::cout, indent); std::cout << "name in " << indentHandler.name << '(' << Name(p0) << ")\n"; }
+#define NOTE_EVAL1(p0) { doIndent(std::cout, indent); std::cout << "eval in " << indentHandler.name << '(' << p0 << ")\n"; }
+#define NOTE_EVAL2(p0, p1) { doIndent(std::cout, indent); std::cout << "eval in " << indentHandler.name << '(' << p0 << ", " << p1 << ")\n"; }
#else // WASM_INTERPRETER_DEBUG
#define NOTE_ENTER(x)
+#define NOTE_ENTER_(x)
#define NOTE_NAME(p0)
#define NOTE_EVAL1(p0)
#define NOTE_EVAL2(p0, p1)
@@ -580,10 +584,6 @@ private:
// stack traces.
std::vector<Name> functionStack;
-#ifdef WASM_INTERPRETER_DEBUG
- int indent = 0;
-#endif
-
// Call a function, starting an invocation.
Literal callFunction(IString name, LiteralList& arguments) {
// if the last call ended in a jump up the stack, it might have left stuff for us to clean up here
@@ -638,10 +638,12 @@ public:
RuntimeExpressionRunner(ModuleInstance& instance, FunctionScope& scope) : instance(instance), scope(scope) {}
Flow generateArguments(const ExpressionList& operands, LiteralList& arguments) {
+ NOTE_ENTER_("generateArguments");
arguments.reserve(operands.size());
for (auto expression : operands) {
Flow flow = visit(expression);
if (flow.breaking()) return flow;
+ NOTE_EVAL1(flow.value);
arguments.push_back(flow.value);
}
return Flow();