Skip to content

Commit b326495

Browse files
committed
[MERGE #5244 @sigatrev] OS#17382750 avoid recollecting callback inlinee data for recursive calls
Merge pull request #5244 from sigatrev:recursiveCallback
2 parents 6040091 + 6a9ef1e commit b326495

File tree

3 files changed

+44
-18
lines changed

3 files changed

+44
-18
lines changed

lib/Backend/NativeCodeGenerator.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2919,26 +2919,29 @@ NativeCodeGenerator::GatherCodeGenData(
29192919

29202920
if (PHASE_ENABLED(InlineCallbacksPhase, functionBody))
29212921
{
2922-
Js::FunctionInfo *const callbackInfo = inliningDecider.InlineCallback(functionBody, profiledCallSiteId, recursiveInlineDepth);
2923-
if (callbackInfo != nullptr)
2922+
if (!isJitTimeDataComputed)
29242923
{
2925-
Js::FunctionBody *const callbackBody = callbackInfo->GetFunctionBody();
2926-
if (callbackBody != nullptr && callbackBody != functionBody)
2924+
Js::FunctionInfo *const callbackInfo = inliningDecider.InlineCallback(functionBody, profiledCallSiteId, recursiveInlineDepth);
2925+
if (callbackInfo != nullptr)
29272926
{
2928-
Js::FunctionCodeGenJitTimeData * callbackJitTimeData = jitTimeData->AddCallbackInlinee(recycler, profiledCallSiteId, callbackInfo);
2929-
Js::FunctionCodeGenRuntimeData * callbackRuntimeData = IsInlinee ? runtimeData->EnsureCallbackInlinee(recycler, profiledCallSiteId, callbackBody) : functionBody->EnsureCallbackInlineeCodeGenRuntimeData(recycler, profiledCallSiteId, callbackBody);
2930-
2931-
GatherCodeGenData<true>(
2932-
recycler,
2933-
topFunctionBody,
2934-
callbackBody,
2935-
entryPoint,
2936-
inliningDecider,
2937-
objTypeSpecFldInfoList,
2938-
callbackJitTimeData,
2939-
callbackRuntimeData);
2940-
2941-
AddInlineCacheStats(jitTimeData, callbackJitTimeData);
2927+
Js::FunctionBody *const callbackBody = callbackInfo->GetFunctionBody();
2928+
if (callbackBody != nullptr && callbackBody != functionBody)
2929+
{
2930+
Js::FunctionCodeGenJitTimeData * callbackJitTimeData = jitTimeData->AddCallbackInlinee(recycler, profiledCallSiteId, callbackInfo);
2931+
Js::FunctionCodeGenRuntimeData * callbackRuntimeData = IsInlinee ? runtimeData->EnsureCallbackInlinee(recycler, profiledCallSiteId, callbackBody) : functionBody->EnsureCallbackInlineeCodeGenRuntimeData(recycler, profiledCallSiteId, callbackBody);
2932+
2933+
GatherCodeGenData<true>(
2934+
recycler,
2935+
topFunctionBody,
2936+
callbackBody,
2937+
entryPoint,
2938+
inliningDecider,
2939+
objTypeSpecFldInfoList,
2940+
callbackJitTimeData,
2941+
callbackRuntimeData);
2942+
2943+
AddInlineCacheStats(jitTimeData, callbackJitTimeData);
2944+
}
29422945
}
29432946
}
29442947
}

test/inlining/recursiveCallbacks.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
function r(t) {
7+
if (!(this instanceof r)) {
8+
return new r(t);
9+
}
10+
}
11+
12+
function foo() {}
13+
14+
r(foo);
15+
r(foo);
16+
r(foo);
17+
18+
WScript.Echo("Passed");

test/inlining/rlexe.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,4 +302,9 @@
302302
<tags>exclude_dynapogo,exclude_nonative,exclude_forceserialized,require_backend</tags>
303303
</default>
304304
</test>
305+
<test>
306+
<default>
307+
<files>recursiveCallbacks.js</files>
308+
</default>
309+
</test>
305310
</regress-exe>

0 commit comments

Comments
 (0)