Skip to content

Commit 1377160

Browse files
committed
* mix - CSCGenerater / GenerateBindings (split into multiple wrapper assemblies, modify InitBind process) /
* modify PureScriptBuilder build process (remove RunBinderBeforeStrip step,add Managed_orign dir) / * fix generater errors
1 parent eb1b220 commit 1377160

20 files changed

Lines changed: 249 additions & 638 deletions

BindGenerater/Generater/Binder.cs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ public static class Binder
2121
static HashSet<TypeReference> refTypes = new HashSet<TypeReference>();
2222

2323
public static string OutDir;
24-
public static CodeWriter FuncDefineWriter;
25-
public static CodeWriter FuncSerWriter;
26-
public static CodeWriter FuncDeSerWriter;
2724

2825
public static Dictionary<string, CSharpDecompiler> DecompilerDic = new Dictionary<string, CSharpDecompiler>();
2926
public static DecompilerSettings DecompilerSetting;
@@ -65,6 +62,12 @@ public static class Binder
6562
{
6663
"UnityEngine.Transform",
6764
"UnityEngine.Texture",
65+
"UnityEngine.Debug",
66+
"UnityEngine.ILogger",
67+
"UnityEngine.ILogHandler",
68+
"UnityEngine.Logger",
69+
"UnityEngine.DebugLogHandler",
70+
6871
"UnityEngine.UnityException",
6972
"UnityEngine.UnityString",
7073
"UnityEngine.CastHelper`1",
@@ -77,20 +80,13 @@ public static void Init(string outDir)
7780
if (!Directory.Exists(outDir))
7881
Directory.CreateDirectory(outDir);
7982

80-
FuncDefineWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.define.cs")));
81-
FuncSerWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.funcser.cs")));
82-
FuncDeSerWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.funcdeser.cs")));
83-
8483
Utils.IgnoreTypeSet.UnionWith(IgnorTypes);
8584
}
8685

8786
public static void End()
8887
{
8988
TypeResolver.WrapperSide = false;
90-
GenerateBindings.Gen();
91-
FuncDefineWriter.EndAll();
92-
FuncSerWriter.EndAll();
93-
FuncDeSerWriter.EndAll();
89+
GenerateBindings.End();
9490

9591
foreach (var m in moduleSet)
9692
m.Dispose();
@@ -118,7 +114,8 @@ public static void Bind(string dllPath)
118114
curModule = ModuleDefinition.ReadModule(dllPath, parameters);
119115
moduleSet.Add(curModule);
120116
ICallGenerater.AddWrapperAssembly(curModule.Assembly.Name.Name);
121-
//CSCGenerater.SetWrapper(file);
117+
CSCGenerater.SetWrapper(file);
118+
GenerateBindings.StartWraper(file);
122119
CSCGenerater.AdapterCompiler.AddReference(curModule.Name);
123120
foreach(var refAssembly in curModule.AssemblyReferences )
124121
{
@@ -146,6 +143,8 @@ public static void Bind(string dllPath)
146143
gener.Gen();
147144
}
148145
generaters.Clear();
146+
147+
GenerateBindings.Gen();
149148
}
150149

151150
public static void AddType(TypeDefinition type)

BindGenerater/Generater/C/CTypeResolver.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ public RefTypeResolver(TypeReference _type, bool _il2cppType) : base(_type, _il2
224224
public override string Box(string name, bool previous = false)
225225
{
226226
var reName = $"mono{name}";
227-
var classCache = ClassCacheGenerater.GetClass(type.Resolve());
227+
var classCache = ClassCacheGenerater.GetClass(type);
228228
if(type.FullName == "UnityEngine.Object" || type.FullName == "System.Object")
229229
classCache = $"get_mono_class(il2cpp_object_get_class({name}))";
230230

@@ -242,7 +242,7 @@ public override string Unbox(string name, bool previous = false)
242242
string classCache = "NULL";
243243
if (type.Namespace.StartsWith("UnityEngine"))
244244
{
245-
classCache = ClassCacheGenerater.GetClass(type.Resolve(), true);
245+
classCache = ClassCacheGenerater.GetClass(type, true);
246246
// if (type.FullName == "UnityEngine.Object" || type.FullName == "System.Object")
247247
// classCache = $"get_il2cpp_class(mono_object_get_class({name}))";
248248
}
@@ -318,7 +318,7 @@ public override string Box(string name, bool previous = false)
318318

319319
var eType = type.GetElementType();
320320
if(eType.Name != "String")
321-
ClassCacheGenerater.GetClass(type.GetElementType().Resolve());
321+
ClassCacheGenerater.GetClass(type.GetElementType());
322322

323323
var reName = $"mono{name}";
324324
var cmd = $"MonoArray* {reName} = get_mono_array({name})";

BindGenerater/Generater/C/CUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public static bool Filter(TypeReference type)
152152
return false;
153153
}
154154
var td = type.Resolve();
155-
if (td != null && td.IsStruct() && !Utils.IsFullValueType(type))
155+
if (td != null && td.IsStruct() && !Utils.IsFullValueType(td))
156156
return false;
157157

158158
return true;

BindGenerater/Generater/C/ClassCacheGenerater.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,12 @@ public static string GetAssembly(string name, bool il2cpp)
5252
return GetImageDefine(name, il2cpp);
5353
}
5454

55-
public static string GetClass(TypeDefinition type,bool il2cpp = false)
55+
public static string GetClass(TypeReference type,bool il2cpp = false)
5656
{
57-
var filePath = type.Module.Assembly.MainModule.FileName;
58-
if(il2cpp)
59-
{
60-
var flag = type.CustomAttributes.First(attr => attr.AttributeType.Name == "WrapperClassAttribute");
61-
if (flag != null)
62-
filePath = flag.ConstructorArguments.First().Value.ToString();
63-
}
57+
var td = type.Resolve();
58+
var filePath = td.Module.Assembly.MainModule.FileName;
6459

65-
return GetClass(Path.GetFileNameWithoutExtension(filePath), type.Namespace, type.Name, il2cpp);
60+
return GetClass(Path.GetFileNameWithoutExtension(filePath), td.Namespace, td.Name, il2cpp);
6661
}
6762

6863
public static string GetClass(string _assembly ,string _namespace,string name, bool il2cpp)

BindGenerater/Generater/C/ICallGenerater.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ void register_assembly_map()
101101
private static void RegisterAssemblyMap()
102102
{
103103
CS.Writer.Start("void register_assembly_map()");
104-
foreach(var assembly in wrapperAssemblySet)
105-
CS.Writer.WriteLine($"insert_assembly_map(\"{assembly}\", \"Adapter.wrapper\")");
104+
/*foreach(var assembly in wrapperAssemblySet)
105+
CS.Writer.WriteLine($"insert_assembly_map(\"{assembly}\", \"Adapter.wrapper\")");*/
106106
CS.Writer.End();
107107
}
108108
}

BindGenerater/Generater/CSharp/CSCGenerater.cs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,13 @@ public class CSCGenerater
2525

2626
private static string[] AdapterSrc = new string[]
2727
{
28-
"glue/Binder.define.cs",
29-
"glue/Binder.funcser.cs",
28+
"glue/Binder.impl.cs",
3029
"Tools/CustomBinder.cs",
3130
"Tools/ObjectStore.cs",
3231
};
3332

3433
private static string[] AdapterWrapperSrc = new string[]
3534
{
36-
"glue/Binder.define.cs",
37-
"glue/Binder.funcdeser.cs",
3835
"Tools/CustomBinder.cs",
3936
"Tools/ObjectStore.wrapper.cs",
4037
"Tools/ScriptEngine.cs",
@@ -49,11 +46,11 @@ public class CSCGenerater
4946
private static HashSet<string> IgnoreRefSet = new HashSet<string>();
5047
private static Dictionary<string, CSCGenerater> WrapperDic = new Dictionary<string, CSCGenerater>();
5148

52-
public static void Init(string cscDir,string adapterDir, string outDir,string dllRefDir, HashSet<string> ignoreRefSet)
49+
public static void Init(string cscDir,string adapterDir, string outDir, HashSet<string> ignoreRefSet)
5350
{
5451
CSCPath = Path.Combine(cscDir, Utils.IsWin32() ? "csc.exe":"csc") ;
5552
OutDir = outDir;
56-
DllRefDir = dllRefDir;
53+
DllRefDir = outDir;
5754
AdapterDir = adapterDir;
5855
IgnoreRefSet = ignoreRefSet;
5956
AdapterCompiler = new CSCGenerater(Path.Combine(outDir, "Adapter.gen.dll"));
@@ -62,36 +59,66 @@ public static void Init(string cscDir,string adapterDir, string outDir,string dl
6259
AdapterCompiler.AddSource(Path.Combine(adapterDir,file));
6360

6461
SetWrapper("Adapter.wrapper.dll");
62+
foreach (var file in AdapterWrapperSrc)
63+
AdapterWrapperCompiler.AddSource(Path.Combine(adapterDir, file));
6564
}
6665

6766
public static void SetWrapper(string dllName)
6867
{
6968
if (!WrapperDic.TryGetValue(dllName,out AdapterWrapperCompiler))
7069
{
7170
AdapterWrapperCompiler = new CSCGenerater(Path.Combine(OutDir, dllName));
72-
foreach (var file in AdapterWrapperSrc)
73-
AdapterWrapperCompiler.AddSource(Path.Combine(AdapterDir, file));
71+
//foreach (var file in AdapterWrapperSrc)
72+
// AdapterWrapperCompiler.AddSource(Path.Combine(AdapterDir, file));
7473
AdapterWrapperCompiler.AddDefine("WRAPPER_SIDE");
7574
if (!Utils.IsWin32())
7675
AdapterWrapperCompiler.AddDefine("IOS");
7776

7877
WrapperDic[dllName] = AdapterWrapperCompiler;
78+
79+
if (dllName != "Adapter.wrapper.dll")
80+
AdapterWrapperCompiler.AddReference("Adapter.wrapper.dll");
7981
}
8082
}
8183

8284
public static void End()
8385
{
8486
AdapterCompiler.Gen();
8587
//AdapterWrapperCompiler.Gen();
86-
foreach(var wrapper in WrapperDic.Values)
88+
var list = GetSortedList();
89+
foreach (var wrapper in list)
8790
{
8891
wrapper.Gen();
8992
}
9093
}
9194

95+
private static List<CSCGenerater> GetSortedList()
96+
{
97+
foreach (var wrapper in WrapperDic.Values)
98+
{
99+
CountRef(wrapper);
100+
}
101+
var list = new List<CSCGenerater>(WrapperDic.Values);
102+
list.Sort((a, b) => { return b.RefCount - a.RefCount; });
103+
return list;
104+
}
105+
106+
private static void CountRef(CSCGenerater gener)
107+
{
108+
foreach (var depend in gener.refSet)
109+
{
110+
if (WrapperDic.TryGetValue(depend, out var dependGener))
111+
{
112+
dependGener.RefCount++;
113+
CountRef(dependGener);
114+
}
115+
}
116+
}
117+
92118

93119
public string outName { get; private set; }
94-
HashSet<string> refSet = new HashSet<string>();
120+
public HashSet<string> refSet = new HashSet<string>();
121+
public int RefCount = 0;
95122
HashSet<string> srcSet = new HashSet<string>();
96123
HashSet<string> defineSet = new HashSet<string>();
97124

BindGenerater/Generater/CSharp/ClassGenerater.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ public class ClassGenerater : CodeGenerater
3333
public ClassGenerater(TypeDefinition type, StreamWriter writer = null)
3434
{
3535
genType = type;
36+
RefNameSpace.Add("System");
3637
RefNameSpace.Add("PureScript.Mono");
3738
RefNameSpace.Add("System.Runtime.CompilerServices");
3839

3940
if (writer == null)
4041
{
41-
var filePath = Path.Combine(Binder.OutDir, $"Binder.{TypeFullName()}.cs");
42+
var filePath = Path.Combine(Binder.OutDir, $"Gen.{TypeFullName()}.cs");
4243
CSCGenerater.AdapterWrapperCompiler.AddSource(filePath);
4344
FileStream = File.CreateText(filePath);
4445
}
@@ -181,8 +182,8 @@ public override void Gen()
181182
}
182183
}
183184

184-
if (!isCopyOrignType)
185-
CS.Writer.WriteLine($"[WrapperClass(\"{Binder.curModule.Name}\")]", false);
185+
//if (!isCopyOrignType)
186+
// CS.Writer.WriteLine($"[WrapperClass(\"{Binder.curModule.Name}\")]", false);
186187

187188
Utils.TokenMap = nodesCollector.TokenMap;
188189
string classDefine = Utils.GetMemberDelcear(genType,stripInterfaceSet);
@@ -221,7 +222,7 @@ public override void Gen()
221222

222223
if(!hasDefaultConstructor && !genType.IsSealed)
223224
{
224-
CS.Writer.WriteLine($"internal {genType.Name}()" + " { }", false);
225+
CS.Writer.WriteLine($"public {genType.Name}()" + " { }", false);
225226
}
226227
foreach (var m in methods)
227228
{
@@ -294,9 +295,6 @@ void CopyType(TypeDefinition type )
294295
}
295296

296297
syntaxTree.AcceptVisitor(outVisitor);
297-
AddRefType(outVisitor.InternalTypeRef);
298-
299-
300298
if (!isNested)
301299
{
302300
RefNameSpace.UnionWith(outVisitor.nestedUsing);
@@ -310,6 +308,8 @@ void CopyType(TypeDefinition type )
310308

311309
var txt = w.ToString();
312310
CS.Writer.WriteLine(txt, false);
311+
312+
AddRefType(outVisitor.InternalTypeRef);
313313
}
314314

315315
}
@@ -380,6 +380,8 @@ void AddRefType(HashSet<string> refSet)
380380
var tdDeclear = td.DeclaringType;
381381
if (tdDeclear != null && tdDeclear.MetadataToken == genType.MetadataToken)
382382
nestType[td] = new ClassGenerater(td, FileStream);
383+
else if(!Utils.Filter(td))
384+
CS.Writer.WriteLine($"internal class {td.Name}{{}}", false);
383385
else
384386
Binder.AddType(td);
385387
}

0 commit comments

Comments
 (0)