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 "ArrayReferenceImpl.h"
28*e82f7db8SAndroid Build Coastguard Worker #include "inStream.h"
29*e82f7db8SAndroid Build Coastguard Worker #include "outStream.h"
30*e82f7db8SAndroid Build Coastguard Worker
31*e82f7db8SAndroid Build Coastguard Worker static jboolean
length(PacketInputStream * in,PacketOutputStream * out)32*e82f7db8SAndroid Build Coastguard Worker length(PacketInputStream *in, PacketOutputStream *out)
33*e82f7db8SAndroid Build Coastguard Worker {
34*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env = getEnv();
35*e82f7db8SAndroid Build Coastguard Worker jsize arrayLength;
36*e82f7db8SAndroid Build Coastguard Worker
37*e82f7db8SAndroid Build Coastguard Worker jarray array = inStream_readArrayRef(env, in);
38*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
39*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
40*e82f7db8SAndroid Build Coastguard Worker }
41*e82f7db8SAndroid Build Coastguard Worker
42*e82f7db8SAndroid Build Coastguard Worker arrayLength = JNI_FUNC_PTR(env,GetArrayLength)(env, array);
43*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, arrayLength);
44*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
45*e82f7db8SAndroid Build Coastguard Worker }
46*e82f7db8SAndroid Build Coastguard Worker
47*e82f7db8SAndroid Build Coastguard Worker static void *
newComponents(PacketOutputStream * out,jint length,size_t nbytes)48*e82f7db8SAndroid Build Coastguard Worker newComponents(PacketOutputStream *out, jint length, size_t nbytes)
49*e82f7db8SAndroid Build Coastguard Worker {
50*e82f7db8SAndroid Build Coastguard Worker void *ptr = NULL;
51*e82f7db8SAndroid Build Coastguard Worker
52*e82f7db8SAndroid Build Coastguard Worker if ( length > 0 ) {
53*e82f7db8SAndroid Build Coastguard Worker ptr = jvmtiAllocate(length*((jint)nbytes));
54*e82f7db8SAndroid Build Coastguard Worker if ( ptr == NULL ) {
55*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
56*e82f7db8SAndroid Build Coastguard Worker } else {
57*e82f7db8SAndroid Build Coastguard Worker (void)memset(ptr, 0, length*nbytes);
58*e82f7db8SAndroid Build Coastguard Worker }
59*e82f7db8SAndroid Build Coastguard Worker }
60*e82f7db8SAndroid Build Coastguard Worker return ptr;
61*e82f7db8SAndroid Build Coastguard Worker }
62*e82f7db8SAndroid Build Coastguard Worker
63*e82f7db8SAndroid Build Coastguard Worker static void
deleteComponents(void * ptr)64*e82f7db8SAndroid Build Coastguard Worker deleteComponents(void *ptr)
65*e82f7db8SAndroid Build Coastguard Worker {
66*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(ptr);
67*e82f7db8SAndroid Build Coastguard Worker }
68*e82f7db8SAndroid Build Coastguard Worker
69*e82f7db8SAndroid Build Coastguard Worker static void
writeBooleanComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)70*e82f7db8SAndroid Build Coastguard Worker writeBooleanComponents(JNIEnv *env, PacketOutputStream *out,
71*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
72*e82f7db8SAndroid Build Coastguard Worker {
73*e82f7db8SAndroid Build Coastguard Worker jboolean *components;
74*e82f7db8SAndroid Build Coastguard Worker
75*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jboolean));
76*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
77*e82f7db8SAndroid Build Coastguard Worker jint i;
78*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetBooleanArrayRegion)(env, array, index, length, components);
79*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
80*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, components[i]);
81*e82f7db8SAndroid Build Coastguard Worker }
82*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
83*e82f7db8SAndroid Build Coastguard Worker }
84*e82f7db8SAndroid Build Coastguard Worker }
85*e82f7db8SAndroid Build Coastguard Worker
86*e82f7db8SAndroid Build Coastguard Worker static void
writeByteComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)87*e82f7db8SAndroid Build Coastguard Worker writeByteComponents(JNIEnv *env, PacketOutputStream *out,
88*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
89*e82f7db8SAndroid Build Coastguard Worker {
90*e82f7db8SAndroid Build Coastguard Worker jbyte *components;
91*e82f7db8SAndroid Build Coastguard Worker
92*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jbyte));
93*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
94*e82f7db8SAndroid Build Coastguard Worker jint i;
95*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetByteArrayRegion)(env, array, index, length, components);
96*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
97*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, components[i]);
98*e82f7db8SAndroid Build Coastguard Worker }
99*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
100*e82f7db8SAndroid Build Coastguard Worker }
101*e82f7db8SAndroid Build Coastguard Worker }
102*e82f7db8SAndroid Build Coastguard Worker
103*e82f7db8SAndroid Build Coastguard Worker static void
writeCharComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)104*e82f7db8SAndroid Build Coastguard Worker writeCharComponents(JNIEnv *env, PacketOutputStream *out,
105*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
106*e82f7db8SAndroid Build Coastguard Worker {
107*e82f7db8SAndroid Build Coastguard Worker jchar *components;
108*e82f7db8SAndroid Build Coastguard Worker
109*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jchar));
110*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
111*e82f7db8SAndroid Build Coastguard Worker jint i;
112*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetCharArrayRegion)(env, array, index, length, components);
113*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
114*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeChar(out, components[i]);
115*e82f7db8SAndroid Build Coastguard Worker }
116*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
117*e82f7db8SAndroid Build Coastguard Worker }
118*e82f7db8SAndroid Build Coastguard Worker }
119*e82f7db8SAndroid Build Coastguard Worker
120*e82f7db8SAndroid Build Coastguard Worker static void
writeShortComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)121*e82f7db8SAndroid Build Coastguard Worker writeShortComponents(JNIEnv *env, PacketOutputStream *out,
122*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
123*e82f7db8SAndroid Build Coastguard Worker {
124*e82f7db8SAndroid Build Coastguard Worker jshort *components;
125*e82f7db8SAndroid Build Coastguard Worker
126*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jshort));
127*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
128*e82f7db8SAndroid Build Coastguard Worker jint i;
129*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetShortArrayRegion)(env, array, index, length, components);
130*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
131*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeShort(out, components[i]);
132*e82f7db8SAndroid Build Coastguard Worker }
133*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
134*e82f7db8SAndroid Build Coastguard Worker }
135*e82f7db8SAndroid Build Coastguard Worker }
136*e82f7db8SAndroid Build Coastguard Worker
137*e82f7db8SAndroid Build Coastguard Worker static void
writeIntComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)138*e82f7db8SAndroid Build Coastguard Worker writeIntComponents(JNIEnv *env, PacketOutputStream *out,
139*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
140*e82f7db8SAndroid Build Coastguard Worker {
141*e82f7db8SAndroid Build Coastguard Worker jint *components;
142*e82f7db8SAndroid Build Coastguard Worker
143*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jint));
144*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
145*e82f7db8SAndroid Build Coastguard Worker jint i;
146*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetIntArrayRegion)(env, array, index, length, components);
147*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
148*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, components[i]);
149*e82f7db8SAndroid Build Coastguard Worker }
150*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
151*e82f7db8SAndroid Build Coastguard Worker }
152*e82f7db8SAndroid Build Coastguard Worker }
153*e82f7db8SAndroid Build Coastguard Worker
154*e82f7db8SAndroid Build Coastguard Worker static void
writeLongComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)155*e82f7db8SAndroid Build Coastguard Worker writeLongComponents(JNIEnv *env, PacketOutputStream *out,
156*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
157*e82f7db8SAndroid Build Coastguard Worker {
158*e82f7db8SAndroid Build Coastguard Worker jlong *components;
159*e82f7db8SAndroid Build Coastguard Worker
160*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jlong));
161*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
162*e82f7db8SAndroid Build Coastguard Worker jint i;
163*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetLongArrayRegion)(env, array, index, length, components);
164*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
165*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeLong(out, components[i]);
166*e82f7db8SAndroid Build Coastguard Worker }
167*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
168*e82f7db8SAndroid Build Coastguard Worker }
169*e82f7db8SAndroid Build Coastguard Worker }
170*e82f7db8SAndroid Build Coastguard Worker
171*e82f7db8SAndroid Build Coastguard Worker static void
writeFloatComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)172*e82f7db8SAndroid Build Coastguard Worker writeFloatComponents(JNIEnv *env, PacketOutputStream *out,
173*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
174*e82f7db8SAndroid Build Coastguard Worker {
175*e82f7db8SAndroid Build Coastguard Worker jfloat *components;
176*e82f7db8SAndroid Build Coastguard Worker
177*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jfloat));
178*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
179*e82f7db8SAndroid Build Coastguard Worker jint i;
180*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetFloatArrayRegion)(env, array, index, length, components);
181*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
182*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeFloat(out, components[i]);
183*e82f7db8SAndroid Build Coastguard Worker }
184*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
185*e82f7db8SAndroid Build Coastguard Worker }
186*e82f7db8SAndroid Build Coastguard Worker }
187*e82f7db8SAndroid Build Coastguard Worker
188*e82f7db8SAndroid Build Coastguard Worker static void
writeDoubleComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)189*e82f7db8SAndroid Build Coastguard Worker writeDoubleComponents(JNIEnv *env, PacketOutputStream *out,
190*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
191*e82f7db8SAndroid Build Coastguard Worker {
192*e82f7db8SAndroid Build Coastguard Worker jdouble *components;
193*e82f7db8SAndroid Build Coastguard Worker
194*e82f7db8SAndroid Build Coastguard Worker components = newComponents(out, length, sizeof(jdouble));
195*e82f7db8SAndroid Build Coastguard Worker if (components != NULL) {
196*e82f7db8SAndroid Build Coastguard Worker jint i;
197*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,GetDoubleArrayRegion)(env, array, index, length, components);
198*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
199*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeDouble(out, components[i]);
200*e82f7db8SAndroid Build Coastguard Worker }
201*e82f7db8SAndroid Build Coastguard Worker deleteComponents(components);
202*e82f7db8SAndroid Build Coastguard Worker }
203*e82f7db8SAndroid Build Coastguard Worker }
204*e82f7db8SAndroid Build Coastguard Worker
205*e82f7db8SAndroid Build Coastguard Worker static void
writeObjectComponents(JNIEnv * env,PacketOutputStream * out,jarray array,jint index,jint length)206*e82f7db8SAndroid Build Coastguard Worker writeObjectComponents(JNIEnv *env, PacketOutputStream *out,
207*e82f7db8SAndroid Build Coastguard Worker jarray array, jint index, jint length)
208*e82f7db8SAndroid Build Coastguard Worker {
209*e82f7db8SAndroid Build Coastguard Worker
210*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, length) {
211*e82f7db8SAndroid Build Coastguard Worker
212*e82f7db8SAndroid Build Coastguard Worker int i;
213*e82f7db8SAndroid Build Coastguard Worker jobject component;
214*e82f7db8SAndroid Build Coastguard Worker
215*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
216*e82f7db8SAndroid Build Coastguard Worker component = JNI_FUNC_PTR(env,GetObjectArrayElement)(env, array, index + i);
217*e82f7db8SAndroid Build Coastguard Worker if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) {
218*e82f7db8SAndroid Build Coastguard Worker /* cleared by caller */
219*e82f7db8SAndroid Build Coastguard Worker break;
220*e82f7db8SAndroid Build Coastguard Worker }
221*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, specificTypeKey(env, component));
222*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, component);
223*e82f7db8SAndroid Build Coastguard Worker }
224*e82f7db8SAndroid Build Coastguard Worker
225*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
226*e82f7db8SAndroid Build Coastguard Worker }
227*e82f7db8SAndroid Build Coastguard Worker
228*e82f7db8SAndroid Build Coastguard Worker static jboolean
getValues(PacketInputStream * in,PacketOutputStream * out)229*e82f7db8SAndroid Build Coastguard Worker getValues(PacketInputStream *in, PacketOutputStream *out)
230*e82f7db8SAndroid Build Coastguard Worker {
231*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env = getEnv();
232*e82f7db8SAndroid Build Coastguard Worker jint arrayLength;
233*e82f7db8SAndroid Build Coastguard Worker jarray array;
234*e82f7db8SAndroid Build Coastguard Worker jint index;
235*e82f7db8SAndroid Build Coastguard Worker jint length;
236*e82f7db8SAndroid Build Coastguard Worker
237*e82f7db8SAndroid Build Coastguard Worker array = inStream_readArrayRef(env, 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 index = inStream_readInt(in);
242*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
243*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
244*e82f7db8SAndroid Build Coastguard Worker }
245*e82f7db8SAndroid Build Coastguard Worker length = inStream_readInt(in);
246*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
247*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
248*e82f7db8SAndroid Build Coastguard Worker }
249*e82f7db8SAndroid Build Coastguard Worker
250*e82f7db8SAndroid Build Coastguard Worker arrayLength = JNI_FUNC_PTR(env,GetArrayLength)(env, array);
251*e82f7db8SAndroid Build Coastguard Worker
252*e82f7db8SAndroid Build Coastguard Worker if (length == -1) {
253*e82f7db8SAndroid Build Coastguard Worker length = arrayLength - index;
254*e82f7db8SAndroid Build Coastguard Worker }
255*e82f7db8SAndroid Build Coastguard Worker
256*e82f7db8SAndroid Build Coastguard Worker if ((index < 0) || (index > arrayLength - 1)) {
257*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_INDEX));
258*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
259*e82f7db8SAndroid Build Coastguard Worker }
260*e82f7db8SAndroid Build Coastguard Worker
261*e82f7db8SAndroid Build Coastguard Worker if ((length < 0) || (length + index > arrayLength)) {
262*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_LENGTH));
263*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
264*e82f7db8SAndroid Build Coastguard Worker }
265*e82f7db8SAndroid Build Coastguard Worker
266*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
267*e82f7db8SAndroid Build Coastguard Worker
268*e82f7db8SAndroid Build Coastguard Worker jclass arrayClass;
269*e82f7db8SAndroid Build Coastguard Worker char *signature = NULL;
270*e82f7db8SAndroid Build Coastguard Worker char *componentSignature;
271*e82f7db8SAndroid Build Coastguard Worker jbyte typeKey;
272*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
273*e82f7db8SAndroid Build Coastguard Worker
274*e82f7db8SAndroid Build Coastguard Worker arrayClass = JNI_FUNC_PTR(env,GetObjectClass)(env, array);
275*e82f7db8SAndroid Build Coastguard Worker error = classSignature(arrayClass, &signature, NULL);
276*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
277*e82f7db8SAndroid Build Coastguard Worker goto err;
278*e82f7db8SAndroid Build Coastguard Worker }
279*e82f7db8SAndroid Build Coastguard Worker componentSignature = &signature[1];
280*e82f7db8SAndroid Build Coastguard Worker typeKey = componentSignature[0];
281*e82f7db8SAndroid Build Coastguard Worker
282*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, typeKey);
283*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, length);
284*e82f7db8SAndroid Build Coastguard Worker
285*e82f7db8SAndroid Build Coastguard Worker if (isObjectTag(typeKey)) {
286*e82f7db8SAndroid Build Coastguard Worker writeObjectComponents(env, out, array, index, length);
287*e82f7db8SAndroid Build Coastguard Worker } else {
288*e82f7db8SAndroid Build Coastguard Worker switch (typeKey) {
289*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BYTE):
290*e82f7db8SAndroid Build Coastguard Worker writeByteComponents(env, out, array, index, length);
291*e82f7db8SAndroid Build Coastguard Worker break;
292*e82f7db8SAndroid Build Coastguard Worker
293*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(CHAR):
294*e82f7db8SAndroid Build Coastguard Worker writeCharComponents(env, out, array, index, length);
295*e82f7db8SAndroid Build Coastguard Worker break;
296*e82f7db8SAndroid Build Coastguard Worker
297*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(FLOAT):
298*e82f7db8SAndroid Build Coastguard Worker writeFloatComponents(env, out, array, index, length);
299*e82f7db8SAndroid Build Coastguard Worker break;
300*e82f7db8SAndroid Build Coastguard Worker
301*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(DOUBLE):
302*e82f7db8SAndroid Build Coastguard Worker writeDoubleComponents(env, out, array, index, length);
303*e82f7db8SAndroid Build Coastguard Worker break;
304*e82f7db8SAndroid Build Coastguard Worker
305*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(INT):
306*e82f7db8SAndroid Build Coastguard Worker writeIntComponents(env, out, array, index, length);
307*e82f7db8SAndroid Build Coastguard Worker break;
308*e82f7db8SAndroid Build Coastguard Worker
309*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(LONG):
310*e82f7db8SAndroid Build Coastguard Worker writeLongComponents(env, out, array, index, length);
311*e82f7db8SAndroid Build Coastguard Worker break;
312*e82f7db8SAndroid Build Coastguard Worker
313*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(SHORT):
314*e82f7db8SAndroid Build Coastguard Worker writeShortComponents(env, out, array, index, length);
315*e82f7db8SAndroid Build Coastguard Worker break;
316*e82f7db8SAndroid Build Coastguard Worker
317*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BOOLEAN):
318*e82f7db8SAndroid Build Coastguard Worker writeBooleanComponents(env, out, array, index, length);
319*e82f7db8SAndroid Build Coastguard Worker break;
320*e82f7db8SAndroid Build Coastguard Worker
321*e82f7db8SAndroid Build Coastguard Worker default:
322*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_TAG));
323*e82f7db8SAndroid Build Coastguard Worker break;
324*e82f7db8SAndroid Build Coastguard Worker }
325*e82f7db8SAndroid Build Coastguard Worker }
326*e82f7db8SAndroid Build Coastguard Worker
327*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(signature);
328*e82f7db8SAndroid Build Coastguard Worker
329*e82f7db8SAndroid Build Coastguard Worker err:;
330*e82f7db8SAndroid Build Coastguard Worker
331*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
332*e82f7db8SAndroid Build Coastguard Worker
333*e82f7db8SAndroid Build Coastguard Worker if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) {
334*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INTERNAL));
335*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,ExceptionClear)(env);
336*e82f7db8SAndroid Build Coastguard Worker }
337*e82f7db8SAndroid Build Coastguard Worker
338*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
339*e82f7db8SAndroid Build Coastguard Worker }
340*e82f7db8SAndroid Build Coastguard Worker
341*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readBooleanComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)342*e82f7db8SAndroid Build Coastguard Worker readBooleanComponents(JNIEnv *env, PacketInputStream *in,
343*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
344*e82f7db8SAndroid Build Coastguard Worker {
345*e82f7db8SAndroid Build Coastguard Worker int i;
346*e82f7db8SAndroid Build Coastguard Worker jboolean component;
347*e82f7db8SAndroid Build Coastguard Worker
348*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
349*e82f7db8SAndroid Build Coastguard Worker component = inStream_readBoolean(in);
350*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetBooleanArrayRegion)(env, array, index + i, 1, &component);
351*e82f7db8SAndroid Build Coastguard Worker }
352*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
353*e82f7db8SAndroid Build Coastguard Worker }
354*e82f7db8SAndroid Build Coastguard Worker
355*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readByteComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)356*e82f7db8SAndroid Build Coastguard Worker readByteComponents(JNIEnv *env, PacketInputStream *in,
357*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
358*e82f7db8SAndroid Build Coastguard Worker {
359*e82f7db8SAndroid Build Coastguard Worker int i;
360*e82f7db8SAndroid Build Coastguard Worker jbyte component;
361*e82f7db8SAndroid Build Coastguard Worker
362*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
363*e82f7db8SAndroid Build Coastguard Worker component = inStream_readByte(in);
364*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetByteArrayRegion)(env, array, index + i, 1, &component);
365*e82f7db8SAndroid Build Coastguard Worker }
366*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
367*e82f7db8SAndroid Build Coastguard Worker }
368*e82f7db8SAndroid Build Coastguard Worker
369*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readCharComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)370*e82f7db8SAndroid Build Coastguard Worker readCharComponents(JNIEnv *env, PacketInputStream *in,
371*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
372*e82f7db8SAndroid Build Coastguard Worker {
373*e82f7db8SAndroid Build Coastguard Worker int i;
374*e82f7db8SAndroid Build Coastguard Worker jchar component;
375*e82f7db8SAndroid Build Coastguard Worker
376*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
377*e82f7db8SAndroid Build Coastguard Worker component = inStream_readChar(in);
378*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetCharArrayRegion)(env, array, index + i, 1, &component);
379*e82f7db8SAndroid Build Coastguard Worker }
380*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
381*e82f7db8SAndroid Build Coastguard Worker }
382*e82f7db8SAndroid Build Coastguard Worker
383*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readShortComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)384*e82f7db8SAndroid Build Coastguard Worker readShortComponents(JNIEnv *env, PacketInputStream *in,
385*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
386*e82f7db8SAndroid Build Coastguard Worker {
387*e82f7db8SAndroid Build Coastguard Worker int i;
388*e82f7db8SAndroid Build Coastguard Worker jshort component;
389*e82f7db8SAndroid Build Coastguard Worker
390*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
391*e82f7db8SAndroid Build Coastguard Worker component = inStream_readShort(in);
392*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetShortArrayRegion)(env, array, index + i, 1, &component);
393*e82f7db8SAndroid Build Coastguard Worker }
394*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
395*e82f7db8SAndroid Build Coastguard Worker }
396*e82f7db8SAndroid Build Coastguard Worker
397*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readIntComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)398*e82f7db8SAndroid Build Coastguard Worker readIntComponents(JNIEnv *env, PacketInputStream *in,
399*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
400*e82f7db8SAndroid Build Coastguard Worker {
401*e82f7db8SAndroid Build Coastguard Worker int i;
402*e82f7db8SAndroid Build Coastguard Worker jint component;
403*e82f7db8SAndroid Build Coastguard Worker
404*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
405*e82f7db8SAndroid Build Coastguard Worker component = inStream_readInt(in);
406*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetIntArrayRegion)(env, array, index + i, 1, &component);
407*e82f7db8SAndroid Build Coastguard Worker }
408*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
409*e82f7db8SAndroid Build Coastguard Worker }
410*e82f7db8SAndroid Build Coastguard Worker
411*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readLongComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)412*e82f7db8SAndroid Build Coastguard Worker readLongComponents(JNIEnv *env, PacketInputStream *in,
413*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
414*e82f7db8SAndroid Build Coastguard Worker {
415*e82f7db8SAndroid Build Coastguard Worker int i;
416*e82f7db8SAndroid Build Coastguard Worker jlong component;
417*e82f7db8SAndroid Build Coastguard Worker
418*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
419*e82f7db8SAndroid Build Coastguard Worker component = inStream_readLong(in);
420*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetLongArrayRegion)(env, array, index + i, 1, &component);
421*e82f7db8SAndroid Build Coastguard Worker }
422*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
423*e82f7db8SAndroid Build Coastguard Worker }
424*e82f7db8SAndroid Build Coastguard Worker
425*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readFloatComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)426*e82f7db8SAndroid Build Coastguard Worker readFloatComponents(JNIEnv *env, PacketInputStream *in,
427*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
428*e82f7db8SAndroid Build Coastguard Worker {
429*e82f7db8SAndroid Build Coastguard Worker int i;
430*e82f7db8SAndroid Build Coastguard Worker jfloat component;
431*e82f7db8SAndroid Build Coastguard Worker
432*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
433*e82f7db8SAndroid Build Coastguard Worker component = inStream_readFloat(in);
434*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetFloatArrayRegion)(env, array, index + i, 1, &component);
435*e82f7db8SAndroid Build Coastguard Worker }
436*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
437*e82f7db8SAndroid Build Coastguard Worker }
438*e82f7db8SAndroid Build Coastguard Worker
439*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readDoubleComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)440*e82f7db8SAndroid Build Coastguard Worker readDoubleComponents(JNIEnv *env, PacketInputStream *in,
441*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
442*e82f7db8SAndroid Build Coastguard Worker {
443*e82f7db8SAndroid Build Coastguard Worker int i;
444*e82f7db8SAndroid Build Coastguard Worker jdouble component;
445*e82f7db8SAndroid Build Coastguard Worker
446*e82f7db8SAndroid Build Coastguard Worker for (i = 0; (i < length) && !inStream_error(in); i++) {
447*e82f7db8SAndroid Build Coastguard Worker component = inStream_readDouble(in);
448*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetDoubleArrayRegion)(env, array, index + i, 1, &component);
449*e82f7db8SAndroid Build Coastguard Worker }
450*e82f7db8SAndroid Build Coastguard Worker return inStream_error(in);
451*e82f7db8SAndroid Build Coastguard Worker }
452*e82f7db8SAndroid Build Coastguard Worker
453*e82f7db8SAndroid Build Coastguard Worker
454*e82f7db8SAndroid Build Coastguard Worker static jdwpError
readObjectComponents(JNIEnv * env,PacketInputStream * in,jarray array,int index,int length)455*e82f7db8SAndroid Build Coastguard Worker readObjectComponents(JNIEnv *env, PacketInputStream *in,
456*e82f7db8SAndroid Build Coastguard Worker jarray array, int index, int length)
457*e82f7db8SAndroid Build Coastguard Worker /* char *componentSignature) */
458*e82f7db8SAndroid Build Coastguard Worker {
459*e82f7db8SAndroid Build Coastguard Worker int i;
460*e82f7db8SAndroid Build Coastguard Worker
461*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
462*e82f7db8SAndroid Build Coastguard Worker jobject object = inStream_readObjectRef(env, in);
463*e82f7db8SAndroid Build Coastguard Worker
464*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,SetObjectArrayElement)(env, array, index + i, object);
465*e82f7db8SAndroid Build Coastguard Worker if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) {
466*e82f7db8SAndroid Build Coastguard Worker /* caller will clear */
467*e82f7db8SAndroid Build Coastguard Worker break;
468*e82f7db8SAndroid Build Coastguard Worker }
469*e82f7db8SAndroid Build Coastguard Worker }
470*e82f7db8SAndroid Build Coastguard Worker
471*e82f7db8SAndroid Build Coastguard Worker return JDWP_ERROR(NONE);
472*e82f7db8SAndroid Build Coastguard Worker }
473*e82f7db8SAndroid Build Coastguard Worker
474*e82f7db8SAndroid Build Coastguard Worker
475*e82f7db8SAndroid Build Coastguard Worker static jboolean
setValues(PacketInputStream * in,PacketOutputStream * out)476*e82f7db8SAndroid Build Coastguard Worker setValues(PacketInputStream *in, PacketOutputStream *out)
477*e82f7db8SAndroid Build Coastguard Worker {
478*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env = getEnv();
479*e82f7db8SAndroid Build Coastguard Worker jdwpError serror = JDWP_ERROR(NONE);
480*e82f7db8SAndroid Build Coastguard Worker int arrayLength;
481*e82f7db8SAndroid Build Coastguard Worker jarray array;
482*e82f7db8SAndroid Build Coastguard Worker jint index;
483*e82f7db8SAndroid Build Coastguard Worker jint length;
484*e82f7db8SAndroid Build Coastguard Worker
485*e82f7db8SAndroid Build Coastguard Worker array = inStream_readArrayRef(env, in);
486*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
487*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
488*e82f7db8SAndroid Build Coastguard Worker }
489*e82f7db8SAndroid Build Coastguard Worker index = inStream_readInt(in);
490*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
491*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
492*e82f7db8SAndroid Build Coastguard Worker }
493*e82f7db8SAndroid Build Coastguard Worker length = inStream_readInt(in);
494*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
495*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
496*e82f7db8SAndroid Build Coastguard Worker }
497*e82f7db8SAndroid Build Coastguard Worker
498*e82f7db8SAndroid Build Coastguard Worker arrayLength = JNI_FUNC_PTR(env,GetArrayLength)(env, array);
499*e82f7db8SAndroid Build Coastguard Worker
500*e82f7db8SAndroid Build Coastguard Worker if ((index < 0) || (index > arrayLength - 1)) {
501*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_INDEX));
502*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
503*e82f7db8SAndroid Build Coastguard Worker }
504*e82f7db8SAndroid Build Coastguard Worker
505*e82f7db8SAndroid Build Coastguard Worker if ((length < 0) || (length + index > arrayLength)) {
506*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_LENGTH));
507*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
508*e82f7db8SAndroid Build Coastguard Worker }
509*e82f7db8SAndroid Build Coastguard Worker
510*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
511*e82f7db8SAndroid Build Coastguard Worker
512*e82f7db8SAndroid Build Coastguard Worker jclass arrayClass;
513*e82f7db8SAndroid Build Coastguard Worker char *signature = NULL;
514*e82f7db8SAndroid Build Coastguard Worker char *componentSignature;
515*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
516*e82f7db8SAndroid Build Coastguard Worker
517*e82f7db8SAndroid Build Coastguard Worker arrayClass = JNI_FUNC_PTR(env,GetObjectClass)(env, array);
518*e82f7db8SAndroid Build Coastguard Worker error = classSignature(arrayClass, &signature, NULL);
519*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
520*e82f7db8SAndroid Build Coastguard Worker goto err;
521*e82f7db8SAndroid Build Coastguard Worker }
522*e82f7db8SAndroid Build Coastguard Worker componentSignature = &signature[1];
523*e82f7db8SAndroid Build Coastguard Worker
524*e82f7db8SAndroid Build Coastguard Worker switch (componentSignature[0]) {
525*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(OBJECT):
526*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(ARRAY):
527*e82f7db8SAndroid Build Coastguard Worker serror = readObjectComponents(env, in, array, index, length);
528*e82f7db8SAndroid Build Coastguard Worker break;
529*e82f7db8SAndroid Build Coastguard Worker
530*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BYTE):
531*e82f7db8SAndroid Build Coastguard Worker serror = readByteComponents(env, in, array, index, length);
532*e82f7db8SAndroid Build Coastguard Worker break;
533*e82f7db8SAndroid Build Coastguard Worker
534*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(CHAR):
535*e82f7db8SAndroid Build Coastguard Worker serror = readCharComponents(env, in, array, index, length);
536*e82f7db8SAndroid Build Coastguard Worker break;
537*e82f7db8SAndroid Build Coastguard Worker
538*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(FLOAT):
539*e82f7db8SAndroid Build Coastguard Worker serror = readFloatComponents(env, in, array, index, length);
540*e82f7db8SAndroid Build Coastguard Worker break;
541*e82f7db8SAndroid Build Coastguard Worker
542*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(DOUBLE):
543*e82f7db8SAndroid Build Coastguard Worker serror = readDoubleComponents(env, in, array, index, length);
544*e82f7db8SAndroid Build Coastguard Worker break;
545*e82f7db8SAndroid Build Coastguard Worker
546*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(INT):
547*e82f7db8SAndroid Build Coastguard Worker serror = readIntComponents(env, in, array, index, length);
548*e82f7db8SAndroid Build Coastguard Worker break;
549*e82f7db8SAndroid Build Coastguard Worker
550*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(LONG):
551*e82f7db8SAndroid Build Coastguard Worker serror = readLongComponents(env, in, array, index, length);
552*e82f7db8SAndroid Build Coastguard Worker break;
553*e82f7db8SAndroid Build Coastguard Worker
554*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(SHORT):
555*e82f7db8SAndroid Build Coastguard Worker serror = readShortComponents(env, in, array, index, length);
556*e82f7db8SAndroid Build Coastguard Worker break;
557*e82f7db8SAndroid Build Coastguard Worker
558*e82f7db8SAndroid Build Coastguard Worker case JDWP_TAG(BOOLEAN):
559*e82f7db8SAndroid Build Coastguard Worker serror = readBooleanComponents(env, in, array, index, length);
560*e82f7db8SAndroid Build Coastguard Worker break;
561*e82f7db8SAndroid Build Coastguard Worker
562*e82f7db8SAndroid Build Coastguard Worker default:
563*e82f7db8SAndroid Build Coastguard Worker {
564*e82f7db8SAndroid Build Coastguard Worker ERROR_MESSAGE(("Invalid array component signature: %s",
565*e82f7db8SAndroid Build Coastguard Worker componentSignature));
566*e82f7db8SAndroid Build Coastguard Worker EXIT_ERROR(AGENT_ERROR_INVALID_OBJECT,NULL);
567*e82f7db8SAndroid Build Coastguard Worker }
568*e82f7db8SAndroid Build Coastguard Worker break;
569*e82f7db8SAndroid Build Coastguard Worker }
570*e82f7db8SAndroid Build Coastguard Worker
571*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(signature);
572*e82f7db8SAndroid Build Coastguard Worker
573*e82f7db8SAndroid Build Coastguard Worker err:;
574*e82f7db8SAndroid Build Coastguard Worker
575*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
576*e82f7db8SAndroid Build Coastguard Worker
577*e82f7db8SAndroid Build Coastguard Worker if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) {
578*e82f7db8SAndroid Build Coastguard Worker /*
579*e82f7db8SAndroid Build Coastguard Worker * TO DO: Check exception type
580*e82f7db8SAndroid Build Coastguard Worker */
581*e82f7db8SAndroid Build Coastguard Worker serror = JDWP_ERROR(TYPE_MISMATCH);
582*e82f7db8SAndroid Build Coastguard Worker JNI_FUNC_PTR(env,ExceptionClear)(env);
583*e82f7db8SAndroid Build Coastguard Worker }
584*e82f7db8SAndroid Build Coastguard Worker
585*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, serror);
586*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
587*e82f7db8SAndroid Build Coastguard Worker }
588*e82f7db8SAndroid Build Coastguard Worker
589*e82f7db8SAndroid Build Coastguard Worker
590*e82f7db8SAndroid Build Coastguard Worker void *ArrayReference_Cmds[] = { (void *)0x3
591*e82f7db8SAndroid Build Coastguard Worker ,(void *)length
592*e82f7db8SAndroid Build Coastguard Worker ,(void *)getValues
593*e82f7db8SAndroid Build Coastguard Worker ,(void *)setValues};
594