| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVELOPER_SHELL_INTERPRETER_SRC_THREAD_H_ |
| #define SRC_DEVELOPER_SHELL_INTERPRETER_SRC_THREAD_H_ |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include <deque> |
| #include <vector> |
| |
| #include "src/developer/shell/interpreter/src/code.h" |
| #include "src/developer/shell/interpreter/src/scope.h" |
| |
| namespace shell { |
| namespace interpreter { |
| |
| class Isolate; |
| |
| // Defines a thread. A thread can execute some code in parallel with other threads. Each one has |
| // its own value stack (equivalent of registers) and it's own program counter. |
| class Thread { |
| public: |
| explicit Thread(Isolate* isolate) : isolate_(isolate) {} |
| |
| Isolate* isolate() const { return isolate_; } |
| |
| size_t stack_size() const { return values_.size(); } |
| |
| // Pops one 64 bit value from the value stack. |
| uint64_t Pop() { |
| FX_DCHECK(!values_.empty()); |
| uint64_t returned_value = values_.back(); |
| values_.pop_back(); |
| return returned_value; |
| } |
| |
| // Pushes one 64 bit value to the value stack. |
| void Push(uint64_t value) { values_.push_back(value); } |
| |
| // Returns the value of one stack slot relative to the end: index 0 is the last pushed value. |
| uint64_t Value(size_t index) const { |
| FX_DCHECK(index < values_.size()); |
| return values_[values_.size() - index - 1]; |
| } |
| |
| // Consumes several values at once (equivalent to several calls to Pop). |
| void Consume(size_t count) { |
| FX_DCHECK(count <= values_.size()); |
| values_.resize(values_.size() - count); |
| } |
| |
| // Executes |code| for |context| using this thread. |
| void Execute(ExecutionContext* context, std::unique_ptr<code::Code> code); |
| |
| private: |
| // The isolate associated to the threda. |
| Isolate* const isolate_; |
| // The value stack (used to compute expressions). |
| std::deque<uint64_t> values_; |
| }; |
| |
| } // namespace interpreter |
| } // namespace shell |
| |
| #endif // SRC_DEVELOPER_SHELL_INTERPRETER_SRC_THREAD_H_ |