comparison src/share/vm/oops/methodOop.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents 541929da62d2
children 018d5b58dd4f
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
428 428
429 429
430 bool methodOopDesc::is_accessor() const { 430 bool methodOopDesc::is_accessor() const {
431 if (code_size() != 5) return false; 431 if (code_size() != 5) return false;
432 if (size_of_parameters() != 1) return false; 432 if (size_of_parameters() != 1) return false;
433 if (Bytecodes::java_code_at(code_base()+0) != Bytecodes::_aload_0 ) return false; 433 methodOop m = (methodOop)this; // pass to code_at() to avoid method_from_bcp
434 if (Bytecodes::java_code_at(code_base()+1) != Bytecodes::_getfield) return false; 434 if (Bytecodes::java_code_at(code_base()+0, m) != Bytecodes::_aload_0 ) return false;
435 Bytecodes::Code ret_bc = Bytecodes::java_code_at(code_base()+4); 435 if (Bytecodes::java_code_at(code_base()+1, m) != Bytecodes::_getfield) return false;
436 if (Bytecodes::java_code_at(code_base()+4) != Bytecodes::_areturn && 436 if (Bytecodes::java_code_at(code_base()+4, m) != Bytecodes::_areturn &&
437 Bytecodes::java_code_at(code_base()+4) != Bytecodes::_ireturn ) return false; 437 Bytecodes::java_code_at(code_base()+4, m) != Bytecodes::_ireturn ) return false;
438 return true; 438 return true;
439 } 439 }
440 440
441 441
442 bool methodOopDesc::is_initializer() const { 442 bool methodOopDesc::is_initializer() const {
953 953
954 954
955 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array 955 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
956 static void reorder_based_on_method_index(objArrayOop methods, 956 static void reorder_based_on_method_index(objArrayOop methods,
957 objArrayOop annotations, 957 objArrayOop annotations,
958 oop* temp_array) { 958 GrowableArray<oop>* temp_array) {
959 if (annotations == NULL) { 959 if (annotations == NULL) {
960 return; 960 return;
961 } 961 }
962 962
963 int length = methods->length(); 963 int length = methods->length();
964 int i; 964 int i;
965 // Copy to temp array 965 // Copy to temp array
966 memcpy(temp_array, annotations->obj_at_addr(0), length * sizeof(oop)); 966 temp_array->clear();
967 for (i = 0; i < length; i++) {
968 temp_array->append(annotations->obj_at(i));
969 }
967 970
968 // Copy back using old method indices 971 // Copy back using old method indices
969 for (i = 0; i < length; i++) { 972 for (i = 0; i < length; i++) {
970 methodOop m = (methodOop) methods->obj_at(i); 973 methodOop m = (methodOop) methods->obj_at(i);
971 annotations->obj_at_put(i, temp_array[m->method_idnum()]); 974 annotations->obj_at_put(i, temp_array->at(m->method_idnum()));
972 } 975 }
973 } 976 }
974 977
975 978
976 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array 979 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
995 } 998 }
996 } 999 }
997 1000
998 // Use a simple bubble sort for small number of methods since 1001 // Use a simple bubble sort for small number of methods since
999 // qsort requires a functional pointer call for each comparison. 1002 // qsort requires a functional pointer call for each comparison.
1000 if (length < 8) { 1003 if (UseCompressedOops || length < 8) {
1001 bool sorted = true; 1004 bool sorted = true;
1002 for (int i=length-1; i>0; i--) { 1005 for (int i=length-1; i>0; i--) {
1003 for (int j=0; j<i; j++) { 1006 for (int j=0; j<i; j++) {
1004 methodOop m1 = (methodOop)methods->obj_at(j); 1007 methodOop m1 = (methodOop)methods->obj_at(j);
1005 methodOop m2 = (methodOop)methods->obj_at(j+1); 1008 methodOop m2 = (methodOop)methods->obj_at(j+1);
1008 methods->obj_at_put(j+1, m1); 1011 methods->obj_at_put(j+1, m1);
1009 sorted = false; 1012 sorted = false;
1010 } 1013 }
1011 } 1014 }
1012 if (sorted) break; 1015 if (sorted) break;
1013 sorted = true; 1016 sorted = true;
1014 } 1017 }
1015 } else { 1018 } else {
1019 // XXX This doesn't work for UseCompressedOops because the compare fn
1020 // will have to decode the methodOop anyway making it not much faster
1021 // than above.
1016 compareFn compare = (compareFn) (idempotent ? method_compare_idempotent : method_compare); 1022 compareFn compare = (compareFn) (idempotent ? method_compare_idempotent : method_compare);
1017 qsort(methods->obj_at_addr(0), length, oopSize, compare); 1023 qsort(methods->base(), length, heapOopSize, compare);
1018 } 1024 }
1019 1025
1020 // Sort annotations if necessary 1026 // Sort annotations if necessary
1021 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), ""); 1027 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), "");
1022 assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), ""); 1028 assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), "");
1023 assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), ""); 1029 assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), "");
1024 if (do_annotations) { 1030 if (do_annotations) {
1031 ResourceMark rm;
1025 // Allocate temporary storage 1032 // Allocate temporary storage
1026 oop* temp_array = NEW_RESOURCE_ARRAY(oop, length); 1033 GrowableArray<oop>* temp_array = new GrowableArray<oop>(length);
1027 reorder_based_on_method_index(methods, methods_annotations, temp_array); 1034 reorder_based_on_method_index(methods, methods_annotations, temp_array);
1028 reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array); 1035 reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array);
1029 reorder_based_on_method_index(methods, methods_default_annotations, temp_array); 1036 reorder_based_on_method_index(methods, methods_default_annotations, temp_array);
1030 } 1037 }
1031 1038