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/DataViewClass.cpp (1 of 3 files). Show all

Unified · Split

libraries/script-engine/src/DataViewClass.cpp+20−3
@@ -54,15 +54,32 @@ QScriptValue DataViewClass::construct(QScriptContext *context, QScriptEngine *en · 53 unmodified lines
5454 }
5555
5656 QScriptValue bufferArg = context->argument(0);
57− QScriptValue byteOffsetArg = (context->argumentCount() >= 2) ? context->argument(1) : QScriptValue(-1);
58− QScriptValue byteLengthArg = (context->argumentCount() >= 3) ? context->argument(2) : QScriptValue(-1);
57+ QScriptValue byteOffsetArg = (context->argumentCount() >= 2) ? context->argument(1) : QScriptValue();
58+ QScriptValue byteLengthArg = (context->argumentCount() >= 3) ? context->argument(2) : QScriptValue();
5959
6060 QByteArray* arrayBuffer = (bufferArg.isValid()) ? qscriptvalue_cast<QByteArray*>(bufferArg.data()) :NULL;
6161 if (!arrayBuffer) {
62+ engine->evaluate("throw \"TypeError: 1st argument not a ArrayBuffer\"");
6263 return QScriptValue();
6364 }
65+ if (byteOffsetArg.isNumber() &&
66+ (byteOffsetArg.toInt32() < 0 ||
67+ byteOffsetArg.toInt32() >= arrayBuffer->size())) {
68+ engine->evaluate("throw \"RangeError: byteOffset out of range\"");
69+ return QScriptValue();
70+ }
71+ if (byteLengthArg.isNumber() &&
72+ (byteLengthArg.toInt32() < 0 ||
73+ byteOffsetArg.toInt32() + byteLengthArg.toInt32() > arrayBuffer->size())) {
74+ engine->evaluate("throw \"RangeError: byteLength out of range\"");
75+ return QScriptValue();
76+ }
6477
65− QScriptValue newObject = cls->newInstance(bufferArg, byteOffsetArg.toInt32(), byteLengthArg.toInt32());
78+ QScriptValue newObject = cls->newInstance(bufferArg,
79+ (byteOffsetArg.isNumber()) ? byteOffsetArg.toInt32()
80+ : 0,
81+ (byteLengthArg.isNumber()) ? byteLengthArg.toInt32()
82+ : arrayBuffer->size());
6683
6784 if (context->isCalledAsConstructor()) {
6885 context->setThisObject(newObject);