tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

PlainObject.h (4358B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef vm_PlainObject_h
      8 #define vm_PlainObject_h
      9 
     10 #include "ds/IdValuePair.h"
     11 #include "gc/AllocKind.h"     // js::gc::AllocKind
     12 #include "js/Class.h"         // JSClass
     13 #include "js/RootingAPI.h"    // JS::Handle
     14 #include "vm/JSObject.h"      // js::NewObjectKind
     15 #include "vm/NativeObject.h"  // js::NativeObject
     16 
     17 struct JS_PUBLIC_API JSContext;
     18 class JS_PUBLIC_API JSFunction;
     19 class JS_PUBLIC_API JSObject;
     20 
     21 namespace js {
     22 
     23 struct IdValuePair;
     24 
     25 // Object class for plain native objects created using '{}' object literals,
     26 // 'new Object()', 'Object.create', etc.
     27 class PlainObject : public NativeObject {
     28 public:
     29  static const JSClass class_;
     30 
     31 private:
     32 #ifdef DEBUG
     33  void assertHasNoNonWritableOrAccessorPropExclProto() const;
     34 #endif
     35 
     36 public:
     37  static inline js::PlainObject* createWithShape(JSContext* cx,
     38                                                 JS::Handle<SharedShape*> shape,
     39                                                 gc::AllocKind kind,
     40                                                 NewObjectKind newKind);
     41 
     42  static inline js::PlainObject* createWithShape(
     43      JSContext* cx, JS::Handle<SharedShape*> shape,
     44      NewObjectKind newKind = GenericObject);
     45 
     46  static inline PlainObject* createWithTemplate(
     47      JSContext* cx, JS::Handle<PlainObject*> templateObject);
     48 
     49  static js::PlainObject* createWithTemplateFromDifferentRealm(
     50      JSContext* cx, JS::Handle<PlainObject*> templateObject);
     51 
     52  /* Return the allocKind we would use if we were to tenure this object. */
     53  inline gc::AllocKind allocKindForTenure() const;
     54 
     55  bool hasNonWritableOrAccessorPropExclProto() const {
     56    if (hasFlag(ObjectFlag::HasNonWritableOrAccessorPropExclProto)) {
     57      return true;
     58    }
     59 #ifdef DEBUG
     60    assertHasNoNonWritableOrAccessorPropExclProto();
     61 #endif
     62    return false;
     63  }
     64 };
     65 
     66 // Specializations of 7.3.23 CopyDataProperties(...) for NativeObjects.
     67 extern bool CopyDataPropertiesNative(JSContext* cx,
     68                                     JS::Handle<PlainObject*> target,
     69                                     JS::Handle<NativeObject*> from,
     70                                     JS::Handle<PlainObject*> excludedItems,
     71                                     bool* optimized);
     72 
     73 // Specialized call to get the shape to use when creating |this| for a known
     74 // function callee.
     75 extern SharedShape* ThisShapeForFunction(JSContext* cx,
     76                                         JS::Handle<JSFunction*> callee,
     77                                         JS::Handle<JSObject*> newTarget);
     78 
     79 // Create a new PlainObject with %Object.prototype% as prototype.
     80 extern PlainObject* NewPlainObject(JSContext* cx,
     81                                   NewObjectKind newKind = GenericObject);
     82 
     83 // Like NewPlainObject, but uses the given AllocKind. This allows creating an
     84 // object with fixed slots available for properties.
     85 extern PlainObject* NewPlainObjectWithAllocKind(
     86    JSContext* cx, gc::AllocKind allocKind,
     87    NewObjectKind newKind = GenericObject);
     88 
     89 // Create a new PlainObject with the given |proto| as prototype.
     90 extern PlainObject* NewPlainObjectWithProto(
     91    JSContext* cx, HandleObject proto, NewObjectKind newKind = GenericObject);
     92 
     93 // Like NewPlainObjectWithProto, but uses the given AllocKind. This allows
     94 // creating an object with fixed slots available for properties.
     95 extern PlainObject* NewPlainObjectWithProtoAndAllocKind(
     96    JSContext* cx, HandleObject proto, gc::AllocKind allocKind,
     97    NewObjectKind newKind = GenericObject);
     98 
     99 // Create a plain object with the given properties. The list must not contain
    100 // duplicate keys or integer keys.
    101 extern PlainObject* NewPlainObjectWithUniqueNames(
    102    JSContext* cx, Handle<IdValueVector> properties,
    103    NewObjectKind newKind = GenericObject);
    104 
    105 // Create a plain object with the given properties. The list may contain integer
    106 // keys or duplicate keys.
    107 extern PlainObject* NewPlainObjectWithMaybeDuplicateKeys(
    108    JSContext* cx, Handle<IdValueVector> properties,
    109    NewObjectKind newKind = GenericObject);
    110 
    111 }  // namespace js
    112 
    113 #endif  // vm_PlainObject_h