@@ -50,10 +50,16 @@ namespace Js
50
50
51
51
const ConfigFlagsTable &configFlags = Configuration::Global.flags ;
52
52
53
+ // AutoProfilingInterpreter might decide to not profile on the first run. For generator
54
+ // functions, that means we will miss the profiling information on the first run when we resume
55
+ // back to the function. This might result in lots of BailOnNoProfile even though we should have
56
+ // profiling information. So always collect profile data for generators
57
+ const bool skipAutoProfileForGenerator = functionBody->SkipAutoProfileForCoroutine ();
58
+
53
59
interpreterLimit = 0 ;
54
- autoProfilingInterpreter0Limit = static_cast <uint16>(configFlags.AutoProfilingInterpreter0Limit );
60
+ autoProfilingInterpreter0Limit = skipAutoProfileForGenerator ? 0 : static_cast <uint16>(configFlags.AutoProfilingInterpreter0Limit );
55
61
profilingInterpreter0Limit = static_cast <uint16>(configFlags.ProfilingInterpreter0Limit );
56
- autoProfilingInterpreter1Limit = static_cast <uint16>(configFlags.AutoProfilingInterpreter1Limit );
62
+ autoProfilingInterpreter1Limit = skipAutoProfileForGenerator ? 0 : static_cast <uint16>(configFlags.AutoProfilingInterpreter1Limit );
57
63
simpleJitLimit = static_cast <uint16>(configFlags.SimpleJitLimit );
58
64
profilingInterpreter1Limit = static_cast <uint16>(configFlags.ProfilingInterpreter1Limit );
59
65
@@ -105,9 +111,9 @@ namespace Js
105
111
106
112
uint16 fullJitThresholdConfig =
107
113
static_cast <uint16>(
108
- configFlags.AutoProfilingInterpreter0Limit +
114
+ (skipAutoProfileForGenerator ? 0 : configFlags.AutoProfilingInterpreter0Limit ) +
109
115
configFlags.ProfilingInterpreter0Limit +
110
- configFlags.AutoProfilingInterpreter1Limit +
116
+ (skipAutoProfileForGenerator ? 0 : configFlags.AutoProfilingInterpreter1Limit ) +
111
117
configFlags.SimpleJitLimit +
112
118
configFlags.ProfilingInterpreter1Limit );
113
119
if (!configFlags.EnforceExecutionModeLimits )
0 commit comments