/*
* 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.
*/
import org.jikesrvm.runtime.Magic;
import org.jikesrvm.util.Services;
import org.vmmagic.unboxed.Address;
/**
* Test GC with Native frames on stack
*/
class TestGC {
static boolean verbose = true; // set to true to get messages for each test
static boolean allTestPass = true;
public static native void setVerboseOff();
/**
* Declare native methods that will call cause GC to occur
*/
static native Object testgc(Object obj1, Object obj2);
public static void main(String[] args) {
boolean runningUnderJDK = true;
String str1 = new String("string 1");
String str2 = new String("string 2");
System.loadLibrary("TestGC");
if (args.length != 0) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-quiet")) {
verbose = false;
setVerboseOff();
}
if (args[i].equals("-jdk")) {
runningUnderJDK = true;
}
}
}
Object returnobj;
if (!runningUnderJDK) {
Address oldAddress1 = Magic.objectAsAddress(str1);
Address oldAddress2 = Magic.objectAsAddress(str2);
printVerbose(" str1 address = " + Services.addressAsHexString(oldAddress1));
printVerbose(" str2 address = " + Services.addressAsHexString(oldAddress2));
returnobj = testgc(str1, str2);
printVerbose("TestGC After native call:");
Address newAddress1 = Magic.objectAsAddress(str1);
Address newAddress2 = Magic.objectAsAddress(str2);
if (oldAddress1 != newAddress1 && oldAddress2 != newAddress2) {
printVerbose("Objects have been moved by GC:");
} else {
printVerbose("Objects have NOT been moved by GC:");
}
printVerbose(" str1 address = " + Services.addressAsHexString(newAddress1));
printVerbose(" str2 address = " + Services.addressAsHexString(newAddress2));
printVerbose(" returnobj address = " + Services.addressAsHexString(Magic.objectAsAddress(returnobj)));
} else {
returnobj = testgc(str1, str2);
printVerbose("TestGC After native call:");
}
// if (copyingGC)
// checkTest( 0, (str1==returnobj), "GC with copying during native code" );
// else
// checkTest( 0, (str1==returnobj), "GC without copying during native code" );
checkTest(0, (str1 == returnobj), "GC during native code");
}
static void printVerbose(String str) {
if (verbose)
System.out.println(str);
}
static void checkTest(int returnValue, boolean postCheck, String testName) {
if (returnValue == 0 && postCheck) {
System.out.println("PASS: " + testName);
} else {
allTestPass = false;
System.out.println("FAIL: " + testName);
}
}
}