return object;
}
-Object *ExecutionEngine::newArrayObject()
+ArrayObject *ExecutionEngine::newArrayObject()
{
ArrayObject *object = new ArrayObject();
object->prototype = arrayPrototype;
return object;
}
-Object *ExecutionEngine::newArrayObject(const Array &value)
+ArrayObject *ExecutionEngine::newArrayObject(const Array &value)
{
ArrayObject *object = new ArrayObject(value);
object->prototype = arrayPrototype;
Object *newFunctionObject(ExecutionContext *ctx);
- Object *newArrayObject();
- Object *newArrayObject(const Array &value);
+ ArrayObject *newArrayObject();
+ ArrayObject *newArrayObject(const Array &value);
FunctionObject *newArrayCtor(ExecutionContext *ctx);
Object *newDateObject(const Value &value);
Value ObjectPrototype::method_keys(ExecutionContext *ctx)
{
- ctx->throwUnimplemented(QStringLiteral("Object.keys"));
- return Value::undefinedValue();
+ if (!ctx->argument(0).isObject())
+ __qmljs_throw_type_error(ctx);
+
+ Object *o = ctx->argument(0).objectValue();
+
+ ArrayObject *a = ctx->engine->newArrayObject();
+
+ if (o->members) {
+ PropertyTable::iterator it = o->members->begin();
+ while (it != o->members->end()) {
+ if ((*it)->descriptor.isEnumerable())
+ a->value.push(Value::fromString((*it)->name));
+ ++it;
+ }
+ }
+
+ return Value::fromObject(a);
}
Value ObjectPrototype::method_toString(ExecutionContext *ctx)
Value ObjectPrototype::method_propertyIsEnumerable(ExecutionContext *ctx)
{
- ctx->throwUnimplemented(QStringLiteral("Object.prototype.propertyIsEnumerable"));
- return Value::undefinedValue();
+ String *p = ctx->argument(0).toString(ctx);
+
+ Object *o = ctx->thisObject.toObject(ctx).objectValue();
+ PropertyDescriptor *pd = o->__getOwnProperty__(ctx, p);
+ return Value::fromBoolean(pd && pd->enumberable);
}
Value ObjectPrototype::method_defineGetter(ExecutionContext *ctx)