Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
64b8e32
Add thunk-based interface caching plan, build/test scripts
jonwis May 4, 2026
85d475f
Address plan review: fix 10 gaps, snake_case, rework build script
jonwis May 4, 2026
5a3fa1e
Move write_abi_args to Phase 1, add user rules to plan
jonwis May 4, 2026
93ef473
Rules: add -logo nul, reduce noisy output guidance
jonwis May 4, 2026
0cb57ec
Phase 1: thunked runtimeclass infrastructure (strings, ASM stubs, con…
jonwis May 4, 2026
2600e33
Phase 2 WIP: code generator emits thunked runtimeclasses
jonwis May 4, 2026
40dac14
Fix thunked type identity: arg<T>, is_com_interface, empty_value, box…
jonwis May 4, 2026
01709ea
Update plan notes: systematic fix complete, disassembly verification …
jonwis May 4, 2026
59740ce
Add thunked_dispatch test: consumer-side PropertySet verification
jonwis May 4, 2026
722d83a
Phase 3 tests: copy/move, ABI interop, as/try_as, thread safety
jonwis May 4, 2026
58b1c07
Update plan: Phase 3 test coverage table, reset_thunked bug documenta…
jonwis May 4, 2026
63e8c49
Phase 3 complete: generic default (StringMap) + full mode (Package >8…
jonwis May 4, 2026
9edcf17
Phase 3 complete: all test scenarios covered, 3072 assertions / 102 t…
jonwis May 4, 2026
89dae65
Add technical documentation: docs/runtimeclass-caching.md
jonwis May 4, 2026
d7eaf1f
Exclude async default interfaces from thunking; add operator== with C…
jonwis May 4, 2026
b175ad2
Fix bind_in, delegate ABI, test_slow expectation; exclude async types
jonwis May 4, 2026
29dcec0
Update plan: e2e validation checkpoint, 5 issues found and fixed
jonwis May 5, 2026
fcf05c5
Checkpoint - QI to an unsupported interface causes bad corruption by …
jonwis May 5, 2026
fae75d3
Checkpoint - enable QIs to return failures
jonwis May 5, 2026
68ee998
Rename things
jonwis May 7, 2026
8d2ad89
Modernize assembly using windows macros
jonwis May 8, 2026
6bdf12d
Inline resolve thunk into base.h, remove separate .cpp
jonwis May 9, 2026
94f6aad
Gate flattened runtimeclasses behind -flatten_classes flag
jonwis May 9, 2026
ee7371a
Fix doc inaccuracies for PR readiness
jonwis May 9, 2026
917954e
Consolidate plan doc: replace session breadcrumbs with concise notes
jonwis May 9, 2026
bd43637
Add cached_thunks static lib for nuget packaging
jonwis May 9, 2026
59c86ee
Restore test_slow QI count expectation
jonwis May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ jobs:
run: |
$target_configuration = "${{ matrix.config }}"
$target_platform = "${{ matrix.arch }}"
& "_build\$target_platform\$target_configuration\cppwinrt.exe" -in local -out _build\$target_platform\$target_configuration -verbose
& "_build\$target_platform\$target_configuration\cppwinrt.exe" -in local -out _build\$target_platform\$target_configuration -verbose -flatten_classes

test-msvc-cppwinrt-test:
name: '${{ matrix.compiler }}: Test [${{ matrix.test_exe }}] (${{ matrix.arch }}, ${{ matrix.config }}, ${{ matrix.toolchain.platform_toolset }})'
Expand Down Expand Up @@ -377,7 +377,7 @@ jobs:
run: |
$target_configuration = "${{ matrix.config }}"
$target_platform = "${{ matrix.arch }}"
& "_build\$target_platform\$target_configuration\cppwinrt.exe" -in local -out _build\$target_platform\$target_configuration -verbose
& "_build\$target_platform\$target_configuration\cppwinrt.exe" -in local -out _build\$target_platform\$target_configuration -verbose -flatten_classes

- name: Run nuget test
run: |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ test*.xml
test*_results.txt
test_failures.txt
build
_build
packages
Debug
Release
Expand Down
2 changes: 1 addition & 1 deletion .pipelines/jobs/OneBranchTest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ jobs:
- task: CmdLine@2
displayName: Run cppwinrt to build projection
inputs:
script: $(BuildPath)\cppwinrt.exe -in local -out $(BuildPath) -verbose
script: $(BuildPath)\cppwinrt.exe -in local -out $(BuildPath) -verbose -flatten_classes

- task: VSBuild@1
displayName: Build test
Expand Down
1 change: 1 addition & 0 deletions build-dir/winmd-prefix/src/winmd
Submodule winmd added at 0f1eae
8 changes: 4 additions & 4 deletions build_nuget.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ rem @echo off
set target_version=%1
if "%target_version%"=="" set target_version=999.999.999.999

call msbuild /m /p:Configuration=Release,Platform=x86,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd
call msbuild /m /p:Configuration=Release,Platform=x64,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd
call msbuild /m /p:Configuration=Release,Platform=arm64,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd
call msbuild /m /p:Configuration=Release,Platform=x86,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd;cached_thunks
call msbuild /m /p:Configuration=Release,Platform=x64,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd;cached_thunks
call msbuild /m /p:Configuration=Release,Platform=arm64,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd;cached_thunks

call msbuild /m /p:Configuration=Release,Platform=x86,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:cppwinrt

nuget pack nuget\Microsoft.Windows.CppWinRT.nuspec -Properties target_version=%target_version%;cppwinrt_exe=%cd%\_build\x86\Release\cppwinrt.exe;cppwinrt_fast_fwd_x86=%cd%\_build\x86\Release\cppwinrt_fast_forwarder.lib;cppwinrt_fast_fwd_x64=%cd%\_build\x64\Release\cppwinrt_fast_forwarder.lib;cppwinrt_fast_fwd_arm64=%cd%\_build\arm64\Release\cppwinrt_fast_forwarder.lib
nuget pack nuget\Microsoft.Windows.CppWinRT.nuspec -Properties target_version=%target_version%;cppwinrt_exe=%cd%\_build\x86\Release\cppwinrt.exe;cppwinrt_fast_fwd_x86=%cd%\_build\x86\Release\cppwinrt_fast_forwarder.lib;cppwinrt_fast_fwd_x64=%cd%\_build\x64\Release\cppwinrt_fast_forwarder.lib;cppwinrt_fast_fwd_arm64=%cd%\_build\arm64\Release\cppwinrt_fast_forwarder.lib;cppwinrt_cached_thunks_x86=%cd%\_build\x86\Release\cppwinrt_cached_thunks.lib;cppwinrt_cached_thunks_x64=%cd%\_build\x64\Release\cppwinrt_cached_thunks.lib;cppwinrt_cached_thunks_arm64=%cd%\_build\arm64\Release\cppwinrt_cached_thunks.lib
2 changes: 1 addition & 1 deletion build_projection.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,5 @@ if not exist "%cppwinrt_exe%" (
)

echo Building projection into %target_platform% %target_configuration%
%cppwinrt_exe% -in local -out %~p0\_build\%target_platform%\%target_configuration% -verbose
%cppwinrt_exe% -in local -out %~p0\_build\%target_platform%\%target_configuration% -verbose -flatten_classes
echo.
38 changes: 22 additions & 16 deletions build_test_all.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,36 @@ if "%target_version%"=="" set target_version=999.999.999.999
if not exist ".\.nuget" mkdir ".\.nuget"
if not exist ".\.nuget\nuget.exe" powershell -Command "$ProgressPreference = 'SilentlyContinue' ; Invoke-WebRequest https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile .\.nuget\nuget.exe"

call .nuget\nuget.exe restore cppwinrt.sln"
call .nuget\nuget.exe restore cppwinrt.sln
call .nuget\nuget.exe restore natvis\cppwinrtvisualizer.sln
call .nuget\nuget.exe restore test\nuget\NugetTest.sln

call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd
call msbuild %additional_msbuild_args% /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:fast_fwd;cached_thunks
if errorlevel 1 exit /b 1

call msbuild /p:Configuration=%target_configuration%,Platform=%target_platform%,Deployment=Component;CppWinRTBuildVersion=%target_version% natvis\cppwinrtvisualizer.sln
call msbuild /p:Configuration=%target_configuration%,Platform=%target_platform%,Deployment=Standalone;CppWinRTBuildVersion=%target_version% natvis\cppwinrtvisualizer.sln
call msbuild %additional_msbuild_args% /p:Configuration=%target_configuration%,Platform=%target_platform%,Deployment=Component;CppWinRTBuildVersion=%target_version% natvis\cppwinrtvisualizer.sln
if errorlevel 1 exit /b 1
call msbuild %additional_msbuild_args% /p:Configuration=%target_configuration%,Platform=%target_platform%,Deployment=Standalone;CppWinRTBuildVersion=%target_version% natvis\cppwinrtvisualizer.sln
if errorlevel 1 exit /b 1

if "%target_platform%"=="arm64" goto :eof

call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:cppwinrt
set build_targets=cppwinrt
set build_targets=%build_targets%;test\test
set build_targets=%build_targets%;test\test_nocoro
set build_targets=%build_targets%;test\test_cpp20
set build_targets=%build_targets%;test\test_cpp20_no_sourcelocation
set build_targets=%build_targets%;test\test_fast
set build_targets=%build_targets%;test\test_slow
set build_targets=%build_targets%;test\test_module_lock_custom
set build_targets=%build_targets%;test\test_module_lock_none
set build_targets=%build_targets%;test\old_tests\test_old

call msbuild /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% test\nuget\NugetTest.sln
call msbuild %additional_msbuild_args% /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln "/t:%build_targets%"
if errorlevel 1 exit /b 1

call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_nocoro
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_cpp20
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_cpp20_no_sourcelocation
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_fast
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_slow
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_module_lock_custom
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_module_lock_none
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\test_module_lock_none
call msbuild /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% cppwinrt.sln /t:test\old_tests\test_old
call msbuild %additional_msbuild_args% /m /p:Configuration=%target_configuration%,Platform=%target_platform%,CppWinRTBuildVersion=%target_version% test\nuget\NugetTest.sln
if errorlevel 1 exit /b 1

call run_tests.cmd %target_platform% %target_configuration%
if errorlevel 1 exit /b 1
112 changes: 112 additions & 0 deletions cached_thunks/cached_thunks.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>cached_thunks</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup>
<Lib>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
</Lib>
</ItemDefinitionGroup>
<PropertyGroup>
<Platform_Arm Condition="'$(Platform)'=='ARM64'">true</Platform_Arm>
<Platform_Arm Condition="'$(Platform_Arm)'!='true'">false</Platform_Arm>
<Platform_Intel>!$(Platform_Arm)</Platform_Intel>
<TargetName>cppwinrt_cached_thunks</TargetName>
</PropertyGroup>
<ImportGroup>
<Import Condition="$(Platform_Intel)" Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
<Import Condition="$(Platform_Arm)" Project="$(VCTargetsPath)\BuildCustomizations\marmasm.props" />
</ImportGroup>
<!-- ARM64: preprocess with cl.exe to expand #include "ksarm64.h" -->
<Target Name="CppWinRTPreprocessArmThunk" Condition="$(Platform_Arm)" BeforeTargets="_MARMASM" Outputs="$(IntDir)cached_thunks_arm64.pp" Inputs="..\strings\cached_thunks_arm64.asm">
<Exec Command="cl /E /Tc ..\strings\cached_thunks_arm64.asm &gt; $(IntDir)cached_thunks_arm64.pp" />
</Target>
<Target Name="CppWinRTPreprocessArmECThunk" Condition="$(Platform_Arm)" BeforeTargets="_MARMASM" Outputs="$(IntDir)cached_thunks_arm64ec.pp" Inputs="..\strings\cached_thunks_arm64ec.asm">
<Exec Command="cl /E /Tc ..\strings\cached_thunks_arm64ec.asm &gt; $(IntDir)cached_thunks_arm64ec.pp" />
</Target>
<ItemGroup Condition="'$(Platform)'=='x64'">
<MASM Include="..\strings\cached_thunks_x64.asm">
<FileType>Document</FileType>
</MASM>
</ItemGroup>
<ItemGroup Condition="'$(Platform)'=='Win32'">
<MASM Include="..\strings\cached_thunks_x86.asm">
<FileType>Document</FileType>
<UseSafeExceptionHandlers>true</UseSafeExceptionHandlers>
</MASM>
</ItemGroup>
<ItemGroup Condition="$(Platform_Arm)">
<MARMASM Include="$(IntDir)cached_thunks_arm64.pp">
<PreprocessWithCl Condition="'$(VisualStudioVersion)' &gt;= '17.0'">false</PreprocessWithCl>
<FileType>Document</FileType>
</MARMASM>
<MARMASM Include="$(IntDir)cached_thunks_arm64ec.pp">
<PreprocessWithCl Condition="'$(VisualStudioVersion)' &gt;= '17.0'">false</PreprocessWithCl>
<FileType>Document</FileType>
</MARMASM>
</ItemGroup>
<ImportGroup>
<Import Condition="$(Platform_Intel)" Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
<Import Condition="$(Platform_Arm)" Project="$(VCTargetsPath)\BuildCustomizations\marmasm.targets" />
</ImportGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
14 changes: 14 additions & 0 deletions cppwinrt.sln
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_fast_fwd", "test\test_
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fast_fwd", "fast_fwd\fast_fwd.vcxproj", "{A63B3AD1-AB7B-461E-9FFF-2447F5BCD459}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cached_thunks", "cached_thunks\cached_thunks.vcxproj", "{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scratch", "scratch\scratch.vcxproj", "{E893622C-47DE-4F83-B422-0A26711590A4}"
ProjectSection(ProjectDependencies) = postProject
{D613FB39-5035-4043-91E2-BAB323908AF4} = {D613FB39-5035-4043-91E2-BAB323908AF4}
Expand Down Expand Up @@ -339,6 +341,18 @@ Global
{A63B3AD1-AB7B-461E-9FFF-2447F5BCD459}.Release|x64.Build.0 = Release|x64
{A63B3AD1-AB7B-461E-9FFF-2447F5BCD459}.Release|x86.ActiveCfg = Release|Win32
{A63B3AD1-AB7B-461E-9FFF-2447F5BCD459}.Release|x86.Build.0 = Release|Win32
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|ARM64.ActiveCfg = Debug|ARM64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|ARM64.Build.0 = Debug|ARM64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|x64.ActiveCfg = Debug|x64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|x64.Build.0 = Debug|x64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|x86.ActiveCfg = Debug|Win32
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Debug|x86.Build.0 = Debug|Win32
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|ARM64.ActiveCfg = Release|ARM64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|ARM64.Build.0 = Release|ARM64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|x64.ActiveCfg = Release|x64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|x64.Build.0 = Release|x64
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|x86.ActiveCfg = Release|Win32
{B3F2B53D-5E38-4B75-9C07-E2B1A5C2E0D7}.Release|x86.Build.0 = Release|Win32
{E893622C-47DE-4F83-B422-0A26711590A4}.Debug|ARM64.ActiveCfg = Debug|ARM64
{E893622C-47DE-4F83-B422-0A26711590A4}.Debug|ARM64.Build.0 = Debug|ARM64
{E893622C-47DE-4F83-B422-0A26711590A4}.Debug|x64.ActiveCfg = Debug|x64
Expand Down
Loading
Loading