changeset 18374:8971259db8ed

Eliminated the need for Signature.getParameterSlots()
author Christian Wimmer <christian.wimmer@oracle.com>
date Thu, 13 Nov 2014 15:41:22 -0800
parents 91283d4a1218
children 0866598c927f
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineFrameStateBuilder.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java
diffstat 7 files changed, 39 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java	Thu Nov 13 15:41:22 2014 -0800
@@ -84,15 +84,6 @@
     }
 
     /**
-     * Gets the size, in Java slots, of the parameters to this signature.
-     *
-     * @param withReceiver {@code true} if to add a slot for a receiver object; {@code false} not to
-     *            include the receiver
-     * @return the size of the parameters in slots
-     */
-    int getParameterSlots(boolean withReceiver);
-
-    /**
      * Gets the <a
      * href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.3">method
      * descriptor</a> corresponding to this signature. For example:
--- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineFrameStateBuilder.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineFrameStateBuilder.java	Thu Nov 13 15:41:22 2014 -0800
@@ -32,7 +32,7 @@
 
     public BaselineFrameStateBuilder(ResolvedJavaMethod method) {
         // we always need at least one stack slot (for exceptions)
-        super(method, new Value[method.getMaxLocals()], new Value[Math.max(1, method.getMaxStackSize())], EMPTY_ARRAY);
+        super(method);
     }
 
     protected BaselineFrameStateBuilder(BaselineFrameStateBuilder other) {
@@ -40,8 +40,8 @@
     }
 
     @Override
-    protected Value[] getEmptyArray() {
-        return EMPTY_ARRAY;
+    protected Value[] allocateArray(int length) {
+        return length == 0 ? EMPTY_ARRAY : new Value[length];
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java	Thu Nov 13 15:41:22 2014 -0800
@@ -29,7 +29,6 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.hotspot.*;
-import com.oracle.graal.java.*;
 
 /**
  * Represents a method signature.
@@ -118,15 +117,6 @@
         return Kind.fromTypeString(parameters.get(index));
     }
 
-    @Override
-    public int getParameterSlots(boolean withReceiver) {
-        int argSlots = 0;
-        for (int i = 0; i < getParameterCount(false); i++) {
-            argSlots += HIRFrameStateBuilder.stackSlots(getParameterKind(i));
-        }
-        return argSlots + (withReceiver ? 1 : 0);
-    }
-
     private static boolean checkValidCache(JavaType type, ResolvedJavaType accessingClass) {
         assert accessingClass != null;
         if (!(type instanceof ResolvedJavaType)) {
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java	Thu Nov 13 15:41:22 2014 -0800
@@ -23,8 +23,6 @@
 
 package com.oracle.graal.java;
 
-import java.util.*;
-
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.java.BciBlockMapping.BciBlock;
@@ -43,11 +41,11 @@
      */
     protected boolean rethrowException;
 
-    public AbstractFrameStateBuilder(ResolvedJavaMethod method, T[] l, T[] s, T[] lo) {
+    public AbstractFrameStateBuilder(ResolvedJavaMethod method) {
         this.method = method;
-        this.locals = l;
-        this.stack = s;
-        this.lockedObjects = lo;
+        this.locals = allocateArray(method.getMaxLocals());
+        this.stack = allocateArray(Math.max(1, method.getMaxStackSize()));
+        this.lockedObjects = allocateArray(0);
     }
 
     protected AbstractFrameStateBuilder(S other) {
@@ -55,7 +53,7 @@
         this.stackSize = other.stackSize;
         this.locals = other.locals.clone();
         this.stack = other.stack.clone();
-        this.lockedObjects = other.lockedObjects == getEmptyArray() ? getEmptyArray() : other.lockedObjects.clone();
+        this.lockedObjects = other.lockedObjects.length == 0 ? other.lockedObjects : other.lockedObjects.clone();
         this.rethrowException = other.rethrowException;
 
         assert locals.length == method.getMaxLocals();
@@ -64,7 +62,7 @@
 
     public abstract S copy();
 
-    protected abstract T[] getEmptyArray();
+    protected abstract T[] allocateArray(int length);
 
     public abstract boolean isCompatibleWith(S other);
 
@@ -360,18 +358,22 @@
      *
      * @return an array containing the arguments off of the stack
      */
-    public T[] popArguments(int slotSize, int argSize) {
-        int base = stackSize - slotSize;
-        List<T> r = new ArrayList<>(argSize);
-        int stackindex = 0;
-        while (stackindex < slotSize) {
-            T element = stack[base + stackindex];
-            assert element != null;
-            r.add(element);
-            stackindex += stackSlots(element.getKind());
+    public T[] popArguments(int argSize) {
+        T[] result = allocateArray(argSize);
+        int newStackSize = stackSize;
+        for (int i = argSize - 1; i >= 0; i--) {
+            newStackSize--;
+            if (stack[newStackSize] == null) {
+                /* Two-slot value. */
+                newStackSize--;
+                assert stackSlots(stack[newStackSize].getKind()) == 2;
+            } else {
+                assert stackSlots(stack[newStackSize].getKind()) == 1;
+            }
+            result[i] = stack[newStackSize];
         }
-        stackSize = base;
-        return r.toArray(getEmptyArray());
+        stackSize = newStackSize;
+        return result;
     }
 
     /**
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Thu Nov 13 15:41:22 2014 -0800
@@ -713,7 +713,7 @@
                     if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue()) {
                         handleUnresolvedInvoke(target, InvokeKind.Static);
                     } else {
-                        ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterSlots(false), resolvedTarget.getSignature().getParameterCount(false));
+                        ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false));
                         appendInvoke(InvokeKind.Static, resolvedTarget, args);
                     }
                 } else {
@@ -724,7 +724,7 @@
             @Override
             protected void genInvokeInterface(JavaMethod target) {
                 if (callTargetIsResolved(target)) {
-                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(true), target.getSignature().getParameterCount(true));
+                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
                     appendInvoke(InvokeKind.Interface, (ResolvedJavaMethod) target, args);
                 } else {
                     handleUnresolvedInvoke(target, InvokeKind.Interface);
@@ -738,7 +738,7 @@
                     if (appendix != null) {
                         frameState.apush(ConstantNode.forConstant(appendix, metaAccess, currentGraph));
                     }
-                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(false), target.getSignature().getParameterCount(false));
+                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(false));
                     appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args);
                 } else {
                     handleUnresolvedInvoke(target, InvokeKind.Static);
@@ -760,7 +760,7 @@
                     if (appendix != null) {
                         frameState.apush(ConstantNode.forConstant(appendix, metaAccess, currentGraph));
                     }
-                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(hasReceiver), target.getSignature().getParameterCount(hasReceiver));
+                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(hasReceiver));
                     if (hasReceiver) {
                         appendInvoke(InvokeKind.Virtual, (ResolvedJavaMethod) target, args);
                     } else {
@@ -777,7 +777,7 @@
                 if (callTargetIsResolved(target)) {
                     assert target != null;
                     assert target.getSignature() != null;
-                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(true), target.getSignature().getParameterCount(true));
+                    ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
                     appendInvoke(InvokeKind.Special, (ResolvedJavaMethod) target, args);
                 } else {
                     handleUnresolvedInvoke(target, InvokeKind.Special);
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java	Thu Nov 13 15:41:22 2014 -0800
@@ -45,7 +45,7 @@
     private final StructuredGraph graph;
 
     public HIRFrameStateBuilder(ResolvedJavaMethod method, StructuredGraph graph, boolean eagerResolve) {
-        super(method, new ValueNode[method.getMaxLocals()], new ValueNode[Math.max(1, method.getMaxStackSize())], EMPTY_ARRAY);
+        super(method);
 
         assert graph != null;
 
@@ -87,7 +87,7 @@
         super(other);
         assert other.graph != null;
         graph = other.graph;
-        monitorIds = other.monitorIds == EMPTY_MONITOR_ARRAY ? EMPTY_MONITOR_ARRAY : other.monitorIds.clone();
+        monitorIds = other.monitorIds.length == 0 ? other.monitorIds : other.monitorIds.clone();
 
         assert locals.length == method.getMaxLocals();
         assert stack.length == Math.max(1, method.getMaxStackSize());
@@ -95,8 +95,8 @@
     }
 
     @Override
-    protected ValueNode[] getEmptyArray() {
-        return EMPTY_ARRAY;
+    protected ValueNode[] allocateArray(int length) {
+        return length == 0 ? EMPTY_ARRAY : new ValueNode[length];
     }
 
     @Override
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java	Thu Nov 13 14:56:04 2014 -0800
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java	Thu Nov 13 15:41:22 2014 -0800
@@ -68,20 +68,19 @@
 
     private static final Signature signature = new Signature() {
 
+        @Override
         public JavaType getReturnType(ResolvedJavaType accessingClass) {
             return declaringClass;
         }
 
-        public JavaType getParameterType(int index, ResolvedJavaType accessingClass) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        public int getParameterSlots(boolean withReceiver) {
+        @Override
+        public int getParameterCount(boolean receiver) {
             return 0;
         }
 
-        public int getParameterCount(boolean receiver) {
-            return 0;
+        @Override
+        public JavaType getParameterType(int index, ResolvedJavaType accessingClass) {
+            throw new IndexOutOfBoundsException();
         }
     };