< prev index next >

src/share/vm/code/nmethod.cpp

Print this page
rev 13052 : 8185334

@@ -2543,36 +2543,39 @@
       m->print_value_on(stream);
       stream->cr();
     }
     if (m.not_null() && !is_osr_method()) {
       ResourceMark rm;
-      int sizeargs = m->size_of_parameters();
-      BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
-      VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
-      {
-        int sig_index = 0;
-        if (!m->is_static())
-          sig_bt[sig_index++] = T_OBJECT; // 'this'
-        for (SignatureStream ss(m->signature()); !ss.at_return_type(); ss.next()) {
+      int sizeargs = 0;
+      BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, 256);
+      VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, 256);
+      Symbol* sig = m->signature();
+      bool has_value_arg = false;
+      if (ValueTypePassFieldsAsArgs && m->adapter()->get_sig_extended() != NULL) {
+        // Use extended signature if value type arguments are passed as fields
+        sig = m->adapter()->get_sig_extended();
+        has_value_arg = true;
+      } else if (!m->is_static()) {
+        sig_bt[sizeargs++] = T_OBJECT; // 'this'
+      }
+      for (SignatureStream ss(sig); !ss.at_return_type(); ss.next()) {
           BasicType t = ss.type();
-          sig_bt[sig_index++] = t;
+        sig_bt[sizeargs++] = t;
           if (type2size[t] == 2) {
-            sig_bt[sig_index++] = T_VOID;
+          sig_bt[sizeargs++] = T_VOID;
           } else {
             assert(type2size[t] == 1, "size is 1 or 2");
           }
         }
-        assert(sig_index == sizeargs, "");
-      }
       const char* spname = "sp"; // make arch-specific?
       intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false);
       int stack_slot_offset = this->frame_size() * wordSize;
       int tab1 = 14, tab2 = 24;
       int sig_index = 0;
-      int arg_index = (m->is_static() ? 0 : -1);
+      int arg_index = ((m->is_static() || has_value_arg) ? 0 : -1);
       bool did_old_sp = false;
-      for (SignatureStream ss(m->signature()); !ss.at_return_type(); ) {
+      for (SignatureStream ss(sig); !ss.at_return_type(); ) {
         bool at_this = (arg_index == -1);
         bool at_old_sp = false;
         BasicType t = (at_this ? T_OBJECT : ss.type());
         assert(t == sig_bt[sig_index], "sigs in sync");
         if (at_this)
< prev index next >