Skip to content

Commit 051f5d9

Browse files
authored
Merge branch 'focus-creative-games:main' into main
2 parents 781e1f9 + 756b906 commit 051f5d9

18 files changed

Lines changed: 682 additions & 154 deletions
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "../Il2CppCompatibleDef.h"
2+
3+
namespace hybridclr
4+
{
5+
const char* g_placeHolderAssemblies[] =
6+
{
7+
//!!!{{PLACE_HOLDER
8+
9+
//!!!}}PLACE_HOLDER
10+
nullptr,
11+
};
12+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <codegen/il2cpp-codegen-metadata.h>
2+
#if HYBRIDCLR_UNITY_2023_OR_NEW
3+
#include <codegen/il2cpp-codegen.h>
4+
#elif HYBRIDCLR_UNITY_2022
5+
#include <codegen/il2cpp-codegen-il2cpp.h>
6+
#elif HYBRIDCLR_UNITY_2020 || HYBRIDCLR_UNITY_2021
7+
#include <codegen/il2cpp-codegen-common-big.h>
8+
#else
9+
#include <codegen/il2cpp-codegen-common.h>
10+
#endif
11+
12+
#include "vm/ClassInlines.h"
13+
#include "vm/Object.h"
14+
#include "vm/Class.h"
15+
#include "vm/ScopedThreadAttacher.h"
16+
17+
#include "../metadata/MetadataUtil.h"
18+
19+
20+
#include "../interpreter/InterpreterModule.h"
21+
#include "../interpreter/MethodBridge.h"
22+
#include "../interpreter/Interpreter.h"
23+
#include "../interpreter/MemoryUtil.h"
24+
#include "../interpreter/InstrinctDef.h"
25+
26+
using namespace hybridclr::interpreter;
27+
using namespace hybridclr::metadata;
28+
29+
//!!!{{CODE
30+
31+
32+
//!!!}}CODE

Data~/Templates/UnityVersion.h.tpl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
//!!!{{UNITY_VERSION
4+
5+
6+
//!!!}}UNITY_VERSION

Data~/hybridclr_version.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,38 @@
22
"versions": [
33
{
44
"unity_version":"2019",
5-
"hybridclr" : { "branch":"v7.3.0"},
6-
"il2cpp_plus": { "branch":"v2019-7.3.0"}
5+
"hybridclr" : { "branch":"v7.6.0"},
6+
"il2cpp_plus": { "branch":"v2019-7.6.0"}
77
},
88
{
99
"unity_version":"2020",
10-
"hybridclr" : { "branch":"v7.3.0"},
11-
"il2cpp_plus": { "branch":"v2020-7.3.0"}
10+
"hybridclr" : { "branch":"v7.6.0"},
11+
"il2cpp_plus": { "branch":"v2020-7.6.0"}
1212
},
1313
{
1414
"unity_version":"2021",
15-
"hybridclr" : { "branch":"v7.3.0"},
16-
"il2cpp_plus": { "branch":"v2021-7.3.0"}
15+
"hybridclr" : { "branch":"v7.6.0"},
16+
"il2cpp_plus": { "branch":"v2021-7.6.0"}
1717
},
1818
{
1919
"unity_version":"2022",
20-
"hybridclr" : { "branch":"v7.3.0"},
21-
"il2cpp_plus": { "branch":"v2022-7.2.0"}
20+
"hybridclr" : { "branch":"v7.6.0"},
21+
"il2cpp_plus": { "branch":"v2022-7.4.0"}
2222
},
2323
{
2424
"unity_version":"2022-tuanjie",
25-
"hybridclr" : { "branch":"v7.3.0"},
26-
"il2cpp_plus": { "branch":"v2022-tuanjie-7.1.0"}
25+
"hybridclr" : { "branch":"v7.6.0"},
26+
"il2cpp_plus": { "branch":"v2022-tuanjie-7.4.0"}
2727
},
2828
{
2929
"unity_version":"2023",
30-
"hybridclr" : { "branch":"v6.2.0"},
31-
"il2cpp_plus": { "branch":"v2023-6.0.0"}
30+
"hybridclr" : { "branch":"v7.6.0"},
31+
"il2cpp_plus": { "branch":"v2023-7.4.0"}
3232
},
3333
{
3434
"unity_version":"6000",
35-
"hybridclr" : { "branch":"v7.3.0"},
36-
"il2cpp_plus": { "branch":"v6000-7.2.0"}
35+
"hybridclr" : { "branch":"v7.6.0"},
36+
"il2cpp_plus": { "branch":"v6000-7.4.0"}
3737
}
3838
]
3939
}

Editor/AOT/AOTAssemblyMetadataStripper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public static byte[] Strip(byte[] assemblyBytes)
3131
}
3232
var writer = new System.IO.MemoryStream();
3333
var options = new ModuleWriterOptions(mod);
34-
options.MetadataOptions.Flags |= MetadataFlags.PreserveAll;
35-
mod.Write(writer);
34+
options.MetadataOptions.Flags |= MetadataFlags.PreserveRids;
35+
mod.Write(writer, options);
3636
writer.Flush();
3737
return writer.ToArray();
3838
}

Editor/Commands/Il2CppDefGeneratorCommand.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ public static void GenerateIl2CppDef()
2020
{
2121
UnityVersion = Application.unityVersion,
2222
HotUpdateAssemblies = SettingsUtil.HotUpdateAssemblyNamesIncludePreserved,
23-
OutputFile = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/generated/UnityVersion.h",
24-
OutputFile2 = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/generated/AssemblyManifest.cpp",
23+
UnityVersionTemplateFile = $"{SettingsUtil.TemplatePathInPackage}/UnityVersion.h.tpl",
24+
UnityVersionOutputFile = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/generated/UnityVersion.h",
25+
AssemblyManifestTemplateFile = $"{SettingsUtil.TemplatePathInPackage}/AssemblyManifest.cpp.tpl",
26+
AssemblyManifestOutputFile = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/generated/AssemblyManifest.cpp",
2527
EnableProfilerInReleaseBuild = HybridCLRSettings.Instance.enableProfilerInReleaseBuild,
2628
EnableStraceTraceInWebGLReleaseBuild = HybridCLRSettings.Instance.enableStraceTraceInWebGLReleaseBuild,
2729
};

Editor/Commands/MethodBridgeGeneratorCommand.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@ public static void CleanIl2CppBuildCache()
3131
Directory.Delete(il2cppBuildCachePath, true);
3232
}
3333

34-
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawReversePInvokeMethodInfo> reversePInvokeMethods, string outputFile)
34+
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawReversePInvokeMethodInfo> reversePInvokeMethods, IReadOnlyCollection<RawCalliMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
3535
{
36-
string templateCode = File.ReadAllText(outputFile, Encoding.UTF8);
36+
string templateCode = File.ReadAllText(tempFile, Encoding.UTF8);
3737
var g = new Generator(new Generator.Options()
3838
{
3939
TemplateCode = templateCode,
4040
OutputFile = outputFile,
4141
GenericMethods = genericMethods,
4242
ReversePInvokeMethods = reversePInvokeMethods,
43+
CalliMethodSignatures = calliMethodSignatures,
4344
Development = EditorUserBuildSettings.development,
4445
});
4546

@@ -80,9 +81,13 @@ public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget targ
8081
var reversePInvokeAnalyzer = new ReversePInvokeWrap.Analyzer(cache, hotUpdateDlls);
8182
reversePInvokeAnalyzer.Run();
8283

84+
var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);
85+
calliAnalyzer.Run();
86+
87+
string templateFile = $"{SettingsUtil.TemplatePathInPackage}/MethodBridge.cpp.tpl";
8388
string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
8489

85-
GenerateMethodBridgeCppFile(methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, outputFile);
90+
GenerateMethodBridgeCppFile(methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, calliAnalyzer.CalliMethodSignatures, templateFile, outputFile);
8691

8792
CleanIl2CppBuildCache();
8893
}

Editor/Commands/StripAOTDllCommand.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ public static void GenerateStripedAOTDlls(BuildTarget target)
139139
options = buildOptions,
140140
target = target,
141141
targetGroup = BuildPipeline.GetBuildTargetGroup(target),
142+
#if UNITY_2021_1_OR_NEWER
143+
subtarget = (int)EditorUserBuildSettings.standaloneBuildSubtarget,
144+
#endif
142145
};
143146

144147
var report = BuildPipeline.BuildPlayer(buildPlayerOptions);

Editor/Il2CppDef/Il2CppDefGenerator.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@ public class Options
1717
{
1818
public List<string> HotUpdateAssemblies { get; set; }
1919

20-
public string OutputFile { get; set; }
20+
public string UnityVersionTemplateFile { get; set; }
2121

22-
public string OutputFile2 { get; set; }
22+
public string UnityVersionOutputFile { get; set; }
23+
24+
public string AssemblyManifestTemplateFile { get; set; }
25+
26+
public string AssemblyManifestOutputFile { get; set; }
2327

2428
public string UnityVersion { get; set; }
2529

@@ -45,7 +49,7 @@ public void Generate()
4549

4650
private void GenerateIl2CppConfig()
4751
{
48-
var frr = new FileRegionReplace(File.ReadAllText(_options.OutputFile));
52+
var frr = new FileRegionReplace(File.ReadAllText(_options.UnityVersionTemplateFile));
4953

5054
List<string> lines = new List<string>();
5155

@@ -93,13 +97,13 @@ private void GenerateIl2CppConfig()
9397

9498
frr.Replace("UNITY_VERSION", string.Join("\n", lines));
9599

96-
frr.Commit(_options.OutputFile);
97-
Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.OutputFile}");
100+
frr.Commit(_options.UnityVersionOutputFile);
101+
Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.UnityVersionOutputFile}");
98102
}
99103

100104
private void GeneratePlaceHolderAssemblies()
101105
{
102-
var frr = new FileRegionReplace(File.ReadAllText(_options.OutputFile2));
106+
var frr = new FileRegionReplace(File.ReadAllText(_options.AssemblyManifestTemplateFile));
103107

104108
List<string> lines = new List<string>();
105109

@@ -110,8 +114,8 @@ private void GeneratePlaceHolderAssemblies()
110114

111115
frr.Replace("PLACE_HOLDER", string.Join("\n", lines));
112116

113-
frr.Commit(_options.OutputFile2);
114-
Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.OutputFile2}");
117+
frr.Commit(_options.AssemblyManifestOutputFile);
118+
Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.AssemblyManifestOutputFile}");
115119
}
116120
}
117121
}

Editor/Meta/AssemblySorter.cs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace HybridCLR.Editor.Meta
8+
{
9+
10+
public class AssemblySorter
11+
{
12+
class Node
13+
{
14+
public string Name;
15+
public List<Node> Dependencies = new List<Node>();
16+
17+
public Node(string name)
18+
{
19+
Name = name;
20+
}
21+
}
22+
23+
class TopologicalSorter
24+
{
25+
26+
public static List<Node> Sort(List<Node> nodes)
27+
{
28+
List<Node> sorted = new List<Node>();
29+
HashSet<Node> visited = new HashSet<Node>();
30+
HashSet<Node> tempMarks = new HashSet<Node>();
31+
32+
foreach (var node in nodes)
33+
{
34+
if (!visited.Contains(node))
35+
{
36+
Visit(node, visited, tempMarks, sorted);
37+
}
38+
}
39+
return sorted;
40+
}
41+
42+
private static void Visit(Node node, HashSet<Node> visited, HashSet<Node> tempMarks, List<Node> sorted)
43+
{
44+
if (tempMarks.Contains(node))
45+
{
46+
throw new Exception("Detected cyclic dependency!");
47+
}
48+
49+
if (!visited.Contains(node))
50+
{
51+
tempMarks.Add(node);
52+
foreach (var dependency in node.Dependencies)
53+
{
54+
Visit(dependency, visited, tempMarks, sorted);
55+
}
56+
tempMarks.Remove(node);
57+
visited.Add(node);
58+
sorted.Add(node);
59+
}
60+
}
61+
}
62+
63+
private static List<string> SortAssemblyByReferenceOrder(IEnumerable<string> assemblies, Dictionary<string, HashSet<string>> refs)
64+
{
65+
var nodes = new List<Node>();
66+
var nodeMap = new Dictionary<string, Node>();
67+
foreach (var assembly in assemblies)
68+
{
69+
var node = new Node(assembly);
70+
nodes.Add(node);
71+
nodeMap.Add(assembly, node);
72+
}
73+
foreach (var assembly in assemblies)
74+
{
75+
var node = nodeMap[assembly];
76+
foreach (var refAssembly in refs[assembly])
77+
{
78+
node.Dependencies.Add(nodeMap[refAssembly]);
79+
}
80+
}
81+
var sortedNodes = TopologicalSorter.Sort(nodes);
82+
return sortedNodes.Select(node => node.Name).ToList();
83+
}
84+
85+
public static List<string> SortAssemblyByReferenceOrder(IEnumerable<string> assemblies, IAssemblyResolver assemblyResolver)
86+
{
87+
var assCache = new AssemblyCache(assemblyResolver);
88+
var assRefAssemblies = new Dictionary<string, HashSet<string>>();
89+
foreach (var assName in assemblies)
90+
{
91+
var refAssemblies = new HashSet<string>();
92+
var mod = assCache.LoadModule(assName, false);
93+
foreach (var refAss in mod.GetAssemblyRefs())
94+
{
95+
if (assemblies.Contains(refAss.Name.ToString()))
96+
{
97+
refAssemblies.Add(refAss.Name.ToString());
98+
}
99+
}
100+
assRefAssemblies.Add(assName, refAssemblies);
101+
}
102+
return SortAssemblyByReferenceOrder(assemblies, assRefAssemblies);
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)