use of com.oracle.truffle.espresso.impl.Method in project graal by oracle.
the class InterpreterToVM method fillInStackTrace.
/**
* Preemptively added method to benefit from truffle lazy stack traces when they will be
* reworked.
*/
@SuppressWarnings("unused")
public static StaticObject fillInStackTrace(@JavaType(Throwable.class) StaticObject throwable, Meta meta) {
// Inlined calls to help StackOverflows.
VM.StackTrace frames = (VM.StackTrace) meta.HIDDEN_FRAMES.getHiddenObject(throwable);
if (frames != null) {
return throwable;
}
EspressoException e = EspressoException.wrap(throwable, meta);
List<TruffleStackTraceElement> trace = TruffleStackTrace.getStackTrace(e);
if (trace == null) {
meta.HIDDEN_FRAMES.setHiddenObject(throwable, VM.StackTrace.EMPTY_STACK_TRACE);
meta.java_lang_Throwable_backtrace.setObject(throwable, throwable);
return throwable;
}
int bci = -1;
Method m = null;
frames = new VM.StackTrace();
FrameCounter c = new FrameCounter();
for (TruffleStackTraceElement element : trace) {
Node location = element.getLocation();
while (location != null) {
if (location instanceof QuickNode) {
bci = ((QuickNode) location).getBci(element.getFrame());
break;
}
location = location.getParent();
}
RootCallTarget target = element.getTarget();
if (target != null) {
RootNode rootNode = target.getRootNode();
if (rootNode instanceof EspressoRootNode) {
m = ((EspressoRootNode) rootNode).getMethod();
if (c.checkFillIn(m) || c.checkThrowableInit(m)) {
bci = UNKNOWN_BCI;
continue;
}
if (m.isNative()) {
bci = NATIVE_BCI;
}
frames.add(new VM.StackElement(m, bci));
bci = UNKNOWN_BCI;
}
}
}
meta.HIDDEN_FRAMES.setHiddenObject(throwable, frames);
meta.java_lang_Throwable_backtrace.setObject(throwable, throwable);
return throwable;
}
use of com.oracle.truffle.espresso.impl.Method in project graal by oracle.
the class VM method JVM_ClassDepth.
@VmImpl(isJni = true)
@TruffleBoundary
public int JVM_ClassDepth(@JavaType(String.class) StaticObject name) {
Symbol<Name> className = getContext().getNames().lookup(getMeta().toHostString(name).replace('.', '/'));
if (className == null) {
return -1;
}
Integer res = Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Integer>() {
int depth = 0;
@Override
public Integer visitFrame(FrameInstance frameInstance) {
Method m = getMethodFromFrame(frameInstance);
if (m != null) {
if (className.equals(m.getDeclaringKlass().getName())) {
return depth;
}
depth++;
}
return null;
}
});
return res == null ? -1 : res;
}
use of com.oracle.truffle.espresso.impl.Method in project graal by oracle.
the class VM method JVM_GetClassDeclaredConstructors.
// TODO(tg): inject constructor calltarget.
@VmImpl(isJni = true)
@JavaType(Constructor[].class)
public StaticObject JVM_GetClassDeclaredConstructors(@JavaType(Class.class) StaticObject self, boolean publicOnly) {
Meta meta = getMeta();
ArrayList<Method> collectedMethods = new ArrayList<>();
Klass klass = self.getMirrorKlass();
klass.ensureLinked();
for (Method m : klass.getDeclaredConstructors()) {
if (Name._init_.equals(m.getName()) && (!publicOnly || m.isPublic())) {
collectedMethods.add(m);
}
}
final Method[] constructors = collectedMethods.toArray(Method.EMPTY_ARRAY);
EspressoContext context = meta.getContext();
// TODO(peterssen): Cache guest j.l.reflect.Constructor constructor.
// Calling the constructor is just for validation, manually setting the fields would be
// faster.
Method constructorInit = meta.java_lang_reflect_Constructor.lookupDeclaredMethod(Name._init_, context.getSignatures().makeRaw(Type._void, /* declaringClass */
Type.java_lang_Class, /* parameterTypes */
Type.java_lang_Class_array, /* checkedExceptions */
Type.java_lang_Class_array, /* modifiers */
Type._int, /* slot */
Type._int, /* signature */
Type.java_lang_String, /* annotations */
Type._byte_array, /* parameterAnnotations */
Type._byte_array));
StaticObject arr = meta.java_lang_reflect_Constructor.allocateReferenceArray(constructors.length, new IntFunction<StaticObject>() {
@Override
public StaticObject apply(int i) {
final Method m = constructors[i];
Attribute rawRuntimeVisibleAnnotations = m.getAttribute(Name.RuntimeVisibleAnnotations);
StaticObject runtimeVisibleAnnotations = rawRuntimeVisibleAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleAnnotations.getData(), meta) : StaticObject.NULL;
Attribute rawRuntimeVisibleParameterAnnotations = m.getAttribute(Name.RuntimeVisibleParameterAnnotations);
StaticObject runtimeVisibleParameterAnnotations = rawRuntimeVisibleParameterAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleParameterAnnotations.getData(), meta) : StaticObject.NULL;
Attribute rawRuntimeVisibleTypeAnnotations = m.getAttribute(Name.RuntimeVisibleTypeAnnotations);
StaticObject runtimeVisibleTypeAnnotations = rawRuntimeVisibleTypeAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleTypeAnnotations.getData(), meta) : StaticObject.NULL;
final Klass[] rawParameterKlasses = m.resolveParameterKlasses();
StaticObject parameterTypes = meta.java_lang_Class.allocateReferenceArray(m.getParameterCount(), new IntFunction<StaticObject>() {
@Override
public StaticObject apply(int j) {
return rawParameterKlasses[j].mirror();
}
});
final Klass[] rawCheckedExceptions = m.getCheckedExceptions();
StaticObject checkedExceptions = meta.java_lang_Class.allocateReferenceArray(rawCheckedExceptions.length, new IntFunction<StaticObject>() {
@Override
public StaticObject apply(int j) {
return rawCheckedExceptions[j].mirror();
}
});
SignatureAttribute signatureAttribute = (SignatureAttribute) m.getAttribute(Name.Signature);
StaticObject genericSignature = StaticObject.NULL;
if (signatureAttribute != null) {
String sig = m.getConstantPool().symbolAt(signatureAttribute.getSignatureIndex(), "signature").toString();
genericSignature = meta.toGuestString(sig);
}
StaticObject instance = meta.java_lang_reflect_Constructor.allocateInstance();
constructorInit.invokeDirect(/* this */
instance, /* declaringKlass */
m.getDeclaringKlass().mirror(), /* parameterTypes */
parameterTypes, /* checkedExceptions */
checkedExceptions, /* modifiers */
m.getMethodModifiers(), // TODO(peterssen): Fill method slot.
i, /* signature */
genericSignature, /* annotations */
runtimeVisibleAnnotations, /* parameterAnnotations */
runtimeVisibleParameterAnnotations);
meta.HIDDEN_CONSTRUCTOR_KEY.setHiddenObject(instance, m);
meta.HIDDEN_CONSTRUCTOR_RUNTIME_VISIBLE_TYPE_ANNOTATIONS.setHiddenObject(instance, runtimeVisibleTypeAnnotations);
return instance;
}
});
return arr;
}
use of com.oracle.truffle.espresso.impl.Method in project graal by oracle.
the class VM method getACCAfter12.
private StaticObject getACCAfter12() {
ArrayList<StaticObject> domains = new ArrayList<>();
final boolean[] isPrivileged = new boolean[] { false };
StaticObject context = Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<StaticObject>() {
StaticObject prevDomain = StaticObject.NULL;
@Override
public StaticObject visitFrame(FrameInstance frameInstance) {
Method m = getMethodFromFrame(frameInstance);
if (m != null) {
StaticObject domain = null;
StaticObject stackContext = null;
StaticObject domainKlass = null;
if (m.getDeclaringKlass() == getMeta().java_security_AccessController && m.getName() == Name.executePrivileged) {
isPrivileged[0] = true;
Frame frame = frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY);
// 2nd argument: `AccessControlContext context`
stackContext = BytecodeNode.getLocalObject(frame, 1);
// 3rd argument: Class<?> caller
domainKlass = BytecodeNode.getLocalObject(frame, 2);
} else {
domainKlass = m.getDeclaringKlass().mirror();
}
domain = JVM_GetProtectionDomain(domainKlass);
if (domain != prevDomain && domain != StaticObject.NULL) {
domains.add(domain);
prevDomain = domain;
}
if (isPrivileged[0]) {
return stackContext;
}
}
return null;
}
});
return getAccFromContext(domains, isPrivileged[0], context);
}
use of com.oracle.truffle.espresso.impl.Method in project graal by oracle.
the class VM method JVM_CurrentLoadedClass.
@VmImpl(isJni = true)
@JavaType(Class.class)
public StaticObject JVM_CurrentLoadedClass() {
PrivilegedStack stack = getPrivilegedStack();
StaticObject mirrorKlass = Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<StaticObject>() {
@Override
public StaticObject visitFrame(FrameInstance frameInstance) {
Method m = getMethodFromFrame(frameInstance);
if (m != null) {
if (isTrustedFrame(frameInstance, stack)) {
return StaticObject.NULL;
}
if (!m.isNative()) {
ObjectKlass klass = m.getDeclaringKlass();
StaticObject loader = klass.getDefiningClassLoader();
if (StaticObject.notNull(loader) && !isTrustedLoader(loader)) {
return klass.mirror();
}
}
}
return null;
}
});
return mirrorKlass == null ? StaticObject.NULL : mirrorKlass;
}
Aggregations