6#include <private/qqmlvaluetype_p.h>
7#include <private/qqmlbinding_p.h>
8#include <private/qqmlglobal_p.h>
9#include <private/qqmlbuiltinfunctions_p.h>
11#include <private/qv4engine_p.h>
12#include <private/qv4functionobject_p.h>
13#include <private/qv4variantobject_p.h>
14#include <private/qv4alloca_p.h>
15#include <private/qv4stackframe_p.h>
16#include <private/qv4objectiterator_p.h>
17#include <private/qv4qobjectwrapper_p.h>
18#include <private/qv4identifiertable_p.h>
19#include <private/qv4lookup_p.h>
20#include <private/qv4sequenceobject_p.h>
21#include <private/qv4arraybuffer_p.h>
22#include <private/qv4dateobject_p.h>
23#include <private/qv4jsonobject_p.h>
24#if QT_CONFIG(regularexpression)
25#include <private/qv4regexpobject_p.h>
27#if QT_CONFIG(qml_locale)
28#include <private/qqmllocale_p.h>
30#include <QtCore/qloggingcategory.h>
31#include <QtCore/qdatetime.h>
32#include <QtCore/QLine>
33#include <QtCore/QLineF>
34#include <QtCore/QSize>
35#include <QtCore/QSizeF>
36#include <QtCore/QTimeZone>
46Heap::QQmlValueTypeWrapper *Heap::QQmlValueTypeWrapper::detached()
const
49 m_gadgetPtr,
QMetaType(m_metaType), m_metaObject,
nullptr, -1, NoFlag);
52void Heap::QQmlValueTypeWrapper::destroy()
55 metaType().destruct(m_gadgetPtr);
56 ::operator
delete(m_gadgetPtr);
58 ReferenceObject::destroy();
61QVariant Heap::QQmlValueTypeWrapper::toVariant()
const
64 return QVariant(metaType(), gadgetPtr());
72 if (variantReferenceType != metaType()) {
80 metaType().destruct(gadgetPtr());
81 ::operator
delete(gadgetPtr());
83 setGadgetPtr(
nullptr);
85 setMetaType(variantReferenceType);
97void *Heap::QQmlValueTypeWrapper::storagePointer()
100 setGadgetPtr(::operator
new(metaType().sizeOf()));
101 metaType().construct(gadgetPtr(),
nullptr);
106bool Heap::QQmlValueTypeWrapper::readReference()
112bool Heap::QQmlValueTypeWrapper::writeBack(
int propertyIndex)
126 nullptr, cloneFrom->metaType(), cloneFrom->metaObject(),
127 object, cloneFrom->property(), cloneFrom->flags()));
128 r->d()->setLocation(cloneFrom->function(), cloneFrom->statementIndex());
129 if (cloneFrom->enforcesLocation())
131 return r->asReturnedValue();
141 o->defineDefaultProperty(v4->
id_toString(), method_toString, 1);
145int QQmlValueTypeWrapper::virtualMetacall(
164 if (!
mo->d.static_metacall)
191 Heap::Object *
object,
int property, Heap::ReferenceObject::Flags
flags)
196 if (!
type.isValid()) {
205 r->d()->setLocation(
frame->v4Function,
frame->statementNumber());
206 if (!
data &&
r->d()->enforcesLocation())
208 return r->asReturnedValue();
217 if (!
type.isValid()) {
225 return r->asReturnedValue();
228QVariant QQmlValueTypeWrapper::toVariant()
const
230 if (
d()->isReference() && !readReferenceValue())
232 return d()->toVariant();
235bool QQmlValueTypeWrapper::toGadget(
void *
data)
const
237 if (
d()->isReference() && !readReferenceValue())
251 return lv->
isEqual(rv->d()->data());
262 return Object::virtualHasProperty(
m,
id);
265 if (
auto mo =
wrapper->d()->metaObject())
266 if (
mo->indexOfProperty(
id.toQString().toUtf8()) != -1)
278 o =
o->getPrototypeOf();
280 return o->hasProperty(
id);
288 ? (Heap::ReferenceObject::CanWriteBack | Heap::ReferenceObject::EnforcesLocation)
289 : Heap::ReferenceObject::EnforcesLocation;
302 Heap::QQmlValueTypeWrapper *valueTypeWrapper,
311 int index = coreIndex;
313 const auto wrapChar16 = [
engine](
char16_t c) {
317 return QObjectWrapper::wrap(
engine,
object);
323 return JsonObject::fromJsonObject(
engine,
object);
330 return engine->newDateObject(
334 return engine->newDateObject(
338 return engine->newDateObject(
342#if QT_CONFIG(qml_locale)
348#define VALUE_TYPE_LOAD(metatype, cpptype, constructor) \
351 void *args[] = { &v, nullptr }; \
352 doStaticReadCall(metaObject, valueTypeWrapper, index, args); \
353 return QV4::Encode(constructor(v)); \
359 const int metaTypeId = isEnum
362 ? QMetaType::QObjectStar
365 switch (metaTypeId) {
367 case QMetaType::Void:
368 return Encode::undefined();
369 case QMetaType::Nullptr:
370 case QMetaType::VoidStar:
371 return Encode::null();
393#if QT_CONFIG(regularexpression)
400#if QT_CONFIG(qml_locale)
403 case QMetaType::QPixmap:
404 case QMetaType::QImage: {
412 void *
args[] = { &
v,
nullptr };
415 v, valueTypeWrapper,
index,
426#undef VALUE_TYPE_LOAD
442 if (!
r->d()->isReference() ||
r->readReferenceValue()) {
449 p->value = Encode::undefined();
460 int propertyIndex = 0;
470 return PropertyKey::invalid();
474 const int propertyCount =
mo->propertyCount();
475 if (propertyIndex < propertyCount) {
487 return propName->toPropertyKey();
490 return ObjectOwnPropertyKeyIterator::next(
o, pd,
attrs);
502 if (
d()->isReference() && !readReferenceValue())
504 int id1 =
value.metaType().id();
506 int id2 =
v.metaType().id();
510 case QMetaType::QPoint:
511 if (id2 == QMetaType::QPointF)
514 case QMetaType::QPointF:
515 if (id2 == QMetaType::QPoint)
518 case QMetaType::QRect:
519 if (id2 == QMetaType::QRectF)
522 case QMetaType::QRectF:
523 if (id2 == QMetaType::QRect)
526 case QMetaType::QLine:
527 if (id2 == QMetaType::QLineF)
530 case QMetaType::QLineF:
531 if (id2 == QMetaType::QLine)
534 case QMetaType::QSize:
535 if (id2 == QMetaType::QSizeF)
538 case QMetaType::QSizeF:
539 if (id2 == QMetaType::QSize)
549int QQmlValueTypeWrapper::typeId()
const
551 return d()->metaType().id();
556 return d()->metaType();
561 bool destructGadgetOnExit =
false;
563 if (
d()->isReference()) {
564 if (!
d()->gadgetPtr()) {
566 d()->setGadgetPtr(gadget);
567 d()->metaType().construct(
d()->gadgetPtr(),
nullptr);
568 destructGadgetOnExit =
true;
570 if (!readReferenceValue())
576 void *
a[] = {
d()->gadgetPtr(),
nullptr, &status, &
flags };
579 if (destructGadgetOnExit) {
580 d()->metaType().destruct(
d()->gadgetPtr());
581 d()->setGadgetPtr(
nullptr);
588 if (!
id.isStringOrSymbol())
597 int propertyIndex =
d()->metaObject()->indexOfProperty(
name.constData());
598 if (propertyIndex >= 0)
599 result.load(
mo->property(propertyIndex));
613 if (
w->d()->isReference() && !
w->readReferenceValue())
623 if (
mo->property(
i).isDesignable()) {
638 PropertyKey id =
engine->identifierTable->asPropertyKey(
engine->currentStackFrame->v4Function->compilationUnit->
641 return Object::virtualResolveLookupGetter(
object,
engine, lookup);
649 if (
r->d()->isReference() && !
r->readReferenceValue())
650 return Value::undefinedValue().asReturnedValue();
663 lookup->
getter = QQmlValueTypeWrapper::lookupGetter;
671 lookup->
getter = Lookup::getterGeneric;
672 return Lookup::getterGeneric(lookup,
engine,
object);
677 Heap::Object *
o =
static_cast<Heap::Object *
>(
object.heapObject());
679 return revertLookup();
681 Heap::QQmlValueTypeWrapper *valueTypeWrapper =
682 const_cast<Heap::QQmlValueTypeWrapper*
>(
static_cast<const Heap::QQmlValueTypeWrapper *
>(
o));
684 return revertLookup();
686 if (valueTypeWrapper->isReference() && !valueTypeWrapper->readReference())
687 return Encode::undefined();
695bool QQmlValueTypeWrapper::lookupSetter(
704 return Object::virtualResolveLookupSetter(
object,
engine, lookup,
value);
712 return Object::virtualGet(
m,
id, receiver, hasProperty);
718 if (
r->d()->isReference() && !
r->readReferenceValue())
719 return Value::undefinedValue().asReturnedValue();
723 return Object::virtualGet(
m,
id, receiver, hasProperty);
734 return Object::virtualPut(
m,
id,
value, receiver);
743 Heap::Object *heapObject =
nullptr;
744 if (
r->d()->isReference()) {
745 heapObject =
r->d()->object();
746 if (!
r->readReferenceValue() || !
r->d()->canWriteBack())
756 QObject *referenceObject =
nullptr;
758 const int referencePropertyIndex =
r->d()->property();
761 referenceObject =
o->object();
765 referenceObject =
t->object();
769 if (!
f->isBinding()) {
777 if (!referenceObject) {
785 = referenceObject->metaObject()->
property(referencePropertyIndex);
801 if (
f->isBoundFunction())
804 newBinding->
setTarget(referenceObject, cacheData, &pd);
807 }
else if (referenceObject) {
808 if (
Q_UNLIKELY(lcBindingRemoval().isInfoEnabled())) {
811 const auto qmlBinding =
static_cast<const QQmlBinding*
>(binding);
814 "Overwriting binding on %s::%s which was initially bound at %s by setting \"%s\" at %s:%d",
815 referenceObject->metaObject()->className(), referenceObject->metaObject()->
property(referencePropertyIndex).name(),
816 qPrintable(qmlBinding->expressionIdentifier()),
818 qPrintable(stackFrame->source()), stackFrame->lineNumber());
828 property.resetOnGadget(
reinterpret_cast<QObject *
>(
r->d()->gadgetPtr()));
839 void *gadget =
r->d()->gadgetPtr();
840 property.writeOnGadget(gadget, std::move(
v));
\inmodule QtCore\reentrant
\inmodule QtCore \reentrant
T fromVariant(const QVariant &value)
Returns the given value converted to the template type {T}.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
QVariant property(const char *name) const
Returns the value of the object's name property.
\inmodule QtCore\reentrant
void setTarget(const QQmlProperty &)
void setBoundFunction(QV4::BoundFunction *boundFunction)
void setSourceLocation(const QQmlSourceLocation &location)
static QQmlBinding * create(const QQmlPropertyData *, const QQmlScriptString &, QObject *, QQmlContext *)
bool isResettable() const
void setCoreIndex(int idx)
void setPropType(QMetaType pt)
void setWritable(bool onoff)
static void setBinding(QQmlAbstractBinding *binding, BindingFlags flags=None, QQmlPropertyData::WriteFlags writeFlags=QQmlPropertyData::DontRemoveBinding)
static void removeBinding(const QQmlProperty &that)
static QQmlAbstractBinding * binding(QObject *, QQmlPropertyIndex index)
\inmodule QtCore\reentrant
\inmodule QtCore \reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
\inmodule QtCore \reentrant
QMetaType metaType() const
const void * constData() const
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue wrap(QV4::ExecutionEngine *engine, const QLocale &locale)
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
static Heap::ReferenceObject::Flags referenceFlags(const QMetaObject *metaObject, int index)
static void doStaticReadCall(const QMetaObject *metaObject, Heap::QQmlValueTypeWrapper *valueTypeWrapper, int index, void **args)
static ReturnedValue getGadgetProperty(ExecutionEngine *engine, Heap::QQmlValueTypeWrapper *valueTypeWrapper, QMetaType metaType, quint16 coreIndex, bool isFunction, bool isEnum)
DBusConnection const char DBusError * error
static struct AttrInfo attrs[]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCInfo(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLfloat GLfloat GLfloat w
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLsizei propCount
#define VALUE_TYPE_LOAD(metatype, cpptype, constructor)
#define qPrintable(string)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
#define Q_ALLOCA_ASSIGN(type, name, size)
#define Q_ALLOCA_DECLARE(type, name)
#define RETURN_UNDEFINED()
#define DEFINE_OBJECT_VTABLE(classname)
mimeData setData("text/csv", csvData)
obj metaObject() -> className()
\inmodule QtCore \reentrant
CppStackFrame * currentStackFrame
QQmlRefPointer< QQmlContextData > callingQmlContext() const
Heap::String * newString(const QString &s=QString())
ReturnedValue throwError(const Value &value)
String * id_toString() const
Heap::Object * newObject()
Object * valueTypeWrapperPrototype() const
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjectsAndSymbols=true)
ReturnedValue throwTypeError()
Pointer< InternalClass *, 0 > internalClass
struct QV4::Lookup::@576::@604 qgadgetLookup
ReturnedValue(* getter)(Lookup *l, ExecutionEngine *engine, const Value &object)
const QtPrivate::QMetaTypeInterface * metaType
static bool setterFallback(Lookup *l, ExecutionEngine *engine, Value &object, const Value &value)
ExecutionEngine * engine() const
static ReturnedValue create(QV4::ExecutionContext *scope, Heap::Object *wrapper, int index)
~QQmlValueTypeWrapperOwnPropertyKeyIterator() override=default
const QMetaObject * metaObject() const
bool isEqual(const QVariant &value) const
bool readReferenceValue() const
static bool writeBack(HeapObject *ref, int internalIndex=AllProperties)
static bool readReference(HeapObject *ref)
bool hasException() const
static constexpr VTable::GetOwnProperty virtualGetOwnProperty
static constexpr VTable::ResolveLookupGetter virtualResolveLookupGetter