Showing the changes to libraries/script-engine/src/DataViewClass.cpp (1 of 3 files). Show all
Unified · Split
| @@ -54,15 +54,32 @@ QScriptValue DataViewClass::construct(QScriptContext *context, QScriptEngine *en · 53 unmodified lines | ||
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | 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(); | |
| 59 | 59 | |
| 60 | 60 | QByteArray* arrayBuffer = (bufferArg.isValid()) ? qscriptvalue_cast<QByteArray*>(bufferArg.data()) :NULL; |
| 61 | 61 | if (!arrayBuffer) { |
| 62 | + engine->evaluate("throw \"TypeError: 1st argument not a ArrayBuffer\""); | |
| 62 | 63 | return QScriptValue(); |
| 63 | 64 | } |
| 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 | + } | |
| 64 | 77 | |
| 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()); | |
| 66 | 83 | |
| 67 | 84 | if (context->isCalledAsConstructor()) { |
| 68 | 85 | context->setThisObject(newObject); |