Mercurial > hg > truffle
comparison src/share/vm/prims/methodHandles.cpp @ 3935:5257f8e66b40
Merge
author | iveresov |
---|---|
date | Fri, 09 Sep 2011 12:44:37 -0700 |
parents | b0efc7ee3b31 |
children | e6b1331a51d2 |
comparison
equal
deleted
inserted
replaced
3922:e984655be425 | 3935:5257f8e66b40 |
---|---|
3079 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks | 3079 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks |
3080 return res; | 3080 return res; |
3081 } | 3081 } |
3082 JVM_END | 3082 JVM_END |
3083 | 3083 |
3084 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { | |
3085 oop call_site = JNIHandles::resolve_non_null(call_site_jh); | |
3086 oop target = JNIHandles::resolve(target_jh); | |
3087 { | |
3088 // Walk all nmethods depending on this call site. | |
3089 MutexLocker mu(Compile_lock, thread); | |
3090 Universe::flush_dependents_on(call_site, target); | |
3091 } | |
3092 java_lang_invoke_CallSite::set_target(call_site, target); | |
3093 } | |
3094 JVM_END | |
3095 | |
3096 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { | |
3097 oop call_site = JNIHandles::resolve_non_null(call_site_jh); | |
3098 oop target = JNIHandles::resolve(target_jh); | |
3099 { | |
3100 // Walk all nmethods depending on this call site. | |
3101 MutexLocker mu(Compile_lock, thread); | |
3102 Universe::flush_dependents_on(call_site, target); | |
3103 } | |
3104 java_lang_invoke_CallSite::set_target_volatile(call_site, target); | |
3105 } | |
3106 JVM_END | |
3107 | |
3084 methodOop MethodHandles::resolve_raise_exception_method(TRAPS) { | 3108 methodOop MethodHandles::resolve_raise_exception_method(TRAPS) { |
3085 if (_raise_exception_method != NULL) { | 3109 if (_raise_exception_method != NULL) { |
3086 // no need to do it twice | 3110 // no need to do it twice |
3087 return raise_exception_method(); | 3111 return raise_exception_method(); |
3088 } | 3112 } |
3135 JVM_END | 3159 JVM_END |
3136 | 3160 |
3137 | 3161 |
3138 /// JVM_RegisterMethodHandleMethods | 3162 /// JVM_RegisterMethodHandleMethods |
3139 | 3163 |
3164 #undef CS // Solaris builds complain | |
3165 | |
3140 #define LANG "Ljava/lang/" | 3166 #define LANG "Ljava/lang/" |
3141 #define JLINV "Ljava/lang/invoke/" | 3167 #define JLINV "Ljava/lang/invoke/" |
3142 | 3168 |
3143 #define OBJ LANG"Object;" | 3169 #define OBJ LANG"Object;" |
3144 #define CLS LANG"Class;" | 3170 #define CLS LANG"Class;" |
3145 #define STRG LANG"String;" | 3171 #define STRG LANG"String;" |
3172 #define CS JLINV"CallSite;" | |
3146 #define MT JLINV"MethodType;" | 3173 #define MT JLINV"MethodType;" |
3147 #define MH JLINV"MethodHandle;" | 3174 #define MH JLINV"MethodHandle;" |
3148 #define MEM JLINV"MemberName;" | 3175 #define MEM JLINV"MemberName;" |
3149 #define AMH JLINV"AdapterMethodHandle;" | 3176 #define AMH JLINV"AdapterMethodHandle;" |
3150 #define BMH JLINV"BoundMethodHandle;" | 3177 #define BMH JLINV"BoundMethodHandle;" |
3151 #define DMH JLINV"DirectMethodHandle;" | 3178 #define DMH JLINV"DirectMethodHandle;" |
3152 | 3179 |
3153 #define CC (char*) /*cast a literal from (const char*)*/ | 3180 #define CC (char*) /*cast a literal from (const char*)*/ |
3154 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f) | 3181 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f) |
3155 | 3182 |
3156 // These are the native methods on sun.invoke.MethodHandleNatives. | 3183 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
3157 static JNINativeMethod methods[] = { | 3184 static JNINativeMethod methods[] = { |
3158 // void init(MemberName self, AccessibleObject ref) | 3185 // void init(MemberName self, AccessibleObject ref) |
3159 {CC"init", CC"("AMH""MH"I)V", FN_PTR(MHN_init_AMH)}, | 3186 {CC"init", CC"("AMH""MH"I)V", FN_PTR(MHN_init_AMH)}, |
3160 {CC"init", CC"("BMH""OBJ"I)V", FN_PTR(MHN_init_BMH)}, | 3187 {CC"init", CC"("BMH""OBJ"I)V", FN_PTR(MHN_init_BMH)}, |
3161 {CC"init", CC"("DMH""OBJ"Z"CLS")V", FN_PTR(MHN_init_DMH)}, | 3188 {CC"init", CC"("DMH""OBJ"Z"CLS")V", FN_PTR(MHN_init_DMH)}, |
3162 {CC"init", CC"("MT")V", FN_PTR(MHN_init_MT)}, | 3189 {CC"init", CC"("MT")V", FN_PTR(MHN_init_MT)}, |
3163 {CC"init", CC"("MEM""OBJ")V", FN_PTR(MHN_init_Mem)}, | 3190 {CC"init", CC"("MEM""OBJ")V", FN_PTR(MHN_init_Mem)}, |
3164 {CC"expand", CC"("MEM")V", FN_PTR(MHN_expand_Mem)}, | 3191 {CC"expand", CC"("MEM")V", FN_PTR(MHN_expand_Mem)}, |
3165 {CC"resolve", CC"("MEM""CLS")V", FN_PTR(MHN_resolve_Mem)}, | 3192 {CC"resolve", CC"("MEM""CLS")V", FN_PTR(MHN_resolve_Mem)}, |
3166 {CC"getTarget", CC"("MH"I)"OBJ, FN_PTR(MHN_getTarget)}, | 3193 {CC"getTarget", CC"("MH"I)"OBJ, FN_PTR(MHN_getTarget)}, |
3167 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)}, | 3194 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)}, |
3168 // static native int getNamedCon(int which, Object[] name) | 3195 // static native int getNamedCon(int which, Object[] name) |
3169 {CC"getNamedCon", CC"(I["OBJ")I", FN_PTR(MHN_getNamedCon)}, | 3196 {CC"getNamedCon", CC"(I["OBJ")I", FN_PTR(MHN_getNamedCon)}, |
3170 // static native int getMembers(Class<?> defc, String matchName, String matchSig, | 3197 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
3171 // int matchFlags, Class<?> caller, int skip, MemberName[] results); | 3198 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
3172 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)} | 3199 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)} |
3200 }; | |
3201 | |
3202 static JNINativeMethod call_site_methods[] = { | |
3203 {CC"setCallSiteTargetNormal", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetNormal)}, | |
3204 {CC"setCallSiteTargetVolatile", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetVolatile)} | |
3173 }; | 3205 }; |
3174 | 3206 |
3175 static JNINativeMethod invoke_methods[] = { | 3207 static JNINativeMethod invoke_methods[] = { |
3176 // void init(MemberName self, AccessibleObject ref) | 3208 // void init(MemberName self, AccessibleObject ref) |
3177 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)}, | 3209 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)}, |
3178 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)} | 3210 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)} |
3179 }; | 3211 }; |
3180 | 3212 |
3181 // This one function is exported, used by NativeLookup. | 3213 // This one function is exported, used by NativeLookup. |
3182 | 3214 |
3183 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { | 3215 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
3186 if (!EnableInvokeDynamic) { | 3218 if (!EnableInvokeDynamic) { |
3187 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); | 3219 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |
3188 return; // bind nothing | 3220 return; // bind nothing |
3189 } | 3221 } |
3190 | 3222 |
3223 assert(!MethodHandles::enabled(), "must not be enabled"); | |
3191 bool enable_MH = true; | 3224 bool enable_MH = true; |
3192 | 3225 |
3193 { | 3226 { |
3194 ThreadToNativeFromVM ttnfv(thread); | 3227 ThreadToNativeFromVM ttnfv(thread); |
3195 | |
3196 int status = env->RegisterNatives(MHN_class, methods, sizeof(methods)/sizeof(JNINativeMethod)); | 3228 int status = env->RegisterNatives(MHN_class, methods, sizeof(methods)/sizeof(JNINativeMethod)); |
3197 if (!env->ExceptionOccurred()) { | 3229 if (!env->ExceptionOccurred()) { |
3198 const char* L_MH_name = (JLINV "MethodHandle"); | 3230 const char* L_MH_name = (JLINV "MethodHandle"); |
3199 const char* MH_name = L_MH_name+1; | 3231 const char* MH_name = L_MH_name+1; |
3200 jclass MH_class = env->FindClass(MH_name); | 3232 jclass MH_class = env->FindClass(MH_name); |
3201 status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod)); | 3233 status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod)); |
3202 } | 3234 } |
3203 if (env->ExceptionOccurred()) { | 3235 if (env->ExceptionOccurred()) { |
3204 MethodHandles::set_enabled(false); | |
3205 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); | 3236 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
3206 enable_MH = false; | 3237 enable_MH = false; |
3238 env->ExceptionClear(); | |
3239 } | |
3240 | |
3241 status = env->RegisterNatives(MHN_class, call_site_methods, sizeof(call_site_methods)/sizeof(JNINativeMethod)); | |
3242 if (env->ExceptionOccurred()) { | |
3243 // Exception is okay until 7087357 | |
3207 env->ExceptionClear(); | 3244 env->ExceptionClear(); |
3208 } | 3245 } |
3209 } | 3246 } |
3210 | 3247 |
3211 if (enable_MH) { | 3248 if (enable_MH) { |