Fix some issues in IL2CPP, improve type cache efficiency, reduce alloc

This commit is contained in:
Sinai committed 2021-05-06 04:02:42 +10:00
1 parent e4ff86259b
commit 22435176bf
21 files changed
+300 -183

No files matched your search

+1 -1
View File
@@ -26,7 +26,7 @@ namespace UnityExplorer.UI.CacheObject
{
try
{
var ret = FieldInfo.GetValue(this.Owner.Target.TryCast(this.DeclaringType));
var ret = FieldInfo.GetValue(DeclaringInstance);
HadException = false;
LastException = null;
return ret;
+1 -1
View File
@@ -42,7 +42,7 @@ namespace UnityExplorer.UI.CacheObject
{
KeyInputWanted = true;
KeyInputText = key.ToString();
KeyInputTypeText = SignatureHighlighter.ParseType(type, false);
KeyInputTypeText = SignatureHighlighter.Parse(type, false);
}
else
{
+3 -1
View File
@@ -18,6 +18,8 @@ namespace UnityExplorer.UI.CacheObject
public abstract Type DeclaringType { get; }
public string NameForFiltering { get; protected set; }
public object DeclaringInstance => IsStatic ? null : (m_declaringInstance ?? (m_declaringInstance = Owner.Target.TryCast(DeclaringType)));
private object m_declaringInstance;
public abstract bool IsStatic { get; }
public override bool HasArguments => Arguments?.Length > 0 || GenericArguments.Length > 0;
@@ -29,7 +31,7 @@ namespace UnityExplorer.UI.CacheObject
public virtual void SetInspectorOwner(ReflectionInspector inspector, MemberInfo member)
{
this.Owner = inspector;
this.NameLabelText = SignatureHighlighter.ParseFullSyntax(member.DeclaringType, false, member);
this.NameLabelText = SignatureHighlighter.Parse(member.DeclaringType, false, member);
this.NameForFiltering = $"{member.DeclaringType.Name}.{member.Name}";
}
+2 -4
View File
@@ -34,12 +34,10 @@ namespace UnityExplorer.UI.CacheObject
if (methodInfo.IsGenericMethod)
methodInfo = MethodInfo.MakeGenericMethod(Evaluator.TryParseGenericArguments());
var target = MethodInfo.IsStatic ? null : Owner.Target.TryCast(DeclaringType);
if (Arguments.Length > 0)
return methodInfo.Invoke(target, Evaluator.TryParseArguments());
return methodInfo.Invoke(DeclaringInstance, Evaluator.TryParseArguments());
var ret = methodInfo.Invoke(target, new object[0]);
var ret = methodInfo.Invoke(DeclaringInstance, new object[0]);
HadException = false;
LastException = null;
+7 -6
View File
@@ -5,6 +5,7 @@ using System.Reflection;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.CacheObject.Views;
using UnityExplorer.UI.IValues;
using UnityExplorer.UI.ObjectPool;
@@ -94,6 +95,8 @@ namespace UnityExplorer.UI.CacheObject
// Updating and applying values
public abstract void SetUserValue(object value);
public virtual void SetValueFromSource(object value)
{
this.Value = value;
@@ -118,8 +121,6 @@ namespace UnityExplorer.UI.CacheObject
this.IValue.SetValue(Value);
}
public abstract void SetUserValue(object value);
/// <summary>
/// Process the CacheMember state when the value has been evaluated (or re-evaluated)
/// </summary>
@@ -137,7 +138,7 @@ namespace UnityExplorer.UI.CacheObject
State = ValueState.Boolean;
else if (type.IsPrimitive || type == typeof(decimal))
State = ValueState.Number;
else if (type == typeof(string))
else if (ReflectionProvider.Instance.IsString(Value))
State = ValueState.String;
else if (type.IsEnum)
State = ValueState.Enum;
@@ -162,14 +163,14 @@ namespace UnityExplorer.UI.CacheObject
switch (State)
{
case ValueState.NotEvaluated:
label = $"<i>{NOT_YET_EVAL} ({SignatureHighlighter.ParseType(FallbackType, true)})</i>"; break;
label = $"<i>{NOT_YET_EVAL} ({SignatureHighlighter.Parse(FallbackType, true)})</i>"; break;
case ValueState.Exception:
label = $"<i><color=red>{ReflectionUtility.ReflectionExToString(LastException)}</color></i>"; break;
case ValueState.Boolean:
case ValueState.Number:
label = null; break;
case ValueState.String:
string s = Value as string;
string s = ReflectionProvider.Instance.UnboxString(Value);
if (s.Length > 200)
s = $"{s.Substring(0, 200)}...";
label = $"\"{s}\""; break;
@@ -252,7 +253,7 @@ namespace UnityExplorer.UI.CacheObject
cell.TypeLabel.gameObject.SetActive(args.typeLabelActive);
if (args.typeLabelActive)
cell.TypeLabel.text = SignatureHighlighter.ParseType(Value.GetActualType(), false);
cell.TypeLabel.text = SignatureHighlighter.Parse(Value.GetActualType(), false);
cell.Toggle.gameObject.SetActive(args.toggleActive);
if (args.toggleActive)
+2 -4
View File
@@ -28,12 +28,10 @@ namespace UnityExplorer.UI.CacheObject
{
try
{
var target = IsStatic ? null : Owner.Target.TryCast(DeclaringType);
if (HasArguments)
return PropertyInfo.GetValue(target, this.Evaluator.TryParseArguments());
return PropertyInfo.GetValue(DeclaringInstance, this.Evaluator.TryParseArguments());
var ret = PropertyInfo.GetValue(target, null);
var ret = PropertyInfo.GetValue(DeclaringInstance, null);
HadException = false;
LastException = null;
return ret;
@@ -38,7 +38,7 @@ namespace UnityExplorer.UI.CacheObject.Views
Image = root.AddComponent<Image>();
this.NameLayout.minWidth = 40;
this.NameLayout.minWidth = 55;
this.NameLayout.flexibleWidth = 50;
this.NameLayout.minHeight = 30;
this.NameLayout.flexibleHeight = 0;
+14 -7
View File
@@ -31,6 +31,7 @@ namespace UnityExplorer.UI.CacheObject.Views
private GameObject genericArgHolder;
private readonly List<GameObject> genericArgRows = new List<GameObject>();
private readonly List<Text> genericArgLabels = new List<Text>();
private readonly List<TypeCompleter> genericAutocompleters = new List<TypeCompleter>();
private readonly List<InputField> inputFieldCache = new List<InputField>();
@@ -153,9 +154,12 @@ namespace UnityExplorer.UI.CacheObject.Views
genericArgRows[i].SetActive(true);
var constraints = arg.GetGenericParameterConstraints();
var autoCompleter = genericAutocompleters[i];
autoCompleter.BaseType = arg;
autoCompleter.CacheTypes();
// TODO show "class" constraints as they dont show up, "struct" does effectively.
var constraints = arg.GetGenericParameterConstraints();
autoCompleter.GenericConstraints = constraints;
var sb = new StringBuilder($"<color={SignatureHighlighter.CONST}>{arg.Name}</color>");
@@ -164,7 +168,7 @@ namespace UnityExplorer.UI.CacheObject.Views
if (j == 0) sb.Append(' ').Append('(');
else sb.Append(',').Append(' ');
sb.Append(SignatureHighlighter.ParseType(constraints[j]));
sb.Append(SignatureHighlighter.Parse(constraints[j], false));
if (j + 1 == constraints.Length)
sb.Append(')');
@@ -194,19 +198,19 @@ namespace UnityExplorer.UI.CacheObject.Views
AddArgRow(i, false);
argRows[i].SetActive(true);
argLabels[i].text = $"{SignatureHighlighter.ParseType(arg.ParameterType)} <color={SignatureHighlighter.LOCAL_ARG}>{arg.Name}</color>";
argLabels[i].text = $"{SignatureHighlighter.Parse(arg.ParameterType, false)} <color={SignatureHighlighter.LOCAL_ARG}>{arg.Name}</color>";
}
}
private void AddArgRow(int index, bool generic)
{
if (!generic)
AddArgRow(index, argHolder, argRows, argLabels, argumentInput);//, false);
AddArgRow(index, argHolder, argRows, argLabels, argumentInput, false);
else
AddArgRow(index, genericArgHolder, genericArgRows, genericArgLabels, genericInput);//, true);
AddArgRow(index, genericArgHolder, genericArgRows, genericArgLabels, genericInput, true);
}
private void AddArgRow(int index, GameObject parent, List<GameObject> objectList, List<Text> labelList, string[] inputArray)//, bool autocomplete)
private void AddArgRow(int index, GameObject parent, List<GameObject> objectList, List<Text> labelList, string[] inputArray, bool autocomplete)
{
var horiGroup = UIFactory.CreateUIObject("ArgRow_" + index, parent);
UIFactory.SetLayoutElement(horiGroup, minHeight: 25, flexibleHeight: 50, minWidth: 50, flexibleWidth: 9999);
@@ -225,6 +229,9 @@ namespace UnityExplorer.UI.CacheObject.Views
inputObj.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
inputField.onValueChanged.AddListener((string val) => { inputArray[index] = val; });
inputFieldCache.Add(inputField);
if (autocomplete)
genericAutocompleters.Add(new TypeCompleter(null, inputField));
}
public GameObject CreateContent(GameObject parent)