123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Linq;
- using System.Text;
- using ILRuntime.Runtime.Enviorment;
- namespace ILRuntime.Runtime.CLRBinding
- {
- static class FieldBindingGenerator
- {
- internal static string GenerateFieldRegisterCode(this Type type, FieldInfo[] fields, HashSet<FieldInfo> excludes)
- {
- StringBuilder sb = new StringBuilder();
- int idx = 0;
- foreach (var i in fields)
- {
- if (excludes != null && excludes.Contains(i))
- continue;
- if (type.ShouldSkipField(i))
- continue;
- if (i.IsSpecialName)
- continue;
- sb.AppendLine(string.Format(" field = type.GetField(\"{0}\", flag);", i.Name));
- sb.AppendLine(string.Format(" app.RegisterCLRFieldGetter(field, get_{0}_{1});", i.Name, idx));
- if (!i.IsInitOnly && !i.IsLiteral)
- {
- sb.AppendLine(string.Format(" app.RegisterCLRFieldSetter(field, set_{0}_{1});", i.Name, idx));
- sb.AppendLine(string.Format(" app.RegisterCLRFieldBinding(field, CopyToStack_{0}_{1}, AssignFromStack_{0}_{1});", i.Name, idx));
- }
- else
- {
- sb.AppendLine(string.Format(" app.RegisterCLRFieldBinding(field, CopyToStack_{0}_{1}, null);", i.Name, idx));
- }
- idx++;
- }
- return sb.ToString();
- }
- internal static string GenerateFieldWraperCode(this Type type, FieldInfo[] fields, string typeClsName, HashSet<FieldInfo> excludes, List<Type> valueTypeBinders, Enviorment.AppDomain domain)
- {
- StringBuilder sb = new StringBuilder();
- int idx = 0;
- foreach (var i in fields)
- {
- if (excludes != null && excludes.Contains(i))
- continue;
- if (type.ShouldSkipField(i))
- continue;
- sb.AppendLine(string.Format(" static object get_{0}_{1}(ref object o)", i.Name, idx));
- sb.AppendLine(" {");
- if (i.IsStatic)
- {
- sb.AppendLine(string.Format(" return {0}.{1};", typeClsName, i.Name));
- }
- else
- {
- sb.AppendLine(string.Format(" return (({0})o).{1};", typeClsName, i.Name));
- }
- sb.AppendLine(" }");
- sb.AppendLine();
- sb.AppendLine(string.Format(" static StackObject* CopyToStack_{0}_{1}(ref object o, ILIntepreter __intp, StackObject* __ret, IList<object> __mStack)", i.Name, idx));
- sb.AppendLine(" {");
- if (i.IsStatic)
- {
- sb.AppendLine(string.Format(" var result_of_this_method = {0}.{1};", typeClsName, i.Name));
- }
- else
- {
- sb.AppendLine(string.Format(" var result_of_this_method = (({0})o).{1};", typeClsName, i.Name));
- }
- string clsName, realClsName;
- bool isByRef;
- i.FieldType.GetClassName(out clsName, out realClsName, out isByRef);
- if (i.FieldType.IsValueType && !i.FieldType.IsPrimitive && valueTypeBinders != null && valueTypeBinders.Contains(i.FieldType))
- {
-
- sb.AppendLine(string.Format(" if (ILRuntime.Runtime.Generated.CLRBindings.s_{0}_Binder != null) {{", clsName));
- sb.AppendLine(string.Format(" ILRuntime.Runtime.Generated.CLRBindings.s_{0}_Binder.PushValue(ref result_of_this_method, __intp, __ret, __mStack);", clsName));
- sb.AppendLine(" return __ret + 1;");
- sb.AppendLine(" } else {");
- i.FieldType.GetReturnValueCode(sb, domain);
- sb.AppendLine(" }");
- }
- else
- {
- i.FieldType.GetReturnValueCode(sb, domain);
- }
- sb.AppendLine(" }");
- sb.AppendLine();
- if (!i.IsInitOnly && !i.IsLiteral)
- {
- sb.AppendLine(string.Format(" static void set_{0}_{1}(ref object o, object v)", i.Name, idx));
- sb.AppendLine(" {");
- if (i.IsStatic)
- {
- sb.AppendLine(string.Format(" {0}.{1} = ({2})v;", typeClsName, i.Name, realClsName));
- }
- else
- {
- if (type.IsValueType)
- {
- sb.AppendLine(string.Format(" {0} ins =({0})o;", typeClsName));
- sb.AppendLine(string.Format(" ins.{0} = ({1})v;", i.Name, realClsName));
- sb.AppendLine(" o = ins;");
- }
- else
- sb.AppendLine(string.Format(" (({0})o).{1} = ({2})v;", typeClsName, i.Name, realClsName));
- }
- sb.AppendLine(" }");
- sb.AppendLine();
- sb.AppendLine(string.Format(" static StackObject* AssignFromStack_{0}_{1}(ref object o, ILIntepreter __intp, StackObject* ptr_of_this_method, IList<object> __mStack)", i.Name, idx));
- sb.AppendLine(" {");
- sb.AppendLine(" ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain;");
- i.FieldType.AppendArgumentCode(sb, 0, i.Name, valueTypeBinders, false, false, false);
- if (i.IsStatic)
- {
- sb.AppendLine(string.Format(" {0}.{1} = @{1};", typeClsName, i.Name));
- }
- else
- {
- if (type.IsValueType)
- {
- sb.AppendLine(string.Format(" {0} ins =({0})o;", typeClsName));
- sb.AppendLine(string.Format(" ins.{0} = @{0};", i.Name));
- sb.AppendLine(" o = ins;");
- }
- else
- {
- sb.AppendLine(string.Format(" (({0})o).{1} = @{1};", typeClsName, i.Name));
- }
- }
- sb.AppendLine(" return ptr_of_this_method;");
- sb.AppendLine(" }");
- sb.AppendLine();
- }
- idx++;
- }
- return sb.ToString();
- }
- internal static bool CheckCanPinn(this Type type)
- {
- if (type.IsValueType)
- {
- FieldInfo[] fi = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
- bool res = true;
- foreach(var i in fi)
- {
- if(!i.FieldType.IsPrimitive)
- {
- res = false;
- break;
- }
- }
- return res;
- }
- else
- return false;
- }
- }
- }
|