本文整理汇总了C++中HandleFunction::isCloneAtCallsite方法的典型用法代码示例。如果您正苦于以下问题:C++ HandleFunction::isCloneAtCallsite方法的具体用法?C++ HandleFunction::isCloneAtCallsite怎么用?C++ HandleFunction::isCloneAtCallsite使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类HandleFunction
的用法示例。
在下文中一共展示了HandleFunction::isCloneAtCallsite方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: skipHash
RawFunction
js::CloneFunctionAtCallsite(JSContext *cx, HandleFunction fun, HandleScript script, jsbytecode *pc)
{
JS_ASSERT(cx->typeInferenceEnabled());
JS_ASSERT(fun->isCloneAtCallsite());
JS_ASSERT(types::UseNewTypeForClone(fun));
JS_ASSERT(!fun->nonLazyScript()->enclosingStaticScope());
typedef CallsiteCloneKey Key;
typedef CallsiteCloneTable Table;
Table &table = cx->compartment->callsiteClones;
if (!table.initialized() && !table.init())
return NULL;
Key key;
key.script = script;
key.offset = pc - script->code;
key.original = fun;
Table::AddPtr p = table.lookupForAdd(key);
SkipRoot skipHash(cx, &p); /* Prevent the hash from being poisoned. */
if (p)
return p->value;
RootedObject parent(cx, fun->environment());
RootedFunction clone(cx, CloneFunctionObject(cx, fun, parent,
JSFunction::ExtendedFinalizeKind));
if (!clone)
return NULL;
// Store a link back to the original for function.caller.
clone->setExtendedSlot(0, ObjectValue(*fun));
// Recalculate the hash if script or fun have been moved.
if (key.script != script && key.original != fun) {
key.script = script;
key.original = fun;
Table::AddPtr p = table.lookupForAdd(key);
JS_ASSERT(!p);
}
if (!table.relookupOrAdd(p, key, clone.get()))
return NULL;
return clone;
}