tor-browser

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

Object.h (1726B)


      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 /*
      8 * Shadow definition of |JSObject| innards.  (|js::NativeObject| is more
      9 * accurate, but portions can sometimes be used in some non-native objects.)  Do
     10 * not use this directly!
     11 */
     12 
     13 #ifndef js_shadow_Object_h
     14 #define js_shadow_Object_h
     15 
     16 #include <stddef.h>  // size_t
     17 
     18 #include "js/shadow/Shape.h"  // JS::shadow::Shape
     19 #include "js/Value.h"         // JS::Value
     20 
     21 class JS_PUBLIC_API JSObject;
     22 
     23 namespace JS {
     24 
     25 class JS_PUBLIC_API Value;
     26 
     27 namespace shadow {
     28 
     29 /**
     30 * This layout is shared by all native objects. For non-native objects, the
     31 * shape may always be accessed safely, and other members may be as well,
     32 * depending on the object's specific layout.
     33 */
     34 struct Object {
     35  shadow::Shape* shape;
     36 #ifndef JS_64BIT
     37  uint32_t padding_;
     38 #endif
     39  Value* slots;
     40  void* _1;
     41 
     42  static constexpr size_t MAX_FIXED_SLOTS = 16;
     43 
     44  size_t numFixedSlots() const {
     45    return (shape->immutableFlags & shadow::Shape::FIXED_SLOTS_MASK) >>
     46           shadow::Shape::FIXED_SLOTS_SHIFT;
     47  }
     48 
     49  Value* fixedSlots() const {
     50    auto address = reinterpret_cast<uintptr_t>(this);
     51    return reinterpret_cast<JS::Value*>(address + sizeof(shadow::Object));
     52  }
     53 
     54  Value& slotRef(size_t slot) const {
     55    size_t nfixed = numFixedSlots();
     56    if (slot < nfixed) {
     57      return fixedSlots()[slot];
     58    }
     59    return slots[slot - nfixed];
     60  }
     61 };
     62 
     63 }  // namespace shadow
     64 
     65 }  // namespace JS
     66 
     67 #endif  // js_shadow_Object_h