/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
class FieldAccess {
static boolean verbose = true; // set to true to get messages for each test
static boolean allTestPass = true;
/**
* static fields
*/
static int staticInt;
static byte staticByte;
static char staticChar;
static short staticShort;
static boolean staticBoolean;
static float staticFloat;
static double staticDouble;
static long staticLong;
static FieldAccess staticObject;
/**
* virtual fields
*/
int instanceInt;
byte instanceByte;
char instanceChar;
short instanceShort;
boolean instanceBoolean;
float instanceFloat;
double instanceDouble;
long instanceLong;
FieldAccess instanceObject;
public static native void setVerboseOff();
/**
* Declare native methods that will call the JNI GetTYPEStaticField
*/
static native int accessStaticIntField();
static native int accessStaticBooleanField();
static native int accessStaticByteField();
static native int accessStaticCharField();
static native int accessStaticShortField();
static native int accessStaticLongField();
static native int accessStaticFloatField();
static native int accessStaticDoubleField();
static native int accessStaticObjectField();
static native int accessIntField(Object obj);
static native int accessBooleanField(Object obj);
static native int accessByteField(Object obj);
static native int accessCharField(Object obj);
static native int accessShortField(Object obj);
static native int accessLongField(Object obj);
static native int accessFloatField(Object obj);
static native int accessDoubleField(Object obj);
static native int accessObjectField(Object obj);
/**
* Declare native methods that will call the JNI Set<type>Field functions
*/
static native int setStaticIntField();
static native int setStaticBooleanField();
static native int setStaticByteField();
static native int setStaticCharField();
static native int setStaticShortField();
static native int setStaticLongField();
static native int setStaticFloatField();
static native int setStaticDoubleField();
static native int setStaticObjectField(Object obj);
static native int setIntField(Object obj);
static native int setBooleanField(Object obj);
static native int setByteField(Object obj);
static native int setCharField(Object obj);
static native int setShortField(Object obj);
static native int setLongField(Object obj);
static native int setFloatField(Object obj);
static native int setDoubleField(Object obj);
static native int setObjectField(Object obj, Object obj2);
/**
* constructor initializes instance fields
*/
FieldAccess() {
instanceInt = 456;
instanceByte = 34;
instanceChar = 't';
instanceShort = 45;
instanceBoolean = false;
instanceFloat = .456f;
instanceDouble = 1234.567d;
instanceLong = 135L;
instanceObject = this;
}
public static void main(String[] args) {
int returnValue;
FieldAccess tempObject;
System.loadLibrary("FieldAccess");
if (args.length != 0) {
if (args[0].equals("-quiet")) {
verbose = false;
setVerboseOff();
}
}
FieldAccess anObj = new FieldAccess();
/**
* initialize static fields
*/
staticInt = 123;
staticBoolean = true;
staticByte = 12;
staticChar = 'a';
staticShort = 67;
staticLong = 246L;
staticFloat = .123f;
staticDouble = 567.123d;
staticObject = new FieldAccess();
FieldAccess extraObject = new FieldAccess();
/**
* Test static GetStatic<type>Field
*/
returnValue = accessStaticIntField();
checkTest(returnValue, (staticInt == 123), "accessStaticIntField");
returnValue = accessStaticBooleanField();
checkTest(returnValue, (staticBoolean == true), "accessStaticBooleanField");
returnValue = accessStaticByteField();
checkTest(returnValue, (staticByte == 12), "accessStaticByteField");
returnValue = accessStaticCharField();
checkTest(returnValue, (staticChar == 'a'), "accessStaticCharField");
returnValue = accessStaticShortField();
checkTest(returnValue, (staticShort == 67), "accessStaticShortField");
returnValue = accessStaticLongField();
checkTest(returnValue, (staticLong == 246L), "accessStaticLongField");
returnValue = accessStaticFloatField();
checkTest(returnValue, (staticFloat == .123f), "accessStaticFloatField");
returnValue = accessStaticDoubleField();
checkTest(returnValue, (staticDouble == 567.123d), "accessStaticDoubleField");
tempObject = staticObject;
returnValue = accessStaticObjectField();
checkTest(returnValue, (staticObject.equals(tempObject)), "accessStaticObjectField");
/**
* Test instance Get<type>Field
*/
returnValue = accessIntField(anObj);
checkTest(returnValue, (anObj.instanceInt == 456), "accessIntField");
returnValue = accessBooleanField(anObj);
checkTest(returnValue, (anObj.instanceBoolean == false), "accessBooleanField");
returnValue = accessByteField(anObj);
checkTest(returnValue, (anObj.instanceByte == 34), "accessByteField");
returnValue = accessCharField(anObj);
checkTest(returnValue, (anObj.instanceChar == 't'), "accessCharField");
returnValue = accessShortField(anObj);
checkTest(returnValue, (anObj.instanceShort == 45), "accessShortField");
returnValue = accessLongField(anObj);
checkTest(returnValue, (anObj.instanceLong == 135L), "accessLongField");
returnValue = accessFloatField(anObj);
checkTest(returnValue, (anObj.instanceFloat == .456f), "accessFloatField");
returnValue = accessDoubleField(anObj);
checkTest(returnValue, (anObj.instanceDouble == 1234.567d), "accessDoubleField");
tempObject = anObj.instanceObject; // to check that the reference doesn't get corrupted
returnValue = accessObjectField(anObj);
checkTest(returnValue, (anObj.instanceObject.equals(tempObject)), "accessObjectField");
/**
* Test static SetStatic<type>Field
*/
returnValue = setStaticIntField();
checkTest(returnValue, (staticInt == 456), "setStaticIntField");
returnValue = setStaticBooleanField();
checkTest(returnValue, (staticBoolean == false), "setStaticBooleanField");
returnValue = setStaticByteField();
checkTest(returnValue, (staticByte == 24), "setStaticByteField");
returnValue = setStaticCharField();
checkTest(returnValue, (staticChar == 'b'), "setStaticCharField");
returnValue = setStaticShortField();
checkTest(returnValue, (staticShort == 76), "setStaticShortField");
returnValue = setStaticLongField();
checkTest(returnValue, (staticLong == 357L), "setStaticLongField");
returnValue = setStaticFloatField();
checkTest(returnValue, (staticFloat == .234f), "setStaticFloatField");
returnValue = setStaticDoubleField();
checkTest(returnValue, (staticDouble == 123.456d), "setStaticDoubleField");
returnValue = setStaticObjectField(extraObject);
checkTest(returnValue, (staticObject.equals(extraObject)), "setStaticObjectField");
/**
* Test instance Get<type>Field
*/
returnValue = setIntField(anObj);
checkTest(returnValue, (anObj.instanceInt == 789), "setIntField");
returnValue = setBooleanField(anObj);
checkTest(returnValue, (anObj.instanceBoolean == true), "setBooleanField");
returnValue = setByteField(anObj);
checkTest(returnValue, (anObj.instanceByte == 77), "setByteField");
returnValue = setCharField(anObj);
checkTest(returnValue, (anObj.instanceChar == 'q'), "setCharField");
returnValue = setShortField(anObj);
checkTest(returnValue, (anObj.instanceShort == 25), "setShortField");
returnValue = setLongField(anObj);
checkTest(returnValue, (anObj.instanceLong == 345L), "setLongField");
returnValue = setFloatField(anObj);
checkTest(returnValue, (anObj.instanceFloat == .789f), "setFloatField");
returnValue = setDoubleField(anObj);
checkTest(returnValue, (anObj.instanceDouble == 234.456d), "setDoubleField");
returnValue = setObjectField(anObj,extraObject);
checkTest(returnValue, (anObj.instanceObject.equals(extraObject)), "setObjectField");
// Summarize
if (allTestPass)
System.out.println("PASS: FieldAccess");
else
System.out.println("FAIL: FieldAccess");
}
static void printVerbose(String str) {
if (verbose)
System.out.println(str);
}
static void checkTest(int returnValue, boolean postCheck, String testName) {
if (returnValue == 0 && postCheck) {
printVerbose("PASS: " + testName);
} else {
allTestPass = false;
printVerbose("FAIL: " + testName);
}
}
}