| Index: runtime/vm/simulator_dbc.h
|
| diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e69674bc83def21b50b265b2002a6a0f82627e4
|
| --- /dev/null
|
| +++ b/runtime/vm/simulator_dbc.h
|
| @@ -0,0 +1,182 @@
|
| +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#ifndef VM_SIMULATOR_DBC_H_
|
| +#define VM_SIMULATOR_DBC_H_
|
| +
|
| +#ifndef VM_SIMULATOR_H_
|
| +#error Do not include simulator_dbc.h directly; use simulator.h.
|
| +#endif
|
| +
|
| +#include "vm/constants_dbc.h"
|
| +#include "vm/method_recognizer.h"
|
| +
|
| +namespace dart {
|
| +
|
| +class Isolate;
|
| +class RawObject;
|
| +class SimulatorSetjmpBuffer;
|
| +class Thread;
|
| +class Code;
|
| +class Array;
|
| +class RawICData;
|
| +class RawArray;
|
| +class RawObjectPool;
|
| +class RawFunction;
|
| +
|
| +// Simulator intrinsic handler. It is invoked on entry to the intrinsified
|
| +// function via Intrinsic bytecode before the frame is setup.
|
| +// If the handler returns true then Intrinsic bytecode works as a return
|
| +// instruction returning the value in result. Otherwise interpreter proceeds to
|
| +// execute the body of the function.
|
| +typedef bool (*IntrinsicHandler)(Thread* thread,
|
| + RawObject** FP,
|
| + RawObject** result);
|
| +
|
| +
|
| +class Simulator {
|
| + public:
|
| + static const uword kSimulatorStackUnderflowSize = 64;
|
| +
|
| + Simulator();
|
| + ~Simulator();
|
| +
|
| + // The currently executing Simulator instance, which is associated to the
|
| + // current isolate
|
| + static Simulator* Current();
|
| +
|
| + // Accessors to the internal simulator stack base and top.
|
| + uword StackBase() const { return reinterpret_cast<uword>(stack_); }
|
| + uword StackTop() const;
|
| +
|
| + // The isolate's top_exit_frame_info refers to a Dart frame in the simulator
|
| + // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
|
| + // native stack.
|
| + uword top_exit_frame_info() const { return top_exit_frame_info_; }
|
| + void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
|
| +
|
| + // Call on program start.
|
| + static void InitOnce();
|
| +
|
| + RawObject* Call(const Code& code,
|
| + const Array& arguments_descriptor,
|
| + const Array& arguments,
|
| + Thread* thread);
|
| +
|
| + void Longjmp(uword pc,
|
| + uword sp,
|
| + uword fp,
|
| + RawObject* raw_exception,
|
| + RawObject* raw_stacktrace,
|
| + Thread* thread);
|
| +
|
| + uword get_sp() const {
|
| + return reinterpret_cast<uword>(sp_);
|
| + }
|
| +
|
| + enum IntrinsicId {
|
| +#define V(test_class_name, test_function_name, enum_name, fp) \
|
| + k##enum_name##Intrinsic,
|
| + ALL_INTRINSICS_LIST(V)
|
| + GRAPH_INTRINSICS_LIST(V)
|
| +#undef V
|
| + kIntrinsicCount,
|
| + };
|
| +
|
| + static bool IsSupportedIntrinsic(IntrinsicId id) {
|
| + return intrinsics_[id] != NULL;
|
| + }
|
| +
|
| + enum SpecialIndex {
|
| + kExceptionSpecialIndex,
|
| + kStacktraceSpecialIndex,
|
| + kSpecialIndexCount
|
| + };
|
| +
|
| + private:
|
| + uintptr_t* stack_;
|
| +
|
| + RawObject** fp_;
|
| + RawObject** sp_;
|
| + uword pc_;
|
| +
|
| + SimulatorSetjmpBuffer* last_setjmp_buffer_;
|
| + uword top_exit_frame_info_;
|
| +
|
| + RawObject* special_[kSpecialIndexCount];
|
| +
|
| + static IntrinsicHandler intrinsics_[kIntrinsicCount];
|
| +
|
| + void Exit(Thread* thread,
|
| + RawObject** base,
|
| + RawObject** exit_frame,
|
| + uint32_t* pc);
|
| +
|
| + void CallRuntime(Thread* thread,
|
| + RawObject** base,
|
| + RawObject** exit_frame,
|
| + uint32_t* pc,
|
| + intptr_t argc_tag,
|
| + RawObject** args,
|
| + RawObject** result,
|
| + uword target);
|
| +
|
| + void Invoke(Thread* thread,
|
| + RawObject** call_base,
|
| + RawObject** call_top,
|
| + RawObjectPool** pp,
|
| + uint32_t** pc,
|
| + RawObject*** B,
|
| + RawObject*** SP);
|
| +
|
| + void InlineCacheMiss(int checked_args,
|
| + Thread* thread,
|
| + RawICData* icdata,
|
| + RawObject** call_base,
|
| + RawObject** top,
|
| + uint32_t* pc,
|
| + RawObject** B, RawObject** SP);
|
| +
|
| + void InstanceCall1(Thread* thread,
|
| + RawICData* icdata,
|
| + RawObject** call_base,
|
| + RawObject** call_top,
|
| + RawArray** argdesc,
|
| + RawObjectPool** pp,
|
| + uint32_t** pc,
|
| + RawObject*** B, RawObject*** SP);
|
| +
|
| + void InstanceCall2(Thread* thread,
|
| + RawICData* icdata,
|
| + RawObject** call_base,
|
| + RawObject** call_top,
|
| + RawArray** argdesc,
|
| + RawObjectPool** pp,
|
| + uint32_t** pc,
|
| + RawObject*** B, RawObject*** SP);
|
| +
|
| + void InstanceCall3(Thread* thread,
|
| + RawICData* icdata,
|
| + RawObject** call_base,
|
| + RawObject** call_top,
|
| + RawArray** argdesc,
|
| + RawObjectPool** pp,
|
| + uint32_t** pc,
|
| + RawObject*** B, RawObject*** SP);
|
| +
|
| + // Longjmp support for exceptions.
|
| + SimulatorSetjmpBuffer* last_setjmp_buffer() {
|
| + return last_setjmp_buffer_;
|
| + }
|
| + void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) {
|
| + last_setjmp_buffer_ = buffer;
|
| + }
|
| +
|
| + friend class SimulatorSetjmpBuffer;
|
| + DISALLOW_COPY_AND_ASSIGN(Simulator);
|
| +};
|
| +
|
| +} // namespace dart
|
| +
|
| +#endif // VM_SIMULATOR_DBC_H_
|
|
|