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()) {
222 Scoped<QQmlValueTypeWrapper>
r(
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());
254 return lv->isEqual(
v->toVariant());
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#define VALUE_TYPE_LOAD(metatype, cpptype, constructor) \
345 void *args[] = { &v, nullptr }; \
346 doStaticReadCall(metaObject, valueTypeWrapper, index, args); \
347 return QV4::Encode(constructor(v)); \
353 const int metaTypeId = isEnum
356 ? QMetaType::QObjectStar
359 switch (metaTypeId) {
361 case QMetaType::Void:
362 return Encode::undefined();
363 case QMetaType::Nullptr:
364 case QMetaType::VoidStar:
365 return Encode::null();
387#if QT_CONFIG(regularexpression)
394 case QMetaType::QPixmap:
395 case QMetaType::QImage: {
403 void *
args[] = { &
v,
nullptr };
406 v, valueTypeWrapper,
index,
417#undef VALUE_TYPE_LOAD
433 if (!
r->d()->isReference() ||
r->readReferenceValue()) {
440 p->value = Encode::undefined();
451 int propertyIndex = 0;
460 if (that->d()->isReference() && !that->readReferenceValue())
461 return PropertyKey::invalid();
465 const int propertyCount =
mo->propertyCount();
466 if (propertyIndex < propertyCount) {
467 Scope scope(that->engine());
478 return propName->toPropertyKey();
481 return ObjectOwnPropertyKeyIterator::next(
o, pd,
attrs);
493 if (
d()->isReference() && !readReferenceValue())
495 int id1 =
value.metaType().id();
501 case QMetaType::QPoint:
502 if (id2 == QMetaType::QPointF)
505 case QMetaType::QPointF:
506 if (id2 == QMetaType::QPoint)
509 case QMetaType::QRect:
510 if (id2 == QMetaType::QRectF)
513 case QMetaType::QRectF:
514 if (id2 == QMetaType::QRect)
517 case QMetaType::QLine:
518 if (id2 == QMetaType::QLineF)
521 case QMetaType::QLineF:
522 if (id2 == QMetaType::QLine)
525 case QMetaType::QSize:
526 if (id2 == QMetaType::QSizeF)
529 case QMetaType::QSizeF:
530 if (id2 == QMetaType::QSize)
540int QQmlValueTypeWrapper::typeId()
const
542 return d()->metaType().id();
547 return d()->metaType();
552 bool destructGadgetOnExit =
false;
554 if (
d()->isReference()) {
555 if (!
d()->gadgetPtr()) {
557 d()->setGadgetPtr(gadget);
558 d()->metaType().construct(
d()->gadgetPtr(),
nullptr);
559 destructGadgetOnExit =
true;
561 if (!readReferenceValue())
567 void *
a[] = {
d()->gadgetPtr(),
nullptr, &status, &
flags };
570 if (destructGadgetOnExit) {
571 d()->metaType().destruct(
d()->gadgetPtr());
572 d()->setGadgetPtr(
nullptr);
579 if (!
id.isStringOrSymbol())
588 int propertyIndex =
d()->metaObject()->indexOfProperty(
name.constData());
589 if (propertyIndex >= 0)
590 result.load(
mo->property(propertyIndex));
604 if (
w->d()->isReference() && !
w->readReferenceValue())
614 if (
mo->property(
i).isDesignable()) {
629 PropertyKey id =
engine->identifierTable->asPropertyKey(
engine->currentStackFrame->v4Function->compilationUnit->
632 return Object::virtualResolveLookupGetter(
object,
engine, lookup);
640 if (
r->d()->isReference() && !
r->readReferenceValue())
641 return Value::undefinedValue().asReturnedValue();
654 lookup->
getter = QQmlValueTypeWrapper::lookupGetter;
662 lookup->
getter = Lookup::getterGeneric;
663 return Lookup::getterGeneric(lookup,
engine,
object);
668 Heap::Object *
o =
static_cast<Heap::Object *
>(
object.heapObject());
670 return revertLookup();
672 Heap::QQmlValueTypeWrapper *valueTypeWrapper =
673 const_cast<Heap::QQmlValueTypeWrapper*
>(
static_cast<const Heap::QQmlValueTypeWrapper *
>(
o));
675 return revertLookup();
677 if (valueTypeWrapper->isReference() && !valueTypeWrapper->readReference())
678 return Encode::undefined();
686bool QQmlValueTypeWrapper::lookupSetter(
695 return Object::virtualResolveLookupSetter(
object,
engine, lookup,
value);
703 return Object::virtualGet(
m,
id, receiver, hasProperty);
709 if (
r->d()->isReference() && !
r->readReferenceValue())
710 return Value::undefinedValue().asReturnedValue();
714 return Object::virtualGet(
m,
id, receiver, hasProperty);
725 return Object::virtualPut(
m,
id,
value, receiver);
734 Heap::Object *heapObject =
nullptr;
735 if (
r->d()->isReference()) {
736 heapObject =
r->d()->object();
737 if (!
r->readReferenceValue() || !
r->d()->canWriteBack())
747 QObject *referenceObject =
nullptr;
749 const int referencePropertyIndex =
r->d()->property();
752 referenceObject =
o->object();
756 referenceObject =
t->object();
760 if (!
f->isBinding()) {
768 if (!referenceObject) {
776 = referenceObject->metaObject()->
property(referencePropertyIndex);
777 const QMetaType writeBackPropertyType = writebackProperty.metaType();
783 cacheData.setPropType(writeBackPropertyType);
784 cacheData.setCoreIndex(referencePropertyIndex);
792 if (
f->isBoundFunction())
795 newBinding->
setTarget(referenceObject, cacheData, &pd);
798 }
else if (referenceObject) {
799 if (
Q_UNLIKELY(lcBindingRemoval().isInfoEnabled())) {
802 const auto qmlBinding =
static_cast<const QQmlBinding*
>(binding);
805 "Overwriting binding on %s::%s which was initially bound at %s by setting \"%s\" at %s:%d",
806 referenceObject->metaObject()->className(), referenceObject->metaObject()->
property(referencePropertyIndex).name(),
807 qPrintable(qmlBinding->expressionIdentifier()),
809 qPrintable(stackFrame->source()), stackFrame->lineNumber());
819 property.resetOnGadget(
reinterpret_cast<QObject *
>(
r->d()->gadgetPtr()));
830 void *gadget =
r->d()->gadgetPtr();
831 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
\inmodule QtCore\compares equality \compareswith equality QLine \endcompareswith
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 setWritable(bool onoff)
void load(const QMetaProperty &)
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
Combined button and popup list for selecting options.
static Heap::ReferenceObject::Flags referenceFlags(const QMetaObject *metaObject, int index)
Scoped< FunctionObject > ScopedFunctionObject
Scoped< String > ScopedString
static void doStaticReadCall(const QMetaObject *metaObject, Heap::QQmlValueTypeWrapper *valueTypeWrapper, int index, void **args)
Scoped< ExecutionContext > ScopedContext
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
ReturnedValue throwError(const Value &value)
String * id_toString() const
Heap::Object * newObject()
Object * valueTypeWrapperPrototype() const
Heap::String * newString(char16_t c)
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjectsAndSymbols=true)
ReturnedValue throwTypeError()
ReturnedValue(* getter)(Lookup *l, ExecutionEngine *engine, const Value &object)
struct QV4::Lookup::@583::@601 qgadgetLookup
static bool setterFallback(Lookup *l, ExecutionEngine *engine, Value &object, const Value &value)
ExecutionEngine * engine() const
static ReturnedValue create(ExecutionEngine *engine, Heap::Object *wrapper, int index)
~QQmlValueTypeWrapperOwnPropertyKeyIterator() override=default
bool isEqual(const QVariant &value) 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