< prev index next >

src/hotspot/share/runtime/sharedRuntime.cpp

Print this page

        

@@ -2291,11 +2291,14 @@
       case T_VALUETYPE: {
         // If value types are passed as fields, return 'in' to differentiate
         // between a T_VALUETYPE and a T_OBJECT in the signature.
         return ValueTypePassFieldsAsArgs ? in : adapter_encoding(T_OBJECT, false);
       }
+
       case T_VALUETYPEPTR:
+        return T_VALUETYPE; // TODO hack because we don't have enough bits to represent T_VALUETYPEPTR.
+
       case T_OBJECT:
       case T_ARRAY:
         // In other words, we assume that any register good enough for
         // an int or long is good enough for a managed pointer.
 #ifdef _LP64

@@ -2673,12 +2676,12 @@
         } else {
           sig_extended.push(SigEntry(T_OBJECT));
         }
       }
       for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
-        if (ss.type() == T_VALUETYPE) {
-          Symbol* name = ss.as_symbol(CHECK_NULL);
+        Symbol* sym = ss.as_symbol_or_null();
+        if (sym != NULL && method->method_holder()->is_declared_value_type(sym)) {
           if (!ValueTypePassFieldsAsArgs) {
             sig_extended.push(SigEntry(T_VALUETYPEPTR));
           } else {
             // Method handle intrinsics with a __Value argument may be created during
             // compilation. Only do a full system dictionary lookup if the argument name
< prev index next >