History

make fromScriptValue logic easier to follow for CR; eliminate extra QByteArray conversion

humbletim committed 8 years ago

Commit 63a226f1 parent c2ee1394 files · +29 −45Browse files

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

Unified · Split

libraries/script-engine/src/ArrayBufferClass.cpp+28−5
@@ -18,14 +18,19 @@ · 17 unmodified lines
1818
1919 #include "ArrayBufferClass.h"
2020
21+
2122 static const QString CLASS_NAME = "ArrayBuffer";
2223
24+// FIXME: Q_DECLARE_METATYPE is global and really belongs in a shared header file, not per .cpp like this
25+// (see DataViewClass.cpp, etc. which would also have to be updated to resolve)
26+Q_DECLARE_METATYPE(QScriptClass*)
2327 Q_DECLARE_METATYPE(QByteArray*)
28+int qScriptClassPointerMetaTypeId = qRegisterMetaType<QScriptClass*>();
29+int qByteArrayPointerMetaTypeId = qRegisterMetaType<QByteArray*>();
2430
2531 ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) :
2632 QObject(scriptEngine),
27−QScriptClass(scriptEngine),
28−_scriptEngine(scriptEngine) {
33+QScriptClass(scriptEngine) {
2934 qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue);
3035 QScriptValue global = engine()->globalObject();
3136
@@ -144,12 +149,30 @@ QScriptValue ArrayBufferClass::toScriptValue(QScriptEngine* engine, const QByteA · 112 unmodified lines
144149 QScriptValue ctor = engine->globalObject().property(CLASS_NAME);
145150 ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data());
146151 if (!cls) {
147− return engine->newVariant(QVariant::fromValue(ba));
152+ if (engine->currentContext()) {
153+ engine->currentContext()->throwError("arrayBufferClass::toScriptValue -- could not get " + CLASS_NAME + " class constructor");
154+ }
155+ return QScriptValue::NullValue;
148156 }
149157 return cls->newInstance(ba);
150158 }
151159
152−void ArrayBufferClass::fromScriptValue(const QScriptValue& obj, QByteArray& ba) {
153− ba = qvariant_cast<QByteArray>(obj.data().toVariant());
160+void ArrayBufferClass::fromScriptValue(const QScriptValue& object, QByteArray& byteArray) {
161+ if (object.isString()) {
162+ // UTF-8 encoded String
163+ byteArray = object.toString().toUtf8();
164+ } else if (object.isArray()) {
165+ // Array of uint8s eg: [ 128, 3, 25, 234 ]
166+ auto Uint8Array = object.engine()->globalObject().property("Uint8Array");
167+ auto typedArray = Uint8Array.construct(QScriptValueList{object});
168+ if (QByteArray* buffer = qscriptvalue_cast<QByteArray*>(typedArray.property("buffer"))) {
169+ byteArray = *buffer;
170+ }
171+ } else if (object.isObject()) {
172+ // ArrayBuffer instance (or any JS class that supports coercion into QByteArray*)
173+ if (QByteArray* buffer = qscriptvalue_cast<QByteArray*>(object.data())) {
174+ byteArray = *buffer;
175+ }
176+ }
154177 }
155178

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t