diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java index 6359e94caa2fbf0e94bdf95af98c5b7dc4633ace..818244e964bd14a74c07476e39b4bb09d00706fa 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java @@ -161,8 +161,18 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum return Arguments.create(values, ArgumentsSignature.get(newNames)); } - private ArgumentsSignature cachedVarArgsSignature; - private ArgumentsSignature cachedResultSignature; + private static final class CachedSignature { + private final ArgumentsSignature signature; + private final ArgumentsSignature resultSignature; + + protected CachedSignature(ArgumentsSignature signature, ArgumentsSignature resultSignature) { + this.signature = signature; + this.resultSignature = resultSignature; + } + } + + private CachedSignature cachedVarArgsSignature; + private final BranchProfile regenerateSignatureProfile = BranchProfile.create(); public ArgumentsSignature flattenNames(RArgsValuesAndNames varArgs) { @@ -170,15 +180,15 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum return signature; } ArgumentsSignature varArgsSignature = varArgs.getSignature(); - if (cachedVarArgsSignature == null) { + CachedSignature cached = cachedVarArgsSignature; + if (cached == null) { CompilerDirectives.transferToInterpreter(); } - if (varArgsSignature == cachedVarArgsSignature) { - return cachedResultSignature; + if (cached == null || varArgsSignature != cached.signature) { + regenerateSignatureProfile.enter(); + cachedVarArgsSignature = cached = new CachedSignature(varArgsSignature, flattenNamesInternal(varArgsSignature)); } - regenerateSignatureProfile.enter(); - cachedVarArgsSignature = varArgsSignature; - return cachedResultSignature = flattenNamesInternal(varArgsSignature); + return cached.resultSignature; } @TruffleBoundary