comparison truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.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
comparison
equal deleted inserted replaced
22498:ec40768d77a6 22499:9bba3a7b34be
95 @Child private Node readImag; 95 @Child private Node readImag;
96 96
97 @Override 97 @Override
98 public Object execute(VirtualFrame frame) { 98 public Object execute(VirtualFrame frame) {
99 ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); 99 ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame);
100 Number index = (Number) ForeignAccess.getArguments(frame).get(0); 100 Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0));
101 TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); 101 TruffleObject value = TckLanguage.expectTruffleObject(ForeignAccess.getArguments(frame).get(1));
102 if (readReal == null || readImag == null) { 102 if (readReal == null || readImag == null) {
103 CompilerDirectives.transferToInterpreterAndInvalidate(); 103 CompilerDirectives.transferToInterpreterAndInvalidate();
104 this.readReal = insert(Message.READ.createNode()); 104 this.readReal = insert(Message.READ.createNode());
105 this.readImag = insert(Message.READ.createNode()); 105 this.readImag = insert(Message.READ.createNode());
106 } 106 }
107 Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); 107 Number realPart = TckLanguage.expectNumber(ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}));
108 Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); 108 Number imagPart = TckLanguage.expectNumber(ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}));
109 109
110 complexNumbers.reals[index.intValue()] = realPart.doubleValue(); 110 complexNumbers.reals[index.intValue()] = realPart.doubleValue();
111 complexNumbers.imags[index.intValue()] = imagPart.doubleValue(); 111 complexNumbers.imags[index.intValue()] = imagPart.doubleValue();
112 return value; 112 return value;
113 } 113 }
119 } 119 }
120 120
121 @Override 121 @Override
122 public Object execute(VirtualFrame frame) { 122 public Object execute(VirtualFrame frame) {
123 ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); 123 ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame);
124 Number index = (Number) ForeignAccess.getArguments(frame).get(0); 124 Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0));
125 return new ComplexNumberBEntry(complexNumbers, index.intValue()); 125 return new ComplexNumberBEntry(complexNumbers, index.intValue());
126 } 126 }
127 127
128 } 128 }
129 129
188 @Child private Node readImag; 188 @Child private Node readImag;
189 189
190 @Override 190 @Override
191 public Object execute(VirtualFrame frame) { 191 public Object execute(VirtualFrame frame) {
192 ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); 192 ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame);
193 String name = (String) ForeignAccess.getArguments(frame).get(0); 193 String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0));
194 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { 194 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) {
195 return complexNumber.numbers.imags[complexNumber.index]; 195 return complexNumber.numbers.imags[complexNumber.index];
196 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { 196 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) {
197 return complexNumber.numbers.reals[complexNumber.index]; 197 return complexNumber.numbers.reals[complexNumber.index];
198 } else { 198 } else {
207 } 207 }
208 208
209 @Override 209 @Override
210 public Object execute(VirtualFrame frame) { 210 public Object execute(VirtualFrame frame) {
211 ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); 211 ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame);
212 String name = (String) ForeignAccess.getArguments(frame).get(0); 212 String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0));
213 Number value = (Number) ForeignAccess.getArguments(frame).get(1); 213 Number value = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(1));
214 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { 214 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) {
215 complexNumber.numbers.imags[complexNumber.index] = value.doubleValue(); 215 complexNumber.numbers.imags[complexNumber.index] = value.doubleValue();
216 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { 216 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) {
217 complexNumber.numbers.reals[complexNumber.index] = value.doubleValue(); 217 complexNumber.numbers.reals[complexNumber.index] = value.doubleValue();
218 } else { 218 } else {