Mercurial > hg > truffle
diff src/share/vm/oops/klassVtable.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | 642e54d1850a |
children | e5383553fd4e |
line wrap: on
line diff
--- a/src/share/vm/oops/klassVtable.cpp Thu Jan 27 13:42:28 2011 -0800 +++ b/src/share/vm/oops/klassVtable.cpp Thu Jan 27 16:11:27 2011 -0800 @@ -61,7 +61,7 @@ objArrayOop methods, AccessFlags class_flags, Handle classloader, - symbolHandle classname, + Symbol* classname, objArrayOop local_interfaces, TRAPS ) { @@ -210,7 +210,7 @@ // the superclass's method, but might indirectly override a super-super class's vtable entry // If none found, return a null superk, else return the superk of the method this does override instanceKlass* klassVtable::find_transitive_override(instanceKlass* initialsuper, methodHandle target_method, - int vtable_index, Handle target_loader, symbolHandle target_classname, Thread * THREAD) { + int vtable_index, Handle target_loader, Symbol* target_classname, Thread * THREAD) { instanceKlass* superk = initialsuper; while (superk != NULL && superk->super() != NULL) { instanceKlass* supersuperklass = instanceKlass::cast(superk->super()); @@ -218,9 +218,9 @@ if (vtable_index < ssVtable->length()) { methodOop super_method = ssVtable->method_at(vtable_index); #ifndef PRODUCT - symbolHandle name(THREAD,target_method()->name()); - symbolHandle signature(THREAD,target_method()->signature()); - assert(super_method->name() == name() && super_method->signature() == signature(), "vtable entry name/sig mismatch"); + Symbol* name= target_method()->name(); + Symbol* signature = target_method()->signature(); + assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); #endif if (supersuperklass->is_override(super_method, target_loader, target_classname, THREAD)) { #ifndef PRODUCT @@ -294,14 +294,14 @@ // which can block for gc, once we are in this loop, use handles // For classfiles built with >= jdk7, we now look for transitive overrides - symbolHandle name(THREAD,target_method()->name()); - symbolHandle signature(THREAD,target_method()->signature()); + Symbol* name = target_method()->name(); + Symbol* signature = target_method()->signature(); Handle target_loader(THREAD, _klass->class_loader()); - symbolHandle target_classname(THREAD, _klass->name()); + Symbol* target_classname = _klass->name(); for(int i = 0; i < super_vtable_len; i++) { methodOop super_method = method_at(i); // Check if method name matches - if (super_method->name() == name() && super_method->signature() == signature()) { + if (super_method->name() == name && super_method->signature() == signature) { // get super_klass for method_holder for the found method instanceKlass* super_klass = instanceKlass::cast(super_method->method_holder()); @@ -406,7 +406,7 @@ bool klassVtable::needs_new_vtable_entry(methodHandle target_method, klassOop super, Handle classloader, - symbolHandle classname, + Symbol* classname, AccessFlags class_flags, TRAPS) { if ((class_flags.is_final() || target_method()->is_final()) || @@ -436,8 +436,8 @@ // search through the super class hierarchy to see if we need // a new entry ResourceMark rm; - symbolOop name = target_method()->name(); - symbolOop signature = target_method()->signature(); + Symbol* name = target_method()->name(); + Symbol* signature = target_method()->signature(); klassOop k = super; methodOop super_method = NULL; instanceKlass *holder = NULL; @@ -485,7 +485,7 @@ // Support for miranda methods // get the vtable index of a miranda method with matching "name" and "signature" -int klassVtable::index_of_miranda(symbolOop name, symbolOop signature) { +int klassVtable::index_of_miranda(Symbol* name, Symbol* signature) { // search from the bottom, might be faster for (int i = (length() - 1); i >= 0; i--) { methodOop m = table()[i].method(); @@ -516,9 +516,8 @@ // check if a method is a miranda method, given a class's methods table and it's super // the caller must make sure that the method belongs to an interface implemented by the class bool klassVtable::is_miranda(methodOop m, objArrayOop class_methods, klassOop super) { - symbolOop name = m->name(); - symbolOop signature = m->signature(); - + Symbol* name = m->name(); + Symbol* signature = m->signature(); if (instanceKlass::find_method(class_methods, name, signature) == NULL) { // did not find it in the method table of the current class if (super == NULL) { @@ -929,8 +928,8 @@ // methods needs a handle in case of gc from check_signature_loaders for(; i < nof_methods; i++) { methodOop m = (methodOop)methods()->obj_at(i); - symbolOop method_name = m->name(); - symbolOop method_signature = m->signature(); + Symbol* method_name = m->name(); + Symbol* method_signature = m->signature(); // This is same code as in Linkresolver::lookup_instance_method_in_klasses methodOop target = klass->uncached_lookup_method(method_name, method_signature);