Make the Linkage::NeedsFrameState list more intuitive.

R=jarin@chromium.org

Review URL: https://codereview.chromium.org/878743006

Cr-Commit-Position: refs/heads/master@{#26488}
This commit is contained in:
mstarzinger 2015-02-06 07:07:15 -08:00 committed by Commit bot
parent 2b0427a912
commit c699a87be9

View File

@ -120,114 +120,49 @@ bool Linkage::NeedsFrameState(Runtime::FunctionId function) {
if (!FLAG_turbo_deoptimization) {
return false;
}
// TODO(jarin) At the moment, we only add frame state for
// few chosen runtime functions.
// Most runtime functions need a FrameState. A few chosen ones that we know
// not to call into arbitrary JavaScript, not to throw, and not to deoptimize
// are blacklisted here and can be called without a FrameState.
switch (function) {
case Runtime::kApply:
case Runtime::kArrayBufferNeuter:
case Runtime::kArrayConcat:
case Runtime::kBasicJSONStringify:
case Runtime::kCheckExecutionState:
case Runtime::kCollectStackTrace:
case Runtime::kCompileLazy:
case Runtime::kCompileOptimized:
case Runtime::kCompileString:
case Runtime::kCreateArrayLiteral:
case Runtime::kCreateObjectLiteral:
case Runtime::kDebugBreak:
case Runtime::kDataViewSetInt8:
case Runtime::kDataViewSetUint8:
case Runtime::kDataViewSetInt16:
case Runtime::kDataViewSetUint16:
case Runtime::kDataViewSetInt32:
case Runtime::kDataViewSetUint32:
case Runtime::kDataViewSetFloat32:
case Runtime::kDataViewSetFloat64:
case Runtime::kDataViewGetInt8:
case Runtime::kDataViewGetUint8:
case Runtime::kDataViewGetInt16:
case Runtime::kDataViewGetUint16:
case Runtime::kDataViewGetInt32:
case Runtime::kDataViewGetUint32:
case Runtime::kDataViewGetFloat32:
case Runtime::kDataViewGetFloat64:
case Runtime::kDebugEvaluate:
case Runtime::kDebugEvaluateGlobal:
case Runtime::kDebugGetLoadedScripts:
case Runtime::kDebugGetPropertyDetails:
case Runtime::kDebugPromiseEvent:
case Runtime::kDefaultConstructorSuperCall:
case Runtime::kDefineAccessorPropertyUnchecked:
case Runtime::kDefineClass:
case Runtime::kDefineDataPropertyUnchecked:
case Runtime::kDeleteProperty:
case Runtime::kDeliverObservationChangeRecords:
case Runtime::kDeoptimizeFunction:
case Runtime::kFunctionBindArguments:
case Runtime::kGetDefaultReceiver:
case Runtime::kGetFrameCount:
case Runtime::kGetOwnProperty:
case Runtime::kGetOwnPropertyNames:
case Runtime::kGetPropertyNamesFast:
case Runtime::kGetPrototype:
case Runtime::kBooleanize:
case Runtime::kDeclareGlobals: // TODO(jarin): Is it safe?
case Runtime::kDefineClassMethod: // TODO(jarin): Is it safe?
case Runtime::kDefineGetterPropertyUnchecked: // TODO(jarin): Is it safe?
case Runtime::kDefineSetterPropertyUnchecked: // TODO(jarin): Is it safe?
case Runtime::kForInCacheArrayLength:
case Runtime::kForInInit:
case Runtime::kForInNext:
case Runtime::kNewArguments:
case Runtime::kNewClosure:
case Runtime::kNewFunctionContext:
case Runtime::kPushBlockContext:
case Runtime::kPushCatchContext:
case Runtime::kReThrow:
case Runtime::kSetProperty: // TODO(jarin): Is it safe?
case Runtime::kStringCompare:
case Runtime::kStringEquals:
case Runtime::kToFastProperties: // TODO(jarin): Is it safe?
case Runtime::kTraceEnter:
case Runtime::kTraceExit:
case Runtime::kTypeof:
return false;
case Runtime::kInlineArguments:
case Runtime::kInlineCallFunction:
case Runtime::kInlineDateField:
case Runtime::kInlineOptimizedGetPrototype:
case Runtime::kInlineRegExpExec:
case Runtime::kInternalSetPrototype:
case Runtime::kInterrupt:
case Runtime::kIsPropertyEnumerable:
case Runtime::kIsSloppyModeFunction:
case Runtime::kLiveEditGatherCompileInfo:
case Runtime::kLoadLookupSlot:
case Runtime::kLoadLookupSlotNoReferenceError:
case Runtime::kMaterializeRegExpLiteral:
case Runtime::kNewObject:
case Runtime::kNewObjectFromBound:
case Runtime::kNewObjectWithAllocationSite:
case Runtime::kObjectFreeze:
case Runtime::kObjectSeal:
case Runtime::kOwnKeys:
case Runtime::kParseJson:
case Runtime::kPrepareStep:
case Runtime::kPreventExtensions:
case Runtime::kPromiseRejectEvent:
case Runtime::kPromiseRevokeReject:
case Runtime::kPushWithContext:
case Runtime::kRegExpInitializeAndCompile:
case Runtime::kRegExpExecMultiple:
case Runtime::kResolvePossiblyDirectEval:
case Runtime::kRunMicrotasks:
case Runtime::kSetPrototype:
case Runtime::kSetScriptBreakPoint:
case Runtime::kSparseJoinWithSeparator:
case Runtime::kStackGuard:
case Runtime::kStoreKeyedToSuper_Sloppy:
case Runtime::kStoreKeyedToSuper_Strict:
case Runtime::kStoreToSuper_Sloppy:
case Runtime::kStoreToSuper_Strict:
case Runtime::kStoreLookupSlot:
case Runtime::kStringBuilderConcat:
case Runtime::kStringBuilderJoin:
case Runtime::kStringMatch:
case Runtime::kStringReplaceGlobalRegExpWithString:
case Runtime::kThrowConstAssignError:
case Runtime::kThrowConstructorNonCallableError:
case Runtime::kThrowNonMethodError:
case Runtime::kThrowNotDateError:
case Runtime::kThrowReferenceError:
case Runtime::kThrowUnsupportedSuperError:
case Runtime::kThrow:
case Runtime::kTypedArraySetFastCases:
case Runtime::kTypedArrayInitializeFromArrayLike:
#ifdef V8_I18N_SUPPORT
case Runtime::kGetImplFromInitializedIntlObject:
#endif
return true;
default:
return false;
break;
}
// Most inlined runtime functions (except the ones listed above) can be called
// without a FrameState or will be lowered by JSIntrinsicLowering internally.
const Runtime::Function* const f = Runtime::FunctionForId(function);
if (f->intrinsic_type == Runtime::IntrinsicType::INLINE) return false;
return true;
}