changeset 22499:9bba3a7b34be

Check foreign arguments when accessing ComplexNumber/Sequence objects
author Matthias Grimmer <grimmer@ssw.jku.at>
date Mon, 14 Dec 2015 15:07:19 +0100
parents ec40768d77a6
children fbe1eb7b4172
files truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TckLanguage.java
diffstat 6 files changed, 64 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- 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);
         }
 
--- 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)) {
--- 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)) {
--- 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);
         }
 
     }
--- 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);
         }
 
--- 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;
+    }
+
 }