• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 /*
17  * Dalvik interpreter definitions.  These are internal to the interpreter.
18  *
19  * This includes defines, types, function declarations, and inline functions
20  * that are common to all interpreter implementations.
21  *
22  * Functions and globals declared here are defined in Interp.c.
23  */
24 #ifndef _DALVIK_INTERP_DEFS
25 #define _DALVIK_INTERP_DEFS
26 
27 
28 /*
29  * Specify the starting point when switching between interpreters.
30  */
31 typedef enum InterpEntry {
32     kInterpEntryInstr = 0,      // continue to next instruction
33     kInterpEntryReturn = 1,     // jump to method return
34     kInterpEntryThrow = 2,      // jump to exception throw
35 } InterpEntry;
36 
37 /*
38  * Interpreter context, used when switching from one interpreter to
39  * another.  We also tuck "mterp" state in here.
40  */
41 typedef struct InterpState {
42     /*
43      * To make some mterp state updates easier, "pc" and "fp" MUST come
44      * first and MUST appear in this order.
45      */
46     const u2*   pc;                     // program counter
47     u4*         fp;                     // frame pointer
48 
49     JValue      retval;                 // return value -- "out" only
50     const Method* method;               // method being executed
51 
52 
53     /* ----------------------------------------------------------------------
54      * Mterp-only state
55      */
56     DvmDex*         methodClassDex;
57     Thread*         self;
58 
59     /* housekeeping */
60     void*           bailPtr;
61 
62     /*
63      * These are available globally, from gDvm, or from another glue field
64      * (self/method).  They're copied in here for speed.
65      */
66     const u1*       interpStackEnd;
67     volatile int*   pSelfSuspendCount;
68 #if defined(WITH_DEBUGGER)
69     volatile bool*  pDebuggerActive;
70 #endif
71 #if defined(WITH_PROFILER)
72     volatile int*   pActiveProfilers;
73 #endif
74     /* ----------------------------------------------------------------------
75      */
76 
77     /*
78      * Interpreter switching.
79      */
80     InterpEntry entryPoint;             // what to do when we start
81     int         nextMode;               // INTERP_STD or INTERP_DBG
82 
83 
84 #if defined(WITH_PROFILER) || defined(WITH_DEBUGGER)
85     bool        debugIsMethodEntry;     // used for method entry event triggers
86 #endif
87 #if defined(WITH_TRACKREF_CHECKS)
88     int         debugTrackedRefStart;   // tracked refs from prior invocations
89 #endif
90 
91 } InterpState;
92 
93 /*
94  * These are generated from InterpCore.h.
95  */
96 extern bool dvmInterpretDbg(Thread* self, InterpState* interpState);
97 extern bool dvmInterpretStd(Thread* self, InterpState* interpState);
98 #define INTERP_STD 0
99 #define INTERP_DBG 1
100 
101 /*
102  * "mterp" interpreter.
103  */
104 extern bool dvmMterpStd(Thread* self, InterpState* interpState);
105 
106 /*
107  * Get the "this" pointer from the current frame.
108  */
109 Object* dvmGetThisPtr(const Method* method, const u4* fp);
110 
111 /*
112  * Verify that our tracked local references are valid.
113  */
114 void dvmInterpCheckTrackedRefs(Thread* self, const Method* method,
115     int debugTrackedRefStart);
116 
117 /*
118  * Process switch statement.
119  */
120 s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal);
121 s4 dvmInterpHandleSparseSwitch(const u2* switchData, s4 testVal);
122 
123 /*
124  * Process fill-array-data.
125  */
126 bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject,
127                                   const u2* arrayData);
128 
129 /*
130  * Find an interface method.
131  */
132 Method* dvmInterpFindInterfaceMethod(ClassObject* thisClass, u4 methodIdx,
133     const Method* method, DvmDex* methodClassDex);
134 
135 /*
136  * Determine if the debugger or profiler is currently active.  Used when
137  * selecting which interpreter to start or switch to.
138  */
dvmDebuggerOrProfilerActive(void)139 static inline bool dvmDebuggerOrProfilerActive(void)
140 {
141     return gDvm.debuggerActive
142 #if defined(WITH_PROFILER)
143         || gDvm.activeProfilers != 0
144 #endif
145         ;
146 }
147 
148 #endif /*_DALVIK_INTERP_DEFS*/
149