Mercurial > hg > graal-compiler
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 |