< prev index next >
src/share/vm/ci/ciValueKlass.hpp
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 37,86 ****
// Specialized ciInstanceKlass for value types.
class ciValueKlass : public ciInstanceKlass {
CI_PACKAGE_ACCESS
private:
! // Index fields of a value type, indeces range from 0 to the number of fields of the
! // value type - 1.
! // For each index constructed, _field_index_map records the field's index
! // in InstanceKlass::_fields (i.e., _field_index_map records the value returned by
! // fieldDescriptor::index() for each field).
! GrowableArray<int>* _field_index_map;
protected:
! ciValueKlass(Klass* h_k) : ciInstanceKlass(h_k), _field_index_map(NULL) {
assert(is_final(), "ValueKlass must be final");
};
const char* type_string() { return "ciValueKlass"; }
- int compute_field_index_map();
-
- ValueKlass* get_valueKlass() const {
- return ValueKlass::cast(get_Klass());
- }
public:
bool is_valuetype() const { return true; }
- bool flatten_array() const;
- bool contains_oops() const;
! // Value type fields
! int field_count();
! int field_size();
! int flattened_field_count() {
! return nof_nonstatic_fields();
}
! int field_index_by_offset(int offset);
! int field_offset_by_index(int index);
! ciType* field_type_by_index(int index);
int first_field_offset() const;
int value_arg_slots();
-
- // Can a value type instance of this type be returned as multiple
- // returned values?
- bool can_be_returned_as_fields() const {
- return this != ciEnv::current()->___Value_klass() && get_valueKlass()->return_regs() != NULL;
- }
};
#endif // SHARE_VM_CI_CIVALUEKLASS_HPP
--- 37,78 ----
// Specialized ciInstanceKlass for value types.
class ciValueKlass : public ciInstanceKlass {
CI_PACKAGE_ACCESS
private:
! // Fields declared in the bytecode (without flattened value type fields)
! GrowableArray<ciField*>* _declared_nonstatic_fields;
protected:
! ciValueKlass(Klass* h_k) : ciInstanceKlass(h_k), _declared_nonstatic_fields(NULL) {
assert(is_final(), "ValueKlass must be final");
};
+ int compute_nonstatic_fields();
const char* type_string() { return "ciValueKlass"; }
public:
bool is_valuetype() const { return true; }
! int nof_declared_nonstatic_fields() {
! if (_declared_nonstatic_fields == NULL) {
! compute_nonstatic_fields();
}
! return _declared_nonstatic_fields->length();
! }
!
! // ith non-static declared field (presented by ascending address)
! ciField* declared_nonstatic_field_at(int i) {
! assert(_declared_nonstatic_fields != NULL, "should be initialized");
! return _declared_nonstatic_fields->at(i);
! }
!
! // Value type fields
int first_field_offset() const;
+ int field_index_by_offset(int offset);
+ bool flatten_array() const;
+ bool can_be_returned_as_fields() const;
int value_arg_slots();
};
#endif // SHARE_VM_CI_CIVALUEKLASS_HPP
< prev index next >