Mercurial > hg > graal-compiler
comparison src/share/vm/classfile/systemDictionary.cpp @ 726:be93aad57795
6655646: dynamic languages need dynamically linked call sites
Summary: invokedynamic instruction (JSR 292 RI)
Reviewed-by: twisti, never
author | jrose |
---|---|
date | Tue, 21 Apr 2009 23:21:04 -0700 |
parents | e5b0439ef4ae |
children | 6a93908f268f |
comparison
equal
deleted
inserted
replaced
725:928912ce8438 | 726:be93aad57795 |
---|---|
1948 initialize_wk_klasses_through(meth_group_start, scan, CHECK); | 1948 initialize_wk_klasses_through(meth_group_start, scan, CHECK); |
1949 } | 1949 } |
1950 if (_well_known_klasses[meth_group_start] == NULL) { | 1950 if (_well_known_klasses[meth_group_start] == NULL) { |
1951 // Skip the rest of the method handle classes, if MethodHandle is not loaded. | 1951 // Skip the rest of the method handle classes, if MethodHandle is not loaded. |
1952 scan = WKID(meth_group_end+1); | 1952 scan = WKID(meth_group_end+1); |
1953 } | |
1954 WKID indy_group_start = WK_KLASS_ENUM_NAME(Linkage_klass); | |
1955 WKID indy_group_end = WK_KLASS_ENUM_NAME(Dynamic_klass); | |
1956 initialize_wk_klasses_until(indy_group_start, scan, CHECK); | |
1957 if (EnableInvokeDynamic) { | |
1958 initialize_wk_klasses_through(indy_group_start, scan, CHECK); | |
1959 } | |
1960 if (_well_known_klasses[indy_group_start] == NULL) { | |
1961 // Skip the rest of the dynamic typing classes, if Linkage is not loaded. | |
1962 scan = WKID(indy_group_end+1); | |
1953 } | 1963 } |
1954 | 1964 |
1955 initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK); | 1965 initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK); |
1956 | 1966 |
1957 _box_klasses[T_BOOLEAN] = WK_KLASS(boolean_klass); | 1967 _box_klasses[T_BOOLEAN] = WK_KLASS(boolean_klass); |
2365 &args, CHECK_(empty)); | 2375 &args, CHECK_(empty)); |
2366 return Handle(THREAD, (oop) result.get_jobject()); | 2376 return Handle(THREAD, (oop) result.get_jobject()); |
2367 } | 2377 } |
2368 | 2378 |
2369 | 2379 |
2380 // Ask Java code to find or construct a java.dyn.CallSite for the given | |
2381 // name and signature, as interpreted relative to the given class loader. | |
2382 Handle SystemDictionary::make_dynamic_call_site(KlassHandle caller, | |
2383 int caller_method_idnum, | |
2384 int caller_bci, | |
2385 symbolHandle name, | |
2386 methodHandle mh_invdyn, | |
2387 TRAPS) { | |
2388 Handle empty; | |
2389 // call sun.dyn.CallSiteImpl::makeSite(caller, name, mtype, cmid, cbci) | |
2390 oop name_str_oop = StringTable::intern(name(), CHECK_(empty)); // not a handle! | |
2391 JavaCallArguments args(Handle(THREAD, caller->java_mirror())); | |
2392 args.push_oop(name_str_oop); | |
2393 args.push_oop(mh_invdyn->method_handle_type()); | |
2394 args.push_int(caller_method_idnum); | |
2395 args.push_int(caller_bci); | |
2396 JavaValue result(T_OBJECT); | |
2397 JavaCalls::call_static(&result, | |
2398 SystemDictionary::CallSiteImpl_klass(), | |
2399 vmSymbols::makeSite_name(), vmSymbols::makeSite_signature(), | |
2400 &args, CHECK_(empty)); | |
2401 oop call_site_oop = (oop) result.get_jobject(); | |
2402 sun_dyn_CallSiteImpl::set_vmmethod(call_site_oop, mh_invdyn()); | |
2403 if (TraceMethodHandles) { | |
2404 tty->print_cr("Linked invokedynamic bci=%d site="INTPTR_FORMAT":", caller_bci, call_site_oop); | |
2405 call_site_oop->print(); | |
2406 tty->cr(); | |
2407 } | |
2408 return call_site_oop; | |
2409 } | |
2410 | |
2411 Handle SystemDictionary::find_bootstrap_method(KlassHandle caller, | |
2412 KlassHandle search_bootstrap_klass, | |
2413 TRAPS) { | |
2414 Handle empty; | |
2415 if (!caller->oop_is_instance()) return empty; | |
2416 | |
2417 instanceKlassHandle ik(THREAD, caller()); | |
2418 | |
2419 if (ik->bootstrap_method() != NULL) { | |
2420 return Handle(THREAD, ik->bootstrap_method()); | |
2421 } | |
2422 | |
2423 // call java.dyn.Linkage::findBootstrapMethod(caller, sbk) | |
2424 JavaCallArguments args(Handle(THREAD, ik->java_mirror())); | |
2425 if (search_bootstrap_klass.is_null()) | |
2426 args.push_oop(Handle()); | |
2427 else | |
2428 args.push_oop(search_bootstrap_klass->java_mirror()); | |
2429 JavaValue result(T_OBJECT); | |
2430 JavaCalls::call_static(&result, | |
2431 SystemDictionary::Linkage_klass(), | |
2432 vmSymbols::findBootstrapMethod_name(), | |
2433 vmSymbols::findBootstrapMethod_signature(), | |
2434 &args, CHECK_(empty)); | |
2435 oop boot_method_oop = (oop) result.get_jobject(); | |
2436 | |
2437 if (boot_method_oop != NULL) { | |
2438 // probably no race conditions, but let's be careful: | |
2439 if (Atomic::cmpxchg_ptr(boot_method_oop, ik->adr_bootstrap_method(), NULL) == NULL) | |
2440 ik->set_bootstrap_method(boot_method_oop); | |
2441 else | |
2442 boot_method_oop = ik->bootstrap_method(); | |
2443 } else { | |
2444 boot_method_oop = ik->bootstrap_method(); | |
2445 } | |
2446 | |
2447 return Handle(THREAD, boot_method_oop); | |
2448 } | |
2449 | |
2370 // Since the identity hash code for symbols changes when the symbols are | 2450 // Since the identity hash code for symbols changes when the symbols are |
2371 // moved from the regular perm gen (hash in the mark word) to the shared | 2451 // moved from the regular perm gen (hash in the mark word) to the shared |
2372 // spaces (hash is the address), the classes loaded into the dictionary | 2452 // spaces (hash is the address), the classes loaded into the dictionary |
2373 // may be in the wrong buckets. | 2453 // may be in the wrong buckets. |
2374 | 2454 |