comparison 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
comparison
equal deleted inserted replaced
22498:ec40768d77a6 22499:9bba3a7b34be
88 @Child private Node readImag; 88 @Child private Node readImag;
89 89
90 @Override 90 @Override
91 public Object execute(VirtualFrame frame) { 91 public Object execute(VirtualFrame frame) {
92 ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); 92 ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame);
93 Number index = (Number) ForeignAccess.getArguments(frame).get(0); 93 Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0));
94 TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); 94 TruffleObject value = TckLanguage.expectTruffleObject(ForeignAccess.getArguments(frame).get(1));
95 if (readReal == null || readImag == null) { 95 if (readReal == null || readImag == null) {
96 CompilerDirectives.transferToInterpreterAndInvalidate(); 96 CompilerDirectives.transferToInterpreterAndInvalidate();
97 this.readReal = insert(Message.READ.createNode()); 97 this.readReal = insert(Message.READ.createNode());
98 this.readImag = insert(Message.READ.createNode()); 98 this.readImag = insert(Message.READ.createNode());
99 } 99 }
100 Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); 100 Number realPart = TckLanguage.expectNumber(ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}));
101 Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); 101 Number imagPart = TckLanguage.expectNumber(ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}));
102 102
103 complexNumbers.data[index.intValue() * 2] = realPart.doubleValue(); 103 int idx = TckLanguage.checkBounds(index.intValue(), complexNumbers.data.length / 2);
104 complexNumbers.data[index.intValue() * 2 + 1] = imagPart.doubleValue(); 104
105 complexNumbers.data[idx * 2] = realPart.doubleValue();
106 complexNumbers.data[idx * 2 + 1] = imagPart.doubleValue();
105 return value; 107 return value;
106 } 108 }
107 } 109 }
108 110
109 private static class ComplexNumbersAReadNode extends RootNode { 111 private static class ComplexNumbersAReadNode extends RootNode {
112 } 114 }
113 115
114 @Override 116 @Override
115 public Object execute(VirtualFrame frame) { 117 public Object execute(VirtualFrame frame) {
116 ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); 118 ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame);
117 Number index = (Number) ForeignAccess.getArguments(frame).get(0); 119 Number index = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(0));
118 return new ComplexNumberAEntry(complexNumbers, index.intValue()); 120 int idx = TckLanguage.checkBounds(index.intValue(), complexNumbers.data.length / 2);
121 return new ComplexNumberAEntry(complexNumbers, idx);
119 } 122 }
120 } 123 }
121 124
122 private static class ComplexNumbersASizeNode extends RootNode { 125 private static class ComplexNumbersASizeNode extends RootNode {
123 protected ComplexNumbersASizeNode() { 126 protected ComplexNumbersASizeNode() {
179 @Child private Node readImag; 182 @Child private Node readImag;
180 183
181 @Override 184 @Override
182 public Object execute(VirtualFrame frame) { 185 public Object execute(VirtualFrame frame) {
183 ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); 186 ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame);
184 String name = (String) ForeignAccess.getArguments(frame).get(0); 187 String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0));
185 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { 188 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) {
186 return complexNumber.numbers.data[complexNumber.index * 2 + 1]; 189 return complexNumber.numbers.data[complexNumber.index * 2 + 1];
187 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { 190 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) {
188 return complexNumber.numbers.data[complexNumber.index * 2]; 191 return complexNumber.numbers.data[complexNumber.index * 2];
189 } else { 192 } else {
198 } 201 }
199 202
200 @Override 203 @Override
201 public Object execute(VirtualFrame frame) { 204 public Object execute(VirtualFrame frame) {
202 ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); 205 ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame);
203 String name = (String) ForeignAccess.getArguments(frame).get(0); 206 String name = TckLanguage.expectString(ForeignAccess.getArguments(frame).get(0));
204 Number value = (Number) ForeignAccess.getArguments(frame).get(1); 207 Number value = TckLanguage.expectNumber(ForeignAccess.getArguments(frame).get(1));
205 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { 208 if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) {
206 complexNumber.numbers.data[complexNumber.index * 2 + 1] = value.doubleValue(); 209 complexNumber.numbers.data[complexNumber.index * 2 + 1] = value.doubleValue();
207 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { 210 } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) {
208 complexNumber.numbers.data[complexNumber.index * 2] = value.doubleValue(); 211 complexNumber.numbers.data[complexNumber.index * 2] = value.doubleValue();
209 } else { 212 } else {