/* * Copyright (c) 2012, 2012, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.oracle.truffle.api.dsl.test; import org.junit.Assert; import org.junit.Test; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.dsl.test.ExpressionOrderTestFactory.ExpressionOrderTest1NodeGen; import com.oracle.truffle.api.dsl.test.examples.ExampleTypes; import com.oracle.truffle.api.nodes.Node; public class ExpressionOrderTest { @SuppressWarnings("unused") @TypeSystemReference(ExampleTypes.class) public abstract static class ExpressionOrderTest1 extends Node { abstract boolean execute(Object value); @Specialization(guards = {"guard1(value)", "cacheGuard1(cache1)", "guard2(value)", "cacheGuard2(cache2)"}, // assumptions = {"assumptionInitializer1(cache3)", "assumptionInitializer2()"}) boolean s0(boolean value, @Cached("cacheInitializer1(value)") int cache1, @Cached("cacheInitializer2(value)") int cache2, @Cached("cacheInitializer3(value)") int cache3, @Cached("cacheInitializer4(value)") int cache4) { Assert.assertEquals(1, cache1); Assert.assertEquals(2, cache2); Assert.assertEquals(3, cache3); Assert.assertEquals(4, cache4); return value; } private boolean[] visitedFlags = new boolean[10]; private void assertOrder(int orderIndex) { for (int i = 0; i < orderIndex; i++) { Assert.assertTrue(String.valueOf(i), visitedFlags[i]); } for (int i = orderIndex; i < visitedFlags.length; i++) { Assert.assertFalse(String.valueOf(i), visitedFlags[i]); } visitedFlags[orderIndex] = true; } protected boolean guard1(boolean value) { assertOrder(0); return true; } protected int cacheInitializer1(boolean value) { assertOrder(1); return 1; } protected boolean cacheGuard1(int value) { assertOrder(2); Assert.assertEquals(1, value); return true; } protected boolean guard2(boolean value) { assertOrder(3); return true; } protected int cacheInitializer2(boolean value) { assertOrder(4); return 2; } protected boolean cacheGuard2(int value) { assertOrder(5); Assert.assertEquals(2, value); return true; } protected int cacheInitializer3(boolean value) { assertOrder(6); return 3; } protected Assumption assumptionInitializer1(int boo) { assertOrder(7); Assert.assertEquals(3, boo); return Truffle.getRuntime().createAssumption(); } protected Assumption assumptionInitializer2() { assertOrder(8); return Truffle.getRuntime().createAssumption(); } protected int cacheInitializer4(boolean boo) { assertOrder(9); return 4; } } @Test public void testExpressionOrder() { ExpressionOrderTest1 test = ExpressionOrderTest1NodeGen.create(); Assert.assertTrue(test.execute(true)); } }