comparison src/share/vm/classfile/systemDictionary.hpp @ 710:e5b0439ef4ae

6655638: dynamic languages need method handles Summary: initial implementation, with known omissions (x86/64, sparc, compiler optim., c-oops, C++ interp.) Reviewed-by: kvn, twisti, never
author jrose
date Wed, 08 Apr 2009 10:56:49 -0700
parents c89f86385056
children be93aad57795
comparison
equal deleted inserted replaced
709:1d037ecd7960 710:e5b0439ef4ae
61 class Dictionary; 61 class Dictionary;
62 class PlaceholderTable; 62 class PlaceholderTable;
63 class LoaderConstraintTable; 63 class LoaderConstraintTable;
64 class HashtableBucket; 64 class HashtableBucket;
65 class ResolutionErrorTable; 65 class ResolutionErrorTable;
66 class SymbolPropertyTable;
66 67
67 // Certain classes are preloaded, such as java.lang.Object and java.lang.String. 68 // Certain classes are preloaded, such as java.lang.Object and java.lang.String.
68 // They are all "well-known", in the sense that no class loader is allowed 69 // They are all "well-known", in the sense that no class loader is allowed
69 // to provide a different definition. 70 // to provide a different definition.
70 // 71 //
129 template(reflect_constructor_accessor_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \ 130 template(reflect_constructor_accessor_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
130 template(reflect_delegating_classloader_klass, sun_reflect_DelegatingClassLoader, Opt) \ 131 template(reflect_delegating_classloader_klass, sun_reflect_DelegatingClassLoader, Opt) \
131 template(reflect_constant_pool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15) \ 132 template(reflect_constant_pool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15) \
132 template(reflect_unsafe_static_field_accessor_impl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15) \ 133 template(reflect_unsafe_static_field_accessor_impl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15) \
133 \ 134 \
135 /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
136 template(MethodHandle_klass, java_dyn_MethodHandle, Opt) \
137 template(MemberName_klass, sun_dyn_MemberName, Opt) \
138 template(MethodHandleImpl_klass, sun_dyn_MethodHandleImpl, Opt) \
139 template(AdapterMethodHandle_klass, sun_dyn_AdapterMethodHandle, Opt) \
140 template(BoundMethodHandle_klass, sun_dyn_BoundMethodHandle, Opt) \
141 template(DirectMethodHandle_klass, sun_dyn_DirectMethodHandle, Opt) \
142 template(MethodType_klass, java_dyn_MethodType, Opt) \
143 template(MethodTypeForm_klass, java_dyn_MethodTypeForm, Opt) \
144 template(WrongMethodTypeException_klass, java_dyn_WrongMethodTypeException, Opt) \
134 template(vector_klass, java_util_Vector, Pre) \ 145 template(vector_klass, java_util_Vector, Pre) \
135 template(hashtable_klass, java_util_Hashtable, Pre) \ 146 template(hashtable_klass, java_util_Hashtable, Pre) \
136 template(stringBuffer_klass, java_lang_StringBuffer, Pre) \ 147 template(stringBuffer_klass, java_lang_StringBuffer, Pre) \
137 \ 148 \
138 /* It's NULL in non-1.4 JDKs. */ \ 149 /* It's NULL in non-1.4 JDKs. */ \
442 static bool add_loader_constraint(symbolHandle name, Handle loader1, 453 static bool add_loader_constraint(symbolHandle name, Handle loader1,
443 Handle loader2, TRAPS); 454 Handle loader2, TRAPS);
444 static char* check_signature_loaders(symbolHandle signature, Handle loader1, 455 static char* check_signature_loaders(symbolHandle signature, Handle loader1,
445 Handle loader2, bool is_method, TRAPS); 456 Handle loader2, bool is_method, TRAPS);
446 457
458 // JSR 292
459 // find the java.dyn.MethodHandles::invoke method for a given signature
460 static methodOop find_method_handle_invoke(symbolHandle signature,
461 Handle class_loader,
462 Handle protection_domain,
463 TRAPS);
464 // ask Java to compute the java.dyn.MethodType object for a given signature
465 static Handle compute_method_handle_type(symbolHandle signature,
466 Handle class_loader,
467 Handle protection_domain,
468 TRAPS);
447 // Utility for printing loader "name" as part of tracing constraints 469 // Utility for printing loader "name" as part of tracing constraints
448 static const char* loader_name(oop loader) { 470 static const char* loader_name(oop loader) {
449 return ((loader) == NULL ? "<bootloader>" : 471 return ((loader) == NULL ? "<bootloader>" :
450 instanceKlass::cast((loader)->klass())->name()->as_C_string() ); 472 instanceKlass::cast((loader)->klass())->name()->as_C_string() );
451 } 473 }
458 private: 480 private:
459 481
460 enum Constants { 482 enum Constants {
461 _loader_constraint_size = 107, // number of entries in constraint table 483 _loader_constraint_size = 107, // number of entries in constraint table
462 _resolution_error_size = 107, // number of entries in resolution error table 484 _resolution_error_size = 107, // number of entries in resolution error table
485 _invoke_method_size = 139, // number of entries in invoke method table
463 _nof_buckets = 1009 // number of buckets in hash table 486 _nof_buckets = 1009 // number of buckets in hash table
464 }; 487 };
465 488
466 489
467 // Static variables 490 // Static variables
486 // Constraints on class loaders 509 // Constraints on class loaders
487 static LoaderConstraintTable* _loader_constraints; 510 static LoaderConstraintTable* _loader_constraints;
488 511
489 // Resolution errors 512 // Resolution errors
490 static ResolutionErrorTable* _resolution_errors; 513 static ResolutionErrorTable* _resolution_errors;
514
515 // Invoke methods (JSR 292)
516 static SymbolPropertyTable* _invoke_method_table;
491 517
492 public: 518 public:
493 // for VM_CounterDecay iteration support 519 // for VM_CounterDecay iteration support
494 friend class CounterDecay; 520 friend class CounterDecay;
495 static klassOop try_get_next_class(); 521 static klassOop try_get_next_class();
504 static Dictionary* dictionary() { return _dictionary; } 530 static Dictionary* dictionary() { return _dictionary; }
505 static Dictionary* shared_dictionary() { return _shared_dictionary; } 531 static Dictionary* shared_dictionary() { return _shared_dictionary; }
506 static PlaceholderTable* placeholders() { return _placeholders; } 532 static PlaceholderTable* placeholders() { return _placeholders; }
507 static LoaderConstraintTable* constraints() { return _loader_constraints; } 533 static LoaderConstraintTable* constraints() { return _loader_constraints; }
508 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } 534 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; }
535 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; }
509 536
510 // Basic loading operations 537 // Basic loading operations
511 static klassOop resolve_instance_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); 538 static klassOop resolve_instance_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
512 static klassOop resolve_array_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); 539 static klassOop resolve_array_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
513 static instanceKlassHandle handle_parallel_super_load(symbolHandle class_name, symbolHandle supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); 540 static instanceKlassHandle handle_parallel_super_load(symbolHandle class_name, symbolHandle supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);