340 error = objectReferrers(object, &referrerBatch, maxReferrers);
341 if (error != JVMTI_ERROR_NONE) {
342 outStream_setError(out, map2jdwpError(error));
343 } else {
344 int kk;
345
346 (void)outStream_writeInt(out, referrerBatch.count);
347 for (kk = 0; kk < referrerBatch.count; kk++) {
348 jobject ref;
349
350 ref = referrerBatch.objects[kk];
351 (void)outStream_writeByte(out, specificTypeKey(env, ref));
352 (void)outStream_writeObjectRef(env, out, ref);
353 }
354 jvmtiDeallocate(referrerBatch.objects);
355 }
356 } END_WITH_LOCAL_REFS(env);
357 return JNI_TRUE;
358 }
359
360 Command ObjectReference_Commands[] = {
361 {referenceType, "ReferenceType"},
362 {getValues, "GetValues"},
363 {setValues, "SetValues"},
364 {NULL, "<unused>"},
365 {monitorInfo, "MonitorInfo"},
366 {invokeInstance, "InvokeInstance"},
367 {disableCollection, "DisableCollection"},
368 {enableCollection, "EnableCollection"},
369 {isCollected, "IsCollected"},
370 {referringObjects, "ReferringObjects"}
371 };
372
373 DEBUG_DISPATCH_DEFINE_CMDSET(ObjectReference)
|
340 error = objectReferrers(object, &referrerBatch, maxReferrers);
341 if (error != JVMTI_ERROR_NONE) {
342 outStream_setError(out, map2jdwpError(error));
343 } else {
344 int kk;
345
346 (void)outStream_writeInt(out, referrerBatch.count);
347 for (kk = 0; kk < referrerBatch.count; kk++) {
348 jobject ref;
349
350 ref = referrerBatch.objects[kk];
351 (void)outStream_writeByte(out, specificTypeKey(env, ref));
352 (void)outStream_writeObjectRef(env, out, ref);
353 }
354 jvmtiDeallocate(referrerBatch.objects);
355 }
356 } END_WITH_LOCAL_REFS(env);
357 return JNI_TRUE;
358 }
359
360 static jboolean
361 isSameObjectImpl(PacketInputStream *in, PacketOutputStream *out)
362 {
363 jlong id1;
364 jlong id2;
365 jobject ref1;
366 jobject ref2;
367 JNIEnv *env;
368
369 env = getEnv();
370 id1 = inStream_readObjectID(in);
371 id2 = inStream_readObjectID(in);
372 if (inStream_error(in)) {
373 return JNI_TRUE;
374 }
375
376 if (id1 == NULL_OBJECT_ID || id2 == NULL_OBJECT_ID) {
377 outStream_setError(out, JDWP_ERROR(INVALID_OBJECT));
378 return JNI_TRUE;
379 }
380
381 ref1 = commonRef_idToRef(env, id1);
382 ref2 = commonRef_idToRef(env, id2);
383 (void)outStream_writeBoolean(out, isSameObject(env, ref1, ref2));
384
385 commonRef_idToRef_delete(env, ref1);
386 commonRef_idToRef_delete(env, ref2);
387
388 return JNI_TRUE;
389 }
390
391 static jboolean
392 objectHashCodeImpl(PacketInputStream *in, PacketOutputStream *out)
393 {
394 jlong id;
395 jobject ref;
396 JNIEnv *env;
397
398 env = getEnv();
399 id = inStream_readObjectID(in);
400 if (inStream_error(in)) {
401 return JNI_TRUE;
402 }
403
404 if (id == NULL_OBJECT_ID) {
405 outStream_setError(out, JDWP_ERROR(INVALID_OBJECT));
406 return JNI_TRUE;
407 }
408
409 ref = commonRef_idToRef(env, id);
410 (void)outStream_writeInt(out, objectHashCode(ref));
411
412 commonRef_idToRef_delete(env, ref);
413
414 return JNI_TRUE;
415 }
416
417 Command ObjectReference_Commands[] = {
418 {referenceType, "ReferenceType"},
419 {getValues, "GetValues"},
420 {setValues, "SetValues"},
421 {NULL, "<unused>"},
422 {monitorInfo, "MonitorInfo"},
423 {invokeInstance, "InvokeInstance"},
424 {disableCollection, "DisableCollection"},
425 {enableCollection, "EnableCollection"},
426 {isCollected, "IsCollected"},
427 {referringObjects, "ReferringObjects"},
428 {isSameObjectImpl, "IsSameObject"},
429 {objectHashCodeImpl, "ObjectHashCode"}
430 };
431
432 DEBUG_DISPATCH_DEFINE_CMDSET(ObjectReference)
|