diff options
author | Jack Moffitt <jack@metajack.im> | 2014-08-28 09:34:23 -0600 |
---|---|---|
committer | Jack Moffitt <jack@metajack.im> | 2014-09-08 20:21:42 -0600 |
commit | c6ab60dbfc6da7b4f800c9e40893c8b58413960c (patch) | |
tree | d1d74076cf7fa20e4f77ec7cb82cae98b67362cb /components/script/dom/bindings/codegen/DOMJSClass.h | |
parent | db2f642c32fc5bed445bb6f2e45b0f6f0b4342cf (diff) | |
download | servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.tar.gz servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.zip |
Cargoify servo
Diffstat (limited to 'components/script/dom/bindings/codegen/DOMJSClass.h')
-rw-r--r-- | components/script/dom/bindings/codegen/DOMJSClass.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/components/script/dom/bindings/codegen/DOMJSClass.h b/components/script/dom/bindings/codegen/DOMJSClass.h new file mode 100644 index 00000000000..151960b5901 --- /dev/null +++ b/components/script/dom/bindings/codegen/DOMJSClass.h @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_DOMJSClass_h +#define mozilla_dom_DOMJSClass_h + +#include "jsapi.h" +#include "jsfriendapi.h" + +#include "mozilla/dom/PrototypeList.h" // auto-generated + +// We use slot 0 for holding the raw object. This is safe for both +// globals and non-globals. +#define DOM_OBJECT_SLOT 0 + +// All DOM globals must have a slot at DOM_PROTOTYPE_SLOT. We have to +// start at 1 past JSCLASS_GLOBAL_SLOT_COUNT because XPConnect uses +// that one. +#define DOM_PROTOTYPE_SLOT (JSCLASS_GLOBAL_SLOT_COUNT + 1) + +// We use these flag bits for the new bindings. +#define JSCLASS_DOM_GLOBAL JSCLASS_USERBIT1 + +// NOTE: This is baked into the Ion JIT as 0 in codegen for LGetDOMProperty and +// LSetDOMProperty. Those constants need to be changed accordingly if this value +// changes. +#define DOM_PROTO_INSTANCE_CLASS_SLOT 0 + +namespace mozilla { +namespace dom { + +typedef bool +(* ResolveProperty)(JSContext* cx, JSObject* wrapper, jsid id, bool set, + JSPropertyDescriptor* desc); +typedef bool +(* EnumerateProperties)(JSContext* cx, JSObject* wrapper, + JS::AutoIdVector& props); + +struct NativePropertyHooks +{ + ResolveProperty mResolveOwnProperty; + ResolveProperty mResolveProperty; + EnumerateProperties mEnumerateOwnProperties; + EnumerateProperties mEnumerateProperties; + + const NativePropertyHooks *mProtoHooks; +}; + +struct DOMClass +{ + // A list of interfaces that this object implements, in order of decreasing + // derivedness. + const prototypes::ID mInterfaceChain[prototypes::id::_ID_Count]; + + // We store the DOM object in reserved slot with index DOM_OBJECT_SLOT or in + // the proxy private if we use a proxy object. + // Sometimes it's an nsISupports and sometimes it's not; this class tells + // us which it is. + const bool mDOMObjectIsISupports; + + const NativePropertyHooks* mNativeHooks; +}; + +// Special JSClass for reflected DOM objects. +struct DOMJSClass +{ + // It would be nice to just inherit from JSClass, but that precludes pure + // compile-time initialization of the form |DOMJSClass = {...};|, since C++ + // only allows brace initialization for aggregate/POD types. + JSClass mBase; + + DOMClass mClass; + + static DOMJSClass* FromJSClass(JSClass* base) { + MOZ_ASSERT(base->flags & JSCLASS_IS_DOMJSCLASS); + return reinterpret_cast<DOMJSClass*>(base); + } + static const DOMJSClass* FromJSClass(const JSClass* base) { + MOZ_ASSERT(base->flags & JSCLASS_IS_DOMJSCLASS); + return reinterpret_cast<const DOMJSClass*>(base); + } + + static DOMJSClass* FromJSClass(js::Class* base) { + return FromJSClass(Jsvalify(base)); + } + static const DOMJSClass* FromJSClass(const js::Class* base) { + return FromJSClass(Jsvalify(base)); + } + + JSClass* ToJSClass() { return &mBase; } +}; + +inline bool +HasProtoOrIfaceArray(JSObject* global) +{ + MOZ_ASSERT(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL); + // This can be undefined if we GC while creating the global + return !js::GetReservedSlot(global, DOM_PROTOTYPE_SLOT).isUndefined(); +} + +inline JSObject** +GetProtoOrIfaceArray(JSObject* global) +{ + MOZ_ASSERT(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL); + return static_cast<JSObject**>( + js::GetReservedSlot(global, DOM_PROTOTYPE_SLOT).toPrivate()); +} + +} // namespace dom +} // namespace mozilla + +#endif /* mozilla_dom_DOMJSClass_h */ |