| 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_
 | 
| 
 |