/*
* Copyright (c) 2012, 2013, 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.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import com.oracle.truffle.api.Assumption;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.FrameSlotKind;
import com.oracle.truffle.api.frame.FrameSlotTypeException;
import com.oracle.truffle.api.frame.VirtualFrame;
public class FrameDescriptorTest {
private FrameSlot s1;
private FrameSlot s2;
private FrameSlot s3;
@Test
public void localsDefaultValue() throws Exception {
Object defaultValue = "default";
FrameDescriptor d = new FrameDescriptor(defaultValue);
s1 = d.addFrameSlot("v1");
s2 = d.addFrameSlot("v2");
s3 = d.addFrameSlot("v3");
VirtualFrame f = Truffle.getRuntime().createVirtualFrame(new Object[]{1, 2}, d);
assertFrame(f, d);
assertFrame(f.materialize(), d);
}
private void assertFrame(Frame f, FrameDescriptor d) throws FrameSlotTypeException {
assertEquals("Three slots", 3, d.getSize());
assertEquals("Three slots list", 3, d.getSlots().size());
assertEquals("1st slot", d.getSlots().get(0), s1);
assertEquals("2nd slot", d.getSlots().get(1), s2);
assertEquals("3rd slot", d.getSlots().get(2), s3);
assertEquals("default", f.getObject(s1));
assertEquals("default", f.getObject(s2));
f.setInt(s3, (int) f.getArguments()[0]);
assertEquals(1, f.getInt(s3));
}
@Test
public void nullDefaultValue() {
assertNull(new FrameDescriptor().getDefaultValue());
}
@Test
public void copy() throws Exception {
Object defaultValue = "default";
FrameDescriptor d = new FrameDescriptor(defaultValue);
s1 = d.addFrameSlot("v1", "i1", FrameSlotKind.Boolean);
s2 = d.addFrameSlot("v2", "i2", FrameSlotKind.Float);
assertEquals(2, d.getSize());
assertEquals(d.getSlots().get(1).getInfo(), "i2");
assertEquals(d.getSlots().get(1).getKind(), FrameSlotKind.Float);
assertEquals(d.getSlots().get(1).getIndex(), 1);
FrameDescriptor copy = d.copy();
assertEquals(2, copy.getSize());
assertEquals(1, copy.getSlots().get(1).getIndex());
assertEquals("Info is copied", "i2", copy.getSlots().get(1).getInfo());
assertEquals("Kind isn't copied", FrameSlotKind.Illegal, copy.getSlots().get(1).getKind());
}
@Test
public void shallowCopy() {
Object defaultValue = "default";
FrameDescriptor d = new FrameDescriptor(defaultValue);
s1 = d.addFrameSlot("v1", "i1", FrameSlotKind.Boolean);
s2 = d.addFrameSlot("v2", "i2", FrameSlotKind.Float);
assertEquals(2, d.getSize());
final FrameSlot first = d.getSlots().get(1);
assertEquals(first.getInfo(), "i2");
assertEquals(first.getKind(), FrameSlotKind.Float);
assertEquals(first.getIndex(), 1);
FrameDescriptor copy = d.shallowCopy();
assertEquals(2, copy.getSize());
final FrameSlot firstCopy = copy.getSlots().get(1);
assertEquals("Info is copied", firstCopy.getInfo(), "i2");
assertEquals("Kind is copied", firstCopy.getKind(), FrameSlotKind.Float);
assertEquals(firstCopy.getIndex(), 1);
firstCopy.setKind(FrameSlotKind.Int);
assertEquals("Kind is changed", firstCopy.getKind(), FrameSlotKind.Int);
assertEquals("Kind is changed in original too!", first.getKind(), FrameSlotKind.Int);
}
@Test
public void version() {
FrameDescriptor d = new FrameDescriptor();
s1 = d.addFrameSlot("v1", "i1", FrameSlotKind.Boolean);
s2 = d.addFrameSlot("v2", "i2", FrameSlotKind.Float);
Assumption version;
version = d.getVersion();
assertTrue(version.isValid());
// add slot
s3 = d.addFrameSlot("v3", "i3", FrameSlotKind.Int);
assertEquals(3, d.getSize());
assertFalse(version.isValid());
version = d.getVersion();
assertTrue(version.isValid());
assertSame("1st slot", s1, d.getSlots().get(0));
assertSame("2nd slot", s2, d.getSlots().get(1));
assertSame("3rd slot", s3, d.getSlots().get(2));
// change kind
s3.setKind(FrameSlotKind.Object);
assertFalse(version.isValid());
version = d.getVersion();
assertTrue(version.isValid());
// remove slot
d.removeFrameSlot("v3");
assertEquals(2, d.getSize());
assertFalse(version.isValid());
version = d.getVersion();
assertTrue(version.isValid());
}
@Test
public void notInFrameAssumption() {
FrameDescriptor d = new FrameDescriptor();
Assumption[] ass = new Assumption[]{d.getNotInFrameAssumption("v1"), d.getNotInFrameAssumption("v2"), d.getNotInFrameAssumption("v3")};
assertTrue(ass[0].isValid());
assertTrue(ass[1].isValid());
assertTrue(ass[2].isValid());
s1 = d.addFrameSlot("v1", "i1", FrameSlotKind.Boolean);
assertFalse(ass[0].isValid());
assertTrue(ass[1].isValid());
assertTrue(ass[2].isValid());
s2 = d.addFrameSlot("v2", "i2", FrameSlotKind.Float);
assertFalse(ass[0].isValid());
assertFalse(ass[1].isValid());
assertTrue(ass[2].isValid());
s3 = d.addFrameSlot("v3", "i3", FrameSlotKind.Int);
assertFalse(ass[0].isValid());
assertFalse(ass[1].isValid());
assertFalse(ass[2].isValid());
for (String identifier : new String[]{"v1", "v2", "v3"}) {
try {
d.getNotInFrameAssumption(identifier);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
d.getNotInFrameAssumption("v4");
}
}