comparison src/share/vm/oops/klassVtable.hpp @ 652:4aaa9f5e02a8

4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242. Reviewed-by: kamg, coleenp
author acorn
date Wed, 18 Mar 2009 17:20:57 -0400
parents f8236e79048a
children d3676b4cb78c
comparison
equal deleted inserted replaced
651:8ce995316d10 652:4aaa9f5e02a8
68 void initialize_vtable(bool checkconstraints, TRAPS); // initialize vtable of a new klass 68 void initialize_vtable(bool checkconstraints, TRAPS); // initialize vtable of a new klass
69 69
70 // conputes vtable length (in words) and the number of miranda methods 70 // conputes vtable length (in words) and the number of miranda methods
71 static void compute_vtable_size_and_num_mirandas(int &vtable_length, int &num_miranda_methods, 71 static void compute_vtable_size_and_num_mirandas(int &vtable_length, int &num_miranda_methods,
72 klassOop super, objArrayOop methods, 72 klassOop super, objArrayOop methods,
73 AccessFlags class_flags, oop classloader, 73 AccessFlags class_flags, Handle classloader,
74 symbolOop classname, objArrayOop local_interfaces); 74 symbolHandle classname, objArrayOop local_interfaces,
75 TRAPS);
75 76
76 // RedefineClasses() API support: 77 // RedefineClasses() API support:
77 // If any entry of this vtable points to any of old_methods, 78 // If any entry of this vtable points to any of old_methods,
78 // replace it with the corresponding new_method. 79 // replace it with the corresponding new_method.
79 // trace_name_printed is set to true if the current call has 80 // trace_name_printed is set to true if the current call has
109 #endif 110 #endif
110 111
111 protected: 112 protected:
112 friend class vtableEntry; 113 friend class vtableEntry;
113 private: 114 private:
115 enum { VTABLE_TRANSITIVE_OVERRIDE_VERSION = 51 } ;
114 void copy_vtable_to(vtableEntry* start); 116 void copy_vtable_to(vtableEntry* start);
115 int initialize_from_super(KlassHandle super); 117 int initialize_from_super(KlassHandle super);
116 int index_of(methodOop m, int len) const; // same as index_of, but search only up to len 118 int index_of(methodOop m, int len) const; // same as index_of, but search only up to len
117 void put_method_at(methodOop m, int index); 119 void put_method_at(methodOop m, int index);
118 static bool needs_new_vtable_entry(methodOop m, klassOop super, oop classloader, symbolOop classname, AccessFlags access_flags); 120 static bool needs_new_vtable_entry(methodHandle m, klassOop super, Handle classloader, symbolHandle classname, AccessFlags access_flags, TRAPS);
119 AccessType vtable_accessibility_at(int i); 121
120 122 bool update_inherited_vtable(instanceKlass* klass, methodHandle target_method, int super_vtable_len, bool checkconstraints, TRAPS);
121 bool update_super_vtable(instanceKlass* klass, methodHandle target_method, int super_vtable_len, bool checkconstraints, TRAPS); 123 instanceKlass* find_transitive_override(instanceKlass* initialsuper, methodHandle target_method, int vtable_index,
124 Handle target_loader, symbolHandle target_classname, Thread* THREAD);
122 125
123 // support for miranda methods 126 // support for miranda methods
124 bool is_miranda_entry_at(int i); 127 bool is_miranda_entry_at(int i);
125 void fill_in_mirandas(int& initialized); 128 void fill_in_mirandas(int& initialized);
126 static bool is_miranda(methodOop m, objArrayOop class_methods, klassOop super); 129 static bool is_miranda(methodOop m, objArrayOop class_methods, klassOop super);