# HG changeset patch # User Christian Wimmer # Date 1415922082 28800 # Node ID 8971259db8ed9749118d5d39affe15144bbd1f11 # Parent 91283d4a121810599febadebcda993e11a3ef51d Eliminated the need for Signature.getParameterSlots() diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java --- 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 method * descriptor corresponding to this signature. For example: diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineFrameStateBuilder.java --- 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 diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java --- 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)) { diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java --- 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 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; } /** diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- 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); diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java --- 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 diff -r 91283d4a1218 -r 8971259db8ed graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java --- 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(); } };