本文整理汇总了C++中JSValue::asCell方法的典型用法代码示例。如果您正苦于以下问题:C++ JSValue::asCell方法的具体用法?C++ JSValue::asCell怎么用?C++ JSValue::asCell使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JSValue
的用法示例。
在下文中一共展示了JSValue::asCell方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: append
void SlotVisitor::append(JSValue value)
{
if (!value || !value.isCell())
return;
if (UNLIKELY(m_heapSnapshotBuilder))
m_heapSnapshotBuilder->appendEdge(m_currentCell, value.asCell());
setMarkedAndAppendToMarkStack(value.asCell());
}
示例2: speculationFromValue
SpeculatedType speculationFromValue(JSValue value)
{
if (value.isEmpty())
return SpecEmpty;
if (value.isInt32())
return SpecInt32;
if (value.isDouble()) {
double number = value.asNumber();
if (number == number) {
int64_t asInt64 = static_cast<int64_t>(number);
if (asInt64 == number && (asInt64 || !std::signbit(number))
&& asInt64 < (static_cast<int64_t>(1) << 47)
&& asInt64 >= -(static_cast<int64_t>(1) << 47)) {
return SpecInt48AsDouble;
}
return SpecNonIntAsDouble;
}
return SpecDoubleNaN;
}
if (value.isCell())
return speculationFromCell(value.asCell());
if (value.isBoolean())
return SpecBoolean;
ASSERT(value.isUndefinedOrNull());
return SpecOther;
}
示例3: operationGetByVal
EncodedJSValue DFG_OPERATION operationGetByVal(ExecState* exec, EncodedJSValue encodedBase, EncodedJSValue encodedProperty)
{
JSGlobalData* globalData = &exec->globalData();
NativeCallFrameTracer tracer(globalData, exec);
JSValue baseValue = JSValue::decode(encodedBase);
JSValue property = JSValue::decode(encodedProperty);
if (LIKELY(baseValue.isCell())) {
JSCell* base = baseValue.asCell();
if (property.isUInt32()) {
return getByVal(exec, base, property.asUInt32());
} else if (property.isDouble()) {
double propertyAsDouble = property.asDouble();
uint32_t propertyAsUInt32 = static_cast<uint32_t>(propertyAsDouble);
if (propertyAsUInt32 == propertyAsDouble)
return getByVal(exec, base, propertyAsUInt32);
} else if (property.isString()) {
if (JSValue result = base->fastGetOwnProperty(exec, asString(property)->value(exec)))
return JSValue::encode(result);
}
}
Identifier ident(exec, property.toString(exec)->value(exec));
return JSValue::encode(baseValue.get(exec, ident));
}
示例4: mergeOSREntryValue
bool AbstractValue::mergeOSREntryValue(Graph& graph, JSValue value)
{
AbstractValue oldMe = *this;
if (isClear()) {
FrozenValue* frozenValue = graph.freeze(value);
if (frozenValue->pointsToHeap()) {
m_structure = frozenValue->structure();
m_arrayModes = asArrayModes(frozenValue->structure()->indexingType());
} else {
m_structure.clear();
m_arrayModes = 0;
}
m_type = speculationFromValue(value);
m_value = value;
} else {
mergeSpeculation(m_type, speculationFromValue(value));
if (!!value && value.isCell()) {
Structure* structure = value.asCell()->structure();
graph.registerStructure(structure);
mergeArrayModes(m_arrayModes, asArrayModes(structure->indexingType()));
m_structure.merge(StructureSet(structure));
}
if (m_value != value)
m_value = JSValue();
}
checkConsistency();
assertIsRegistered(graph);
return oldMe != *this;
}
示例5: codeBlockFromArg
static CodeBlock* codeBlockFromArg(ExecState* exec)
{
VM& vm = exec->vm();
if (exec->argumentCount() < 1)
return nullptr;
JSValue value = exec->uncheckedArgument(0);
CodeBlock* candidateCodeBlock = nullptr;
if (value.isCell()) {
JSFunction* func = jsDynamicCast<JSFunction*>(vm, value.asCell());
if (func) {
if (func->isHostFunction())
candidateCodeBlock = nullptr;
else
candidateCodeBlock = func->jsExecutable()->eitherCodeBlock();
}
} else if (value.isDouble()) {
// If the value is a double, it may be an encoded CodeBlock* that came from
// $vm.codeBlockForFrame(). We'll treat it as a candidate codeBlock and check if it's
// valid below before using.
candidateCodeBlock = reinterpret_cast<CodeBlock*>(bitwise_cast<uint64_t>(value.asDouble()));
}
if (candidateCodeBlock && JSDollarVMPrototype::isValidCodeBlock(exec, candidateCodeBlock))
return candidateCodeBlock;
if (candidateCodeBlock)
dataLog("Invalid codeBlock: ", RawPointer(candidateCodeBlock), " ", value, "\n");
else
dataLog("Invalid codeBlock: ", value, "\n");
return nullptr;
}
示例6: appendHidden
void SlotVisitor::appendHidden(JSValue value)
{
if (!value || !value.isCell())
return;
setMarkedAndAppendToMarkStack(value.asCell());
}
示例7: functionDetails
JSValue JSInjectedScriptHost::functionDetails(ExecState* exec)
{
if (exec->argumentCount() < 1)
return jsUndefined();
JSValue value = exec->argument(0);
if (!value.asCell()->inherits(&JSFunction::s_info))
return jsUndefined();
JSFunction* function = jsCast<JSFunction*>(value);
const SourceCode* sourceCode = function->sourceCode();
if (!sourceCode)
return jsUndefined();
int lineNumber = sourceCode->firstLine();
if (lineNumber)
lineNumber -= 1; // In the inspector protocol all positions are 0-based while in SourceCode they are 1-based
UString scriptId = UString::number(sourceCode->provider()->asID());
JSObject* location = constructEmptyObject(exec);
location->putDirect(exec->globalData(), Identifier(exec, "lineNumber"), jsNumber(lineNumber));
location->putDirect(exec->globalData(), Identifier(exec, "scriptId"), jsString(exec, scriptId));
JSObject* result = constructEmptyObject(exec);
result->putDirect(exec->globalData(), Identifier(exec, "location"), location);
UString name = function->name(exec);
if (!name.isEmpty())
result->putDirect(exec->globalData(), Identifier(exec, "name"), jsString(exec, name));
UString displayName = function->displayName(exec);
if (!displayName.isEmpty())
result->putDirect(exec->globalData(), Identifier(exec, "displayName"), jsString(exec, displayName));
// FIXME: provide function scope data in "scopesRaw" property when JSC supports it.
// https://bugs.webkit.org/show_bug.cgi?id=87192
return result;
}
示例8: prototypeChainMayInterceptStoreTo
bool Structure::prototypeChainMayInterceptStoreTo(JSGlobalData& globalData, PropertyName propertyName)
{
unsigned i = propertyName.asIndex();
if (i != PropertyName::NotAnIndex)
return anyObjectInChainMayInterceptIndexedAccesses();
for (Structure* current = this; ;) {
JSValue prototype = current->storedPrototype();
if (prototype.isNull())
return false;
current = prototype.asCell()->structure();
unsigned attributes;
JSCell* specificValue;
PropertyOffset offset = current->get(globalData, propertyName, attributes, specificValue);
if (!JSC::isValidOffset(offset))
continue;
if (attributes & (ReadOnly | Accessor))
return true;
return false;
}
}
示例9:
CallLinkStatus::CallLinkStatus(JSValue value)
: m_callTarget(value)
, m_executable(0)
, m_structure(0)
, m_couldTakeSlowPath(false)
, m_isProved(false)
{
if (!value || !value.isCell())
return;
m_structure = value.asCell()->structure();
if (!value.asCell()->inherits(&JSFunction::s_info))
return;
m_executable = jsCast<JSFunction*>(value.asCell())->executable();
}
示例10: processUnverifiedStackTraces
void SamplingProfiler::processUnverifiedStackTraces()
{
// This function needs to be called from the JSC execution thread.
RELEASE_ASSERT(m_lock.isLocked());
TinyBloomFilter filter = m_vm.heap.objectSpace().blocks().filter();
MarkedBlockSet& markedBlockSet = m_vm.heap.objectSpace().blocks();
for (unsigned i = m_indexOfNextStackTraceToVerify; i < m_stackTraces.size(); i++) {
StackTrace& stackTrace = m_stackTraces[i];
if (!stackTrace.needsVerification)
continue;
stackTrace.needsVerification = false;
for (StackFrame& stackFrame : stackTrace.frames) {
if (stackFrame.frameType != FrameType::UnverifiedCallee) {
RELEASE_ASSERT(stackFrame.frameType == FrameType::VerifiedExecutable);
continue;
}
JSValue callee = JSValue::decode(stackFrame.u.unverifiedCallee);
if (!Heap::isValueGCObject(filter, markedBlockSet, callee)) {
stackFrame.frameType = FrameType::Unknown;
continue;
}
JSCell* calleeCell = callee.asCell();
auto frameTypeFromCallData = [&] () -> FrameType {
FrameType result = FrameType::Unknown;
CallData callData;
CallType callType;
callType = getCallData(calleeCell, callData);
if (callType == CallTypeHost)
result = FrameType::Host;
return result;
};
if (calleeCell->type() != JSFunctionType) {
stackFrame.frameType = frameTypeFromCallData();
continue;
}
ExecutableBase* executable = static_cast<JSFunction*>(calleeCell)->executable();
if (!executable) {
stackFrame.frameType = frameTypeFromCallData();
continue;
}
RELEASE_ASSERT(Heap::isPointerGCObject(filter, markedBlockSet, executable));
stackFrame.frameType = FrameType::VerifiedExecutable;
stackFrame.u.verifiedExecutable = executable;
m_seenExecutables.add(executable);
}
}
m_indexOfNextStackTraceToVerify = m_stackTraces.size();
}
示例11: gatherConservativeRoots
void RegisterFile::gatherConservativeRoots(ConservativeRoots& conservativeRoots)
{
for (Register* it = start(); it != end(); ++it) {
JSValue v = it->jsValue();
if (!v.isCell())
continue;
conservativeRoots.add(v.asCell());
}
}
示例12: protectedObjectTypeCounts
void HandleHeap::protectedObjectTypeCounts(TypeCounter& typeCounter)
{
Node* end = m_strongList.end();
for (Node* node = m_strongList.begin(); node != end; node = node->next()) {
JSValue value = *node->slot();
if (value && value.isCell())
typeCounter(value.asCell());
}
}
示例13: constructJSDataCue
EncodedJSValue JSC_HOST_CALL constructJSDataCue(ExecState* exec)
{
DOMConstructorObject* castedThis = jsCast<DOMConstructorObject*>(exec->callee());
if (exec->argumentCount() < 3)
return throwVMError(exec, createNotEnoughArgumentsError(exec));
ExceptionCode ec = 0;
double startTime(exec->argument(0).toNumber(exec));
if (UNLIKELY(exec->hadException()))
return JSValue::encode(jsUndefined());
double endTime(exec->argument(1).toNumber(exec));
if (UNLIKELY(exec->hadException()))
return JSValue::encode(jsUndefined());
ScriptExecutionContext* context = castedThis->scriptExecutionContext();
if (!context)
return throwConstructorDocumentUnavailableError(*exec, "DataCue");
String type;
#if ENABLE(DATACUE_VALUE)
if (exec->argumentCount() > 3) {
if (!exec->argument(3).isString())
return throwVMError(exec, createTypeError(exec, "Second argument of the constructor is not of type String"));
type = exec->argument(3).getString(exec);
}
#endif
JSValue valueArgument = exec->argument(2);
if (valueArgument.isUndefinedOrNull()) {
setDOMException(exec, TypeError);
return JSValue::encode(JSValue());
}
RefPtr<DataCue> object;
if (valueArgument.isCell() && valueArgument.asCell()->inherits(std::remove_pointer<JSArrayBuffer*>::type::info())) {
ArrayBuffer* data(toArrayBuffer(valueArgument));
if (UNLIKELY(exec->hadException()))
return JSValue::encode(jsUndefined());
object = DataCue::create(*context, startTime, endTime, data, type, ec);
if (ec) {
setDOMException(exec, ec);
return JSValue::encode(JSValue());
}
return JSValue::encode(asObject(toJS(exec, castedThis->globalObject(), object.get())));
}
#if !ENABLE(DATACUE_VALUE)
return JSValue::encode(jsUndefined());
#else
object = DataCue::create(*context, startTime, endTime, valueArgument, type);
return JSValue::encode(asObject(toJS(exec, castedThis->globalObject(), object.get())));
#endif
}
示例14: protect
void Heap::protect(JSValue k)
{
ASSERT(k);
ASSERT(m_vm->currentThreadIsHoldingAPILock());
if (!k.isCell())
return;
m_protectedValues.add(k.asCell());
}
示例15: unprotect
bool Heap::unprotect(JSValue k)
{
ASSERT(k);
ASSERT(m_globalData->apiLock().currentThreadIsHoldingLock());
if (!k.isCell())
return false;
return m_protectedValues.remove(k.asCell());
}