/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Dalvik interpreter definitions. These are internal to the interpreter. * * This includes defines, types, function declarations, and inline functions * that are common to all interpreter implementations. * * Functions and globals declared here are defined in Interp.c. */ #ifndef _DALVIK_INTERP_DEFS #define _DALVIK_INTERP_DEFS /* * Specify the starting point when switching between interpreters. */ typedef enum InterpEntry { kInterpEntryInstr = 0, // continue to next instruction kInterpEntryReturn = 1, // jump to method return kInterpEntryThrow = 2, // jump to exception throw } InterpEntry; /* * Interpreter context, used when switching from one interpreter to * another. We also tuck "mterp" state in here. */ typedef struct InterpState { /* * To make some mterp state updates easier, "pc" and "fp" MUST come * first and MUST appear in this order. */ const u2* pc; // program counter u4* fp; // frame pointer JValue retval; // return value -- "out" only const Method* method; // method being executed /* ---------------------------------------------------------------------- * Mterp-only state */ DvmDex* methodClassDex; Thread* self; /* housekeeping */ void* bailPtr; /* * These are available globally, from gDvm, or from another glue field * (self/method). They're copied in here for speed. */ const u1* interpStackEnd; volatile int* pSelfSuspendCount; #if defined(WITH_DEBUGGER) volatile bool* pDebuggerActive; #endif #if defined(WITH_PROFILER) volatile int* pActiveProfilers; #endif /* ---------------------------------------------------------------------- */ /* * Interpreter switching. */ InterpEntry entryPoint; // what to do when we start int nextMode; // INTERP_STD or INTERP_DBG #if defined(WITH_PROFILER) || defined(WITH_DEBUGGER) bool debugIsMethodEntry; // used for method entry event triggers #endif #if defined(WITH_TRACKREF_CHECKS) int debugTrackedRefStart; // tracked refs from prior invocations #endif } InterpState; /* * These are generated from InterpCore.h. */ extern bool dvmInterpretDbg(Thread* self, InterpState* interpState); extern bool dvmInterpretStd(Thread* self, InterpState* interpState); #define INTERP_STD 0 #define INTERP_DBG 1 /* * "mterp" interpreter. */ extern bool dvmMterpStd(Thread* self, InterpState* interpState); /* * Get the "this" pointer from the current frame. */ Object* dvmGetThisPtr(const Method* method, const u4* fp); /* * Verify that our tracked local references are valid. */ void dvmInterpCheckTrackedRefs(Thread* self, const Method* method, int debugTrackedRefStart); /* * Process switch statement. */ s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal); s4 dvmInterpHandleSparseSwitch(const u2* switchData, s4 testVal); /* * Process fill-array-data. */ bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject, const u2* arrayData); /* * Find an interface method. */ Method* dvmInterpFindInterfaceMethod(ClassObject* thisClass, u4 methodIdx, const Method* method, DvmDex* methodClassDex); /* * Determine if the debugger or profiler is currently active. Used when * selecting which interpreter to start or switch to. */ static inline bool dvmDebuggerOrProfilerActive(void) { return gDvm.debuggerActive #if defined(WITH_PROFILER) || gDvm.activeProfilers != 0 #endif ; } #endif /*_DALVIK_INTERP_DEFS*/