Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1207)

Unified Diff: src/wasm/wasm-interpreter.cc

Issue 2639013002: [wasm] Use pimpl idiom for interpreter thread implementation (Closed)
Patch Set: Fix android and windows compile errors Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/wasm/wasm-interpreter.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-interpreter.cc
diff --git a/src/wasm/wasm-interpreter.cc b/src/wasm/wasm-interpreter.cc
index 199fe724f8bfe52da22c36b3390fcd13dc96c71a..27d439b37e22713ca7b1606200b56a82363ceccc 100644
--- a/src/wasm/wasm-interpreter.cc
+++ b/src/wasm/wasm-interpreter.cc
@@ -919,7 +919,7 @@ class CodeMap {
};
// Responsible for executing code directly.
-class ThreadImpl : public WasmInterpreter::Thread {
+class WasmInterpreter::ThreadImpl : public ZoneObject {
public:
ThreadImpl(Zone* zone, CodeMap* codemap, WasmInstance* instance)
: codemap_(codemap),
@@ -932,15 +932,15 @@ class ThreadImpl : public WasmInterpreter::Thread {
trap_reason_(kTrapCount),
possible_nondeterminism_(false) {}
- virtual ~ThreadImpl() {}
+ ~ThreadImpl() {}
//==========================================================================
// Implementation of public interface for WasmInterpreter::Thread.
//==========================================================================
- virtual WasmInterpreter::State state() { return state_; }
+ WasmInterpreter::State state() { return state_; }
- virtual void PushFrame(const WasmFunction* function, WasmVal* args) {
+ void PushFrame(const WasmFunction* function, WasmVal* args) {
InterpreterCode* code = codemap()->FindCode(function);
CHECK_NOT_NULL(code);
frames_.push_back({code, 0, 0, stack_.size()});
@@ -955,7 +955,7 @@ class ThreadImpl : public WasmInterpreter::Thread {
frames_.back().ret_pc);
}
- virtual WasmInterpreter::State Run() {
+ WasmInterpreter::State Run() {
do {
TRACE(" => Run()\n");
if (state_ == WasmInterpreter::STOPPED ||
@@ -967,7 +967,7 @@ class ThreadImpl : public WasmInterpreter::Thread {
return state_;
}
- virtual WasmInterpreter::State Step() {
+ WasmInterpreter::State Step() {
TRACE(" => Step()\n");
if (state_ == WasmInterpreter::STOPPED ||
state_ == WasmInterpreter::PAUSED) {
@@ -977,9 +977,9 @@ class ThreadImpl : public WasmInterpreter::Thread {
return state_;
}
- virtual void Pause() { UNIMPLEMENTED(); }
+ void Pause() { UNIMPLEMENTED(); }
- virtual void Reset() {
+ void Reset() {
TRACE("----- RESET -----\n");
stack_.clear();
frames_.clear();
@@ -988,33 +988,28 @@ class ThreadImpl : public WasmInterpreter::Thread {
possible_nondeterminism_ = false;
}
- virtual int GetFrameCount() { return static_cast<int>(frames_.size()); }
+ int GetFrameCount() { return static_cast<int>(frames_.size()); }
- virtual const WasmFrame* GetFrame(int index) {
+ const WasmFrame* GetFrame(int index) {
UNIMPLEMENTED();
return nullptr;
}
- virtual WasmFrame* GetMutableFrame(int index) {
+ WasmFrame* GetMutableFrame(int index) {
UNIMPLEMENTED();
return nullptr;
}
- virtual WasmVal GetReturnValue(int index) {
+ WasmVal GetReturnValue(int index) {
if (state_ == WasmInterpreter::TRAPPED) return WasmVal(0xdeadbeef);
CHECK_EQ(WasmInterpreter::FINISHED, state_);
CHECK_LT(static_cast<size_t>(index), stack_.size());
return stack_[index];
}
- virtual pc_t GetBreakpointPc() { return break_pc_; }
+ pc_t GetBreakpointPc() { return break_pc_; }
- virtual bool PossibleNondeterminism() { return possible_nondeterminism_; }
-
- bool Terminated() {
- return state_ == WasmInterpreter::TRAPPED ||
- state_ == WasmInterpreter::FINISHED;
- }
+ bool PossibleNondeterminism() { return possible_nondeterminism_; }
private:
// Entries on the stack of functions being evaluated.
@@ -1704,6 +1699,38 @@ class ThreadImpl : public WasmInterpreter::Thread {
};
//============================================================================
+// Forwarding functions of WasmInterpreter::Thread (pimpl idiom).
+//============================================================================
+WasmInterpreter::Thread::Thread(ThreadImpl* impl) : impl_(impl) {}
+WasmInterpreter::State WasmInterpreter::Thread::state() {
+ return impl_->state();
+}
+void WasmInterpreter::Thread::PushFrame(const WasmFunction* function,
+ WasmVal* args) {
+ return impl_->PushFrame(function, args);
+}
+WasmInterpreter::State WasmInterpreter::Thread::Run() { return impl_->Run(); }
+WasmInterpreter::State WasmInterpreter::Thread::Step() { return impl_->Step(); }
+void WasmInterpreter::Thread::Pause() { return impl_->Pause(); }
+void WasmInterpreter::Thread::Reset() { return impl_->Reset(); }
+pc_t WasmInterpreter::Thread::GetBreakpointPc() {
+ return impl_->GetBreakpointPc();
+}
+int WasmInterpreter::Thread::GetFrameCount() { return impl_->GetFrameCount(); }
+const WasmFrame* WasmInterpreter::Thread::GetFrame(int index) {
+ return impl_->GetFrame(index);
+}
+WasmFrame* WasmInterpreter::Thread::GetMutableFrame(int index) {
+ return impl_->GetMutableFrame(index);
+}
+WasmVal WasmInterpreter::Thread::GetReturnValue(int index) {
+ return impl_->GetReturnValue(index);
+}
+bool WasmInterpreter::Thread::PossibleNondeterminism() {
+ return impl_->PossibleNondeterminism();
+}
+
+//============================================================================
// The implementation details of the interpreter.
//============================================================================
class WasmInterpreterInternals : public ZoneObject {
@@ -1713,7 +1740,7 @@ class WasmInterpreterInternals : public ZoneObject {
// pointer might be invalidated after constructing the interpreter.
const ZoneVector<uint8_t> module_bytes_;
CodeMap codemap_;
- ZoneVector<ThreadImpl*> threads_;
+ ZoneVector<WasmInterpreter::Thread> threads_;
WasmInterpreterInternals(Zone* zone, const ModuleBytesEnv& env)
: instance_(env.instance),
@@ -1721,14 +1748,11 @@ class WasmInterpreterInternals : public ZoneObject {
codemap_(env.instance ? env.instance->module : nullptr,
module_bytes_.data(), zone),
threads_(zone) {
- threads_.push_back(new ThreadImpl(zone, &codemap_, env.instance));
+ threads_.push_back(WasmInterpreter::Thread(
+ new (zone) WasmInterpreter::ThreadImpl(zone, &codemap_, env.instance)));
}
- void Delete() {
- // TODO(titzer): CFI doesn't like threads in the ZoneVector.
- for (auto t : threads_) delete t;
- threads_.resize(0);
- }
+ void Delete() { threads_.clear(); }
};
//============================================================================
@@ -1741,9 +1765,9 @@ WasmInterpreter::WasmInterpreter(const ModuleBytesEnv& env,
WasmInterpreter::~WasmInterpreter() { internals_->Delete(); }
-void WasmInterpreter::Run() { internals_->threads_[0]->Run(); }
+void WasmInterpreter::Run() { internals_->threads_[0].Run(); }
-void WasmInterpreter::Pause() { internals_->threads_[0]->Pause(); }
+void WasmInterpreter::Pause() { internals_->threads_[0].Pause(); }
bool WasmInterpreter::SetBreakpoint(const WasmFunction* function, pc_t pc,
bool enabled) {
@@ -1788,7 +1812,7 @@ int WasmInterpreter::GetThreadCount() {
WasmInterpreter::Thread* WasmInterpreter::GetThread(int id) {
CHECK_EQ(0, id); // only one thread for now.
- return internals_->threads_[id];
+ return &internals_->threads_[id];
}
WasmVal WasmInterpreter::GetLocalVal(const WasmFrame* frame, int index) {
« no previous file with comments | « src/wasm/wasm-interpreter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698