Mercurial > hg > truffle
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 { |