RFR (S): make lookupConstantInPool use ConstantPool logic

Christian Thalinger christian.thalinger at oracle.com
Mon May 6 14:31:35 PDT 2013


On May 6, 2013, at 2:28 PM, Doug Simon <doug.simon at oracle.com> wrote:

> Looks good to me.
> 
> Not sure why we never used tag.value() in the first place - probably just another bit of HotSpot internal API we weren't aware of.

Probably.  As I said, I will keep my eyes open and send patches.

At least the 292 stuff gets into shape.  Thanks for the review.

-- Chris

> 
> -Doug
> 
> On May 6, 2013, at 11:24 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
> 
>> This change uses the ConstantPool logic to do the lookups.  It also implements missing constant pool types like JVM_CONSTANT_MethodHandle and JVM_CONSTANT_MethodType.
>> 
>> test.java.lang.invoke.InvokeDynamicPrintArgs can now be run like:
>> 
>> $ java -XX:-BootstrapGraal -Xcomp -XX:CompileCommand=compileonly,test.java.lang.invoke.*::* -XX:+PrintCompilation -cp test/java/lang/invoke/:. indify.Indify --java test.java.lang.invoke.InvokeDynamicPrintArgs
>> 
>> -- Chris
>> 
>> diff --git a/src/share/vm/graal/graalCompilerToVM.cpp b/src/share/vm/graal/graalCompilerToVM.cpp
>> --- a/src/share/vm/graal/graalCompilerToVM.cpp
>> +++ b/src/share/vm/graal/graalCompilerToVM.cpp
>> @@ -391,35 +391,52 @@
>> 
>>  oop result = NULL;
>>  constantTag tag = cp->tag_at(index);
>> -  if (tag.is_int()) {
>> -    result = VMToCompiler::createConstant(Kind::Int(), cp->int_at(index), CHECK_0);
>> -  } else if (tag.is_long()) {
>> -    result = VMToCompiler::createConstant(Kind::Long(), cp->long_at(index), CHECK_0);
>> -  } else if (tag.is_float()) {
>> -    result = VMToCompiler::createConstantFloat(cp->float_at(index), CHECK_0);
>> -  } else if (tag.is_double()) {
>> -    result = VMToCompiler::createConstantDouble(cp->double_at(index), CHECK_0);
>> -  } else if (tag.is_string()) {
>> -    oop string = NULL;
>> -    if (cp->is_pseudo_string_at(index)) {
>> -      int obj_index = cp->cp_to_object_index(index);
>> -      string = cp->pseudo_string_at(index, obj_index);
>> -    } else {
>> -      string = cp->string_at(index, THREAD);
>> -      if (HAS_PENDING_EXCEPTION) {
>> -        CLEAR_PENDING_EXCEPTION;
>> -        // TODO: Gracefully exit compilation.
>> -        fatal("out of memory during compilation!");
>> -        return NULL;
>> -      }
>> +
>> +  switch (tag.value()) {
>> +  case JVM_CONSTANT_Integer:
>> +    result = VMToCompiler::createConstant(Kind::Int(), cp->int_at(index), CHECK_NULL);
>> +    break;
>> +
>> +  case JVM_CONSTANT_Long:
>> +    result = VMToCompiler::createConstant(Kind::Long(), cp->long_at(index), CHECK_NULL);
>> +    break;
>> +
>> +  case JVM_CONSTANT_Float:
>> +    result = VMToCompiler::createConstantFloat(cp->float_at(index), CHECK_NULL);
>> +    break;
>> +
>> +  case JVM_CONSTANT_Double:
>> +    result = VMToCompiler::createConstantDouble(cp->double_at(index), CHECK_NULL);
>> +    break;
>> +
>> +  case JVM_CONSTANT_Class:
>> +  case JVM_CONSTANT_UnresolvedClass:
>> +  case JVM_CONSTANT_UnresolvedClassInError:
>> +    {
>> +      Handle type = GraalCompiler::get_JavaType(cp, index, cp->pool_holder(), CHECK_NULL);
>> +      result = type();
>> +      break;
>>    }
>> -    result = VMToCompiler::createConstantObject(string, CHECK_0);
>> -  } else if (tag.is_klass() || tag.is_unresolved_klass()) {
>> -    Handle type = GraalCompiler::get_JavaType(cp, index, cp->pool_holder(), CHECK_NULL);
>> -    result = type();
>> -  } else {
>> -    tty->print("unknown constant pool tag (%s) at cpi %d in %s: ", tag.internal_name(), index, cp->pool_holder()->name()->as_C_string());
>> -    ShouldNotReachHere();
>> +
>> +  case JVM_CONSTANT_String:
>> +    {
>> +      oop result_oop = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL);
>> +      result = VMToCompiler::createConstantObject(result_oop, CHECK_NULL);
>> +      break;
>> +    }
>> +
>> +  case JVM_CONSTANT_MethodHandle:
>> +  case JVM_CONSTANT_MethodHandleInError:
>> +  case JVM_CONSTANT_MethodType:
>> +  case JVM_CONSTANT_MethodTypeInError:
>> +    {
>> +      oop result_oop = cp->resolve_constant_at(index, CHECK_NULL);
>> +      result = VMToCompiler::createConstantObject(result_oop, CHECK_NULL);
>> +      break;
>> +    }
>> +
>> +  default:
>> +    fatal(err_msg_res("unknown constant pool tag %s at cpi %d in %s", tag.internal_name(), index, cp->pool_holder()->name()->as_C_string()));
>>  }
>> 
>>  return JNIHandles::make_local(THREAD, result);
>> 
> 



More information about the graal-dev mailing list