< prev index next >

src/hotspot/share/prims/methodHandles.cpp

roman_version

944 
945   if ((match_flags & IS_TYPE) != 0) {                                                                                                
946     // NYI, and Core Reflection works quite well for this query                                                                      
947   }                                                                                                                                  
948 
949   if ((match_flags & IS_FIELD) != 0) {                                                                                               
950     InstanceKlass* ik = InstanceKlass::cast(k);                                                                                      
951     for (FieldStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {                                                      
952       if (name != NULL && st.name() != name)                                                                                         
953           continue;                                                                                                                  
954       if (sig != NULL && st.signature() != sig)                                                                                      
955         continue;                                                                                                                    
956       // passed the filters                                                                                                          
957       if (rskip > 0) {                                                                                                               
958         --rskip;                                                                                                                     
959       } else if (rfill < rlimit) {                                                                                                   
960         Handle result(thread, results->obj_at(rfill++));                                                                             
961         if (!java_lang_invoke_MemberName::is_instance(result()))                                                                     
962           return -99;  // caller bug!                                                                                                
963         oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());                                             
964         if (saved != result())                                                                                                       
965           results->obj_at_put(rfill-1, saved);  // show saved instance to user                                                       
966       } else if (++overflow >= overflow_limit) {                                                                                     
967         match_flags = 0; break; // got tired of looking at overflow                                                                  
968       }                                                                                                                              
969     }                                                                                                                                
970   }                                                                                                                                  
971 
972   if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {                                                                           
973     // watch out for these guys:                                                                                                     
974     Symbol* init_name   = vmSymbols::object_initializer_name();                                                                      
975     Symbol* clinit_name = vmSymbols::class_initializer_name();                                                                       
976     if (name == clinit_name)  clinit_name = NULL; // hack for exposing <clinit>                                                      
977     bool negate_name_test = false;                                                                                                   
978     // fix name so that it captures the intention of IS_CONSTRUCTOR                                                                  
979     if (!(match_flags & IS_METHOD)) {                                                                                                
980       // constructors only                                                                                                           
981       if (name == NULL) {                                                                                                            
982         name = init_name;                                                                                                            
983       } else if (name != init_name) {                                                                                                

944 
945   if ((match_flags & IS_TYPE) != 0) {
946     // NYI, and Core Reflection works quite well for this query
947   }
948 
949   if ((match_flags & IS_FIELD) != 0) {
950     InstanceKlass* ik = InstanceKlass::cast(k);
951     for (FieldStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
952       if (name != NULL && st.name() != name)
953           continue;
954       if (sig != NULL && st.signature() != sig)
955         continue;
956       // passed the filters
957       if (rskip > 0) {
958         --rskip;
959       } else if (rfill < rlimit) {
960         Handle result(thread, results->obj_at(rfill++));
961         if (!java_lang_invoke_MemberName::is_instance(result()))
962           return -99;  // caller bug!
963         oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());
964         if (!oopDesc::equals(saved, result()))
965           results->obj_at_put(rfill-1, saved);  // show saved instance to user
966       } else if (++overflow >= overflow_limit) {
967         match_flags = 0; break; // got tired of looking at overflow
968       }
969     }
970   }
971 
972   if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
973     // watch out for these guys:
974     Symbol* init_name   = vmSymbols::object_initializer_name();
975     Symbol* clinit_name = vmSymbols::class_initializer_name();
976     if (name == clinit_name)  clinit_name = NULL; // hack for exposing <clinit>
977     bool negate_name_test = false;
978     // fix name so that it captures the intention of IS_CONSTRUCTOR
979     if (!(match_flags & IS_METHOD)) {
980       // constructors only
981       if (name == NULL) {
982         name = init_name;
983       } else if (name != init_name) {

996     }                                                                                                                                
997     InstanceKlass* ik = InstanceKlass::cast(k);                                                                                      
998     for (MethodStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {                                                     
999       Method* m = st.method();                                                                                                       
1000       Symbol* m_name = m->name();                                                                                                    
1001       if (m_name == clinit_name)                                                                                                     
1002         continue;                                                                                                                    
1003       if (name != NULL && ((m_name != name) ^ negate_name_test))                                                                     
1004           continue;                                                                                                                  
1005       if (sig != NULL && m->signature() != sig)                                                                                      
1006         continue;                                                                                                                    
1007       // passed the filters                                                                                                          
1008       if (rskip > 0) {                                                                                                               
1009         --rskip;                                                                                                                     
1010       } else if (rfill < rlimit) {                                                                                                   
1011         Handle result(thread, results->obj_at(rfill++));                                                                             
1012         if (!java_lang_invoke_MemberName::is_instance(result()))                                                                     
1013           return -99;  // caller bug!                                                                                                
1014         CallInfo info(m, NULL, CHECK_0);                                                                                             
1015         oop saved = MethodHandles::init_method_MemberName(result, info);                                                             
1016         if (saved != result())                                                                                                       
1017           results->obj_at_put(rfill-1, saved);  // show saved instance to user                                                       
1018       } else if (++overflow >= overflow_limit) {                                                                                     
1019         match_flags = 0; break; // got tired of looking at overflow                                                                  
1020       }                                                                                                                              
1021     }                                                                                                                                
1022   }                                                                                                                                  
1023 
1024   // return number of elements we at leasted wanted to initialize                                                                    
1025   return rfill + overflow;                                                                                                           
1026 }                                                                                                                                    
1027 
1028 // Is it safe to remove stale entries from a dependency list?                                                                        
1029 static bool safe_to_expunge() {                                                                                                      
1030   // Since parallel GC threads can concurrently iterate over a dependency                                                            
1031   // list during safepoint, it is safe to remove entries only when                                                                   
1032   // CodeCache lock is held.                                                                                                         
1033   return CodeCache_lock->owned_by_self();                                                                                            
1034 }                                                                                                                                    
1035 

996     }
997     InstanceKlass* ik = InstanceKlass::cast(k);
998     for (MethodStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
999       Method* m = st.method();
1000       Symbol* m_name = m->name();
1001       if (m_name == clinit_name)
1002         continue;
1003       if (name != NULL && ((m_name != name) ^ negate_name_test))
1004           continue;
1005       if (sig != NULL && m->signature() != sig)
1006         continue;
1007       // passed the filters
1008       if (rskip > 0) {
1009         --rskip;
1010       } else if (rfill < rlimit) {
1011         Handle result(thread, results->obj_at(rfill++));
1012         if (!java_lang_invoke_MemberName::is_instance(result()))
1013           return -99;  // caller bug!
1014         CallInfo info(m, NULL, CHECK_0);
1015         oop saved = MethodHandles::init_method_MemberName(result, info);
1016         if (!oopDesc::equals(saved, result()))
1017           results->obj_at_put(rfill-1, saved);  // show saved instance to user
1018       } else if (++overflow >= overflow_limit) {
1019         match_flags = 0; break; // got tired of looking at overflow
1020       }
1021     }
1022   }
1023 
1024   // return number of elements we at leasted wanted to initialize
1025   return rfill + overflow;
1026 }
1027 
1028 // Is it safe to remove stale entries from a dependency list?
1029 static bool safe_to_expunge() {
1030   // Since parallel GC threads can concurrently iterate over a dependency
1031   // list during safepoint, it is safe to remove entries only when
1032   // CodeCache lock is held.
1033   return CodeCache_lock->owned_by_self();
1034 }
1035 
< prev index next >