1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
166ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Stack frames, and uses thereof.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_INTERP_STACK_H_
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_INTERP_STACK_H_
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "jni.h"
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdarg.h>
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStack layout
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIn what follows, the "top" of the stack is at a low position in memory,
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectand the "bottom" of the stack is in a high position (put more simply,
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectthey grow downward).  They may be merged with the native stack at a
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectlater date.  The interpreter assumes that they have a fixed size,
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdetermined when the thread is created.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDalvik's registers (of which there can be up to 64K) map to the "ins"
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(method arguments) and "locals" (local variables).  The "outs" (arguments
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto called methods) are specified by the "invoke" operand.  The return
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvalue, which is passed through the interpreter rather than on the stack,
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectis retrieved with a "move-result" instruction.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Low addresses (0x00000000)
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +- - - - - - - - -+
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     -  out0           -
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +-----------------+  <-- stack ptr (top of stack)
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +  VM-specific    +
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +  internal goop  +
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +-----------------+  <-- curFrame: FP for cur function
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     +  v0 == local0   +
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+  +-----------------+
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  out0           +  +  v1 == in0      +
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+  +-----------------+
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  out1           +  +  v2 == in1      +
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+  +-----------------+
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  VM-specific    +
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  internal goop  +
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+  <-- frame ptr (FP) for previous function
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  v0 == local0   +
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  v1 == local1   +
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  v2 == in0      +
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  v3 == in1      +
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+  v4 == in2      +
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-                 -
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-                 -
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-                 -
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project+-----------------+  <-- interpStackStart
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    High addresses (0xffffffff)
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNote the "ins" and "outs" overlap -- values pushed into the "outs" area
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbecome the parameters to the called method.  The VM guarantees that there
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectwill be enough room for all possible "outs" on the stack before calling
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinto a method.
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectAll "V registers" are 32 bits, and all stack entries are 32-bit aligned.
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectRegisters are accessed as a positive offset from the frame pointer,
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecte.g. register v2 is fp[2].  64-bit quantities are stored in two adjacent
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectregisters, addressed by the lower-numbered register, and are in host order.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project64-bit quantities do not need to start in an even-numbered register.
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectWe push two stack frames on when calling an interpreted or native method
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdirectly from the VM (e.g. invoking <clinit> or via reflection "invoke()").
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe first is a "break" frame, which allows us to tell when a call return or
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectexception unroll has reached the VM call site.  Without the break frame the
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstack might look like an uninterrupted series of interpreted method calls.
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe second frame is for the method itself.
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe "break" frame is used as an alternative to adding additional fields
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto the StackSaveArea struct itself.  They are recognized by having a
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNULL method pointer.
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectWhen calling a native method from interpreted code, the stack setup is
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectessentially identical to calling an interpreted method.  Because it's a
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectnative method, though, there are never any "locals" or "outs".
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectFor native calls into JNI, we want to store a table of local references
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecton the stack.  The GC needs to scan them while the native code is running,
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectand we want to trivially discard them when the method returns.  See JNI.c
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfor a discussion of how this is managed.  In particular note that it is
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpossible to push additional call frames on without calling a method.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct StackSaveArea;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//#define PAD_SAVE_AREA       /* help debug stack trampling */
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The VM-specific internal goop.
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The idea is to mimic a typical native stack frame, with copies of the
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * saved PC and FP.  At some point we'd like to have interpreted and
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * native code share the same stack, though this makes portability harder.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct StackSaveArea {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef PAD_SAVE_AREA
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4          pad0, pad1, pad2;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* make it easier to trek through stack frames in GDB */
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    StackSaveArea* prevSave;
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* saved frame pointer for previous frame, or NULL if this is at bottom */
13130bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    u4*         prevFrame;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* saved program counter (from method in caller's frame) */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u2*   savedPc;
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* pointer to method we're *currently* executing; handy for exceptions */
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const Method* method;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    union {
140d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden        /* for JNI native methods: bottom of local reference segment */
141d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden        u4          localRefCookie;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* for interpreted methods: saved current PC, for exception stack
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * traces and debugger traces */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        const u2*   currentPc;
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } xtra;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Native return pointer for JIT, or 0 if interpreted */
149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    const u2* returnAddr;
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef PAD_SAVE_AREA
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4          pad3, pad4, pad5;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* move between the stack save area and the frame pointer */
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_fp)   ((StackSaveArea*)(_fp) -1)
15730bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee#define FP_FROM_SAVEAREA(_save) ((u4*) ((StackSaveArea*)(_save) +1))
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* when calling a function, get a pointer to outs[0] */
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUTS_FROM_FP(_fp, _argCount) \
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ((u4*) ((u1*)SAVEAREA_FROM_FP(_fp) - sizeof(u4) * (_argCount)))
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* reserve this many bytes for handling StackOverflowError */
1646d470592dcd18ce22fc13857d38348bc5817a29fAndy McFadden#define STACK_OVERFLOW_RESERVE  768
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine if the frame pointer points to a "break frame".
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmIsBreakFrame(const u4* fp)
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return SAVEAREA_FROM_FP(fp)->method == NULL;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialize the interp stack (call this after allocating storage and
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * setting thread->interpStackStart).
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmInitInterpStack(Thread* thread, int stackSize);
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Push a native method frame directly onto the stack.  Used to push the
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "fake" native frames at the top of each thread stack.
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPushJNIFrame(Thread* thread, const Method* method);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI local frame management.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPushLocalFrame(Thread* thread, const Method* method);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPopLocalFrame(Thread* thread);
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
193d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden * Call an interpreted method from native code.  If this is being called
194d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden * from a JNI function, references in the argument list will be converted
195d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden * back to pointers.
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "obj" should be NULL for "direct" methods.
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmCallMethod(Thread* self, const Method* method, Object* obj,
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult, ...);
201d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFaddenvoid dvmCallMethodV(Thread* self, const Method* method, Object* obj,
202d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    bool fromJni, JValue* pResult, va_list args);
203d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFaddenvoid dvmCallMethodA(Thread* self, const Method* method, Object* obj,
204d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    bool fromJni, JValue* pResult, const jvalue* args);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invoke a method, using the specified arguments and return type, through
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a reflection interface.
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Deals with boxing/unboxing primitives and performs widening conversions.
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "obj" should be null for a static method.
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "params" and "returnType" come from the Method object, so we don't have
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to re-generate them from the method signature.  "returnType" should be
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NULL if we're invoking a constructor.
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmInvokeMethod(Object* invokeObj, const Method* meth,
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* argList, ArrayObject* params, ClassObject* returnType,
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck);
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine the source file line number, given the program counter offset
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * into the specified method.  Returns -2 for native methods, -1 if no
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * match was found.
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
2279c6f0a6a36fcce4a55e3764db45c6c7cced077a5Carl Shapiroextern "C" int dvmLineNumFromPC(const Method* method, u4 relPc);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, compute the current call depth.  The value can be
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "exact" (a count of non-break frames) or "vague" (just subtracting
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointers to give relative values).
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmComputeExactFrameDepth(const void* fp);
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmComputeVagueFrameDepth(Thread* thread, const void* fp);
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the frame pointer for the caller's stack frame.
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmGetCallerFP(const void* curFrame);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the class of the method that called us.
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetCallerClass(const void* curFrame);
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the caller's caller's class.  Pass in the current fp.
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is used by e.g. java.lang.Class, which wants to know about the
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class loader of the method that called it.
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetCaller2Class(const void* curFrame);
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the caller's caller's caller's class.  Pass in the current fp.
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is used by e.g. java.lang.Class, which wants to know about the
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class loader of the method that called it.
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetCaller3Class(const void* curFrame);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
264db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro * Fill an array of method pointers representing the current stack
265db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro * trace (element 0 is current frame).
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
267db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirovoid dvmFillStackTraceArray(const void* fp, const Method** array, size_t length);
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common handling for stack overflow.
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
272d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmHandleStackOverflow(Thread* self, const Method* method);
273d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmCleanupStackOverflow(Thread* self, const Object* exception);
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* debugging; dvmDumpThread() is probably a better starting point */
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpThreadStack(const DebugOutputTarget* target, Thread* thread);
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpRunningThreadStack(const DebugOutputTarget* target, Thread* thread);
278b1212301d5cffc06907211d243a21d50c4419dc9Jeff Brownvoid dvmDumpNativeStack(const DebugOutputTarget* target, pid_t tid);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
280375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_INTERP_STACK_H_
281