当前位置: 首页>>代码示例>>C++>>正文


C++ Compartment::lookupWrapper方法代码示例

本文整理汇总了C++中js::Compartment::lookupWrapper方法的典型用法代码示例。如果您正苦于以下问题:C++ Compartment::lookupWrapper方法的具体用法?C++ Compartment::lookupWrapper怎么用?C++ Compartment::lookupWrapper使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在js::Compartment的用法示例。


在下文中一共展示了Compartment::lookupWrapper方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: NukeCrossCompartmentWrapper

JS_FRIEND_API void js::NukeCrossCompartmentWrapper(JSContext* cx,
                                                   JSObject* wrapper) {
  JS::Compartment* comp = wrapper->compartment();
  auto ptr = comp->lookupWrapper(Wrapper::wrappedObject(wrapper));
  if (ptr) {
    comp->removeWrapper(ptr);
  }
  NukeRemovedCrossCompartmentWrapper(cx, wrapper);
}
开发者ID:servo,项目名称:mozjs,代码行数:9,代码来源:CrossCompartmentWrapper.cpp

示例2: RemapWrapper

// Given a cross-compartment wrapper |wobj|, update it to point to
// |newTarget|. This recomputes the wrapper with JS_WrapValue, and thus can be
// useful even if wrapper already points to newTarget.
// This operation crashes on failure rather than leaving the heap in an
// inconsistent state.
void js::RemapWrapper(JSContext* cx, JSObject* wobjArg,
                      JSObject* newTargetArg) {
  MOZ_ASSERT(!IsInsideNursery(wobjArg));
  MOZ_ASSERT(!IsInsideNursery(newTargetArg));

  RootedObject wobj(cx, wobjArg);
  RootedObject newTarget(cx, newTargetArg);
  MOZ_ASSERT(wobj->is<CrossCompartmentWrapperObject>());
  MOZ_ASSERT(!newTarget->is<CrossCompartmentWrapperObject>());
  JSObject* origTarget = Wrapper::wrappedObject(wobj);
  MOZ_ASSERT(origTarget);
  MOZ_ASSERT(!JS_IsDeadWrapper(origTarget),
             "We don't want a dead proxy in the wrapper map");
  Value origv = ObjectValue(*origTarget);
  JS::Compartment* wcompartment = wobj->compartment();
  MOZ_ASSERT(wcompartment != newTarget->compartment());

  AutoDisableProxyCheck adpc;

  // If we're mapping to a different target (as opposed to just recomputing
  // for the same target), we must not have an existing wrapper for the new
  // target, otherwise this will break.
  MOZ_ASSERT_IF(origTarget != newTarget,
                !wcompartment->lookupWrapper(ObjectValue(*newTarget)));

  // The old value should still be in the cross-compartment wrapper map, and
  // the lookup should return wobj.
  WrapperMap::Ptr p = wcompartment->lookupWrapper(origv);
  MOZ_ASSERT(&p->value().unsafeGet()->toObject() == wobj);
  wcompartment->removeWrapper(p);

  // When we remove origv from the wrapper map, its wrapper, wobj, must
  // immediately cease to be a cross-compartment wrapper. Nuke it.
  NukeCrossCompartmentWrapper(cx, wobj);

  // wobj is no longer a cross-compartment wrapper after nuking it, so we can
  // now use nonCCWRealm.
  Realm* wrealm = wobj->nonCCWRealm();

  // First, we wrap it in the new compartment. We try to use the existing
  // wrapper, |wobj|, since it's been nuked anyway. The wrap() function has
  // the choice to reuse |wobj| or not.
  RootedObject tobj(cx, newTarget);
  AutoRealmUnchecked ar(cx, wrealm);
  AutoEnterOOMUnsafeRegion oomUnsafe;
  if (!wcompartment->rewrap(cx, &tobj, wobj)) {
    oomUnsafe.crash("js::RemapWrapper");
  }

  // If wrap() reused |wobj|, it will have overwritten it and returned with
  // |tobj == wobj|. Otherwise, |tobj| will point to a new wrapper and |wobj|
  // will still be nuked. In the latter case, we replace |wobj| with the
  // contents of the new wrapper in |tobj|.
  if (tobj != wobj) {
    // Now, because we need to maintain object identity, we do a brain
    // transplant on the old object so that it contains the contents of the
    // new one.
    JSObject::swap(cx, wobj, tobj);
  }

  // Before swapping, this wrapper came out of wrap(), which enforces the
  // invariant that the wrapper in the map points directly to the key.
  MOZ_ASSERT(Wrapper::wrappedObject(wobj) == newTarget);

  // Update the entry in the compartment's wrapper map to point to the old
  // wrapper, which has now been updated (via reuse or swap).
  MOZ_ASSERT(wobj->is<WrapperObject>());
  if (!wcompartment->putWrapper(cx, CrossCompartmentKey(newTarget),
                                ObjectValue(*wobj))) {
    oomUnsafe.crash("js::RemapWrapper");
  }
}
开发者ID:servo,项目名称:mozjs,代码行数:77,代码来源:CrossCompartmentWrapper.cpp


注:本文中的js::Compartment::lookupWrapper方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。