--- a/src/hotspot/share/ci/ciEnv.cpp Wed Jan 31 10:55:49 2018 -0800
+++ b/src/hotspot/share/ci/ciEnv.cpp Fri Sep 08 10:46:46 2017 -0700
@@ -584,8 +584,34 @@
int index = pool_index;
if (cache_index >= 0) {
assert(index < 0, "only one kind of index at a time");
+ index = cpool->object_to_cp_index(cache_index);
oop obj = cpool->resolved_references()->obj_at(cache_index);
if (obj != NULL) {
+ if (obj == Universe::the_null_sentinel()) {
+ return ciConstant(T_OBJECT, get_object(NULL));
+ }
+ BasicType bt = T_OBJECT;
+ if (cpool->tag_at(index).is_dynamic_constant())
+ bt = FieldType::basic_type(cpool->uncached_signature_ref_at(index));
+ if (is_reference_type(bt)) {
+ } else {
+ // we have to unbox the primitive value
+ if (!is_java_primitive(bt)) return ciConstant();
+ jvalue value;
+ BasicType bt2 = java_lang_boxing_object::get_value(obj, &value);
+ assert(bt2 == bt, "");
+ switch (bt2) {
+ case T_DOUBLE: return ciConstant(value.d);
+ case T_FLOAT: return ciConstant(value.f);
+ case T_LONG: return ciConstant(value.j);
+ case T_INT: return ciConstant(bt2, value.i);
+ case T_SHORT: return ciConstant(bt2, value.s);
+ case T_BYTE: return ciConstant(bt2, value.b);
+ case T_CHAR: return ciConstant(bt2, value.c);
+ case T_BOOLEAN: return ciConstant(bt2, value.z);
+ default: return ciConstant();
+ }
+ }
ciObject* ciobj = get_object(obj);
if (ciobj->is_array()) {
return ciConstant(T_ARRAY, ciobj);
@@ -594,7 +620,6 @@
return ciConstant(T_OBJECT, ciobj);
}
}
- index = cpool->object_to_cp_index(cache_index);
}
constantTag tag = cpool->tag_at(index);
if (tag.is_int()) {
@@ -650,6 +675,8 @@
ciSymbol* signature = get_symbol(cpool->method_handle_signature_ref_at(index));
ciObject* ciobj = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
return ciConstant(T_OBJECT, ciobj);
+ } else if (tag.is_dynamic_constant()) {
+ return ciConstant();
} else {
ShouldNotReachHere();
return ciConstant();