1885 WK_KLASSES_DO(WK_KLASS_INIT_INFO) |
1885 WK_KLASSES_DO(WK_KLASS_INIT_INFO) |
1886 #undef WK_KLASS_INIT_INFO |
1886 #undef WK_KLASS_INIT_INFO |
1887 0 |
1887 0 |
1888 }; |
1888 }; |
1889 |
1889 |
1890 Symbol* SystemDictionary::find_backup_symbol(Symbol* symbol, |
|
1891 const char* from_prefix, |
|
1892 const char* to_prefix) { |
|
1893 assert(AllowTransitionalJSR292, ""); // delete this subroutine |
|
1894 Symbol* backup_symbol = NULL; |
|
1895 size_t from_len = strlen(from_prefix); |
|
1896 if (strncmp((const char*) symbol->base(), from_prefix, from_len) != 0) |
|
1897 return NULL; |
|
1898 char buf[100]; |
|
1899 size_t to_len = strlen(to_prefix); |
|
1900 size_t tail_len = symbol->utf8_length() - from_len; |
|
1901 size_t new_len = to_len + tail_len; |
|
1902 guarantee(new_len < sizeof(buf), "buf too small"); |
|
1903 memcpy(buf, to_prefix, to_len); |
|
1904 memcpy(buf + to_len, symbol->base() + from_len, tail_len); |
|
1905 buf[new_len] = '\0'; |
|
1906 vmSymbols::SID backup_sid = vmSymbols::find_sid(buf); |
|
1907 if (backup_sid != vmSymbols::NO_SID) { |
|
1908 backup_symbol = vmSymbols::symbol_at(backup_sid); |
|
1909 } |
|
1910 return backup_symbol; |
|
1911 } |
|
1912 |
|
1913 Symbol* SystemDictionary::find_backup_class_name(Symbol* symbol) { |
|
1914 assert(AllowTransitionalJSR292, ""); // delete this subroutine |
|
1915 if (symbol == NULL) return NULL; |
|
1916 Symbol* backup_symbol = find_backup_symbol(symbol, "java/lang/invoke/", "java/dyn/"); // AllowTransitionalJSR292 ONLY |
|
1917 if (backup_symbol == NULL) |
|
1918 backup_symbol = find_backup_symbol(symbol, "java/dyn/", "sun/dyn/"); // AllowTransitionalJSR292 ONLY |
|
1919 return backup_symbol; |
|
1920 } |
|
1921 |
|
1922 Symbol* SystemDictionary::find_backup_signature(Symbol* symbol) { |
|
1923 assert(AllowTransitionalJSR292, ""); // delete this subroutine |
|
1924 if (symbol == NULL) return NULL; |
|
1925 return find_backup_symbol(symbol, "Ljava/lang/invoke/", "Ljava/dyn/"); |
|
1926 } |
|
1927 |
|
1928 bool SystemDictionary::initialize_wk_klass(WKID id, int init_opt, TRAPS) { |
1890 bool SystemDictionary::initialize_wk_klass(WKID id, int init_opt, TRAPS) { |
1929 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
1891 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
1930 int info = wk_init_info[id - FIRST_WKID]; |
1892 int info = wk_init_info[id - FIRST_WKID]; |
1931 int sid = (info >> CEIL_LG_OPTION_LIMIT); |
1893 int sid = (info >> CEIL_LG_OPTION_LIMIT); |
1932 Symbol* symbol = vmSymbols::symbol_at((vmSymbols::SID)sid); |
1894 Symbol* symbol = vmSymbols::symbol_at((vmSymbols::SID)sid); |
1933 klassOop* klassp = &_well_known_klasses[id]; |
1895 klassOop* klassp = &_well_known_klasses[id]; |
1934 bool pre_load = (init_opt < SystemDictionary::Opt); |
1896 bool must_load = (init_opt < SystemDictionary::Opt); |
1935 bool try_load = true; |
1897 bool try_load = true; |
1936 if (init_opt == SystemDictionary::Opt_Kernel) { |
1898 if (init_opt == SystemDictionary::Opt_Kernel) { |
1937 #ifndef KERNEL |
1899 #ifndef KERNEL |
1938 try_load = false; |
1900 try_load = false; |
1939 #endif //KERNEL |
1901 #endif //KERNEL |
1940 } |
1902 } |
1941 Symbol* backup_symbol = NULL; // symbol to try if the current symbol fails |
1903 if ((*klassp) == NULL && try_load) { |
1942 if (init_opt == SystemDictionary::Pre_JSR292) { |
|
1943 if (!EnableInvokeDynamic) try_load = false; // do not bother to load such classes |
|
1944 if (AllowTransitionalJSR292) { |
|
1945 backup_symbol = find_backup_class_name(symbol); |
|
1946 if (try_load && PreferTransitionalJSR292) { |
|
1947 while (backup_symbol != NULL) { |
|
1948 (*klassp) = resolve_or_null(backup_symbol, CHECK_0); // try backup early |
|
1949 if (TraceMethodHandles) { |
|
1950 ResourceMark rm; |
|
1951 tty->print_cr("MethodHandles: try backup first for %s => %s (%s)", |
|
1952 symbol->as_C_string(), backup_symbol->as_C_string(), |
|
1953 ((*klassp) == NULL) ? "no such class" : "backup load succeeded"); |
|
1954 } |
|
1955 if ((*klassp) != NULL) return true; |
|
1956 backup_symbol = find_backup_class_name(backup_symbol); // find next backup |
|
1957 } |
|
1958 } |
|
1959 } |
|
1960 } |
|
1961 if ((*klassp) != NULL) return true; |
|
1962 if (!try_load) return false; |
|
1963 while (symbol != NULL) { |
|
1964 bool must_load = (pre_load && (backup_symbol == NULL)); |
|
1965 if (must_load) { |
1904 if (must_load) { |
1966 (*klassp) = resolve_or_fail(symbol, true, CHECK_0); // load required class |
1905 (*klassp) = resolve_or_fail(symbol, true, CHECK_0); // load required class |
1967 } else { |
1906 } else { |
1968 (*klassp) = resolve_or_null(symbol, CHECK_0); // load optional klass |
1907 (*klassp) = resolve_or_null(symbol, CHECK_0); // load optional klass |
1969 } |
1908 } |
1970 if ((*klassp) != NULL) return true; |
1909 } |
1971 // Go around again. Example of long backup sequence: |
1910 return ((*klassp) != NULL); |
1972 // java.lang.invoke.MemberName, java.dyn.MemberName, sun.dyn.MemberName, ONLY if AllowTransitionalJSR292 |
|
1973 if (TraceMethodHandles && (backup_symbol != NULL)) { |
|
1974 ResourceMark rm; |
|
1975 tty->print_cr("MethodHandles: backup for %s => %s", |
|
1976 symbol->as_C_string(), backup_symbol->as_C_string()); |
|
1977 } |
|
1978 symbol = backup_symbol; |
|
1979 if (AllowTransitionalJSR292) |
|
1980 backup_symbol = find_backup_class_name(symbol); |
|
1981 } |
|
1982 return false; |
|
1983 } |
1911 } |
1984 |
1912 |
1985 void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) { |
1913 void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) { |
1986 assert((int)start_id <= (int)limit_id, "IDs are out of order!"); |
1914 assert((int)start_id <= (int)limit_id, "IDs are out of order!"); |
1987 for (int id = (int)start_id; id < (int)limit_id; id++) { |
1915 for (int id = (int)start_id; id < (int)limit_id; id++) { |
2407 if (spe == NULL || spe->property_oop() == NULL) { |
2335 if (spe == NULL || spe->property_oop() == NULL) { |
2408 spe = NULL; |
2336 spe = NULL; |
2409 // Must create lots of stuff here, but outside of the SystemDictionary lock. |
2337 // Must create lots of stuff here, but outside of the SystemDictionary lock. |
2410 if (THREAD->is_Compiler_thread()) |
2338 if (THREAD->is_Compiler_thread()) |
2411 return NULL; // do not attempt from within compiler |
2339 return NULL; // do not attempt from within compiler |
2412 bool for_invokeGeneric = (name_id == vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name)); |
2340 bool for_invokeGeneric = (name_id != vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name)); |
2413 if (AllowInvokeForInvokeGeneric && name_id == vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name)) |
|
2414 for_invokeGeneric = true; |
|
2415 bool found_on_bcp = false; |
2341 bool found_on_bcp = false; |
2416 Handle mt = find_method_handle_type(signature, accessing_klass, |
2342 Handle mt = find_method_handle_type(signature, accessing_klass, |
2417 for_invokeGeneric, |
2343 for_invokeGeneric, |
2418 found_on_bcp, CHECK_NULL); |
2344 found_on_bcp, CHECK_NULL); |
2419 KlassHandle mh_klass = SystemDictionaryHandles::MethodHandle_klass(); |
2345 KlassHandle mh_klass = SystemDictionaryHandles::MethodHandle_klass(); |
2496 |
2422 |
2497 // call java.lang.invoke.MethodHandleNatives::findMethodType(Class rt, Class[] pts) -> MethodType |
2423 // call java.lang.invoke.MethodHandleNatives::findMethodType(Class rt, Class[] pts) -> MethodType |
2498 JavaCallArguments args(Handle(THREAD, rt())); |
2424 JavaCallArguments args(Handle(THREAD, rt())); |
2499 args.push_oop(pts()); |
2425 args.push_oop(pts()); |
2500 JavaValue result(T_OBJECT); |
2426 JavaValue result(T_OBJECT); |
2501 Symbol* findMethodHandleType_signature = vmSymbols::findMethodHandleType_signature(); |
|
2502 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodType_klass()->name() == vmSymbols::java_dyn_MethodType()) { |
|
2503 findMethodHandleType_signature = vmSymbols::findMethodHandleType_TRANS_signature(); |
|
2504 } |
|
2505 JavaCalls::call_static(&result, |
2427 JavaCalls::call_static(&result, |
2506 SystemDictionary::MethodHandleNatives_klass(), |
2428 SystemDictionary::MethodHandleNatives_klass(), |
2507 vmSymbols::findMethodHandleType_name(), |
2429 vmSymbols::findMethodHandleType_name(), |
2508 findMethodHandleType_signature, |
2430 vmSymbols::findMethodHandleType_signature(), |
2509 &args, CHECK_(empty)); |
2431 &args, CHECK_(empty)); |
2510 Handle method_type(THREAD, (oop) result.get_jobject()); |
2432 Handle method_type(THREAD, (oop) result.get_jobject()); |
2511 |
2433 |
2512 if (for_invokeGeneric) { |
2434 if (for_invokeGeneric) { |
2513 // call java.lang.invoke.MethodHandleNatives::notifyGenericMethodType(MethodType) -> void |
2435 // call java.lang.invoke.MethodHandleNatives::notifyGenericMethodType(MethodType) -> void |
2514 JavaCallArguments args(Handle(THREAD, method_type())); |
2436 JavaCallArguments args(Handle(THREAD, method_type())); |
2515 JavaValue no_result(T_VOID); |
2437 JavaValue no_result(T_VOID); |
2516 Symbol* notifyGenericMethodType_signature = vmSymbols::notifyGenericMethodType_signature(); |
|
2517 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodType_klass()->name() == vmSymbols::java_dyn_MethodType()) { |
|
2518 notifyGenericMethodType_signature = vmSymbols::notifyGenericMethodType_TRANS_signature(); |
|
2519 } |
|
2520 JavaCalls::call_static(&no_result, |
2438 JavaCalls::call_static(&no_result, |
2521 SystemDictionary::MethodHandleNatives_klass(), |
2439 SystemDictionary::MethodHandleNatives_klass(), |
2522 vmSymbols::notifyGenericMethodType_name(), |
2440 vmSymbols::notifyGenericMethodType_name(), |
2523 notifyGenericMethodType_signature, |
2441 vmSymbols::notifyGenericMethodType_signature(), |
2524 &args, THREAD); |
2442 &args, THREAD); |
2525 if (HAS_PENDING_EXCEPTION) { |
2443 if (HAS_PENDING_EXCEPTION) { |
2526 // If the notification fails, just kill it. |
2444 // If the notification fails, just kill it. |
2527 CLEAR_PENDING_EXCEPTION; |
2445 CLEAR_PENDING_EXCEPTION; |
2528 } |
2446 } |
2567 args.push_int(ref_kind); |
2485 args.push_int(ref_kind); |
2568 args.push_oop(callee->java_mirror()); // the target class |
2486 args.push_oop(callee->java_mirror()); // the target class |
2569 args.push_oop(name()); |
2487 args.push_oop(name()); |
2570 args.push_oop(type()); |
2488 args.push_oop(type()); |
2571 JavaValue result(T_OBJECT); |
2489 JavaValue result(T_OBJECT); |
2572 Symbol* linkMethodHandleConstant_signature = vmSymbols::linkMethodHandleConstant_signature(); |
|
2573 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandle_klass()->name() == vmSymbols::java_dyn_MethodHandle()) { |
|
2574 linkMethodHandleConstant_signature = vmSymbols::linkMethodHandleConstant_TRANS_signature(); |
|
2575 } |
|
2576 JavaCalls::call_static(&result, |
2490 JavaCalls::call_static(&result, |
2577 SystemDictionary::MethodHandleNatives_klass(), |
2491 SystemDictionary::MethodHandleNatives_klass(), |
2578 vmSymbols::linkMethodHandleConstant_name(), |
2492 vmSymbols::linkMethodHandleConstant_name(), |
2579 linkMethodHandleConstant_signature, |
2493 vmSymbols::linkMethodHandleConstant_signature(), |
2580 &args, CHECK_(empty)); |
2494 &args, CHECK_(empty)); |
2581 return Handle(THREAD, (oop) result.get_jobject()); |
2495 return Handle(THREAD, (oop) result.get_jobject()); |
2582 } |
2496 } |
2583 |
2497 |
2584 // Ask Java code to find or construct a java.lang.invoke.CallSite for the given |
2498 // Ask Java code to find or construct a java.lang.invoke.CallSite for the given |
2605 args.push_oop(signature_invoker->method_handle_type()); |
2519 args.push_oop(signature_invoker->method_handle_type()); |
2606 args.push_oop(info()); |
2520 args.push_oop(info()); |
2607 args.push_oop(caller_mname()); |
2521 args.push_oop(caller_mname()); |
2608 args.push_int(caller_bci); |
2522 args.push_int(caller_bci); |
2609 JavaValue result(T_OBJECT); |
2523 JavaValue result(T_OBJECT); |
2610 Symbol* makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_signature(); |
|
2611 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandleNatives_klass()->name() == vmSymbols::sun_dyn_MethodHandleNatives()) { |
|
2612 makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_TRANS_signature(); |
|
2613 } |
|
2614 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandleNatives_klass()->name() == vmSymbols::java_dyn_MethodHandleNatives()) { |
|
2615 makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_TRANS2_signature(); |
|
2616 } |
|
2617 JavaCalls::call_static(&result, |
2524 JavaCalls::call_static(&result, |
2618 SystemDictionary::MethodHandleNatives_klass(), |
2525 SystemDictionary::MethodHandleNatives_klass(), |
2619 vmSymbols::makeDynamicCallSite_name(), |
2526 vmSymbols::makeDynamicCallSite_name(), |
2620 makeDynamicCallSite_signature, |
2527 vmSymbols::makeDynamicCallSite_signature(), |
2621 &args, CHECK_(empty)); |
2528 &args, CHECK_(empty)); |
2622 oop call_site_oop = (oop) result.get_jobject(); |
2529 oop call_site_oop = (oop) result.get_jobject(); |
2623 assert(call_site_oop->is_oop() |
2530 assert(call_site_oop->is_oop() |
2624 /*&& java_lang_invoke_CallSite::is_instance(call_site_oop)*/, "must be sane"); |
2531 /*&& java_lang_invoke_CallSite::is_instance(call_site_oop)*/, "must be sane"); |
2625 if (TraceMethodHandles) { |
2532 if (TraceMethodHandles) { |