diff truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java @ 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 b3569a53c24c
children 89db2519ef18
line wrap: on
line diff
--- 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)) {