本文整理汇总了C++中RELEASE_ASSERT_NOT_REACHED函数的典型用法代码示例。如果您正苦于以下问题:C++ RELEASE_ASSERT_NOT_REACHED函数的具体用法?C++ RELEASE_ASSERT_NOT_REACHED怎么用?C++ RELEASE_ASSERT_NOT_REACHED使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RELEASE_ASSERT_NOT_REACHED函数的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: switch
std::unique_ptr<CryptoAlgorithmParameters> JSCryptoAlgorithmDictionary::createParametersForGenerateKey(ExecState* exec, CryptoAlgorithmIdentifier algorithm, JSValue value)
{
switch (algorithm) {
case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5:
case CryptoAlgorithmIdentifier::RSA_PSS:
case CryptoAlgorithmIdentifier::RSA_OAEP:
return createRsaKeyGenParams(exec, value);
case CryptoAlgorithmIdentifier::ECDSA:
case CryptoAlgorithmIdentifier::ECDH:
setDOMException(exec, NOT_SUPPORTED_ERR);
return nullptr;
case CryptoAlgorithmIdentifier::AES_CTR:
case CryptoAlgorithmIdentifier::AES_CBC:
case CryptoAlgorithmIdentifier::AES_CMAC:
case CryptoAlgorithmIdentifier::AES_GCM:
case CryptoAlgorithmIdentifier::AES_CFB:
case CryptoAlgorithmIdentifier::AES_KW:
return createAesKeyGenParams(exec, value);
case CryptoAlgorithmIdentifier::HMAC:
return createHmacKeyParams(exec, value);
case CryptoAlgorithmIdentifier::DH:
case CryptoAlgorithmIdentifier::SHA_1:
case CryptoAlgorithmIdentifier::SHA_224:
case CryptoAlgorithmIdentifier::SHA_256:
case CryptoAlgorithmIdentifier::SHA_384:
case CryptoAlgorithmIdentifier::SHA_512:
case CryptoAlgorithmIdentifier::CONCAT:
case CryptoAlgorithmIdentifier::HKDF_CTR:
case CryptoAlgorithmIdentifier::PBKDF2:
setDOMException(exec, NOT_SUPPORTED_ERR);
return nullptr;
}
RELEASE_ASSERT_NOT_REACHED();
return nullptr;
}
开发者ID:cheekiatng,项目名称:webkit,代码行数:36,代码来源:JSCryptoAlgorithmDictionary.cpp
示例2: formatLocaleDate
static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, LocaleDateTimeFormat format)
{
#if OS(WINDOWS)
SYSTEMTIME systemTime;
memset(&systemTime, 0, sizeof(systemTime));
systemTime.wYear = gdt.year();
systemTime.wMonth = gdt.month() + 1;
systemTime.wDay = gdt.monthDay();
systemTime.wDayOfWeek = gdt.weekDay();
systemTime.wHour = gdt.hour();
systemTime.wMinute = gdt.minute();
systemTime.wSecond = gdt.second();
Vector<UChar, 128> buffer;
size_t length = 0;
if (format == LocaleDate) {
buffer.resize(GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systemTime, 0, 0, 0));
length = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systemTime, 0, buffer.data(), buffer.size());
} else if (format == LocaleTime) {
buffer.resize(GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &systemTime, 0, 0, 0));
length = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &systemTime, 0, buffer.data(), buffer.size());
} else if (format == LocaleDateAndTime) {
buffer.resize(GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systemTime, 0, 0, 0) + GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &systemTime, 0, 0, 0));
length = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systemTime, 0, buffer.data(), buffer.size());
if (length) {
buffer[length - 1] = ' ';
length += GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &systemTime, 0, buffer.data() + length, buffer.size() - length);
}
} else
RELEASE_ASSERT_NOT_REACHED();
// Remove terminating null character.
if (length)
length--;
return jsNontrivialString(exec, String(buffer.data(), length));
#else // OS(WINDOWS)
#if HAVE(LANGINFO_H)
static const nl_item formats[] = { D_T_FMT, D_FMT, T_FMT };
#else
static const char* const formatStrings[] = { "%#c", "%#x", "%X" };
#endif
// Offset year if needed
struct tm localTM = gdt;
int year = gdt.year();
bool yearNeedsOffset = year < 1900 || year > 2038;
if (yearNeedsOffset)
localTM.tm_year = equivalentYearForDST(year) - 1900;
#if HAVE(LANGINFO_H)
// We do not allow strftime to generate dates with 2-digits years,
// both to avoid ambiguity, and a crash in strncpy, for years that
// need offset.
char* formatString = strdup(nl_langinfo(formats[format]));
char* yPos = strchr(formatString, 'y');
if (yPos)
*yPos = 'Y';
#endif
// Do the formatting
const int bufsize = 128;
char timebuffer[bufsize];
#if HAVE(LANGINFO_H)
size_t ret = strftime(timebuffer, bufsize, formatString, &localTM);
free(formatString);
#else
size_t ret = strftime(timebuffer, bufsize, formatStrings[format], &localTM);
#endif
if (ret == 0)
return jsEmptyString(exec);
// Copy original into the buffer
if (yearNeedsOffset && format != LocaleTime) {
static const int yearLen = 5; // FIXME will be a problem in the year 10,000
char yearString[yearLen];
snprintf(yearString, yearLen, "%d", localTM.tm_year + 1900);
char* yearLocation = strstr(timebuffer, yearString);
snprintf(yearString, yearLen, "%d", year);
strncpy(yearLocation, yearString, yearLen - 1);
}
// Convert multi-byte result to UNICODE.
// If __STDC_ISO_10646__ is defined, wide character represents
// UTF-16 (or UTF-32) code point. In most modern Unix like system
// (e.g. Linux with glibc 2.2 and above) the macro is defined,
// and wide character represents UTF-32 code point.
// Here we static_cast potential UTF-32 to UTF-16, it should be
// safe because date and (or) time related characters in different languages
// should be in UNICODE BMP. If mbstowcs fails, we just fall
// back on using multi-byte result as-is.
#ifdef __STDC_ISO_10646__
UChar buffer[bufsize];
//.........这里部分代码省略.........
开发者ID:chenbk85,项目名称:webkit2-wincairo,代码行数:101,代码来源:DatePrototype.cpp
示例3: doesGC
//.........这里部分代码省略.........
case CountExecution:
case ForceOSRExit:
case CheckWatchdogTimer:
case StringFromCharCode:
case Unreachable:
case ExtractOSREntryLocal:
case CheckTierUpInLoop:
case CheckTierUpAtReturn:
case CheckTierUpAndOSREnter:
case LoopHint:
case StoreBarrier:
case StoreBarrierWithNullCheck:
case InvalidationPoint:
case NotifyWrite:
case CheckInBounds:
case ConstantStoragePointer:
case Check:
case MultiGetByOffset:
case ValueRep:
case DoubleRep:
case Int52Rep:
case GetGetter:
case GetSetter:
case GetByVal:
case GetIndexedPropertyStorage:
case GetArrayLength:
case ArrayPush:
case ArrayPop:
case StringCharAt:
case StringCharCodeAt:
case GetTypedArrayByteOffset:
case PutByValDirect:
case PutByVal:
case PutByValAlias:
case PutStructure:
case GetByOffset:
case GetGetterSetterByOffset:
case PutByOffset:
case GetEnumerableLength:
case HasGenericProperty:
case HasStructureProperty:
case HasIndexedProperty:
case GetDirectPname:
case FiatInt52:
case BooleanToNumber:
case CheckBadCell:
case BottomValue:
case PhantomNewObject:
case PhantomNewFunction:
case PhantomDirectArguments:
case PhantomClonedArguments:
case GetMyArgumentByVal:
case ForwardVarargs:
case PutHint:
case CheckStructureImmediate:
case PutStack:
case KillStack:
case GetStack:
case GetFromArguments:
case PutToArguments:
return false;
case CreateActivation:
case CreateDirectArguments:
case CreateScopedArguments:
case CreateClonedArguments:
case ToThis:
case CreateThis:
case AllocatePropertyStorage:
case ReallocatePropertyStorage:
case Arrayify:
case ArrayifyToStructure:
case NewObject:
case NewArray:
case NewArrayWithSize:
case NewArrayBuffer:
case NewRegexp:
case NewStringObject:
case MakeRope:
case NewFunction:
case NewTypedArray:
case ThrowReferenceError:
case GetPropertyEnumerator:
case GetEnumeratorStructurePname:
case GetEnumeratorGenericPname:
case ToIndexString:
case MaterializeNewObject:
return true;
case MultiPutByOffset:
return node->multiPutByOffsetData().reallocatesStorage();
case LastNodeType:
RELEASE_ASSERT_NOT_REACHED();
return true;
}
RELEASE_ASSERT_NOT_REACHED();
return true;
}
开发者ID:B-Stefan,项目名称:webkit,代码行数:101,代码来源:DFGDoesGC.cpp
示例4: RELEASE_ASSERT_NOT_REACHED
bool JITCode::contains(void*)
{
// We have no idea what addresses the FTL code contains, yet.
RELEASE_ASSERT_NOT_REACHED();
return false;
}
开发者ID:rodrigo-speller,项目名称:webkit,代码行数:6,代码来源:FTLJITCode.cpp
示例5: RELEASE_ASSERT_NOT_REACHED
Ref<Node> ShadowRoot::cloneNodeInternal(Document&, CloningOperation)
{
RELEASE_ASSERT_NOT_REACHED();
return *static_cast<Node*>(nullptr); // ShadowRoots should never be cloned.
}
开发者ID:edcwconan,项目名称:webkit,代码行数:5,代码来源:ShadowRoot.cpp
示例6: GetByIdStatus
GetByIdStatus GetByIdStatus::computeForStubInfo(
const ConcurrentJITLocker& locker, CodeBlock* profiledBlock, StructureStubInfo* stubInfo, StringImpl* uid,
CallLinkStatus::ExitSiteData callExitSiteData)
{
if (!stubInfo || !stubInfo->seen)
return GetByIdStatus(NoInformation);
PolymorphicGetByIdList* list = 0;
State slowPathState = TakesSlowPath;
if (stubInfo->accessType == access_get_by_id_list) {
list = stubInfo->u.getByIdList.list;
for (unsigned i = 0; i < list->size(); ++i) {
const GetByIdAccess& access = list->at(i);
if (access.doesCalls())
slowPathState = MakesCalls;
}
}
// Finally figure out if we can derive an access strategy.
GetByIdStatus result;
result.m_state = Simple;
result.m_wasSeenInJIT = true; // This is interesting for bytecode dumping only.
switch (stubInfo->accessType) {
case access_unset:
return GetByIdStatus(NoInformation);
case access_get_by_id_self: {
Structure* structure = stubInfo->u.getByIdSelf.baseObjectStructure.get();
if (structure->takesSlowPathInDFGForImpureProperty())
return GetByIdStatus(slowPathState, true);
unsigned attributesIgnored;
GetByIdVariant variant;
variant.m_offset = structure->getConcurrently(uid, attributesIgnored);
if (!isValidOffset(variant.m_offset))
return GetByIdStatus(slowPathState, true);
variant.m_structureSet.add(structure);
bool didAppend = result.appendVariant(variant);
ASSERT_UNUSED(didAppend, didAppend);
return result;
}
case access_get_by_id_list: {
for (unsigned listIndex = 0; listIndex < list->size(); ++listIndex) {
Structure* structure = list->at(listIndex).structure();
ComplexGetStatus complexGetStatus = ComplexGetStatus::computeFor(
profiledBlock, structure, list->at(listIndex).chain(),
list->at(listIndex).chainCount(), uid);
switch (complexGetStatus.kind()) {
case ComplexGetStatus::ShouldSkip:
continue;
case ComplexGetStatus::TakesSlowPath:
return GetByIdStatus(slowPathState, true);
case ComplexGetStatus::Inlineable: {
std::unique_ptr<CallLinkStatus> callLinkStatus;
switch (list->at(listIndex).type()) {
case GetByIdAccess::SimpleInline:
case GetByIdAccess::SimpleStub: {
break;
}
case GetByIdAccess::Getter: {
AccessorCallJITStubRoutine* stub = static_cast<AccessorCallJITStubRoutine*>(
list->at(listIndex).stubRoutine());
callLinkStatus = std::make_unique<CallLinkStatus>(
CallLinkStatus::computeFor(
locker, profiledBlock, *stub->m_callLinkInfo, callExitSiteData));
break;
}
case GetByIdAccess::CustomGetter:
case GetByIdAccess::WatchedStub:{
// FIXME: It would be totally sweet to support this at some point in the future.
// https://bugs.webkit.org/show_bug.cgi?id=133052
return GetByIdStatus(slowPathState, true);
}
default:
RELEASE_ASSERT_NOT_REACHED();
}
GetByIdVariant variant(
StructureSet(structure), complexGetStatus.offset(), complexGetStatus.chain(),
std::move(callLinkStatus));
if (!result.appendVariant(variant))
return GetByIdStatus(slowPathState, true);
break;
} }
}
return result;
}
default:
return GetByIdStatus(slowPathState, true);
}
RELEASE_ASSERT_NOT_REACHED();
//.........这里部分代码省略.........
开发者ID:ddxxyy,项目名称:webkit,代码行数:101,代码来源:GetByIdStatus.cpp
示例7: handleBlock
void handleBlock(BlockIndex blockIndex)
{
BasicBlock* block = m_graph.block(blockIndex);
if (!block)
return;
m_map.clear();
// First we collect Ranges. If operations within the range have enough redundancy,
// we hoist. And then we remove additions and checks that fall within the max range.
for (unsigned nodeIndex = 0; nodeIndex < block->size(); ++nodeIndex) {
Node* node = block->at(nodeIndex);
RangeKeyAndAddend data = rangeKeyAndAddend(node);
if (verbose)
dataLog("For ", node, ": ", data, "\n");
if (!data)
continue;
Range& range = m_map[data.m_key];
if (verbose)
dataLog(" Range: ", range, "\n");
if (range.m_count) {
if (data.m_addend > range.m_maxBound) {
range.m_maxBound = data.m_addend;
range.m_maxOrigin = node->origin.semantic;
} else if (data.m_addend < range.m_minBound) {
range.m_minBound = data.m_addend;
range.m_minOrigin = node->origin.semantic;
}
} else {
range.m_maxBound = data.m_addend;
range.m_minBound = data.m_addend;
range.m_minOrigin = node->origin.semantic;
range.m_maxOrigin = node->origin.semantic;
}
range.m_count++;
if (verbose)
dataLog(" New range: ", range, "\n");
}
for (unsigned nodeIndex = 0; nodeIndex < block->size(); ++nodeIndex) {
Node* node = block->at(nodeIndex);
RangeKeyAndAddend data = rangeKeyAndAddend(node);
if (!data)
continue;
Range range = m_map[data.m_key];
if (!isValid(data.m_key, range))
continue;
// Do the hoisting.
if (!range.m_hoisted) {
switch (data.m_key.m_kind) {
case Addition: {
if (range.m_minBound < 0) {
insertMustAdd(
nodeIndex, NodeOrigin(range.m_minOrigin, node->origin.forExit),
data.m_key.m_source, range.m_minBound);
}
if (range.m_maxBound > 0) {
insertMustAdd(
nodeIndex, NodeOrigin(range.m_maxOrigin, node->origin.forExit),
data.m_key.m_source, range.m_maxBound);
}
break;
}
case ArrayBounds: {
Node* minNode;
Node* maxNode;
if (!data.m_key.m_source) {
minNode = 0;
maxNode = m_insertionSet.insertConstant(
nodeIndex, range.m_maxOrigin, jsNumber(range.m_maxBound));
} else {
minNode = insertAdd(
nodeIndex, NodeOrigin(range.m_minOrigin, node->origin.forExit),
data.m_key.m_source, range.m_minBound, Arith::Unchecked);
maxNode = insertAdd(
nodeIndex, NodeOrigin(range.m_maxOrigin, node->origin.forExit),
data.m_key.m_source, range.m_maxBound, Arith::Unchecked);
}
if (minNode) {
m_insertionSet.insertNode(
nodeIndex, SpecNone, CheckInBounds, node->origin,
Edge(minNode, Int32Use), Edge(data.m_key.m_key, Int32Use));
}
m_insertionSet.insertNode(
nodeIndex, SpecNone, CheckInBounds, node->origin,
Edge(maxNode, Int32Use), Edge(data.m_key.m_key, Int32Use));
break;
}
default:
RELEASE_ASSERT_NOT_REACHED();
}
m_changed = true;
//.........这里部分代码省略.........
开发者ID:vinod-designer1,项目名称:webkit,代码行数:101,代码来源:DFGIntegerCheckCombiningPhase.cpp
示例8: fixupBlock
void fixupBlock(BasicBlock* block)
{
if (!block)
return;
switch (m_graph.m_form) {
case SSA:
break;
case ThreadedCPS: {
// Clean up variable links for the block. We need to do this before the actual DCE
// because we need to see GetLocals, so we can bypass them in situations where the
// vars-at-tail point to a GetLocal, the GetLocal is dead, but the Phi it points
// to is alive.
for (unsigned phiIndex = 0; phiIndex < block->phis.size(); ++phiIndex) {
if (!block->phis[phiIndex]->shouldGenerate()) {
// FIXME: We could actually free nodes here. Except that it probably
// doesn't matter, since we don't add any nodes after this phase.
// https://bugs.webkit.org/show_bug.cgi?id=126239
block->phis[phiIndex--] = block->phis.last();
block->phis.removeLast();
}
}
cleanVariables(block->variablesAtHead);
cleanVariables(block->variablesAtTail);
break;
}
default:
RELEASE_ASSERT_NOT_REACHED();
return;
}
for (unsigned indexInBlock = block->size(); indexInBlock--;) {
Node* node = block->at(indexInBlock);
if (node->shouldGenerate())
continue;
switch (node->op()) {
case MovHint: {
ASSERT(node->child1().useKind() == UntypedUse);
if (!node->child1()->shouldGenerate()) {
node->setOpAndDefaultFlags(ZombieHint);
node->child1() = Edge();
break;
}
node->setOpAndDefaultFlags(MovHint);
break;
}
case ZombieHint: {
// Currently we assume that DCE runs only once.
RELEASE_ASSERT_NOT_REACHED();
break;
}
default: {
if (node->flags() & NodeHasVarArgs) {
for (unsigned childIdx = node->firstChild(); childIdx < node->firstChild() + node->numChildren(); childIdx++) {
Edge edge = m_graph.m_varArgChildren[childIdx];
if (!edge || edge.willNotHaveCheck())
continue;
m_insertionSet.insertNode(indexInBlock, SpecNone, Phantom, node->origin, edge);
}
node->convertToPhantomUnchecked();
node->children.reset();
node->setRefCount(1);
break;
}
node->convertToPhantom();
eliminateIrrelevantPhantomChildren(node);
node->setRefCount(1);
break;
} }
}
m_insertionSet.execute(block);
}
开发者ID:MYSHLIFE,项目名称:webkit,代码行数:84,代码来源:DFGDCEPhase.cpp
示例9: propagate
//.........这里部分代码省略.........
flags &= ~NodeBytecodeUsesAsOther;
node->child1()->mergeFlags(flags);
node->child2()->mergeFlags(flags & ~NodeBytecodeNeedsNegZero);
break;
}
case GetByVal: {
node->child1()->mergeFlags(NodeBytecodeUsesAsValue);
node->child2()->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther | NodeBytecodeUsesAsInt | NodeBytecodeUsesAsArrayIndex);
break;
}
case NewArrayWithSize: {
node->child1()->mergeFlags(NodeBytecodeUsesAsValue | NodeBytecodeUsesAsInt | NodeBytecodeUsesAsArrayIndex);
break;
}
case NewTypedArray: {
// Negative zero is not observable. NaN versus undefined are only observable
// in that you would get a different exception message. So, like, whatever: we
// claim here that NaN v. undefined is observable.
node->child1()->mergeFlags(NodeBytecodeUsesAsInt | NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther | NodeBytecodeUsesAsArrayIndex);
break;
}
case StringCharAt: {
node->child1()->mergeFlags(NodeBytecodeUsesAsValue);
node->child2()->mergeFlags(NodeBytecodeUsesAsValue | NodeBytecodeUsesAsInt | NodeBytecodeUsesAsArrayIndex);
break;
}
case ToString:
case CallStringConstructor: {
node->child1()->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther);
break;
}
case ToPrimitive:
case ToNumber: {
node->child1()->mergeFlags(flags);
break;
}
case PutByValDirect:
case PutByVal: {
m_graph.varArgChild(node, 0)->mergeFlags(NodeBytecodeUsesAsValue);
m_graph.varArgChild(node, 1)->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther | NodeBytecodeUsesAsInt | NodeBytecodeUsesAsArrayIndex);
m_graph.varArgChild(node, 2)->mergeFlags(NodeBytecodeUsesAsValue);
break;
}
case Switch: {
SwitchData* data = node->switchData();
switch (data->kind) {
case SwitchImm:
// We don't need NodeBytecodeNeedsNegZero because if the cases are all integers
// then -0 and 0 are treated the same. We don't need NodeBytecodeUsesAsOther
// because if all of the cases are integers then NaN and undefined are
// treated the same (i.e. they will take default).
node->child1()->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsInt);
break;
case SwitchChar: {
// We don't need NodeBytecodeNeedsNegZero because if the cases are all strings
// then -0 and 0 are treated the same. We don't need NodeBytecodeUsesAsOther
// because if all of the cases are single-character strings then NaN
// and undefined are treated the same (i.e. they will take default).
node->child1()->mergeFlags(NodeBytecodeUsesAsNumber);
break;
}
case SwitchString:
// We don't need NodeBytecodeNeedsNegZero because if the cases are all strings
// then -0 and 0 are treated the same.
node->child1()->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther);
break;
case SwitchCell:
// There is currently no point to being clever here since this is used for switching
// on objects.
mergeDefaultFlags(node);
break;
}
break;
}
case Identity:
// This would be trivial to handle but we just assert that we cannot see these yet.
RELEASE_ASSERT_NOT_REACHED();
break;
// Note: ArithSqrt, ArithUnary and other math intrinsics don't have special
// rules in here because they are always followed by Phantoms to signify that if the
// method call speculation fails, the bytecode may use the arguments in arbitrary ways.
// This corresponds to that possibility of someone doing something like:
// Math.sin = function(x) { doArbitraryThingsTo(x); }
default:
mergeDefaultFlags(node);
break;
}
}
开发者ID:mjparme,项目名称:openjdk-jfx,代码行数:101,代码来源:DFGBackwardsPropagationPhase.cpp
示例10: RELEASE_ASSERT_NOT_REACHED
FTL::ForOSREntryJITCode* JITCode::ftlForOSREntry()
{
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
开发者ID:biddyweb,项目名称:switch-oss,代码行数:5,代码来源:JITCode.cpp
示例11: run
bool run()
{
RELEASE_ASSERT(m_graph.m_plan.mode == DFGMode);
if (!Options::useFTLJIT())
return false;
if (m_graph.m_profiledBlock->m_didFailFTLCompilation)
return false;
#if ENABLE(FTL_JIT)
FTL::CapabilityLevel level = FTL::canCompile(m_graph);
if (level == FTL::CannotCompile)
return false;
if (!Options::enableOSREntryToFTL())
level = FTL::CanCompile;
InsertionSet insertionSet(m_graph);
for (BlockIndex blockIndex = m_graph.numBlocks(); blockIndex--;) {
BasicBlock* block = m_graph.block(blockIndex);
if (!block)
continue;
for (unsigned nodeIndex = 0; nodeIndex < block->size(); ++nodeIndex) {
Node* node = block->at(nodeIndex);
if (node->op() != LoopHint)
continue;
// We only put OSR checks for the first LoopHint in the block. Note that
// more than one LoopHint could happen in cases where we did a lot of CFG
// simplification in the bytecode parser, but it should be very rare.
NodeOrigin origin = node->origin;
if (level != FTL::CanCompileAndOSREnter || origin.semantic.inlineCallFrame) {
insertionSet.insertNode(
nodeIndex + 1, SpecNone, CheckTierUpInLoop, origin);
break;
}
bool isAtTop = true;
for (unsigned subNodeIndex = nodeIndex; subNodeIndex--;) {
if (!block->at(subNodeIndex)->isSemanticallySkippable()) {
isAtTop = false;
break;
}
}
if (!isAtTop) {
insertionSet.insertNode(
nodeIndex + 1, SpecNone, CheckTierUpInLoop, origin);
break;
}
insertionSet.insertNode(
nodeIndex + 1, SpecNone, CheckTierUpAndOSREnter, origin);
break;
}
NodeAndIndex terminal = block->findTerminal();
if (terminal.node->op() == Return) {
insertionSet.insertNode(
terminal.index, SpecNone, CheckTierUpAtReturn, terminal.node->origin);
}
insertionSet.execute(block);
}
m_graph.m_plan.willTryToTierUp = true;
return true;
#else // ENABLE(FTL_JIT)
RELEASE_ASSERT_NOT_REACHED();
return false;
#endif // ENABLE(FTL_JIT)
}
开发者ID:fanghongjia,项目名称:JavaScriptCore,代码行数:76,代码来源:DFGTierUpCheckInjectionPhase.cpp
示例12: prepareOSREntry
SUPPRESS_ASAN
void* prepareOSREntry(
ExecState* exec, CodeBlock* dfgCodeBlock, CodeBlock* entryCodeBlock,
unsigned bytecodeIndex, unsigned streamIndex)
{
VM& vm = exec->vm();
CodeBlock* baseline = dfgCodeBlock->baselineVersion();
ExecutableBase* executable = dfgCodeBlock->ownerExecutable();
DFG::JITCode* dfgCode = dfgCodeBlock->jitCode()->dfg();
ForOSREntryJITCode* entryCode = entryCodeBlock->jitCode()->ftlForOSREntry();
if (Options::verboseOSR()) {
dataLog(
"FTL OSR from ", *dfgCodeBlock, " to ", *entryCodeBlock, " at bc#",
bytecodeIndex, ".\n");
}
if (bytecodeIndex)
jsCast<ScriptExecutable*>(executable)->setDidTryToEnterInLoop(true);
if (bytecodeIndex != entryCode->bytecodeIndex()) {
if (Options::verboseOSR())
dataLog(" OSR failed because we don't have an entrypoint for bc#", bytecodeIndex, "; ours is for bc#", entryCode->bytecodeIndex(), "\n");
return 0;
}
Operands<JSValue> values;
dfgCode->reconstruct(
exec, dfgCodeBlock, CodeOrigin(bytecodeIndex), streamIndex, values);
if (Options::verboseOSR())
dataLog(" Values at entry: ", values, "\n");
for (int argument = values.numberOfArguments(); argument--;) {
JSValue valueOnStack = exec->r(virtualRegisterForArgument(argument).offset()).asanUnsafeJSValue();
JSValue reconstructedValue = values.argument(argument);
if (valueOnStack == reconstructedValue || !argument)
continue;
dataLog("Mismatch between reconstructed values and the the value on the stack for argument arg", argument, " for ", *entryCodeBlock, " at bc#", bytecodeIndex, ":\n");
dataLog(" Value on stack: ", valueOnStack, "\n");
dataLog(" Reconstructed value: ", reconstructedValue, "\n");
RELEASE_ASSERT_NOT_REACHED();
}
RELEASE_ASSERT(
static_cast<int>(values.numberOfLocals()) == baseline->m_numCalleeRegisters);
EncodedJSValue* scratch = static_cast<EncodedJSValue*>(
entryCode->entryBuffer()->dataBuffer());
for (int local = values.numberOfLocals(); local--;)
scratch[local] = JSValue::encode(values.local(local));
int stackFrameSize = entryCode->common.requiredRegisterCountForExecutionAndExit();
if (!vm.interpreter->stack().ensureCapacityFor(&exec->registers()[virtualRegisterForLocal(stackFrameSize - 1).offset()])) {
if (Options::verboseOSR())
dataLog(" OSR failed because stack growth failed.\n");
return 0;
}
exec->setCodeBlock(entryCodeBlock);
void* result = entryCode->addressForCall(
vm, executable, ArityCheckNotRequired,
RegisterPreservationNotRequired).executableAddress();
if (Options::verboseOSR())
dataLog(" Entry will succeed, going to address", RawPointer(result), "\n");
return result;
}
开发者ID:biddyweb,项目名称:switch-oss,代码行数:70,代码来源:FTLOSREntry.cpp
注:本文中的RELEASE_ASSERT_NOT_REACHED函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论