< prev index next >

src/share/vm/opto/doCall.cpp

Print this page

        

@@ -36,10 +36,11 @@
 #include "opto/mulnode.hpp"
 #include "opto/parse.hpp"
 #include "opto/rootnode.hpp"
 #include "opto/runtime.hpp"
 #include "opto/subnode.hpp"
+#include "opto/valuetypenode.hpp"
 #include "prims/nativeLookup.hpp"
 #include "runtime/sharedRuntime.hpp"
 
 void trace_type_profile(Compile* C, ciMethod *method, int depth, int bci, ciMethod *prof_method, ciKlass *prof_klass, int site_count, int receiver_count) {
   if (TraceTypeProfile || C->print_inlining()) {

@@ -655,10 +656,25 @@
               Node* retnode = pop();
               Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
               push(cast_obj);
             }
           }
+        } else if (rt == T_VALUETYPE) {
+          assert(ct == T_VALUETYPE, "value type expected but got rt=%s, ct=%s", type2name(rt), type2name(ct));
+          if (rtype == C->env()->___Value_klass()) {
+            const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
+            Node* retnode = pop();
+            Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
+            Node* vt = ValueTypeNode::make(_gvn, merged_memory(), cast);
+            push(vt);
+          } else {
+            assert(ctype == C->env()->___Value_klass(), "unexpected value type klass");
+            Node* retnode = pop();
+            assert(retnode->is_ValueType(), "inconsistent");
+            retnode = retnode->as_ValueType()->store_to_memory(this);
+            push(retnode);
+          }
         } else {
           assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
           // push a zero; it's better than getting an oop/int mismatch
           pop_node(rt);
           Node* retnode = zerocon(ct);
< prev index next >