< prev index next >
src/share/vm/ci/ciValueKlass.cpp
Print this page
*** 24,60 ****
#include "ci/ciField.hpp"
#include "ci/ciValueKlass.hpp"
#include "oops/valueKlass.hpp"
! int ciValueKlass::get_field_index_by_offset(int offset) {
! // TODO do we need handles here?
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
methodHandle factory_h(vklass_h->factory_method());
! // Search field with field_offset and return factory parameter index
! for (int index = 0; index < field_count(); ++index) {
! if (get_field_offset_by_index(index) == offset) {
! return index;
}
}
! ShouldNotReachHere();
! return -1;
}
int ciValueKlass::get_field_offset_by_index(int index) const {
// Compute the field index from the factory parameter index
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
methodHandle factory_h(vklass_h->factory_method());
int field_index = factory_h->constMethod()->valuefactory_parameter_mapping_start()[index].data.field_index;
// Get the field offset
return vklass_h->field_offset(field_index);
}
! BasicType ciValueKlass::get_field_type_by_index(int index) const {
! // Compute the field index from the factory parameter index
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
! methodHandle factory_h(vklass_h->factory_method());
! int field_index = factory_h->constMethod()->valuefactory_parameter_mapping_start()[index].data.field_index;
! // Get the basic type of the field
! Symbol* signature = vklass_h->field_signature(field_index);
! return vmSymbols::signature_type(signature);
}
--- 24,92 ----
#include "ci/ciField.hpp"
#include "ci/ciValueKlass.hpp"
#include "oops/valueKlass.hpp"
! // Number of value type factory parameters
! int ciValueKlass::param_count() const {
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
methodHandle factory_h(vklass_h->factory_method());
! return factory_h->constMethod()->valuefactory_parameter_mapping_length();
! }
!
! // Size of value type factory parameters in words
! int ciValueKlass::param_size() {
! int size = 0;
! for (int i = 0; i < param_count(); ++i) {
! size += get_field_type_by_index(i)->size();
! }
! return size;
! }
!
! // Returns the value factory parameter index of the field with the given offset.
! // If the field at 'offset' belongs to a flattened value type field, return the
! // index of the ValueType parameter corresponding to this flattened value type.
! int ciValueKlass::get_field_index_by_offset(int offset) {
! assert(contains_field_offset(offset), "invalid field offset");
! int best_offset = 0;
! int best_index = -1;
! // Search the field with the given offset
! for (int i = 0; i < param_count(); ++i) {
! int field_offset = get_field_offset_by_index(i);
! if (field_offset == offset) {
! // Exact match
! return i;
! } else if (field_offset < offset && field_offset > best_offset) {
! // No exact match. Save the index of the field with the closest offset that
! // is smaller than the given field offset. This index corresponds to the
! // flattened value type field that holds the field we are looking for.
! best_offset = field_offset;
! best_index = i;
}
}
! assert(best_index >= 0, "field not found");
! assert(best_offset == offset || get_field_type_by_index(best_index)->is_valuetype(), "offset should match for non-VTs");
! return best_index;
}
+ // Returns the field offset of the value factory parameter with the given index
int ciValueKlass::get_field_offset_by_index(int index) const {
// Compute the field index from the factory parameter index
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
methodHandle factory_h(vklass_h->factory_method());
int field_index = factory_h->constMethod()->valuefactory_parameter_mapping_start()[index].data.field_index;
// Get the field offset
return vklass_h->field_offset(field_index);
}
! // Returns the field type of the value factory parameter with the given index
! ciType* ciValueKlass::get_field_type_by_index(int index) {
! int offset = get_field_offset_by_index(index);
! VM_ENTRY_MARK;
! return get_field_type_by_offset(offset);
! }
!
! // Offset of the first field in the value type
! int ciValueKlass::get_first_field_offset() const {
valueKlassHandle vklass_h(ValueKlass::cast(get_Klass()));
! return vklass_h()->first_field_offset();
}
< prev index next >