diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/JSProxy.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSProxy.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSProxy.cpp | 89 |
1 files changed, 68 insertions, 21 deletions
diff --git a/Source/JavaScriptCore/runtime/JSProxy.cpp b/Source/JavaScriptCore/runtime/JSProxy.cpp index ced8cc41f..533b1b5c1 100644 --- a/Source/JavaScriptCore/runtime/JSProxy.cpp +++ b/Source/JavaScriptCore/runtime/JSProxy.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. + * Copyright (C) 2011-2012, 2016-2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,41 +27,44 @@ #include "JSProxy.h" #include "JSGlobalObject.h" -#include "Operations.h" +#include "JSCInlines.h" +#include "PrototypeMapInlines.h" namespace JSC { STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSProxy); -const ClassInfo JSProxy::s_info = { "JSProxy", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSProxy) }; +const ClassInfo JSProxy::s_info = { "JSProxy", &Base::s_info, 0, CREATE_METHOD_TABLE(JSProxy) }; void JSProxy::visitChildren(JSCell* cell, SlotVisitor& visitor) { JSProxy* thisObject = jsCast<JSProxy*>(cell); ASSERT_GC_OBJECT_INHERITS(thisObject, info()); - - COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); - ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); - Base::visitChildren(thisObject, visitor); - visitor.append(&thisObject->m_target); + visitor.append(thisObject->m_target); } void JSProxy::setTarget(VM& vm, JSGlobalObject* globalObject) { ASSERT_ARG(globalObject, globalObject); + JSGlobalObject* previousGlobalObject = jsCast<JSGlobalObject*>(m_target.get()); + m_target.set(vm, this, globalObject); - setPrototype(vm, globalObject->prototype()); + setPrototypeDirect(vm, globalObject->getPrototypeDirect()); PrototypeMap& prototypeMap = vm.prototypeMap; if (!prototypeMap.isPrototype(this)) return; + // previousGlobalObject cannot be null because in order for this JSProxy to be used as a prototype + // of an object, we must have previously called setTarget() and associated it with a JSGlobalObject. + RELEASE_ASSERT(previousGlobalObject); + // This is slow but constant time. We think it's very rare for a proxy // to be a prototype, and reasonably rare to retarget a proxy, // so slow constant time is OK. for (size_t i = 0; i <= JSFinalObject::maxInlineCapacity(); ++i) - prototypeMap.clearEmptyObjectStructureForPrototype(this, i); + prototypeMap.clearEmptyObjectStructureForPrototype(previousGlobalObject, this, i); } String JSProxy::className(const JSObject* object) @@ -70,58 +73,102 @@ String JSProxy::className(const JSObject* object) return thisObject->target()->methodTable()->className(thisObject->target()); } +String JSProxy::toStringName(const JSObject* object, ExecState* exec) +{ + const JSProxy* thisObject = jsCast<const JSProxy*>(object); + return thisObject->target()->methodTable(exec->vm())->toStringName(thisObject->target(), exec); +} + bool JSProxy::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) { JSProxy* thisObject = jsCast<JSProxy*>(object); - return thisObject->target()->methodTable()->getOwnPropertySlot(thisObject->target(), exec, propertyName, slot); + return thisObject->target()->methodTable(exec->vm())->getOwnPropertySlot(thisObject->target(), exec, propertyName, slot); } bool JSProxy::getOwnPropertySlotByIndex(JSObject* object, ExecState* exec, unsigned propertyName, PropertySlot& slot) { JSProxy* thisObject = jsCast<JSProxy*>(object); - return thisObject->target()->methodTable()->getOwnPropertySlotByIndex(thisObject->target(), exec, propertyName, slot); + return thisObject->target()->methodTable(exec->vm())->getOwnPropertySlotByIndex(thisObject->target(), exec, propertyName, slot); } -void JSProxy::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot) +bool JSProxy::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot) { JSProxy* thisObject = jsCast<JSProxy*>(cell); - thisObject->target()->methodTable()->put(thisObject->target(), exec, propertyName, value, slot); + return thisObject->target()->methodTable(exec->vm())->put(thisObject->target(), exec, propertyName, value, slot); } -void JSProxy::putByIndex(JSCell* cell, ExecState* exec, unsigned propertyName, JSValue value, bool shouldThrow) +bool JSProxy::putByIndex(JSCell* cell, ExecState* exec, unsigned propertyName, JSValue value, bool shouldThrow) { JSProxy* thisObject = jsCast<JSProxy*>(cell); - thisObject->target()->methodTable()->putByIndex(thisObject->target(), exec, propertyName, value, shouldThrow); + return thisObject->target()->methodTable(exec->vm())->putByIndex(thisObject->target(), exec, propertyName, value, shouldThrow); } bool JSProxy::defineOwnProperty(JSObject* object, ExecState* exec, PropertyName propertyName, const PropertyDescriptor& descriptor, bool shouldThrow) { JSProxy* thisObject = jsCast<JSProxy*>(object); - return thisObject->target()->methodTable()->defineOwnProperty(thisObject->target(), exec, propertyName, descriptor, shouldThrow); + return thisObject->target()->methodTable(exec->vm())->defineOwnProperty(thisObject->target(), exec, propertyName, descriptor, shouldThrow); } bool JSProxy::deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName) { JSProxy* thisObject = jsCast<JSProxy*>(cell); - return thisObject->target()->methodTable()->deleteProperty(thisObject->target(), exec, propertyName); + return thisObject->target()->methodTable(exec->vm())->deleteProperty(thisObject->target(), exec, propertyName); +} + +bool JSProxy::preventExtensions(JSObject* object, ExecState* exec) +{ + JSProxy* thisObject = jsCast<JSProxy*>(object); + return thisObject->target()->methodTable(exec->vm())->preventExtensions(thisObject->target(), exec); } bool JSProxy::deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned propertyName) { JSProxy* thisObject = jsCast<JSProxy*>(cell); - return thisObject->target()->methodTable()->deletePropertyByIndex(thisObject->target(), exec, propertyName); + return thisObject->target()->methodTable(exec->vm())->deletePropertyByIndex(thisObject->target(), exec, propertyName); } void JSProxy::getPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) { JSProxy* thisObject = jsCast<JSProxy*>(object); - thisObject->target()->methodTable()->getPropertyNames(thisObject->target(), exec, propertyNames, mode); + thisObject->target()->methodTable(exec->vm())->getPropertyNames(thisObject->target(), exec, propertyNames, mode); +} + +uint32_t JSProxy::getEnumerableLength(ExecState* exec, JSObject* object) +{ + JSProxy* thisObject = jsCast<JSProxy*>(object); + return thisObject->target()->methodTable(exec->vm())->getEnumerableLength(exec, thisObject->target()); +} + +void JSProxy::getStructurePropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode) +{ + // Skip the structure loop, since it is invalid for proxies. +} + +void JSProxy::getGenericPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) +{ + JSProxy* thisObject = jsCast<JSProxy*>(object); + // Get *all* of the property names, not just the generic ones, since we skipped the structure + // ones above. + thisObject->target()->methodTable(exec->vm())->getPropertyNames(thisObject->target(), exec, propertyNames, mode); } void JSProxy::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) { JSProxy* thisObject = jsCast<JSProxy*>(object); - thisObject->target()->methodTable()->getOwnPropertyNames(thisObject->target(), exec, propertyNames, mode); + thisObject->target()->methodTable(exec->vm())->getOwnPropertyNames(thisObject->target(), exec, propertyNames, mode); +} + +bool JSProxy::setPrototype(JSObject*, ExecState* exec, JSValue, bool shouldThrowIfCantSet) +{ + auto scope = DECLARE_THROW_SCOPE(exec->vm()); + + return typeError(exec, scope, shouldThrowIfCantSet, ASCIILiteral("Cannot set prototype of this object")); +} + +JSValue JSProxy::getPrototype(JSObject* object, ExecState* exec) +{ + JSProxy* thisObject = jsCast<JSProxy*>(object); + return thisObject->target()->methodTable(exec->vm())->getPrototype(thisObject->target(), exec); } } // namespace JSC |