History

Fixed exceptions/endian issues with DataViews

Atlante45 committed 12 years ago

Commit 28438d61 parent 49302b23 files · +68 −21Browse files

Showing the changes to libraries/script-engine/src/DataViewPrototype.cpp (1 of 3 files). Show all

Unified · Split

libraries/script-engine/src/DataViewPrototype.cpp+47−17
@@ -29,10 +29,10 @@ QByteArray* DataViewPrototype::thisArrayBuffer() const { · 28 unmodified lines
2929 bool DataViewPrototype::realOffset(quint32& offset, size_t size) const {
3030 quint32 viewOffset = thisObject().data().property(BYTE_OFFSET_PROPERTY_NAME).toInt32();
3131 quint32 viewLength = thisObject().data().property(BYTE_LENGTH_PROPERTY_NAME).toInt32();
32− qDebug() << "View Offset: " << viewOffset << ", View Lenght: " << viewLength;
33− qDebug() << "Offset: " << offset << ", Size: " << size;
32+ //qDebug() << "View Offset: " << viewOffset << ", View Lenght: " << viewLength;
33+ //qDebug() << "Offset: " << offset << ", Size: " << size;
3434 offset += viewOffset;
35− qDebug() << "New offset: " << offset << ", bool: " << ((offset + size) <= viewOffset + viewLength);
35+ //qDebug() << "New offset: " << offset << ", bool: " << ((offset + size) <= viewOffset + viewLength);
3636 return (offset + size) <= viewOffset + viewLength;
3737 }
3838
@@ -47,7 +47,8 @@ qint32 DataViewPrototype::getInt8(quint32 byteOffset) { · 8 unmodified lines
4747 stream >> result;
4848 return result;
4949 }
50− return 42;
50+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
51+ return 0;
5152 }
5253
5354 quint32 DataViewPrototype::getUint8(quint32 byteOffset) {
@@ -59,85 +60,92 @@ quint32 DataViewPrototype::getUint8(quint32 byteOffset) { · 5 unmodified lines
5960 stream >> result;
6061 return result;
6162 }
62− return 42;
63+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
64+ return 0;
6365 }
6466
6567 qint32 DataViewPrototype::getInt16(quint32 byteOffset, bool littleEndian) {
6668 if (realOffset(byteOffset, sizeof(qint16))) {
6769 QDataStream stream(*thisArrayBuffer());
68− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
6970 stream.skipRawData(byteOffset);
71+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
7072
7173 qint16 result;
7274 stream >> result;
7375 return result;
7476 }
75− return 42;
77+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
78+ return 0;
7679 }
7780
7881 quint32 DataViewPrototype::getUint16(quint32 byteOffset, bool littleEndian) {
7982 if (realOffset(byteOffset, sizeof(quint16))) {
8083 QDataStream stream(*thisArrayBuffer());
81− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
8284 stream.skipRawData(byteOffset);
85+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
8386
8487 quint16 result;
8588 stream >> result;
8689 return result;
8790 }
88− return 42;
91+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
92+ return 0;
8993 }
9094
9195 qint32 DataViewPrototype::getInt32(quint32 byteOffset, bool littleEndian) {
9296 if (realOffset(byteOffset, sizeof(qint32))) {
9397 QDataStream stream(*thisArrayBuffer());
94− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
9598 stream.skipRawData(byteOffset);
99+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
96100
97101 qint32 result;
98102 stream >> result;
99103 return result;
100104 }
101− return 42;
105+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
106+ return 0;
102107 }
103108
104109 quint32 DataViewPrototype::getUint32(quint32 byteOffset, bool littleEndian) {
105110 if (realOffset(byteOffset, sizeof(quint32))) {
106111 QDataStream stream(*thisArrayBuffer());
107− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
108112 stream.skipRawData(byteOffset);
113+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
109114
110115 quint32 result;
111116 stream >> result;
112117 return result;
113118 }
114− return 42;
119+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
120+ return 0;
115121 }
116122
117123 float DataViewPrototype::getFloat32(quint32 byteOffset, bool littleEndian) {
118124 if (realOffset(byteOffset, sizeof(float))) {
119125 QDataStream stream(*thisArrayBuffer());
120− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
121126 stream.skipRawData(byteOffset);
127+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
122128
123129 float result;
124130 stream >> result;
125131 return result;
126132 }
127− return 42;
133+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
134+ return 0;
128135 }
129136
130137 double DataViewPrototype::getFloat64(quint32 byteOffset, bool littleEndian) {
131138 if (realOffset(byteOffset, sizeof(double))) {
132139 QDataStream stream(*thisArrayBuffer());
133− stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
134140 stream.skipRawData(byteOffset);
141+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
135142
136143 double result;
137144 stream >> result;
138145 return result;
139146 }
140− return 42;
147+ thisObject().engine()->evaluate("throw \"RangeError: byteOffset out of range\"");
148+ return 0;
141149 }
142150
143151 ///////////////// SETTERS ////////////////////////////
@@ -148,6 +156,8 @@ void DataViewPrototype::setInt8(quint32 byteOffset, qint32 value) { · 4 unmodified lines
148156 stream.skipRawData(byteOffset);
149157
150158 stream << (qint8)value;
159+ } else {
160+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
151161 }
152162 }
153163
@@ -157,6 +167,8 @@ void DataViewPrototype::setUint8(quint32 byteOffset, quint32 value) { · 3 unmodified lines
157167 stream.skipRawData(byteOffset);
158168
159169 stream << (quint8)value;
170+ } else {
171+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
160172 }
161173 }
162174
@@ -164,8 +176,11 @@ void DataViewPrototype::setInt16(quint32 byteOffset, qint32 value, bool littleEn · 1 unmodified line
164176 if (realOffset(byteOffset, sizeof(qint16))) {
165177 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
166178 stream.skipRawData(byteOffset);
179+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
167180
168181 stream << (qint16)value;
182+ } else {
183+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
169184 }
170185 }
171186
@@ -173,8 +188,11 @@ void DataViewPrototype::setUint16(quint32 byteOffset, quint32 value, bool little · 1 unmodified line
173188 if (realOffset(byteOffset, sizeof(quint16))) {
174189 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
175190 stream.skipRawData(byteOffset);
191+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
176192
177193 stream << (quint16)value;
194+ } else {
195+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
178196 }
179197 }
180198
@@ -182,8 +200,11 @@ void DataViewPrototype::setInt32(quint32 byteOffset, qint32 value, bool littleEn · 1 unmodified line
182200 if (realOffset(byteOffset, sizeof(qint32))) {
183201 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
184202 stream.skipRawData(byteOffset);
203+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
185204
186205 stream << (qint32)value;
206+ } else {
207+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
187208 }
188209 }
189210
@@ -191,8 +212,11 @@ void DataViewPrototype::setUint32(quint32 byteOffset, quint32 value, bool little · 1 unmodified line
191212 if (realOffset(byteOffset, sizeof(quint32))) {
192213 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
193214 stream.skipRawData(byteOffset);
215+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
194216
195217 stream << (quint32)value;
218+ } else {
219+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
196220 }
197221 }
198222
@@ -200,8 +224,11 @@ void DataViewPrototype::setFloat32(quint32 byteOffset, float value, bool littleE · 1 unmodified line
200224 if (realOffset(byteOffset, sizeof(float))) {
201225 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
202226 stream.skipRawData(byteOffset);
227+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
203228
204229 stream << value;
230+ } else {
231+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
205232 }
206233 }
207234
@@ -209,8 +236,11 @@ void DataViewPrototype::setFloat64(quint32 byteOffset, double value, bool little · 1 unmodified line
209236 if (realOffset(byteOffset, sizeof(double))) {
210237 QDataStream stream(thisArrayBuffer(), QIODevice::ReadWrite);
211238 stream.skipRawData(byteOffset);
239+ stream.setByteOrder((littleEndian) ? QDataStream::LittleEndian : QDataStream::BigEndian);
212240
213241 stream << value;
242+ } else {
243+ thisObject().engine()->evaluate("throw \"1RangeError: byteOffset out of range\"");
214244 }
215245 }
216246