5 #include "src/debug/debug-evaluate.h" 7 #include "src/accessors.h" 8 #include "src/assembler-inl.h" 9 #include "src/compiler.h" 10 #include "src/contexts.h" 11 #include "src/debug/debug-frames.h" 12 #include "src/debug/debug-scopes.h" 13 #include "src/debug/debug.h" 14 #include "src/frames-inl.h" 15 #include "src/globals.h" 16 #include "src/interpreter/bytecode-array-iterator.h" 17 #include "src/interpreter/bytecodes.h" 18 #include "src/isolate-inl.h" 19 #include "src/snapshot/snapshot.h" 24 MaybeHandle<Object> DebugEvaluate::Global(Isolate* isolate,
25 Handle<String> source,
26 bool throw_on_side_effect) {
28 DisableBreak disable_break_scope(isolate->debug(), throw_on_side_effect);
30 Handle<Context> context = isolate->native_context();
31 ScriptOriginOptions origin_options(
false,
true);
32 MaybeHandle<SharedFunctionInfo> maybe_function_info =
33 Compiler::GetSharedFunctionInfoForScript(
35 Compiler::ScriptDetails(isolate->factory()->empty_string()),
36 origin_options,
nullptr,
nullptr, ScriptCompiler::kNoCompileOptions,
37 ScriptCompiler::kNoCacheNoReason, NOT_NATIVES_CODE);
39 Handle<SharedFunctionInfo> shared_info;
40 if (!maybe_function_info.ToHandle(&shared_info))
return MaybeHandle<Object>();
42 Handle<JSFunction> fun =
43 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared_info,
45 if (throw_on_side_effect) isolate->debug()->StartSideEffectCheckMode();
46 MaybeHandle<Object> result = Execution::Call(
47 isolate, fun, Handle<JSObject>(context->global_proxy(), isolate), 0,
49 if (throw_on_side_effect) isolate->debug()->StopSideEffectCheckMode();
53 MaybeHandle<Object> DebugEvaluate::Local(Isolate* isolate,
54 StackFrame::Id frame_id,
55 int inlined_jsframe_index,
56 Handle<String> source,
57 bool throw_on_side_effect) {
59 DisableBreak disable_break_scope(isolate->debug());
62 StackTraceFrameIterator it(isolate, frame_id);
63 if (!it.is_javascript())
return isolate->factory()->undefined_value();
64 JavaScriptFrame* frame = it.javascript_frame();
72 ContextBuilder context_builder(isolate, frame, inlined_jsframe_index);
73 if (isolate->has_pending_exception())
return MaybeHandle<Object>();
75 Handle<Context> context = context_builder.evaluation_context();
76 Handle<JSObject> receiver(context->global_proxy(), isolate);
77 MaybeHandle<Object> maybe_result =
78 Evaluate(isolate, context_builder.outer_info(), context, receiver, source,
79 throw_on_side_effect);
80 if (!maybe_result.is_null()) context_builder.UpdateValues();
84 MaybeHandle<Object> DebugEvaluate::WithTopmostArguments(Isolate* isolate,
85 Handle<String> source) {
87 DisableBreak disable_break_scope(isolate->debug());
88 Factory* factory = isolate->factory();
89 JavaScriptFrameIterator it(isolate);
92 Handle<Context> native_context(
93 Context::cast(it.frame()->context())->native_context(), isolate);
96 Handle<JSObject> materialized = factory->NewJSObjectWithNullProto();
97 Handle<String> arguments_str = factory->arguments_string();
98 JSObject::SetOwnPropertyIgnoreAttributes(
99 materialized, arguments_str,
100 Accessors::FunctionGetArguments(it.frame(), 0), NONE)
104 Handle<String> this_str = factory->this_string();
105 JSObject::SetOwnPropertyIgnoreAttributes(
106 materialized, this_str, Handle<Object>(it.frame()->receiver(), isolate),
111 Handle<ScopeInfo> scope_info =
112 ScopeInfo::CreateForWithScope(isolate, Handle<ScopeInfo>::null());
113 scope_info->SetIsDebugEvaluateScope();
114 Handle<Context> evaluation_context =
115 factory->NewDebugEvaluateContext(native_context, scope_info, materialized,
116 Handle<Context>(), Handle<StringSet>());
117 Handle<SharedFunctionInfo> outer_info(
118 native_context->empty_function()->shared(), isolate);
119 Handle<JSObject> receiver(native_context->global_proxy(), isolate);
120 const bool throw_on_side_effect =
false;
121 MaybeHandle<Object> maybe_result =
122 Evaluate(isolate, outer_info, evaluation_context, receiver, source,
123 throw_on_side_effect);
128 MaybeHandle<Object> DebugEvaluate::Evaluate(
129 Isolate* isolate, Handle<SharedFunctionInfo> outer_info,
130 Handle<Context> context, Handle<Object> receiver, Handle<String> source,
131 bool throw_on_side_effect) {
132 Handle<JSFunction> eval_fun;
133 ASSIGN_RETURN_ON_EXCEPTION(
135 Compiler::GetFunctionFromEval(source, outer_info, context,
136 LanguageMode::kSloppy, NO_PARSE_RESTRICTION,
137 kNoSourcePosition, kNoSourcePosition,
141 Handle<Object> result;
142 bool success =
false;
143 if (throw_on_side_effect) isolate->debug()->StartSideEffectCheckMode();
144 success = Execution::Call(isolate, eval_fun, receiver, 0,
nullptr)
146 if (throw_on_side_effect) isolate->debug()->StopSideEffectCheckMode();
147 if (!success) DCHECK(isolate->has_pending_exception());
148 return success ? result : MaybeHandle<Object>();
151 Handle<SharedFunctionInfo> DebugEvaluate::ContextBuilder::outer_info()
const {
152 return handle(frame_inspector_.GetFunction()->shared(), isolate_);
155 DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate,
156 JavaScriptFrame* frame,
157 int inlined_jsframe_index)
159 frame_inspector_(frame, inlined_jsframe_index, isolate),
160 scope_iterator_(isolate, &frame_inspector_,
161 ScopeIterator::COLLECT_NON_LOCALS) {
162 Handle<Context> outer_context(frame_inspector_.GetFunction()->context(),
164 evaluation_context_ = outer_context;
165 Factory* factory = isolate->factory();
167 if (scope_iterator_.Done())
return;
185 for (; scope_iterator_.InInnerScope(); scope_iterator_.Next()) {
186 ScopeIterator::ScopeType scope_type = scope_iterator_.Type();
187 if (scope_type == ScopeIterator::ScopeTypeScript)
break;
188 ContextChainElement context_chain_element;
189 if (scope_type == ScopeIterator::ScopeTypeLocal ||
190 scope_iterator_.DeclaresLocals(ScopeIterator::Mode::STACK)) {
191 context_chain_element.materialized_object =
192 scope_iterator_.ScopeObject(ScopeIterator::Mode::STACK);
194 if (scope_iterator_.HasContext()) {
195 context_chain_element.wrapped_context = scope_iterator_.CurrentContext();
197 if (scope_type == ScopeIterator::ScopeTypeLocal) {
198 context_chain_element.whitelist = scope_iterator_.GetNonLocals();
200 context_chain_.push_back(context_chain_element);
203 Handle<ScopeInfo> scope_info =
204 evaluation_context_->IsNativeContext()
205 ? Handle<ScopeInfo>::null()
206 : handle(evaluation_context_->scope_info(), isolate);
207 for (
auto rit = context_chain_.rbegin(); rit != context_chain_.rend();
209 ContextChainElement element = *rit;
210 scope_info = ScopeInfo::CreateForWithScope(isolate, scope_info);
211 scope_info->SetIsDebugEvaluateScope();
212 evaluation_context_ = factory->NewDebugEvaluateContext(
213 evaluation_context_, scope_info, element.materialized_object,
214 element.wrapped_context, element.whitelist);
219 void DebugEvaluate::ContextBuilder::UpdateValues() {
220 scope_iterator_.Restart();
221 for (ContextChainElement& element : context_chain_) {
222 if (!element.materialized_object.is_null()) {
223 Handle<FixedArray> keys =
224 KeyAccumulator::GetKeys(element.materialized_object,
225 KeyCollectionMode::kOwnOnly,
229 for (
int i = 0;
i < keys->length();
i++) {
230 DCHECK(keys->get(
i)->IsString());
231 Handle<String> key(String::cast(keys->get(
i)), isolate_);
232 Handle<Object> value =
233 JSReceiver::GetDataProperty(element.materialized_object, key);
234 scope_iterator_.SetVariableValue(key, value);
237 scope_iterator_.Next();
243 bool IntrinsicHasNoSideEffect(Runtime::FunctionId
id) {
245 #define INTRINSIC_WHITELIST(V) \ 262 V(LoadLookupSlotForCall) \ 265 V(ArraySpeciesConstructor) \ 266 V(EstimateNumberOfElements) \ 268 V(HasComplexElements) \ 269 V(HasFastPackedElements) \ 271 V(NormalizeElements) \ 272 V(PrepareElementsForSort) \ 273 V(TrySliceSimpleNonFastElements) \ 274 V(TypedArrayGetBuffer) \ 278 V(ThrowCalledNonCallable) \ 279 V(ThrowInvalidStringLength) \ 280 V(ThrowIteratorError) \ 281 V(ThrowIteratorResultNotAnObject) \ 282 V(ThrowReferenceError) \ 283 V(ThrowSymbolIteratorInvalid) \ 285 V(RegExpInternalReplace) \ 288 V(StringReplaceOneCharWithString) \ 293 V(BigIntEqualToBigInt) \ 297 V(CreateArrayLiteral) \ 298 V(CreateArrayLiteralWithoutAllocationSite) \ 299 V(CreateObjectLiteral) \ 300 V(CreateObjectLiteralWithoutAllocationSite) \ 301 V(CreateRegExpLiteral) \ 303 V(AllocateInNewSpace) \ 304 V(AllocateInTargetSpace) \ 305 V(AllocateSeqOneByteString) \ 306 V(AllocateSeqTwoByteString) \ 307 V(ArrayIncludes_Slow) \ 312 V(GetOwnPropertyDescriptor) \ 317 V(ObjectEntriesSkipFastPath) \ 318 V(ObjectHasOwnProperty) \ 320 V(ObjectValuesSkipFastPath) \ 321 V(ObjectGetOwnPropertyNames) \ 322 V(ObjectGetOwnPropertyNamesTryFast) \ 323 V(RegExpInitializeAndCompile) \ 326 V(StringCharCodeAt) \ 328 V(StringIndexOfUnchecked) \ 329 V(StringParseFloat) \ 331 V(SymbolDescriptiveString) \ 335 V(TransitionElementsKind) \ 338 V(CompleteInobjectSlackTrackingForMap) \ 339 V(HasInPrototypeChain) \ 342 V(SmiLexicographicCompare) \ 346 V(GetOptimizationStatus) \ 347 V(OptimizeFunctionOnNextCall) \ 349 V(UnblockConcurrentRecompilation) 352 #define INLINE_INTRINSIC_WHITELIST(V) \ 356 #define CASE(Name) case Runtime::k##Name: 357 #define INLINE_CASE(Name) case Runtime::kInline##Name: 359 INTRINSIC_WHITELIST(CASE)
360 INLINE_INTRINSIC_WHITELIST(INLINE_CASE)
363 if (FLAG_trace_side_effect_free_debug_evaluate) {
364 PrintF(
"[debug-evaluate] intrinsic %s may cause side effect.\n",
365 Runtime::FunctionForId(
id)->name);
372 #undef INTRINSIC_WHITELIST 373 #undef INLINE_INTRINSIC_WHITELIST 377 bool BuiltinToIntrinsicHasNoSideEffect(Builtins::Name builtin_id,
378 Runtime::FunctionId intrinsic_id) {
380 if (IntrinsicHasNoSideEffect(intrinsic_id))
return true;
383 #define BUILTIN_INTRINSIC_WHITELIST(V, W) \ 385 V(Builtins::kArrayFilter, W(CreateDataProperty)) \ 386 V(Builtins::kArrayMap, W(CreateDataProperty)) \ 387 V(Builtins::kArrayPrototypeSlice, \ 388 W(CreateDataProperty) W(SetKeyedProperty) W(SetNamedProperty)) \ 390 V(Builtins::kTypedArrayConstructor, \ 391 W(TypedArrayCopyElements) W(ThrowInvalidTypedArrayAlignment)) \ 392 V(Builtins::kTypedArrayPrototypeFilter, W(TypedArrayCopyElements)) \ 393 V(Builtins::kTypedArrayPrototypeMap, W(SetKeyedProperty) W(SetNamedProperty)) 395 #define CASE(Builtin, ...) \ 397 return (__VA_ARGS__ false); 399 #define MATCH(Intrinsic) intrinsic_id == Runtime::k##Intrinsic || 401 switch (builtin_id) {
402 BUILTIN_INTRINSIC_WHITELIST(CASE, MATCH)
409 #undef BUILTIN_INTRINSIC_WHITELIST 413 bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) {
414 typedef interpreter::Bytecode Bytecode;
415 typedef interpreter::Bytecodes Bytecodes;
416 if (Bytecodes::IsWithoutExternalSideEffects(bytecode))
return true;
417 if (Bytecodes::IsCallOrConstruct(bytecode))
return true;
418 if (Bytecodes::IsJumpIfToBoolean(bytecode))
return true;
419 if (Bytecodes::IsPrefixScalingBytecode(bytecode))
return true;
423 case Bytecode::kLdaLookupSlot:
424 case Bytecode::kLdaGlobal:
425 case Bytecode::kLdaNamedProperty:
426 case Bytecode::kLdaNamedPropertyNoFeedback:
427 case Bytecode::kLdaKeyedProperty:
428 case Bytecode::kLdaGlobalInsideTypeof:
429 case Bytecode::kLdaLookupSlotInsideTypeof:
432 case Bytecode::kAddSmi:
434 case Bytecode::kSubSmi:
436 case Bytecode::kMulSmi:
438 case Bytecode::kDivSmi:
440 case Bytecode::kModSmi:
442 case Bytecode::kExpSmi:
443 case Bytecode::kNegate:
444 case Bytecode::kBitwiseAnd:
445 case Bytecode::kBitwiseAndSmi:
446 case Bytecode::kBitwiseNot:
447 case Bytecode::kBitwiseOr:
448 case Bytecode::kBitwiseOrSmi:
449 case Bytecode::kBitwiseXor:
450 case Bytecode::kBitwiseXorSmi:
451 case Bytecode::kShiftLeft:
452 case Bytecode::kShiftLeftSmi:
453 case Bytecode::kShiftRight:
454 case Bytecode::kShiftRightSmi:
455 case Bytecode::kShiftRightLogical:
456 case Bytecode::kShiftRightLogicalSmi:
459 case Bytecode::kLogicalNot:
460 case Bytecode::kToBooleanLogicalNot:
461 case Bytecode::kTypeOf:
463 case Bytecode::kCreateBlockContext:
464 case Bytecode::kCreateCatchContext:
465 case Bytecode::kCreateFunctionContext:
466 case Bytecode::kCreateEvalContext:
467 case Bytecode::kCreateWithContext:
469 case Bytecode::kCreateArrayLiteral:
470 case Bytecode::kCreateEmptyArrayLiteral:
471 case Bytecode::kCreateArrayFromIterable:
472 case Bytecode::kCreateObjectLiteral:
473 case Bytecode::kCreateEmptyObjectLiteral:
474 case Bytecode::kCreateRegExpLiteral:
476 case Bytecode::kCreateClosure:
477 case Bytecode::kCreateUnmappedArguments:
478 case Bytecode::kCreateRestParameter:
480 case Bytecode::kTestEqual:
481 case Bytecode::kTestEqualStrict:
482 case Bytecode::kTestLessThan:
483 case Bytecode::kTestLessThanOrEqual:
484 case Bytecode::kTestGreaterThan:
485 case Bytecode::kTestGreaterThanOrEqual:
486 case Bytecode::kTestInstanceOf:
487 case Bytecode::kTestIn:
488 case Bytecode::kTestReferenceEqual:
489 case Bytecode::kTestUndetectable:
490 case Bytecode::kTestTypeOf:
491 case Bytecode::kTestUndefined:
492 case Bytecode::kTestNull:
494 case Bytecode::kToObject:
495 case Bytecode::kToName:
496 case Bytecode::kToNumber:
497 case Bytecode::kToNumeric:
498 case Bytecode::kToString:
500 case Bytecode::kForInEnumerate:
501 case Bytecode::kForInPrepare:
502 case Bytecode::kForInContinue:
503 case Bytecode::kForInNext:
504 case Bytecode::kForInStep:
505 case Bytecode::kThrow:
506 case Bytecode::kReThrow:
507 case Bytecode::kThrowReferenceErrorIfHole:
508 case Bytecode::kThrowSuperNotCalledIfHole:
509 case Bytecode::kThrowSuperAlreadyCalledIfNotHole:
510 case Bytecode::kIllegal:
511 case Bytecode::kCallJSRuntime:
512 case Bytecode::kStackCheck:
513 case Bytecode::kReturn:
514 case Bytecode::kSetPendingMessage:
521 DebugInfo::SideEffectState BuiltinGetSideEffectState(Builtins::Name
id) {
525 case Builtins::kObjectConstructor:
526 case Builtins::kObjectCreate:
527 case Builtins::kObjectEntries:
528 case Builtins::kObjectGetOwnPropertyDescriptor:
529 case Builtins::kObjectGetOwnPropertyDescriptors:
530 case Builtins::kObjectGetOwnPropertyNames:
531 case Builtins::kObjectGetOwnPropertySymbols:
532 case Builtins::kObjectGetPrototypeOf:
533 case Builtins::kObjectIs:
534 case Builtins::kObjectIsExtensible:
535 case Builtins::kObjectIsFrozen:
536 case Builtins::kObjectIsSealed:
537 case Builtins::kObjectPrototypeValueOf:
538 case Builtins::kObjectValues:
539 case Builtins::kObjectPrototypeHasOwnProperty:
540 case Builtins::kObjectPrototypeIsPrototypeOf:
541 case Builtins::kObjectPrototypePropertyIsEnumerable:
542 case Builtins::kObjectPrototypeToString:
544 case Builtins::kArrayIsArray:
545 case Builtins::kArrayConstructor:
546 case Builtins::kArrayIndexOf:
547 case Builtins::kArrayPrototypeValues:
548 case Builtins::kArrayIncludes:
549 case Builtins::kArrayPrototypeEntries:
550 case Builtins::kArrayPrototypeFill:
551 case Builtins::kArrayPrototypeFind:
552 case Builtins::kArrayPrototypeFindIndex:
553 case Builtins::kArrayPrototypeFlat:
554 case Builtins::kArrayPrototypeFlatMap:
555 case Builtins::kArrayPrototypeJoin:
556 case Builtins::kArrayPrototypeKeys:
557 case Builtins::kArrayPrototypeLastIndexOf:
558 case Builtins::kArrayPrototypeSlice:
559 case Builtins::kArrayPrototypeSort:
560 case Builtins::kArrayPrototypeToLocaleString:
561 case Builtins::kArrayPrototypeToString:
562 case Builtins::kArrayForEach:
563 case Builtins::kArrayEvery:
564 case Builtins::kArraySome:
565 case Builtins::kArrayConcat:
566 case Builtins::kArrayFilter:
567 case Builtins::kArrayMap:
568 case Builtins::kArrayReduce:
569 case Builtins::kArrayReduceRight:
571 case Builtins::kIsTraceCategoryEnabled:
572 case Builtins::kTrace:
574 case Builtins::kTypedArrayConstructor:
575 case Builtins::kTypedArrayPrototypeBuffer:
576 case Builtins::kTypedArrayPrototypeByteLength:
577 case Builtins::kTypedArrayPrototypeByteOffset:
578 case Builtins::kTypedArrayPrototypeLength:
579 case Builtins::kTypedArrayPrototypeEntries:
580 case Builtins::kTypedArrayPrototypeKeys:
581 case Builtins::kTypedArrayPrototypeValues:
582 case Builtins::kTypedArrayPrototypeFind:
583 case Builtins::kTypedArrayPrototypeFindIndex:
584 case Builtins::kTypedArrayPrototypeIncludes:
585 case Builtins::kTypedArrayPrototypeIndexOf:
586 case Builtins::kTypedArrayPrototypeLastIndexOf:
587 case Builtins::kTypedArrayPrototypeSlice:
588 case Builtins::kTypedArrayPrototypeSubArray:
589 case Builtins::kTypedArrayPrototypeEvery:
590 case Builtins::kTypedArrayPrototypeSome:
591 case Builtins::kTypedArrayPrototypeFilter:
592 case Builtins::kTypedArrayPrototypeMap:
593 case Builtins::kTypedArrayPrototypeReduce:
594 case Builtins::kTypedArrayPrototypeReduceRight:
595 case Builtins::kTypedArrayPrototypeForEach:
597 case Builtins::kArrayBufferConstructor:
598 case Builtins::kArrayBufferPrototypeGetByteLength:
599 case Builtins::kArrayBufferIsView:
600 case Builtins::kArrayBufferPrototypeSlice:
601 case Builtins::kReturnReceiver:
603 case Builtins::kDataViewConstructor:
604 case Builtins::kDataViewPrototypeGetBuffer:
605 case Builtins::kDataViewPrototypeGetByteLength:
606 case Builtins::kDataViewPrototypeGetByteOffset:
607 case Builtins::kDataViewPrototypeGetInt8:
608 case Builtins::kDataViewPrototypeGetUint8:
609 case Builtins::kDataViewPrototypeGetInt16:
610 case Builtins::kDataViewPrototypeGetUint16:
611 case Builtins::kDataViewPrototypeGetInt32:
612 case Builtins::kDataViewPrototypeGetUint32:
613 case Builtins::kDataViewPrototypeGetFloat32:
614 case Builtins::kDataViewPrototypeGetFloat64:
615 case Builtins::kDataViewPrototypeGetBigInt64:
616 case Builtins::kDataViewPrototypeGetBigUint64:
618 case Builtins::kBooleanConstructor:
619 case Builtins::kBooleanPrototypeToString:
620 case Builtins::kBooleanPrototypeValueOf:
622 case Builtins::kDateConstructor:
623 case Builtins::kDateNow:
624 case Builtins::kDateParse:
625 case Builtins::kDatePrototypeGetDate:
626 case Builtins::kDatePrototypeGetDay:
627 case Builtins::kDatePrototypeGetFullYear:
628 case Builtins::kDatePrototypeGetHours:
629 case Builtins::kDatePrototypeGetMilliseconds:
630 case Builtins::kDatePrototypeGetMinutes:
631 case Builtins::kDatePrototypeGetMonth:
632 case Builtins::kDatePrototypeGetSeconds:
633 case Builtins::kDatePrototypeGetTime:
634 case Builtins::kDatePrototypeGetTimezoneOffset:
635 case Builtins::kDatePrototypeGetUTCDate:
636 case Builtins::kDatePrototypeGetUTCDay:
637 case Builtins::kDatePrototypeGetUTCFullYear:
638 case Builtins::kDatePrototypeGetUTCHours:
639 case Builtins::kDatePrototypeGetUTCMilliseconds:
640 case Builtins::kDatePrototypeGetUTCMinutes:
641 case Builtins::kDatePrototypeGetUTCMonth:
642 case Builtins::kDatePrototypeGetUTCSeconds:
643 case Builtins::kDatePrototypeGetYear:
644 case Builtins::kDatePrototypeToDateString:
645 case Builtins::kDatePrototypeToISOString:
646 case Builtins::kDatePrototypeToUTCString:
647 case Builtins::kDatePrototypeToString:
648 case Builtins::kDatePrototypeToTimeString:
649 case Builtins::kDatePrototypeToJson:
650 case Builtins::kDatePrototypeToPrimitive:
651 case Builtins::kDatePrototypeValueOf:
653 case Builtins::kMapConstructor:
654 case Builtins::kMapPrototypeForEach:
655 case Builtins::kMapPrototypeGet:
656 case Builtins::kMapPrototypeHas:
657 case Builtins::kMapPrototypeEntries:
658 case Builtins::kMapPrototypeGetSize:
659 case Builtins::kMapPrototypeKeys:
660 case Builtins::kMapPrototypeValues:
662 case Builtins::kWeakMapConstructor:
663 case Builtins::kWeakMapGet:
664 case Builtins::kWeakMapHas:
666 case Builtins::kMathAbs:
667 case Builtins::kMathAcos:
668 case Builtins::kMathAcosh:
669 case Builtins::kMathAsin:
670 case Builtins::kMathAsinh:
671 case Builtins::kMathAtan:
672 case Builtins::kMathAtanh:
673 case Builtins::kMathAtan2:
674 case Builtins::kMathCeil:
675 case Builtins::kMathCbrt:
676 case Builtins::kMathExpm1:
677 case Builtins::kMathClz32:
678 case Builtins::kMathCos:
679 case Builtins::kMathCosh:
680 case Builtins::kMathExp:
681 case Builtins::kMathFloor:
682 case Builtins::kMathFround:
683 case Builtins::kMathHypot:
684 case Builtins::kMathImul:
685 case Builtins::kMathLog:
686 case Builtins::kMathLog1p:
687 case Builtins::kMathLog2:
688 case Builtins::kMathLog10:
689 case Builtins::kMathMax:
690 case Builtins::kMathMin:
691 case Builtins::kMathPow:
692 case Builtins::kMathRandom:
693 case Builtins::kMathRound:
694 case Builtins::kMathSign:
695 case Builtins::kMathSin:
696 case Builtins::kMathSinh:
697 case Builtins::kMathSqrt:
698 case Builtins::kMathTan:
699 case Builtins::kMathTanh:
700 case Builtins::kMathTrunc:
702 case Builtins::kNumberConstructor:
703 case Builtins::kNumberIsFinite:
704 case Builtins::kNumberIsInteger:
705 case Builtins::kNumberIsNaN:
706 case Builtins::kNumberIsSafeInteger:
707 case Builtins::kNumberParseFloat:
708 case Builtins::kNumberParseInt:
709 case Builtins::kNumberPrototypeToExponential:
710 case Builtins::kNumberPrototypeToFixed:
711 case Builtins::kNumberPrototypeToPrecision:
712 case Builtins::kNumberPrototypeToString:
713 case Builtins::kNumberPrototypeValueOf:
715 case Builtins::kBigIntConstructor:
716 case Builtins::kBigIntAsIntN:
717 case Builtins::kBigIntAsUintN:
718 case Builtins::kBigIntPrototypeToString:
719 case Builtins::kBigIntPrototypeValueOf:
721 case Builtins::kSetConstructor:
722 case Builtins::kSetPrototypeEntries:
723 case Builtins::kSetPrototypeForEach:
724 case Builtins::kSetPrototypeGetSize:
725 case Builtins::kSetPrototypeHas:
726 case Builtins::kSetPrototypeValues:
728 case Builtins::kWeakSetConstructor:
729 case Builtins::kWeakSetHas:
731 case Builtins::kStringFromCharCode:
732 case Builtins::kStringFromCodePoint:
733 case Builtins::kStringConstructor:
734 case Builtins::kStringPrototypeAnchor:
735 case Builtins::kStringPrototypeBig:
736 case Builtins::kStringPrototypeBlink:
737 case Builtins::kStringPrototypeBold:
738 case Builtins::kStringPrototypeCharAt:
739 case Builtins::kStringPrototypeCharCodeAt:
740 case Builtins::kStringPrototypeCodePointAt:
741 case Builtins::kStringPrototypeConcat:
742 case Builtins::kStringPrototypeEndsWith:
743 case Builtins::kStringPrototypeFixed:
744 case Builtins::kStringPrototypeFontcolor:
745 case Builtins::kStringPrototypeFontsize:
746 case Builtins::kStringPrototypeIncludes:
747 case Builtins::kStringPrototypeIndexOf:
748 case Builtins::kStringPrototypeItalics:
749 case Builtins::kStringPrototypeLastIndexOf:
750 case Builtins::kStringPrototypeLink:
751 case Builtins::kStringPrototypePadEnd:
752 case Builtins::kStringPrototypePadStart:
753 case Builtins::kStringPrototypeRepeat:
754 case Builtins::kStringPrototypeSlice:
755 case Builtins::kStringPrototypeSmall:
756 case Builtins::kStringPrototypeStartsWith:
757 case Builtins::kStringPrototypeStrike:
758 case Builtins::kStringPrototypeSub:
759 case Builtins::kStringPrototypeSubstr:
760 case Builtins::kStringPrototypeSubstring:
761 case Builtins::kStringPrototypeSup:
762 case Builtins::kStringPrototypeToString:
763 #ifndef V8_INTL_SUPPORT 764 case Builtins::kStringPrototypeToLowerCase:
765 case Builtins::kStringPrototypeToUpperCase:
767 case Builtins::kStringPrototypeTrim:
768 case Builtins::kStringPrototypeTrimEnd:
769 case Builtins::kStringPrototypeTrimStart:
770 case Builtins::kStringPrototypeValueOf:
771 case Builtins::kStringToNumber:
772 case Builtins::kStringSubstring:
774 case Builtins::kSymbolConstructor:
775 case Builtins::kSymbolKeyFor:
776 case Builtins::kSymbolPrototypeToString:
777 case Builtins::kSymbolPrototypeValueOf:
778 case Builtins::kSymbolPrototypeToPrimitive:
780 case Builtins::kJsonParse:
781 case Builtins::kJsonStringify:
783 case Builtins::kGlobalDecodeURI:
784 case Builtins::kGlobalDecodeURIComponent:
785 case Builtins::kGlobalEncodeURI:
786 case Builtins::kGlobalEncodeURIComponent:
787 case Builtins::kGlobalEscape:
788 case Builtins::kGlobalUnescape:
789 case Builtins::kGlobalIsFinite:
790 case Builtins::kGlobalIsNaN:
792 case Builtins::kFunctionPrototypeToString:
793 case Builtins::kFunctionPrototypeBind:
794 case Builtins::kFastFunctionPrototypeBind:
795 case Builtins::kFunctionPrototypeCall:
796 case Builtins::kFunctionPrototypeApply:
798 case Builtins::kErrorConstructor:
799 case Builtins::kMakeError:
800 case Builtins::kMakeTypeError:
801 case Builtins::kMakeSyntaxError:
802 case Builtins::kMakeRangeError:
803 case Builtins::kMakeURIError:
805 case Builtins::kRegExpConstructor:
807 case Builtins::kStrictPoisonPillThrower:
808 return DebugInfo::kHasNoSideEffect;
811 case Builtins::kSetIteratorPrototypeNext:
812 case Builtins::kSetPrototypeAdd:
813 case Builtins::kSetPrototypeClear:
814 case Builtins::kSetPrototypeDelete:
816 case Builtins::kArrayIteratorPrototypeNext:
817 case Builtins::kArrayPrototypePop:
818 case Builtins::kArrayPrototypePush:
819 case Builtins::kArrayPrototypeReverse:
820 case Builtins::kArrayPrototypeShift:
821 case Builtins::kArrayPrototypeUnshift:
822 case Builtins::kArrayPrototypeSplice:
823 case Builtins::kArrayUnshift:
825 case Builtins::kMapIteratorPrototypeNext:
826 case Builtins::kMapPrototypeClear:
827 case Builtins::kMapPrototypeDelete:
828 case Builtins::kMapPrototypeSet:
830 case Builtins::kRegExpPrototypeTest:
831 case Builtins::kRegExpPrototypeExec:
832 case Builtins::kRegExpPrototypeSplit:
833 case Builtins::kRegExpPrototypeFlagsGetter:
834 case Builtins::kRegExpPrototypeGlobalGetter:
835 case Builtins::kRegExpPrototypeIgnoreCaseGetter:
836 case Builtins::kRegExpPrototypeMultilineGetter:
837 case Builtins::kRegExpPrototypeDotAllGetter:
838 case Builtins::kRegExpPrototypeUnicodeGetter:
839 case Builtins::kRegExpPrototypeStickyGetter:
840 return DebugInfo::kRequiresRuntimeChecks;
842 if (FLAG_trace_side_effect_free_debug_evaluate) {
843 PrintF(
"[debug-evaluate] built-in %s may cause side effect.\n",
846 return DebugInfo::kHasSideEffects;
850 bool BytecodeRequiresRuntimeCheck(interpreter::Bytecode bytecode) {
851 typedef interpreter::Bytecode Bytecode;
853 case Bytecode::kStaNamedProperty:
854 case Bytecode::kStaNamedPropertyNoFeedback:
855 case Bytecode::kStaNamedOwnProperty:
856 case Bytecode::kStaKeyedProperty:
857 case Bytecode::kStaInArrayLiteral:
858 case Bytecode::kStaDataPropertyInLiteral:
859 case Bytecode::kStaCurrentContextSlot:
869 DebugInfo::SideEffectState DebugEvaluate::FunctionGetSideEffectState(
870 Isolate* isolate, Handle<SharedFunctionInfo> info) {
871 if (FLAG_trace_side_effect_free_debug_evaluate) {
872 PrintF(
"[debug-evaluate] Checking function %s for side effect.\n",
873 info->DebugName()->ToCString().get());
876 DCHECK(info->is_compiled());
877 if (info->HasBytecodeArray()) {
879 Handle<BytecodeArray> bytecode_array(info->GetBytecodeArray(), isolate);
880 if (FLAG_trace_side_effect_free_debug_evaluate) {
881 bytecode_array->Print();
883 bool requires_runtime_checks =
false;
884 for (interpreter::BytecodeArrayIterator it(bytecode_array); !it.done();
886 interpreter::Bytecode bytecode = it.current_bytecode();
888 if (interpreter::Bytecodes::IsCallRuntime(bytecode)) {
889 Runtime::FunctionId
id =
890 (bytecode == interpreter::Bytecode::kInvokeIntrinsic)
891 ? it.GetIntrinsicIdOperand(0)
892 : it.GetRuntimeIdOperand(0);
893 if (IntrinsicHasNoSideEffect(
id))
continue;
894 return DebugInfo::kHasSideEffects;
897 if (BytecodeHasNoSideEffect(bytecode))
continue;
898 if (BytecodeRequiresRuntimeCheck(bytecode)) {
899 requires_runtime_checks =
true;
903 if (FLAG_trace_side_effect_free_debug_evaluate) {
904 PrintF(
"[debug-evaluate] bytecode %s may cause side effect.\n",
905 interpreter::Bytecodes::ToString(bytecode));
909 return DebugInfo::kHasSideEffects;
911 return requires_runtime_checks ? DebugInfo::kRequiresRuntimeChecks
912 : DebugInfo::kHasNoSideEffect;
913 }
else if (info->IsApiFunction()) {
914 if (info->GetCode()->is_builtin()) {
915 return info->GetCode()->builtin_index() == Builtins::kHandleApiCall
916 ? DebugInfo::kHasNoSideEffect
917 : DebugInfo::kHasSideEffects;
922 info->HasBuiltinId() ? info->builtin_id() : Builtins::kNoBuiltinId;
923 if (!Builtins::IsBuiltinId(builtin_index))
924 return DebugInfo::kHasSideEffects;
925 DebugInfo::SideEffectState state =
926 BuiltinGetSideEffectState(static_cast<Builtins::Name>(builtin_index));
928 if (state == DebugInfo::kHasNoSideEffect) {
930 Code code = isolate->builtins()->builtin(builtin_index);
931 int mode = RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE);
933 for (RelocIterator it(code, mode); !it.done(); it.next()) {
934 RelocInfo* rinfo = it.rinfo();
935 Address address = rinfo->target_external_reference();
936 const Runtime::Function*
function = Runtime::FunctionForEntry(address);
937 if (
function ==
nullptr)
continue;
938 if (!BuiltinToIntrinsicHasNoSideEffect(
939 static_cast<Builtins::Name>(builtin_index),
940 function->function_id)) {
941 PrintF(
"Whitelisted builtin %s calls non-whitelisted intrinsic %s\n",
942 Builtins::name(builtin_index), function->name);
952 return DebugInfo::kHasSideEffects;
956 void DebugEvaluate::ApplySideEffectChecks(
957 Handle<BytecodeArray> bytecode_array) {
958 for (interpreter::BytecodeArrayIterator it(bytecode_array); !it.done();
960 interpreter::Bytecode bytecode = it.current_bytecode();
961 if (BytecodeRequiresRuntimeCheck(bytecode)) it.ApplyDebugBreak();