Heap::ArgumentsObject::ArgumentsObject(QV4::CallContext *context)
: Heap::Object(context->d()->strictMode ? context->d()->engine->strictArgumentsObjectClass : context->d()->engine->argumentsObjectClass)
- , context(context)
+ , context(context->d())
, fullyCreated(false)
{
Q_ASSERT(internalClass->vtable == QV4::ArgumentsObject::staticVTable());
if (fullyCreated())
return;
- uint numAccessors = qMin((int)context()->d()->function->formalParameterCount(), context()->d()->realArgumentCount);
- uint argCount = qMin(context()->d()->realArgumentCount, context()->d()->callData->argc);
+ uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
+ uint argCount = qMin(context()->realArgumentCount, context()->callData->argc);
ArrayData::realloc(this, Heap::ArrayData::Sparse, argCount, true);
- context()->d()->engine->requireArgumentsAccessors(numAccessors);
+ context()->engine->requireArgumentsAccessors(numAccessors);
Scope scope(engine());
Scoped<MemberData> md(scope, d()->mappedArguments);
if (!md || md->size() < numAccessors)
d()->mappedArguments = md->reallocate(engine(), d()->mappedArguments, numAccessors);
for (uint i = 0; i < (uint)numAccessors; ++i) {
- mappedArguments()->data[i] = context()->d()->callData->args[i];
- arraySet(i, context()->d()->engine->argumentsAccessors[i], Attr_Accessor);
+ mappedArguments()->data[i] = context()->callData->args[i];
+ arraySet(i, context()->engine->argumentsAccessors[i], Attr_Accessor);
}
- arrayPut(numAccessors, context()->d()->callData->args + numAccessors, argCount - numAccessors);
+ arrayPut(numAccessors, context()->callData->args + numAccessors, argCount - numAccessors);
for (uint i = numAccessors; i < argCount; ++i)
setArrayAttributes(i, Attr_Data);
Property map;
PropertyAttributes mapAttrs;
bool isMapped = false;
- uint numAccessors = qMin((int)context()->d()->function->formalParameterCount(), context()->d()->realArgumentCount);
+ uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
if (pd && index < (uint)numAccessors)
- isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context()->d()->engine->argumentsAccessors[index].getter();
+ isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context()->engine->argumentsAccessors[index].getter();
if (isMapped) {
Q_ASSERT(arrayData());
if (args->fullyCreated())
return Object::getIndexed(m, index, hasProperty);
- if (index < static_cast<uint>(args->context()->d()->callData->argc)) {
+ if (index < static_cast<uint>(args->context()->callData->argc)) {
if (hasProperty)
*hasProperty = true;
- return args->context()->d()->callData->args[index].asReturnedValue();
+ return args->context()->callData->args[index].asReturnedValue();
}
if (hasProperty)
*hasProperty = false;
void ArgumentsObject::putIndexed(Managed *m, uint index, const ValueRef value)
{
ArgumentsObject *args = static_cast<ArgumentsObject *>(m);
- if (!args->fullyCreated() && index >= static_cast<uint>(args->context()->d()->callData->argc))
+ if (!args->fullyCreated() && index >= static_cast<uint>(args->context()->callData->argc))
args->fullyCreate();
if (args->fullyCreated()) {
return;
}
- args->context()->d()->callData->args[index] = value;
+ args->context()->callData->args[index] = value;
}
bool ArgumentsObject::deleteIndexedProperty(Managed *m, uint index)
if (args->fullyCreated())
return Object::queryIndexed(m, index);
- uint numAccessors = qMin((int)args->context()->d()->function->formalParameterCount(), args->context()->d()->realArgumentCount);
- uint argCount = qMin(args->context()->d()->realArgumentCount, args->context()->d()->callData->argc);
+ uint numAccessors = qMin((int)args->context()->function->formalParameterCount(), args->context()->realArgumentCount);
+ uint argCount = qMin(args->context()->realArgumentCount, args->context()->callData->argc);
if (index >= argCount)
return PropertyAttributes();
if (index >= numAccessors)
if (!o)
return v4->throwTypeError();
- Q_ASSERT(g->index() < static_cast<unsigned>(o->context()->d()->callData->argc));
- return o->context()->argument(g->index());
+ Q_ASSERT(g->index() < static_cast<unsigned>(o->context()->callData->argc));
+ return o->context()->callData->args[g->index()].asReturnedValue();
}
DEFINE_OBJECT_VTABLE(ArgumentsSetterFunction);
if (!o)
return v4->throwTypeError();
- Q_ASSERT(s->index() < static_cast<unsigned>(o->context()->d()->callData->argc));
- o->context()->d()->callData->args[s->index()] = callData->argc ? callData->args[0].asReturnedValue() : Encode::undefined();
+ Q_ASSERT(s->index() < static_cast<unsigned>(o->context()->callData->argc));
+ o->context()->callData->args[s->index()] = callData->argc ? callData->args[0].asReturnedValue() : Encode::undefined();
return Encode::undefined();
}
CallerPropertyIndex = 3
};
ArgumentsObject(QV4::CallContext *context);
- QV4::CallContext *context;
+ CallContext *context;
bool fullyCreated;
MemberData *mappedArguments;
};
V4_OBJECT2(ArgumentsObject, Object)
Q_MANAGED_TYPE(ArgumentsObject)
- CallContext *context() const { return d()->context; }
+ Heap::CallContext *context() const { return d()->context; }
bool fullyCreated() const { return d()->fullyCreated; }
Heap::MemberData *mappedArguments() { return d()->mappedArguments; }
static bool isNonStrictArgumentsObject(Managed *m) {
return m->internalClass()->vtable->type == Type_ArgumentsObject &&
- !static_cast<ArgumentsObject *>(m)->context()->d()->strictMode;
+ !static_cast<ArgumentsObject *>(m)->context()->strictMode;
}
bool defineOwnProperty(ExecutionContext *ctx, uint index, const Property &desc, PropertyAttributes attrs);
struct ArrayBuffer : Object {
ArrayBuffer(ExecutionEngine *e, int length);
QTypedArrayData<char> *data;
+
+ uint byteLength() const { return data->size; }
};
}
V4_OBJECT2(ArrayBuffer, Object)
QByteArray asByteArray() const;
- uint byteLength() const { return d()->data->size; }
+ uint byteLength() const { return d()->byteLength(); }
char *data() {
// ### detach if refcount > 1
return d()->data->data();
return scope.engine->throwRangeError(QStringLiteral("DataView: constructor arguments out of range"));
Scoped<DataView> a(scope, scope.engine->memoryManager->alloc<DataView>(scope.engine));
- a->d()->buffer = buffer;
+ a->d()->buffer = buffer->d();
a->d()->byteLength = byteLength;
a->d()->byteOffset = byteOffset;
return a.asReturnedValue();
return scope.engine->throwTypeError();
idx += v->d()->byteOffset;
- T t = T(v->d()->buffer->d()->data->data()[idx]);
+ T t = T(v->d()->buffer->data->data()[idx]);
return Encode((int)t);
}
bool littleEndian = ctx->d()->callData->argc < 2 ? false : ctx->d()->callData->args[1].toBoolean();
T t = littleEndian
- ? qFromLittleEndian<T>((uchar *)v->d()->buffer->d()->data->data() + idx)
- : qFromBigEndian<T>((uchar *)v->d()->buffer->d()->data->data() + idx);
+ ? qFromLittleEndian<T>((uchar *)v->d()->buffer->data->data() + idx)
+ : qFromBigEndian<T>((uchar *)v->d()->buffer->data->data() + idx);
return Encode(t);
}
float f;
} u;
u.i = littleEndian
- ? qFromLittleEndian<uint>((uchar *)v->d()->buffer->d()->data->data() + idx)
- : qFromBigEndian<uint>((uchar *)v->d()->buffer->d()->data->data() + idx);
+ ? qFromLittleEndian<uint>((uchar *)v->d()->buffer->data->data() + idx)
+ : qFromBigEndian<uint>((uchar *)v->d()->buffer->data->data() + idx);
return Encode(u.f);
} else {
Q_ASSERT(sizeof(T) == 8);
double d;
} u;
u.i = littleEndian
- ? qFromLittleEndian<quint64>((uchar *)v->d()->buffer->d()->data->data() + idx)
- : qFromBigEndian<quint64>((uchar *)v->d()->buffer->d()->data->data() + idx);
+ ? qFromLittleEndian<quint64>((uchar *)v->d()->buffer->data->data() + idx)
+ : qFromBigEndian<quint64>((uchar *)v->d()->buffer->data->data() + idx);
return Encode(u.d);
}
}
idx += v->d()->byteOffset;
int val = ctx->d()->callData->argc >= 2 ? ctx->d()->callData->args[1].toInt32() : 0;
- v->d()->buffer->d()->data->data()[idx] = (char)val;
+ v->d()->buffer->data->data()[idx] = (char)val;
return Encode::undefined();
}
bool littleEndian = ctx->d()->callData->argc < 3 ? false : ctx->d()->callData->args[2].toBoolean();
if (littleEndian)
- qToLittleEndian<T>(val, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToLittleEndian<T>(val, (uchar *)v->d()->buffer->data->data() + idx);
else
- qToBigEndian<T>(val, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToBigEndian<T>(val, (uchar *)v->d()->buffer->data->data() + idx);
return Encode::undefined();
}
} u;
u.f = val;
if (littleEndian)
- qToLittleEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToLittleEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
else
- qToBigEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToBigEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
} else {
Q_ASSERT(sizeof(T) == 8);
union {
} u;
u.d = val;
if (littleEndian)
- qToLittleEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToLittleEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
else
- qToBigEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+ qToBigEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
}
return Encode::undefined();
}
namespace QV4 {
-struct ArrayBuffer;
-
namespace Heap {
struct DataViewCtor : FunctionObject {
struct DataView : Object {
DataView(ExecutionEngine *e);
- QV4::ArrayBuffer *buffer;
+ ArrayBuffer *buffer;
uint byteLength;
uint byteOffset;
};
trace += QString::number(frame.line);
}
}
- This->d()->stack = ctx->d()->engine->newString(trace)->getPointer();
+ This->d()->stack = ctx->d()->engine->newString(trace)->getPointer()->d();
}
return This->d()->stack->asReturnedValue();
}
ErrorObject(InternalClass *ic, const QString &message, ErrorType t = Error);
ErrorObject(InternalClass *ic, const QString &message, const QString &fileName, int line, int column, ErrorType t = Error);
StackTrace stackTrace;
- QV4::String *stack;
+ String *stack;
};
struct EvalErrorObject : ErrorObject {
struct ErrorObject;
struct ArgumentsObject;
struct QObjectWrapper;
+
+ struct ArrayBuffer;
+ struct DataView;
+ struct TypedArray;
}
class MemoryManager;
struct ExecutionEngine;
struct QObjectWrapper;
+struct ArrayBuffer;
+struct DataView;
+struct TypedArray;
+
// ReturnedValue is used to return values from runtime methods
// the type has to be a primitive type (no struct or union), so that the compiler
// will return it in a register on all platforms.
return Encode::undefined();
Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
- array->d()->buffer = buffer;
+ array->d()->buffer = buffer->d();
array->d()->byteLength = byteLength;
array->d()->byteOffset = 0;
return Encode::undefined();
Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
- array->d()->buffer = newBuffer;
+ array->d()->buffer = newBuffer->d();
array->d()->byteLength = destByteLength;
array->d()->byteOffset = 0;
}
Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
- array->d()->buffer = buffer;
+ array->d()->buffer = buffer->d();
array->d()->byteLength = byteLength;
array->d()->byteOffset = byteOffset;
return array.asReturnedValue();
return Encode::undefined();
Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
- array->d()->buffer = newBuffer;
+ array->d()->buffer = newBuffer->d();
array->d()->byteLength = l * elementSize;
array->d()->byteOffset = 0;
}
if (hasProperty)
*hasProperty = true;
- return a->d()->type->read(a->d()->buffer->d()->data->data(), byteOffset);
+ return a->d()->type->read(a->d()->buffer->data->data(), byteOffset);
}
void TypedArray::putIndexed(Managed *m, uint index, const ValueRef value)
if (byteOffset + bytesPerElement > (uint)a->d()->buffer->byteLength())
goto reject;
- a->d()->type->write(scope.engine, a->d()->buffer->d()->data->data(), byteOffset, value);
+ a->d()->type->write(scope.engine, a->d()->buffer->data->data(), byteOffset, value);
return;
reject: