/*
* 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*/