blob: e6f63698e875a14a7ca7889fd3ea99b38f2b5c07 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* This test checks that jvmti function GetFieldModifiers() works for
* fields specified by jfieldID and jclass that inherits the field.
*/
#include <iostream>
#include <jvmti.h>
using namespace std;
#define PACKAGE "org/apache/harmony/drlvm/tests/regression/h3505/"
static const jint EXPECTED_MODIFIERS = 0;
static void set_passed_state(JNIEnv* jni)
{
jclass cl = jni->FindClass(PACKAGE "Status");
if (NULL == cl) {
cerr << "unable to find 'Status' class" << endl;
return;
}
jfieldID fid = jni->GetStaticFieldID(cl, "status", "Z");
if (NULL == fid) {
cerr << "unable to find 'status' field" << endl;
return;
}
jni->SetStaticBooleanField(cl, fid, JNI_TRUE);
}
static void JNICALL VMInit(jvmtiEnv* jvmti, JNIEnv* jni, jthread thread)
{
jvmtiError err;
// get child class
jclass child = jni->FindClass(PACKAGE "Child");
if (NULL == child) {
cerr << "unable to find 'Child' class" << endl;
return;
}
// get inherited field from child class
jfieldID fid = jni->GetFieldID(child, "intField", "I");
if (NULL == fid) {
cerr << "unable to find the field" << endl;
return;
}
// get field modifiers, specifying field by ID and child class
jint modifiers = 0;
err = jvmti->GetFieldModifiers(child, fid, &modifiers);
if (JVMTI_ERROR_NONE != err) {
cerr << "unable to get field modifiers; ERROR: " << err << endl;
return;
}
if (EXPECTED_MODIFIERS != modifiers) {
cerr << "wrong field modifiers: " << modifiers
<< "\texpected: " << EXPECTED_MODIFIERS << endl;
return;
}
set_passed_state(jni);
}
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
{
jvmtiEnv *jvmti = NULL;
jvmtiError err;
// Get JVMTI interface pointer
jint iRes = vm->GetEnv((void**)&jvmti, JVMTI_VERSION);
if (JNI_OK != iRes) {
cerr << "[JvmtiAgent] ERROR: unable to get JVMTI environment" << endl;
return -1;
}
// Set events callbacks
jvmtiEventCallbacks callbacks;
memset(&callbacks, 0, sizeof(jvmtiEventCallbacks));
callbacks.VMInit = VMInit;
err = jvmti->SetEventCallbacks(&callbacks, sizeof(jvmtiEventCallbacks));
if (JVMTI_ERROR_NONE != err) {
cerr << "[JvmtiAgent] ERROR: unable to register event callbacks" << endl;
return -1;
}
err = jvmti->SetEventNotificationMode(JVMTI_ENABLE,
JVMTI_EVENT_VM_INIT, NULL);
if (JVMTI_ERROR_NONE != err) {
cerr << "[JvmtiAgent] ERROR: unable to enable VMInit event"
<< endl;
return -1;
}
// Agent initialized successfully
return 0;
}