# HG changeset patch # User Matthias Grimmer # Date 1450102039 -3600 # Node ID 9bba3a7b34beb2eb1c39f1b53ca4c072ee5b94ea # Parent ec40768d77a63d09caf87e58c5d5fad31e8ff958 Check foreign arguments when accessing ComplexNumber/Sequence objects diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java Mon Dec 14 15:07:19 2015 +0100 @@ -107,8 +107,8 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumber complex = (ComplexNumber) ForeignAccess.getReceiver(frame); - String identifier = (String) ForeignAccess.getArguments(frame).get(0); - Number value = (Number) ForeignAccess.getArguments(frame).get(1); + String identifier = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); + Number value = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(1)); complex.set(identifier, value.doubleValue()); return value; } @@ -122,7 +122,7 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumber complex = (ComplexNumber) ForeignAccess.getReceiver(frame); - String identifier = (String) ForeignAccess.getArguments(frame).get(0); + String identifier = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); return complex.get(identifier); } diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java Mon Dec 14 15:07:19 2015 +0100 @@ -97,15 +97,15 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); + Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0)); + TruffleObject value = TckLanguage.expectTruffleObject(ForeignAccess.getArguments(frame).get(1)); if (readReal == null || readImag == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); this.readReal = insert(Message.READ.createNode()); this.readImag = insert(Message.READ.createNode()); } - Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); - Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); + Number realPart = TckLanguage.expectNumber(ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER})); + Number imagPart = TckLanguage.expectNumber(ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER})); complexNumbers.reals[index.intValue()] = realPart.doubleValue(); complexNumbers.imags[index.intValue()] = imagPart.doubleValue(); @@ -121,7 +121,7 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); + Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0)); return new ComplexNumberBEntry(complexNumbers, index.intValue()); } @@ -190,7 +190,7 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); + String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { return complexNumber.numbers.imags[complexNumber.index]; } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { @@ -209,8 +209,8 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - Number value = (Number) ForeignAccess.getArguments(frame).get(1); + String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); + Number value = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(1)); if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { complexNumber.numbers.imags[complexNumber.index] = value.doubleValue(); } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java Mon Dec 14 15:07:19 2015 +0100 @@ -90,18 +90,20 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); + Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0)); + TruffleObject value = TckLanguage.expectTruffleObject(ForeignAccess.getArguments(frame).get(1)); if (readReal == null || readImag == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); this.readReal = insert(Message.READ.createNode()); this.readImag = insert(Message.READ.createNode()); } - Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); - Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); + Number realPart = TckLanguage.expectNumber(ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER})); + Number imagPart = TckLanguage.expectNumber(ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER})); - complexNumbers.data[index.intValue() * 2] = realPart.doubleValue(); - complexNumbers.data[index.intValue() * 2 + 1] = imagPart.doubleValue(); + int idx = TckLanguage.checkBounds(index.intValue(), complexNumbers.data.length / 2); + + complexNumbers.data[idx * 2] = realPart.doubleValue(); + complexNumbers.data[idx * 2 + 1] = imagPart.doubleValue(); return value; } } @@ -114,8 +116,9 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - return new ComplexNumberAEntry(complexNumbers, index.intValue()); + Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0)); + int idx = TckLanguage.checkBounds(index.intValue(), complexNumbers.data.length / 2); + return new ComplexNumberAEntry(complexNumbers, idx); } } @@ -181,7 +184,7 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); + String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { return complexNumber.numbers.data[complexNumber.index * 2 + 1]; } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { @@ -200,8 +203,8 @@ @Override public Object execute(VirtualFrame frame) { ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - Number value = (Number) ForeignAccess.getArguments(frame).get(1); + String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); + Number value = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(1)); if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { complexNumber.numbers.data[complexNumber.index * 2 + 1] = value.doubleValue(); } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java Mon Dec 14 15:07:19 2015 +0100 @@ -81,8 +81,9 @@ @Override public Object execute(VirtualFrame frame) { StructuredData data = (StructuredData) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - return new StructuredDataEntry(data.buffer, data.schema, index.intValue()); + Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0)); + int idx = TckLanguage.checkBounds(index.intValue(), data.schema.length()); + return new StructuredDataEntry(data.buffer, data.schema, idx); } } diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java Mon Dec 14 15:07:19 2015 +0100 @@ -81,7 +81,7 @@ @Override public Object execute(VirtualFrame frame) { StructuredDataEntry data = (StructuredDataEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); + String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0)); return data.schema.get(data.buffer, data.index, name); } diff -r ec40768d77a6 -r 9bba3a7b34be truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TckLanguage.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TckLanguage.java Mon Dec 14 14:30:41 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TckLanguage.java Mon Dec 14 15:07:19 2015 +0100 @@ -25,6 +25,7 @@ package com.oracle.truffle.tck; import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLanguage.Env; @@ -38,6 +39,7 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.source.Source; + import java.io.IOException; @TruffleLanguage.Registration(mimeType = "application/x-tck", name = "TCK", version = "1.0") @@ -144,4 +146,37 @@ } } + + public static Number expectNumber(Object o) { + if (o instanceof Number) { + return (Number) o; + } + CompilerDirectives.transferToInterpreter(); + throw new IllegalArgumentException(o + " not a Number"); + } + + public static String expectString(Object o) { + if (o instanceof String) { + return (String) o; + } + CompilerDirectives.transferToInterpreter(); + throw new IllegalArgumentException(o + " not a String"); + } + + public static TruffleObject expectTruffleObject(Object o) { + if (o instanceof TruffleObject) { + return (TruffleObject) o; + } + CompilerDirectives.transferToInterpreter(); + throw new IllegalArgumentException(o + " not a TruffleObject"); + } + + public static int checkBounds(int idx, int size) { + if (idx < 0 || idx >= size) { + CompilerDirectives.transferToInterpreter(); + throw new IndexOutOfBoundsException("Index: " + idx + " Size: " + size); + } + return idx; + } + }