FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

GitHub Viewer

/* * Copyright (C) 2006-2022 Apple Inc. All rights reserved. * Copyright (C) 2007 Eric Seidel * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef JSCallbackObject_h #define JSCallbackObject_h #if JSC_OBJC_API_ENABLED || defined(JSC_GLIB_API_ENABLED) #include "JSAPIWrapperObject.h" #endif #if defined(JSC_GLIB_API_ENABLED) #include "JSAPIWrapperGlobalObject.h" #endif #include "JSBase.h" #include "JSGlobalObject.h" #include "JSObject.h" #include "JSObjectRef.h" #include "JSValueRef.h" #include namespace JSC { struct JSCallbackObjectData { WTF_DEPRECATED_MAKE_FAST_ALLOCATED(JSCallbackObjectData); public: JSCallbackObjectData(void* privateData, JSClassRef jsClass) : privateData(privateData) , jsClass(jsClass) { JSClassRetain(jsClass); } ~JSCallbackObjectData() { JSClassRelease(jsClass); } JSValue getPrivateProperty(const Identifier& propertyName) const { if (!m_privateProperties) return JSValue(); return m_privateProperties->getPrivateProperty(propertyName); } void setPrivateProperty(VM& vm, JSCell* owner, const Identifier& propertyName, JSValue value) { if (!m_privateProperties) m_privateProperties = makeUnique(); m_privateProperties->setPrivateProperty(vm, owner, propertyName, value); } void deletePrivateProperty(const Identifier& propertyName) { if (!m_privateProperties) return; m_privateProperties->deletePrivateProperty(propertyName); } DECLARE_VISIT_CHILDREN; template void visitChildren(Visitor& visitor) { JSPrivatePropertyMap* properties = m_privateProperties.get(); if (!properties) return; properties->visitChildren(visitor); } void* privateData; JSClassRef jsClass; struct JSPrivatePropertyMap { WTF_DEPRECATED_MAKE_FAST_ALLOCATED(JSPrivatePropertyMap); public: JSValue getPrivateProperty(const Identifier& propertyName) const { PrivatePropertyMap::const_iterator location = m_propertyMap.find(propertyName.impl()); if (location == m_propertyMap.end()) return JSValue(); return location->value.get(); } void setPrivateProperty(VM& vm, JSCell* owner, const Identifier& propertyName, JSValue value) { Locker locker { m_lock }; WriteBarrier empty; m_propertyMap.add(propertyName.impl(), empty).iterator->value.set(vm, owner, value); } void deletePrivateProperty(const Identifier& propertyName) { Locker locker { m_lock }; m_propertyMap.remove(propertyName.impl()); } template void visitChildren(Visitor& visitor) { Locker locker { m_lock }; for (auto& pair : m_propertyMap) { if (pair.value) visitor.append(pair.value); } } private: typedef UncheckedKeyHashMap PrivatePropertyMap; PrivatePropertyMap m_propertyMap; Lock m_lock; }; std::unique_ptr m_privateProperties; }; template class JSCallbackObject final : public Parent { public: using Base = Parent; static constexpr unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetOwnSpecialPropertyNames | OverridesGetCallData | OverridesPut | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | ImplementsHasInstance | ProhibitsPropertyCaching | GetOwnPropertySlotMayBeWrongAboutDontEnum; static_assert(!(StructureFlags & ImplementsDefaultHasInstance), "using customHasInstance"); ~JSCallbackObject(); static JSCallbackObject* create(JSGlobalObject* globalObject, Structure* structure, JSClassRef classRef, void* data) { VM& vm = getVM(globalObject); ASSERT_UNUSED(globalObject, !structure->realm() || structure->realm() == globalObject); JSCallbackObject* callbackObject = new (NotNull, allocateCell(vm)) JSCallbackObject(globalObject, structure, classRef, data); callbackObject->finishCreation(globalObject); return callbackObject; } static JSCallbackObject* create(VM&, JSClassRef, Structure*); static const DestructionMode needsDestruction; static void destroy(JSCell* cell) { static_cast(cell)->JSCallbackObject::~JSCallbackObject(); } template static GCClient::IsoSubspace* subspaceFor(VM& vm) { return subspaceForImpl(vm, mode); } void setPrivate(void* data); void* getPrivate(); DECLARE_INFO; JSClassRef classRef() const { return m_callbackObjectData->jsClass; } bool inherits(JSClassRef) const; static Structure* createStructure(VM&, JSGlobalObject*, JSValue); JSValue getPrivateProperty(const Identifier& propertyName) const { return m_callbackObjectData->getPrivateProperty(propertyName); } void setPrivateProperty(VM& vm, const Identifier& propertyName, JSValue value) { m_callbackObjectData->setPrivateProperty(vm, this, propertyName, value); } void deletePrivateProperty(const Identifier& propertyName) { m_callbackObjectData->deletePrivateProperty(propertyName); } using Parent::methodTable; static EncodedJSValue callImpl(JSGlobalObject*, CallFrame*); static EncodedJSValue constructImpl(JSGlobalObject*, CallFrame*); static EncodedJSValue staticFunctionGetterImpl(JSGlobalObject*, EncodedJSValue, PropertyName); static EncodedJSValue callbackGetterImpl(JSGlobalObject*, EncodedJSValue, PropertyName); DECLARE_VISIT_CHILDREN; private: JSCallbackObject(JSGlobalObject*, Structure*, JSClassRef, void* data); JSCallbackObject(VM&, JSClassRef, Structure*); void finishCreation(JSGlobalObject*); void finishCreation(VM&); static GCClient::IsoSubspace* subspaceForImpl(VM&, SubspaceAccess); static EncodedJSValue JSC_HOST_CALL_ATTRIBUTES customToPrimitive(JSGlobalObject*, CallFrame*); static bool getOwnPropertySlot(JSObject*, JSGlobalObject*, PropertyName, PropertySlot&); static bool getOwnPropertySlotByIndex(JSObject*, JSGlobalObject*, unsigned propertyName, PropertySlot&); static bool put(JSCell*, JSGlobalObject*, PropertyName, JSValue, PutPropertySlot&); static bool putByIndex(JSCell*, JSGlobalObject*, unsigned, JSValue, bool shouldThrow); static bool deleteProperty(JSCell*, JSGlobalObject*, PropertyName, DeletePropertySlot&); static bool deletePropertyByIndex(JSCell*, JSGlobalObject*, unsigned); static bool customHasInstance(JSObject*, JSGlobalObject*, JSValue); static void getOwnSpecialPropertyNames(JSObject*, JSGlobalObject*, PropertyNameArrayBuilder&, DontEnumPropertiesMode); static CallData getConstructData(JSCell*); static CallData getCallData(JSCell*); void init(JSGlobalObject*); static JSCallbackObject* asCallbackObject(JSValue); static JSCallbackObject* asCallbackObject(EncodedJSValue); using RawNativeFunction = EncodedJSValue(JSC_HOST_CALL_ATTRIBUTES*)(JSGlobalObject*, CallFrame*); static RawNativeFunction getCallFunction(); static RawNativeFunction getConstructFunction(); static GetValueFunc getStaticFunctionGetter(); static GetValueFunc getCallbackGetter(); JSValue getStaticValue(JSGlobalObject*, PropertyName); std::unique_ptr m_callbackObjectData; const ClassInfo* m_classInfo { nullptr }; }; template template void JSCallbackObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) { JSCallbackObject* thisObject = uncheckedDowncast(cell); ASSERT_GC_OBJECT_INHERITS((static_cast(thisObject)), JSCallbackObject::info()); Parent::visitChildren(thisObject, visitor); thisObject->m_callbackObjectData->visitChildren(visitor); } // JSCallbackObject::info()'s forward definition triggers an undefined template var warning // without these declarations in the same translation unit. template const ClassInfo JSCallbackObject::s_info; template const ClassInfo JSCallbackObject::s_info; #if defined(JSC_GLIB_API_ENABLED) template const ClassInfo JSCallbackObject::s_info; #endif #if JSC_OBJC_API_ENABLED || defined(JSC_GLIB_API_ENABLED) template const ClassInfo JSCallbackObject::s_info; #endif } // namespace JSC // include the actual template class implementation #include "JSCallbackObjectFunctions.h" #endif // JSCallbackObject_h

Back | FazBrowse Home | New Git URL