# HG changeset patch # User Lukas Stadler # Date 1422397180 -3600 # Node ID 48b79b8e18f1fcd9174cfdca8e49ac1fc3b4ff3b # Parent ae0eb836e6f4e4224bd9874863043e334e8131d4 fix TruffleBoundary usage in SLCallUntilOptimizedBuiltin diff -r ae0eb836e6f4 -r 48b79b8e18f1 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java Tue Jan 27 23:14:40 2015 +0100 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java Tue Jan 27 23:19:40 2015 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,8 @@ import java.util.concurrent.*; import com.oracle.graal.truffle.*; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; @@ -49,29 +49,43 @@ @Child private IndirectCallNode indirectCall = Truffle.getRuntime().createIndirectCallNode(); @Specialization - @TruffleBoundary public SLFunction callUntilCompiled(VirtualFrame frame, SLFunction function) { OptimizedCallTarget target = ((OptimizedCallTarget) function.getCallTarget()); for (int i = 0; i < MAX_CALLS; i++) { - if (((GraalTruffleRuntime) Truffle.getRuntime()).isCompiling(target) || target.isValid()) { + if (isCompiling(target)) { break; } else { indirectCall.call(frame, target, EMPTY_ARGS); } } + waitForCompilation(target); + + // call one more in compiled + indirectCall.call(frame, target, EMPTY_ARGS); + + checkTarget(target); + + return function; + } + + @TruffleBoundary + private static void checkTarget(OptimizedCallTarget target) throws SLAssertionError { + if (!target.isValid()) { + throw new SLAssertionError("Function " + target + " invalidated."); + } + } + + @TruffleBoundary + private static void waitForCompilation(OptimizedCallTarget target) { try { ((GraalTruffleRuntime) Truffle.getRuntime()).waitForCompilation(target, 640000); } catch (ExecutionException | TimeoutException e) { throw new RuntimeException(e); } - - // call one more in compiled - indirectCall.call(frame, target, EMPTY_ARGS); + } - if (!target.isValid()) { - throw new SLAssertionError("Function " + target + " invalidated."); - } - - return function; + @TruffleBoundary + private static boolean isCompiling(OptimizedCallTarget target) { + return ((GraalTruffleRuntime) Truffle.getRuntime()).isCompiling(target) || target.isValid(); } }