use of com.oracle.truffle.espresso.runtime.Attribute in project graal by oracle.
the class Method method makeMirror.
public StaticObject makeMirror() {
Meta meta = getMeta();
Attribute rawRuntimeVisibleAnnotations = getAttribute(Name.RuntimeVisibleAnnotations);
StaticObject runtimeVisibleAnnotations = rawRuntimeVisibleAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleAnnotations.getData(), meta) : StaticObject.NULL;
Attribute rawRuntimeVisibleParameterAnnotations = getAttribute(Name.RuntimeVisibleParameterAnnotations);
StaticObject runtimeVisibleParameterAnnotations = rawRuntimeVisibleParameterAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleParameterAnnotations.getData(), meta) : StaticObject.NULL;
Attribute rawRuntimeVisibleTypeAnnotations = getAttribute(Name.RuntimeVisibleTypeAnnotations);
StaticObject runtimeVisibleTypeAnnotations = rawRuntimeVisibleTypeAnnotations != null ? StaticObject.wrap(rawRuntimeVisibleTypeAnnotations.getData(), meta) : StaticObject.NULL;
Attribute rawAnnotationDefault = getAttribute(Name.AnnotationDefault);
StaticObject annotationDefault = rawAnnotationDefault != null ? StaticObject.wrap(rawAnnotationDefault.getData(), meta) : StaticObject.NULL;
final Klass[] rawParameterKlasses = resolveParameterKlasses();
StaticObject parameterTypes = meta.java_lang_Class.allocateReferenceArray(getParameterCount(), new IntFunction<StaticObject>() {
@Override
public StaticObject apply(int j) {
return rawParameterKlasses[j].mirror();
}
});
final Klass[] rawCheckedExceptions = getCheckedExceptions();
StaticObject guestCheckedExceptions = meta.java_lang_Class.allocateReferenceArray(rawCheckedExceptions.length, new IntFunction<StaticObject>() {
@Override
public StaticObject apply(int j) {
return rawCheckedExceptions[j].mirror();
}
});
SignatureAttribute signatureAttribute = (SignatureAttribute) getAttribute(Name.Signature);
StaticObject guestGenericSignature = StaticObject.NULL;
if (signatureAttribute != null) {
String sig = getConstantPool().symbolAt(signatureAttribute.getSignatureIndex(), "signature").toString();
guestGenericSignature = meta.toGuestString(sig);
}
StaticObject instance = meta.java_lang_reflect_Method.allocateInstance();
meta.java_lang_reflect_Method_init.invokeDirect(/* this */
instance, /* declaringClass */
getDeclaringKlass().mirror(), /* name */
getContext().getStrings().intern(getName()), /* parameterTypes */
parameterTypes, /* returnType */
resolveReturnKlass().mirror(), /* checkedExceptions */
guestCheckedExceptions, /* modifiers */
getMethodModifiers(), /* slot */
getVTableIndex(), /* signature */
guestGenericSignature, /* annotations */
runtimeVisibleAnnotations, /* parameterAnnotations */
runtimeVisibleParameterAnnotations, /* annotationDefault */
annotationDefault);
meta.HIDDEN_METHOD_KEY.setHiddenObject(instance, this);
meta.HIDDEN_METHOD_RUNTIME_VISIBLE_TYPE_ANNOTATIONS.setHiddenObject(instance, runtimeVisibleTypeAnnotations);
return instance;
}
use of com.oracle.truffle.espresso.runtime.Attribute in project graal by oracle.
the class ClassfileParser method parseRecordComponentAttributes.
private Attribute[] parseRecordComponentAttributes() {
final int size = stream.readU2();
Attribute[] componentAttributes = new Attribute[size];
CommonAttributeParser commonAttributeParser = new CommonAttributeParser(InfoType.Record);
for (int j = 0; j < size; j++) {
final Symbol<Name> attributeName = pool.symbolAt(stream.readU2(), "attribute name");
final int attributeSize = stream.readS4();
Attribute attr = commonAttributeParser.parseCommonAttribute(attributeName, attributeSize);
componentAttributes[j] = attr == null ? new Attribute(attributeName, stream.readByteArray(attributeSize)) : attr;
}
return componentAttributes;
}
use of com.oracle.truffle.espresso.runtime.Attribute in project graal by oracle.
the class ClassfileParser method parseClassAttributes.
private Attribute[] parseClassAttributes() {
int attributeCount = stream.readU2();
if (attributeCount == 0) {
if (maxBootstrapMethodAttrIndex >= 0) {
throw ConstantPool.classFormatError("BootstrapMethods attribute is missing");
}
return Attribute.EMPTY_ARRAY;
}
SourceFileAttribute sourceFileName = null;
SourceDebugExtensionAttribute sourceDebugExtensionAttribute = null;
NestHostAttribute nestHost = null;
NestMembersAttribute nestMembers = null;
EnclosingMethodAttribute enclosingMethod = null;
BootstrapMethodsAttribute bootstrapMethods = null;
InnerClassesAttribute innerClasses = null;
PermittedSubclassesAttribute permittedSubclasses = null;
RecordAttribute record = null;
CommonAttributeParser commonAttributeParser = new CommonAttributeParser(InfoType.Class);
final Attribute[] classAttributes = spawnAttributesArray(attributeCount);
for (int i = 0; i < attributeCount; i++) {
final int attributeNameIndex = stream.readU2();
final Symbol<Name> attributeName = pool.symbolAt(attributeNameIndex, "attribute name");
final int attributeSize = stream.readS4();
final int startPosition = stream.getPosition();
if (attributeName.equals(Name.SourceFile)) {
if (sourceFileName != null) {
throw ConstantPool.classFormatError("Duplicate SourceFile attribute");
}
classAttributes[i] = sourceFileName = parseSourceFileAttribute(attributeName);
} else if (attributeName.equals(Name.SourceDebugExtension)) {
if (sourceDebugExtensionAttribute != null) {
throw ConstantPool.classFormatError("Duplicate SourceDebugExtension attribute");
}
classAttributes[i] = sourceDebugExtensionAttribute = parseSourceDebugExtensionAttribute(attributeName, attributeSize);
} else if (attributeName.equals(Name.Synthetic)) {
classFlags |= ACC_SYNTHETIC;
classAttributes[i] = new Attribute(attributeName, null);
} else if (attributeName.equals(Name.InnerClasses)) {
if (innerClasses != null) {
throw ConstantPool.classFormatError("Duplicate InnerClasses attribute");
}
classAttributes[i] = innerClasses = parseInnerClasses(attributeName);
} else if (majorVersion >= JAVA_1_5_VERSION) {
if (majorVersion >= JAVA_7_VERSION && attributeName.equals(Name.BootstrapMethods)) {
if (bootstrapMethods != null) {
throw ConstantPool.classFormatError("Duplicate BootstrapMethods attribute");
}
classAttributes[i] = bootstrapMethods = parseBootstrapMethods(attributeName);
} else if (attributeName.equals(Name.EnclosingMethod)) {
if (enclosingMethod != null) {
throw ConstantPool.classFormatError("Duplicate EnclosingMethod attribute");
}
classAttributes[i] = enclosingMethod = parseEnclosingMethodAttribute(attributeName);
} else if (majorVersion >= JAVA_11_VERSION && attributeName.equals(Name.NestHost)) {
if (nestHost != null) {
throw ConstantPool.classFormatError("Duplicate NestHost attribute");
}
if (nestMembers != null) {
throw ConstantPool.classFormatError("Classfile cannot have both a nest members and a nest host attribute.");
}
if (attributeSize != 2) {
throw ConstantPool.classFormatError("Attribute length of NestHost must be 2");
}
classAttributes[i] = nestHost = parseNestHostAttribute(attributeName);
} else if (majorVersion >= JAVA_11_VERSION && attributeName.equals(Name.NestMembers)) {
if (nestMembers != null) {
throw ConstantPool.classFormatError("Duplicate NestMembers attribute");
}
if (nestHost != null) {
throw ConstantPool.classFormatError("Classfile cannot have both a nest members and a nest host attribute.");
}
classAttributes[i] = nestMembers = parseNestMembers(attributeName);
} else if (majorVersion >= JAVA_14_VERSION && attributeName.equals(Name.Record)) {
if (record != null) {
throw ConstantPool.classFormatError("Duplicate Record attribute");
}
classAttributes[i] = record = parseRecord(attributeName);
} else if (majorVersion >= JAVA_17_VERSION && attributeName.equals(Name.PermittedSubclasses)) {
if (permittedSubclasses != null) {
throw ConstantPool.classFormatError("Duplicate PermittedSubclasses attribute");
}
classAttributes[i] = permittedSubclasses = parsePermittedSubclasses(attributeName);
} else {
Attribute attr = commonAttributeParser.parseCommonAttribute(attributeName, attributeSize);
// stream.skip(attributeSize);
classAttributes[i] = attr == null ? new Attribute(attributeName, stream.readByteArray(attributeSize)) : attr;
}
} else {
// stream.skip(attributeSize);
classAttributes[i] = new Attribute(attributeName, stream.readByteArray(attributeSize));
}
if (attributeSize != stream.getPosition() - startPosition) {
throw ConstantPool.classFormatError("Invalid attribute length for " + attributeName + " attribute");
}
}
if (maxBootstrapMethodAttrIndex >= 0 && bootstrapMethods == null) {
throw ConstantPool.classFormatError("BootstrapMethods attribute is missing");
}
return classAttributes;
}
use of com.oracle.truffle.espresso.runtime.Attribute in project graal by oracle.
the class ClassfileParser method validateLocalTables.
private void validateLocalTables(Attribute[] codeAttributes) {
if (getMajorVersion() < JAVA_1_5_VERSION) {
return;
}
EconomicMap<Local, Boolean> table = EconomicMap.create(Local.localEquivalence);
ArrayList<LocalVariableTable> typeTables = new ArrayList<>();
for (Attribute attr : codeAttributes) {
if (attr.getName() == Name.LocalVariableTable) {
LocalVariableTable localTable = (LocalVariableTable) attr;
for (Local local : localTable.getLocals()) {
if (table.put(local, false) != null) {
throw ConstantPool.classFormatError("Duplicate local in local variable table: " + local);
}
}
} else if (attr.getName() == Name.LocalVariableTypeTable) {
typeTables.add((LocalVariableTable) attr);
}
}
for (LocalVariableTable typeTable : typeTables) {
for (Local local : typeTable.getLocals()) {
Boolean present = table.put(local, true);
if (present == null) {
throw ConstantPool.classFormatError("Local in local variable type table does not match any local variable table entry: " + local);
}
if (present) {
throw ConstantPool.classFormatError("Duplicate local in local variable type table: " + local);
}
}
}
}
use of com.oracle.truffle.espresso.runtime.Attribute in project graal by oracle.
the class ClassRedefinition method attrChanged.
private static boolean attrChanged(ParserMethod oldMethod, ParserMethod newMethod, Symbol<Symbol.Name> name) {
Attribute oldAttribute = oldMethod.getAttribute(name);
Attribute newAttribute = newMethod.getAttribute(name);
if ((oldAttribute == null || newAttribute == null)) {
if (oldAttribute != null || newAttribute != null) {
return true;
}
// else both null, so no change. Move on!
} else if (!oldAttribute.sameAs(newAttribute)) {
return true;
}
return false;
}
Aggregations