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
18 18
19#include "ArrayBufferClass.h"19#include "ArrayBufferClass.h"
20 20
21
21static const QString CLASS_NAME = "ArrayBuffer";22static const QString CLASS_NAME = "ArrayBuffer";
22 23
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)
26Q_DECLARE_METATYPE(QScriptClass*)
23Q_DECLARE_METATYPE(QByteArray*)27Q_DECLARE_METATYPE(QByteArray*)
28int qScriptClassPointerMetaTypeId = qRegisterMetaType<QScriptClass*>();
29int qByteArrayPointerMetaTypeId = qRegisterMetaType<QByteArray*>();
24 30
25ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) :31ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) :
26QObject(scriptEngine),32QObject(scriptEngine),
27QScriptClass(scriptEngine),33QScriptClass(scriptEngine) {
28_scriptEngine(scriptEngine) {
29 qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue);34 qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue);
30 QScriptValue global = engine()->globalObject();35 QScriptValue global = engine()->globalObject();
31 36
@@ -144,12 +149,30 @@ QScriptValue ArrayBufferClass::toScriptValue(QScriptEngine* engine, const QByteA · 112 unmodified lines
144 QScriptValue ctor = engine->globalObject().property(CLASS_NAME);149 QScriptValue ctor = engine->globalObject().property(CLASS_NAME);
145 ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data());150 ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data());
146 if (!cls) {151 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;
148 }156 }
149 return cls->newInstance(ba);157 return cls->newInstance(ba);
150}158}
151 159
152void ArrayBufferClass::fromScriptValue(const QScriptValue& obj, QByteArray& ba) {160void ArrayBufferClass::fromScriptValue(const QScriptValue& object, QByteArray& byteArray) {
153 ba = qvariant_cast<QByteArray>(obj.data().toVariant());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 }
154}177}
155 178

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