# HG changeset patch # User Christian Wimmer # Date 1349926353 25200 # Node ID 15e04f248d6b6ea3ea5b7d52d4966cdc90bb3fa3 # Parent 4dc9e468c8b077ba9351c7d5b5826fb3f7e025e7 Add functionality to initialize a type diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Wed Oct 10 20:32:33 2012 -0700 @@ -117,6 +117,11 @@ boolean isInitialized(); /** + * Initializes this type. + */ + void initialize(); + + /** * Checks whether this type is a subtype of another type. * * @param other the type to test diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Wed Oct 10 20:32:33 2012 -0700 @@ -80,6 +80,8 @@ boolean JavaType_isInitialized(HotSpotResolvedJavaType klass); + void JavaType_initialize(HotSpotResolvedJavaType klass); + JavaType getType(Class javaClass); JavaType JavaType_uniqueConcreteSubtype(HotSpotResolvedJavaType klass); diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Wed Oct 10 20:32:33 2012 -0700 @@ -112,6 +112,9 @@ public native boolean JavaType_isInitialized(HotSpotResolvedJavaType klass); @Override + public native void JavaType_initialize(HotSpotResolvedJavaType klass); + + @Override public native HotSpotMethodData JavaMethod_methodData(HotSpotResolvedJavaMethod method); @Override diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Wed Oct 10 20:32:33 2012 -0700 @@ -157,6 +157,14 @@ } @Override + public void initialize() { + if (!HotSpotGraalRuntime.getInstance().getCompilerToVM().JavaType_isInitialized(this)) { + HotSpotGraalRuntime.getInstance().getCompilerToVM().JavaType_initialize(this); + } + isInitialized = true; + } + + @Override public boolean isInstance(Constant obj) { return javaMirror.isInstance(obj); } diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Wed Oct 10 20:32:33 2012 -0700 @@ -169,4 +169,8 @@ public HotSpotKlassOop klassOop() { return klassOop; } + + @Override + public void initialize() { + } } diff -r 4dc9e468c8b0 -r 15e04f248d6b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypeUnresolved.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypeUnresolved.java Wed Oct 10 20:29:53 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypeUnresolved.java Wed Oct 10 20:32:33 2012 -0700 @@ -110,8 +110,7 @@ @Override public ResolvedJavaType resolve(ResolvedJavaType accessingClass) { - JavaType type = HotSpotGraalRuntime.getInstance().lookupType(name, (HotSpotResolvedJavaType) accessingClass, true); - return (ResolvedJavaType) type; + return (ResolvedJavaType) HotSpotGraalRuntime.getInstance().lookupType(name, (HotSpotResolvedJavaType) accessingClass, true); } @Override diff -r 4dc9e468c8b0 -r 15e04f248d6b src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Oct 10 20:29:53 2012 -0700 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Wed Oct 10 20:32:33 2012 -0700 @@ -562,6 +562,13 @@ return instanceKlass::cast(klass)->is_initialized(); C2V_END +// public bool JavaType_isInitialized(HotSpotResolvedType klass); +C2V_VMENTRY(void, JavaType_initialize, (JNIEnv *, jobject, jobject hotspot_klass)) + klassOop klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(hotspot_klass)); + assert(klass != NULL, "method must not be called for primitive types"); + instanceKlass::cast(klass)->initialize(JavaThread::current()); +C2V_END + C2V_VMENTRY(jobject, JavaType_arrayOf, (JNIEnv *, jobject, jobject klass)) KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass))); KlassHandle arr = klass_handle->array_klass(THREAD); @@ -989,6 +996,7 @@ {CC"JavaType_arrayOf", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_arrayOf)}, {CC"JavaType_fields", CC"("RESOLVED_TYPE")["RESOLVED_FIELD, FN_PTR(JavaType_fields)}, {CC"JavaType_isInitialized", CC"("RESOLVED_TYPE")Z", FN_PTR(JavaType_isInitialized)}, + {CC"JavaType_initialize", CC"("RESOLVED_TYPE")V", FN_PTR(JavaType_initialize)}, {CC"getPrimitiveArrayType", CC"("KIND")"TYPE, FN_PTR(getPrimitiveArrayType)}, {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)},