/*
* 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.
*/
package java.lang;
import java.security.ProtectionDomain;
import java.lang.instrument.Instrumentation;
import org.jikesrvm.classloader.RVMType;
import org.vmmagic.pragma.*;
import org.jikesrvm.VM; // for VerifyAssertions and _assert()
import org.jikesrvm.scheduler.RVMThread;
/**
* Library support interface of Jikes RVM
*/
public class JikesRVMSupport {
/**
* Call the Object finalize method on the given object
*/
public static void invokeFinalize(Object o) throws Throwable {
o.finalize();
}
public static void initializeInstrumentation(Instrumentation instrumenter) {
VMClassLoader.setInstrumenter(instrumenter);
}
public static Class<?>[] getAllLoadedClasses() {
return VMClassLoader.getAllLoadedClasses();
}
public static Class<?>[] getInitiatedClasses(ClassLoader classLoader) {
return VMClassLoader.getInitiatedClasses(classLoader);
}
public static Class<?> createClass(RVMType type) {
return Class.create(type);
}
public static Class<?> createClass(RVMType type, ProtectionDomain pd) {
Class<?> c = Class.create(type);
setClassProtectionDomain(c, pd);
return c;
}
public static RVMType getTypeForClass(Class<?> c) {
return c.type;
}
public static void setClassProtectionDomain(Class<?> c, ProtectionDomain pd) {
c.pd = pd;
}
/***
* String stuff
* */
@Uninterruptible
public static char[] getBackingCharArray(String str) {
return str.value;
}
@Uninterruptible
public static int getStringLength(String str) {
return str.count;
}
@Uninterruptible
public static int getStringOffset(String str) {
return str.offset;
}
public static String newStringWithoutCopy(char[] data, int offset, int count) {
return new String(data, offset, count, true);
}
/***
* Thread stuff
* */
public static Thread createThread(RVMThread vmdata, String myName) {
if (VM.VerifyAssertions) VM._assert(VM.runningVM);
Thread bootThread = new Thread(new VMThread(vmdata), myName,
vmdata.getPriority(), vmdata.isDaemonThread());
bootThread.group = ThreadGroup.root;
return bootThread;
}
public static RVMThread getThread(Thread thread) {
if (thread == null) {
return null;
} else if (thread.vmThread == null) {
return null;
} else {
return thread.vmThread.vmdata;
}
}
public static void threadDied(Thread thread) {
thread.die();
}
public static Throwable getStillBorn(Thread thread) {
return thread.stillborn;
}
public static void setStillBorn(Thread thread, Throwable stillborn) {
thread.stillborn = stillborn;
}
/***
* Enum stuff
*/
@Uninterruptible
public static int getEnumOrdinal(Enum<?> e) {
return e.ordinal;
}
@Uninterruptible
public static String getEnumName(Enum<?> e) {
return e.name;
}
}