1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
3*e82f7db8SAndroid Build Coastguard Worker * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*e82f7db8SAndroid Build Coastguard Worker *
5*e82f7db8SAndroid Build Coastguard Worker * This code is free software; you can redistribute it and/or modify it
6*e82f7db8SAndroid Build Coastguard Worker * under the terms of the GNU General Public License version 2 only, as
7*e82f7db8SAndroid Build Coastguard Worker * published by the Free Software Foundation. Oracle designates this
8*e82f7db8SAndroid Build Coastguard Worker * particular file as subject to the "Classpath" exception as provided
9*e82f7db8SAndroid Build Coastguard Worker * by Oracle in the LICENSE file that accompanied this code.
10*e82f7db8SAndroid Build Coastguard Worker *
11*e82f7db8SAndroid Build Coastguard Worker * This code is distributed in the hope that it will be useful, but WITHOUT
12*e82f7db8SAndroid Build Coastguard Worker * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e82f7db8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*e82f7db8SAndroid Build Coastguard Worker * version 2 for more details (a copy is included in the LICENSE file that
15*e82f7db8SAndroid Build Coastguard Worker * accompanied this code).
16*e82f7db8SAndroid Build Coastguard Worker *
17*e82f7db8SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License version
18*e82f7db8SAndroid Build Coastguard Worker * 2 along with this work; if not, write to the Free Software Foundation,
19*e82f7db8SAndroid Build Coastguard Worker * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*e82f7db8SAndroid Build Coastguard Worker *
21*e82f7db8SAndroid Build Coastguard Worker * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22*e82f7db8SAndroid Build Coastguard Worker * or visit www.oracle.com if you need additional information or have any
23*e82f7db8SAndroid Build Coastguard Worker * questions.
24*e82f7db8SAndroid Build Coastguard Worker */
25*e82f7db8SAndroid Build Coastguard Worker
26*e82f7db8SAndroid Build Coastguard Worker #include "util.h"
27*e82f7db8SAndroid Build Coastguard Worker #include "StackFrameImpl.h"
28*e82f7db8SAndroid Build Coastguard Worker #include "inStream.h"
29*e82f7db8SAndroid Build Coastguard Worker #include "outStream.h"
30*e82f7db8SAndroid Build Coastguard Worker #include "threadControl.h"
31*e82f7db8SAndroid Build Coastguard Worker #include "FrameID.h"
32*e82f7db8SAndroid Build Coastguard Worker
33*e82f7db8SAndroid Build Coastguard Worker static jdwpError
validateThreadFrame(jthread thread,FrameID frame)34*e82f7db8SAndroid Build Coastguard Worker validateThreadFrame(jthread thread, FrameID frame)
35*e82f7db8SAndroid Build Coastguard Worker {
36*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
37*e82f7db8SAndroid Build Coastguard Worker jdwpError serror;
38*e82f7db8SAndroid Build Coastguard Worker jint count;
39*e82f7db8SAndroid Build Coastguard Worker error = threadControl_suspendCount(thread, &count);
40*e82f7db8SAndroid Build Coastguard Worker if ( error == JVMTI_ERROR_NONE ) {
41*e82f7db8SAndroid Build Coastguard Worker if ( count > 0 ) {
42*e82f7db8SAndroid Build Coastguard Worker serror = validateFrameID(thread, frame);
43*e82f7db8SAndroid Build Coastguard Worker } else {
44*e82f7db8SAndroid Build Coastguard Worker serror = JDWP_ERROR(THREAD_NOT_SUSPENDED);
45*e82f7db8SAndroid Build Coastguard Worker }
46*e82f7db8SAndroid Build Coastguard Worker } else {
47*e82f7db8SAndroid Build Coastguard Worker serror = map2jdwpError(error);
48*e82f7db8SAndroid Build Coastguard Worker }
49*e82f7db8SAndroid Build Coastguard Worker return serror;
50*e82f7db8SAndroid Build Coastguard Worker }
51*e82f7db8SAndroid Build Coastguard Worker
52*e82f7db8SAndroid Build Coastguard Worker static jdwpError
writeVariableValue(JNIEnv * env,PacketOutputStream * out,jthread thread,FrameNumber fnum,jint slot,jbyte typeKey)53*e82f7db8SAndroid Build Coastguard Worker writeVariableValue(JNIEnv *env, PacketOutputStream *out, jthread thread,
54*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum, jint slot, jbyte typeKey)
55*e82f7db8SAndroid Build Coastguard Worker {
56*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
57*e82f7db8SAndroid Build Coastguard Worker jvalue value;
58*e82f7db8SAndroid Build Coastguard Worker
59*e82f7db8SAndroid Build Coastguard Worker if (isObjectTag(typeKey)) {
60*e82f7db8SAndroid Build Coastguard Worker
61*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
62*e82f7db8SAndroid Build Coastguard Worker
63*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalObject)
64*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &value.l);
65*e82f7db8SAndroid Build Coastguard Worker
66*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
67*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
68*e82f7db8SAndroid Build Coastguard Worker } else {
69*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, specificTypeKey(env, value.l));
70*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, value.l);
71*e82f7db8SAndroid Build Coastguard Worker }
72*e82f7db8SAndroid Build Coastguard Worker
73*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
74*e82f7db8SAndroid Build Coastguard Worker
75*e82f7db8SAndroid Build Coastguard Worker } else {
76*e82f7db8SAndroid Build Coastguard Worker /*
77*e82f7db8SAndroid Build Coastguard Worker * For primitive types, the type key is bounced back as is.
78*e82f7db8SAndroid Build Coastguard Worker */
79*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, typeKey);
80*e82f7db8SAndroid Build Coastguard Worker switch (typeKey) {
81*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BYTE): {
82*e82f7db8SAndroid Build Coastguard Worker jint intValue;
83*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInt)
84*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &intValue);
85*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, (jbyte)intValue);
86*e82f7db8SAndroid Build Coastguard Worker break;
87*e82f7db8SAndroid Build Coastguard Worker }
88*e82f7db8SAndroid Build Coastguard Worker
89*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(CHAR): {
90*e82f7db8SAndroid Build Coastguard Worker jint intValue;
91*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInt)
92*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &intValue);
93*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeChar(out, (jchar)intValue);
94*e82f7db8SAndroid Build Coastguard Worker break;
95*e82f7db8SAndroid Build Coastguard Worker }
96*e82f7db8SAndroid Build Coastguard Worker
97*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(FLOAT):
98*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalFloat)
99*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &value.f);
100*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeFloat(out, value.f);
101*e82f7db8SAndroid Build Coastguard Worker break;
102*e82f7db8SAndroid Build Coastguard Worker
103*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(DOUBLE):
104*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalDouble)
105*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &value.d);
106*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeDouble(out, value.d);
107*e82f7db8SAndroid Build Coastguard Worker break;
108*e82f7db8SAndroid Build Coastguard Worker
109*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(INT):
110*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInt)
111*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &value.i);
112*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, value.i);
113*e82f7db8SAndroid Build Coastguard Worker break;
114*e82f7db8SAndroid Build Coastguard Worker
115*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(LONG):
116*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalLong)
117*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &value.j);
118*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeLong(out, value.j);
119*e82f7db8SAndroid Build Coastguard Worker break;
120*e82f7db8SAndroid Build Coastguard Worker
121*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(SHORT): {
122*e82f7db8SAndroid Build Coastguard Worker jint intValue;
123*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInt)
124*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &intValue);
125*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeShort(out, (jshort)intValue);
126*e82f7db8SAndroid Build Coastguard Worker break;
127*e82f7db8SAndroid Build Coastguard Worker }
128*e82f7db8SAndroid Build Coastguard Worker
129*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BOOLEAN):{
130*e82f7db8SAndroid Build Coastguard Worker jint intValue;
131*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInt)
132*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, &intValue);
133*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)intValue);
134*e82f7db8SAndroid Build Coastguard Worker break;
135*e82f7db8SAndroid Build Coastguard Worker }
136*e82f7db8SAndroid Build Coastguard Worker
137*e82f7db8SAndroid Build Coastguard Worker default:
138*e82f7db8SAndroid Build Coastguard Worker return JDWP_ERROR(INVALID_TAG);
139*e82f7db8SAndroid Build Coastguard Worker }
140*e82f7db8SAndroid Build Coastguard Worker }
141*e82f7db8SAndroid Build Coastguard Worker
142*e82f7db8SAndroid Build Coastguard Worker return map2jdwpError(error);
143*e82f7db8SAndroid Build Coastguard Worker }
144*e82f7db8SAndroid Build Coastguard Worker
145*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readVariableValue(JNIEnv * env,PacketInputStream * in,jthread thread,FrameNumber fnum,jint slot,jbyte typeKey)146*e82f7db8SAndroid Build Coastguard Worker readVariableValue(JNIEnv *env, PacketInputStream *in, jthread thread,
147*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum, jint slot, jbyte typeKey)
148*e82f7db8SAndroid Build Coastguard Worker {
149*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
150*e82f7db8SAndroid Build Coastguard Worker jvalue value;
151*e82f7db8SAndroid Build Coastguard Worker
152*e82f7db8SAndroid Build Coastguard Worker if (isObjectTag(typeKey)) {
153*e82f7db8SAndroid Build Coastguard Worker
154*e82f7db8SAndroid Build Coastguard Worker value.l = inStream_readObjectRef(env, in);
155*e82f7db8SAndroid Build Coastguard Worker
156*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalObject)
157*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.l);
158*e82f7db8SAndroid Build Coastguard Worker
159*e82f7db8SAndroid Build Coastguard Worker } else {
160*e82f7db8SAndroid Build Coastguard Worker switch (typeKey) {
161*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BYTE):
162*e82f7db8SAndroid Build Coastguard Worker value.b = inStream_readByte(in);
163*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalInt)
164*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.b);
165*e82f7db8SAndroid Build Coastguard Worker break;
166*e82f7db8SAndroid Build Coastguard Worker
167*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(CHAR):
168*e82f7db8SAndroid Build Coastguard Worker value.c = inStream_readChar(in);
169*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalInt)
170*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.c);
171*e82f7db8SAndroid Build Coastguard Worker break;
172*e82f7db8SAndroid Build Coastguard Worker
173*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(FLOAT):
174*e82f7db8SAndroid Build Coastguard Worker value.f = inStream_readFloat(in);
175*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalFloat)
176*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.f);
177*e82f7db8SAndroid Build Coastguard Worker break;
178*e82f7db8SAndroid Build Coastguard Worker
179*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(DOUBLE):
180*e82f7db8SAndroid Build Coastguard Worker value.d = inStream_readDouble(in);
181*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalDouble)
182*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.d);
183*e82f7db8SAndroid Build Coastguard Worker break;
184*e82f7db8SAndroid Build Coastguard Worker
185*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(INT):
186*e82f7db8SAndroid Build Coastguard Worker value.i = inStream_readInt(in);
187*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalInt)
188*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.i);
189*e82f7db8SAndroid Build Coastguard Worker break;
190*e82f7db8SAndroid Build Coastguard Worker
191*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(LONG):
192*e82f7db8SAndroid Build Coastguard Worker value.j = inStream_readLong(in);
193*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalLong)
194*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.j);
195*e82f7db8SAndroid Build Coastguard Worker break;
196*e82f7db8SAndroid Build Coastguard Worker
197*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(SHORT):
198*e82f7db8SAndroid Build Coastguard Worker value.s = inStream_readShort(in);
199*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalInt)
200*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.s);
201*e82f7db8SAndroid Build Coastguard Worker break;
202*e82f7db8SAndroid Build Coastguard Worker
203*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BOOLEAN):
204*e82f7db8SAndroid Build Coastguard Worker value.z = inStream_readBoolean(in);
205*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,SetLocalInt)
206*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, slot, value.z);
207*e82f7db8SAndroid Build Coastguard Worker break;
208*e82f7db8SAndroid Build Coastguard Worker
209*e82f7db8SAndroid Build Coastguard Worker default:
210*e82f7db8SAndroid Build Coastguard Worker return JDWP_ERROR(INVALID_TAG);
211*e82f7db8SAndroid Build Coastguard Worker }
212*e82f7db8SAndroid Build Coastguard Worker }
213*e82f7db8SAndroid Build Coastguard Worker
214*e82f7db8SAndroid Build Coastguard Worker return map2jdwpError(error);
215*e82f7db8SAndroid Build Coastguard Worker }
216*e82f7db8SAndroid Build Coastguard Worker
217*e82f7db8SAndroid Build Coastguard Worker static jboolean
getValues(PacketInputStream * in,PacketOutputStream * out)218*e82f7db8SAndroid Build Coastguard Worker getValues(PacketInputStream *in, PacketOutputStream *out)
219*e82f7db8SAndroid Build Coastguard Worker {
220*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
221*e82f7db8SAndroid Build Coastguard Worker int i;
222*e82f7db8SAndroid Build Coastguard Worker jdwpError serror;
223*e82f7db8SAndroid Build Coastguard Worker jthread thread;
224*e82f7db8SAndroid Build Coastguard Worker FrameID frame;
225*e82f7db8SAndroid Build Coastguard Worker jint variableCount;
226*e82f7db8SAndroid Build Coastguard Worker
227*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
228*e82f7db8SAndroid Build Coastguard Worker
229*e82f7db8SAndroid Build Coastguard Worker thread = inStream_readThreadRef(env, in);
230*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
231*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
232*e82f7db8SAndroid Build Coastguard Worker }
233*e82f7db8SAndroid Build Coastguard Worker frame = inStream_readFrameID(in);
234*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
235*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
236*e82f7db8SAndroid Build Coastguard Worker }
237*e82f7db8SAndroid Build Coastguard Worker variableCount = inStream_readInt(in);
238*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
239*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
240*e82f7db8SAndroid Build Coastguard Worker }
241*e82f7db8SAndroid Build Coastguard Worker
242*e82f7db8SAndroid Build Coastguard Worker /*
243*e82f7db8SAndroid Build Coastguard Worker * Validate the frame id
244*e82f7db8SAndroid Build Coastguard Worker */
245*e82f7db8SAndroid Build Coastguard Worker serror = validateThreadFrame(thread, frame);
246*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
247*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
248*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
249*e82f7db8SAndroid Build Coastguard Worker }
250*e82f7db8SAndroid Build Coastguard Worker
251*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, variableCount);
252*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < variableCount) && !outStream_error(out); i++) {
253*e82f7db8SAndroid Build Coastguard Worker jint slot;
254*e82f7db8SAndroid Build Coastguard Worker jbyte typeKey;
255*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum;
256*e82f7db8SAndroid Build Coastguard Worker
257*e82f7db8SAndroid Build Coastguard Worker slot = inStream_readInt(in);
258*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in))
259*e82f7db8SAndroid Build Coastguard Worker break;
260*e82f7db8SAndroid Build Coastguard Worker typeKey = inStream_readByte(in);
261*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in))
262*e82f7db8SAndroid Build Coastguard Worker break;
263*e82f7db8SAndroid Build Coastguard Worker
264*e82f7db8SAndroid Build Coastguard Worker fnum = getFrameNumber(frame);
265*e82f7db8SAndroid Build Coastguard Worker serror = writeVariableValue(env, out, thread, fnum, slot, typeKey);
266*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
267*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
268*e82f7db8SAndroid Build Coastguard Worker break;
269*e82f7db8SAndroid Build Coastguard Worker }
270*e82f7db8SAndroid Build Coastguard Worker }
271*e82f7db8SAndroid Build Coastguard Worker
272*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
273*e82f7db8SAndroid Build Coastguard Worker }
274*e82f7db8SAndroid Build Coastguard Worker
275*e82f7db8SAndroid Build Coastguard Worker static jboolean
setValues(PacketInputStream * in,PacketOutputStream * out)276*e82f7db8SAndroid Build Coastguard Worker setValues(PacketInputStream *in, PacketOutputStream *out)
277*e82f7db8SAndroid Build Coastguard Worker {
278*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
279*e82f7db8SAndroid Build Coastguard Worker jint i;
280*e82f7db8SAndroid Build Coastguard Worker jdwpError serror;
281*e82f7db8SAndroid Build Coastguard Worker jthread thread;
282*e82f7db8SAndroid Build Coastguard Worker FrameID frame;
283*e82f7db8SAndroid Build Coastguard Worker jint variableCount;
284*e82f7db8SAndroid Build Coastguard Worker
285*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
286*e82f7db8SAndroid Build Coastguard Worker
287*e82f7db8SAndroid Build Coastguard Worker thread = inStream_readThreadRef(env, in);
288*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
289*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
290*e82f7db8SAndroid Build Coastguard Worker }
291*e82f7db8SAndroid Build Coastguard Worker frame = inStream_readFrameID(in);
292*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
293*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
294*e82f7db8SAndroid Build Coastguard Worker }
295*e82f7db8SAndroid Build Coastguard Worker variableCount = inStream_readInt(in);
296*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
297*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
298*e82f7db8SAndroid Build Coastguard Worker }
299*e82f7db8SAndroid Build Coastguard Worker
300*e82f7db8SAndroid Build Coastguard Worker /*
301*e82f7db8SAndroid Build Coastguard Worker * Validate the frame id
302*e82f7db8SAndroid Build Coastguard Worker */
303*e82f7db8SAndroid Build Coastguard Worker serror = validateThreadFrame(thread, frame);
304*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
305*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
306*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
307*e82f7db8SAndroid Build Coastguard Worker }
308*e82f7db8SAndroid Build Coastguard Worker
309*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < variableCount) && !inStream_error(in); i++) {
310*e82f7db8SAndroid Build Coastguard Worker
311*e82f7db8SAndroid Build Coastguard Worker jint slot;
312*e82f7db8SAndroid Build Coastguard Worker jbyte typeKey;
313*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum;
314*e82f7db8SAndroid Build Coastguard Worker
315*e82f7db8SAndroid Build Coastguard Worker slot = inStream_readInt(in);
316*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
317*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
318*e82f7db8SAndroid Build Coastguard Worker }
319*e82f7db8SAndroid Build Coastguard Worker typeKey = inStream_readByte(in);
320*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
321*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
322*e82f7db8SAndroid Build Coastguard Worker }
323*e82f7db8SAndroid Build Coastguard Worker
324*e82f7db8SAndroid Build Coastguard Worker fnum = getFrameNumber(frame);
325*e82f7db8SAndroid Build Coastguard Worker serror = readVariableValue(env, in, thread, fnum, slot, typeKey);
326*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE))
327*e82f7db8SAndroid Build Coastguard Worker break;
328*e82f7db8SAndroid Build Coastguard Worker }
329*e82f7db8SAndroid Build Coastguard Worker
330*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
331*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
332*e82f7db8SAndroid Build Coastguard Worker }
333*e82f7db8SAndroid Build Coastguard Worker
334*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
335*e82f7db8SAndroid Build Coastguard Worker }
336*e82f7db8SAndroid Build Coastguard Worker
337*e82f7db8SAndroid Build Coastguard Worker static jboolean
thisObject(PacketInputStream * in,PacketOutputStream * out)338*e82f7db8SAndroid Build Coastguard Worker thisObject(PacketInputStream *in, PacketOutputStream *out)
339*e82f7db8SAndroid Build Coastguard Worker {
340*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
341*e82f7db8SAndroid Build Coastguard Worker jdwpError serror;
342*e82f7db8SAndroid Build Coastguard Worker jthread thread;
343*e82f7db8SAndroid Build Coastguard Worker FrameID frame;
344*e82f7db8SAndroid Build Coastguard Worker
345*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
346*e82f7db8SAndroid Build Coastguard Worker
347*e82f7db8SAndroid Build Coastguard Worker thread = inStream_readThreadRef(env, in);
348*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
349*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
350*e82f7db8SAndroid Build Coastguard Worker }
351*e82f7db8SAndroid Build Coastguard Worker
352*e82f7db8SAndroid Build Coastguard Worker frame = inStream_readFrameID(in);
353*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
354*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
355*e82f7db8SAndroid Build Coastguard Worker }
356*e82f7db8SAndroid Build Coastguard Worker
357*e82f7db8SAndroid Build Coastguard Worker /*
358*e82f7db8SAndroid Build Coastguard Worker * Validate the frame id
359*e82f7db8SAndroid Build Coastguard Worker */
360*e82f7db8SAndroid Build Coastguard Worker serror = validateThreadFrame(thread, frame);
361*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
362*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
363*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
364*e82f7db8SAndroid Build Coastguard Worker }
365*e82f7db8SAndroid Build Coastguard Worker
366*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 2) {
367*e82f7db8SAndroid Build Coastguard Worker
368*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
369*e82f7db8SAndroid Build Coastguard Worker jmethodID method;
370*e82f7db8SAndroid Build Coastguard Worker jlocation location;
371*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum;
372*e82f7db8SAndroid Build Coastguard Worker
373*e82f7db8SAndroid Build Coastguard Worker /*
374*e82f7db8SAndroid Build Coastguard Worker * Find out if the given frame is for a static or native method.
375*e82f7db8SAndroid Build Coastguard Worker */
376*e82f7db8SAndroid Build Coastguard Worker fnum = getFrameNumber(frame);
377*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetFrameLocation)
378*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, &method, &location);
379*e82f7db8SAndroid Build Coastguard Worker if (error == JVMTI_ERROR_NONE) {
380*e82f7db8SAndroid Build Coastguard Worker
381*e82f7db8SAndroid Build Coastguard Worker jint modifiers;
382*e82f7db8SAndroid Build Coastguard Worker
383*e82f7db8SAndroid Build Coastguard Worker error = methodModifiers(method, &modifiers);
384*e82f7db8SAndroid Build Coastguard Worker if (error == JVMTI_ERROR_NONE) {
385*e82f7db8SAndroid Build Coastguard Worker
386*e82f7db8SAndroid Build Coastguard Worker jobject this_object;
387*e82f7db8SAndroid Build Coastguard Worker
388*e82f7db8SAndroid Build Coastguard Worker /*
389*e82f7db8SAndroid Build Coastguard Worker * Return null for static or native methods; otherwise, the JVM
390*e82f7db8SAndroid Build Coastguard Worker * spec guarantees that "this" is in slot 0
391*e82f7db8SAndroid Build Coastguard Worker */
392*e82f7db8SAndroid Build Coastguard Worker if (modifiers & (MOD_STATIC | MOD_NATIVE)) {
393*e82f7db8SAndroid Build Coastguard Worker this_object = NULL;
394*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, specificTypeKey(env, this_object));
395*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, this_object);
396*e82f7db8SAndroid Build Coastguard Worker } else {
397*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: On ART 'this' is not always in register 0. We just use
398*e82f7db8SAndroid Build Coastguard Worker // GetLocalInstance in all cases.
399*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetLocalInstance)
400*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, thread, fnum, &this_object);
401*e82f7db8SAndroid Build Coastguard Worker if (error == JVMTI_ERROR_NONE) {
402*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, specificTypeKey(env, this_object));
403*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, this_object);
404*e82f7db8SAndroid Build Coastguard Worker }
405*e82f7db8SAndroid Build Coastguard Worker }
406*e82f7db8SAndroid Build Coastguard Worker
407*e82f7db8SAndroid Build Coastguard Worker }
408*e82f7db8SAndroid Build Coastguard Worker }
409*e82f7db8SAndroid Build Coastguard Worker serror = map2jdwpError(error);
410*e82f7db8SAndroid Build Coastguard Worker
411*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
412*e82f7db8SAndroid Build Coastguard Worker
413*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE))
414*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
415*e82f7db8SAndroid Build Coastguard Worker
416*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
417*e82f7db8SAndroid Build Coastguard Worker }
418*e82f7db8SAndroid Build Coastguard Worker
419*e82f7db8SAndroid Build Coastguard Worker static jboolean
popFrames(PacketInputStream * in,PacketOutputStream * out)420*e82f7db8SAndroid Build Coastguard Worker popFrames(PacketInputStream *in, PacketOutputStream *out)
421*e82f7db8SAndroid Build Coastguard Worker {
422*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
423*e82f7db8SAndroid Build Coastguard Worker jdwpError serror;
424*e82f7db8SAndroid Build Coastguard Worker jthread thread;
425*e82f7db8SAndroid Build Coastguard Worker FrameID frame;
426*e82f7db8SAndroid Build Coastguard Worker FrameNumber fnum;
427*e82f7db8SAndroid Build Coastguard Worker
428*e82f7db8SAndroid Build Coastguard Worker thread = inStream_readThreadRef(getEnv(), in);
429*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
430*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
431*e82f7db8SAndroid Build Coastguard Worker }
432*e82f7db8SAndroid Build Coastguard Worker
433*e82f7db8SAndroid Build Coastguard Worker frame = inStream_readFrameID(in);
434*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
435*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
436*e82f7db8SAndroid Build Coastguard Worker }
437*e82f7db8SAndroid Build Coastguard Worker
438*e82f7db8SAndroid Build Coastguard Worker /*
439*e82f7db8SAndroid Build Coastguard Worker * Validate the frame id
440*e82f7db8SAndroid Build Coastguard Worker */
441*e82f7db8SAndroid Build Coastguard Worker serror = validateThreadFrame(thread, frame);
442*e82f7db8SAndroid Build Coastguard Worker if (serror != JDWP_ERROR(NONE)) {
443*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
444*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
445*e82f7db8SAndroid Build Coastguard Worker }
446*e82f7db8SAndroid Build Coastguard Worker
447*e82f7db8SAndroid Build Coastguard Worker if (threadControl_isDebugThread(thread)) {
448*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_THREAD));
449*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
450*e82f7db8SAndroid Build Coastguard Worker }
451*e82f7db8SAndroid Build Coastguard Worker
452*e82f7db8SAndroid Build Coastguard Worker fnum = getFrameNumber(frame);
453*e82f7db8SAndroid Build Coastguard Worker error = threadControl_popFrames(thread, fnum);
454*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
455*e82f7db8SAndroid Build Coastguard Worker serror = map2jdwpError(error);
456*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
457*e82f7db8SAndroid Build Coastguard Worker }
458*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
459*e82f7db8SAndroid Build Coastguard Worker }
460*e82f7db8SAndroid Build Coastguard Worker
461*e82f7db8SAndroid Build Coastguard Worker void *StackFrame_Cmds[] = { (void *)0x4
462*e82f7db8SAndroid Build Coastguard Worker ,(void *)getValues
463*e82f7db8SAndroid Build Coastguard Worker ,(void *)setValues
464*e82f7db8SAndroid Build Coastguard Worker ,(void *)thisObject
465*e82f7db8SAndroid Build Coastguard Worker ,(void *)popFrames
466*e82f7db8SAndroid Build Coastguard Worker };
467