static void WriteStructWithFields(CodeOutput codeOutput, ClosureEntities crRuntime, Type type) { if (DelegateManager.IsTypeDelegate(type)) return; var mappedType = type.GetMappedType(crRuntime); type = mappedType.GetReversedMappedType(crRuntime); if (!type.IsValueType && type.BaseType != null) { //Not Necessary // codeOutput.AppendFormat("struct {0} : public {1} {2} {{", type.ToCppMangling(), type.BaseType.ToCppMangling(),type.GetInterfaces().Any()? " ,"+type.GetInterfaces().Select(j=>j.ToCppMangling()).Aggregate((a,b)=>a + " , " + b):""); codeOutput.AppendFormat( "struct {0} : public {1}", type.ToCppMangling(), type.BaseType.ToCppMangling()) .BracketOpen(); } else if (!type.IsValueType && type.IsInterface) { codeOutput.AppendFormat("struct {0} : public {1}", type.ToCppMangling(), typeof(object).ToCppMangling()) .BracketOpen(); } else { codeOutput.AppendFormat("struct {0}", type.ToCppMangling()) .BracketOpen(); } if (type == typeof(object)) { codeOutput.Append("int _typeId;\n"); } //String Support if (type == typeof(string)) { crRuntime.AddType(typeof(string)); var usedTypes = crRuntime.MappedTypes.Values.ToList(); var typeTable = new TypeDescriptionTable(usedTypes, crRuntime); codeOutput.Append("System_String()") .BracketOpen() .AppendFormat("_typeId = {0};\n", typeTable.GetTypeId(typeof(string))) .BracketClose() .BlankLine(); } WriteClassFieldsBody(codeOutput, mappedType, crRuntime); codeOutput.BracketClose(true) .Append(";\n") .BlankLine(); var typedesc = UsedTypeList.Set(type, crRuntime); typedesc.WriteStaticFieldInitialization(codeOutput); }
public static string GetArgumentsAsTextWithEscaping(this MethodInterpreter interpreter, CrRuntimeLibrary crRuntime) { var method = interpreter.Method; var parameterInfos = method.GetParameters(); var escapingBools = method.BuildEscapingBools(crRuntime); var sb = new StringBuilder(); var index = 0; var analyze = interpreter.AnalyzeProperties; if (!method.IsStatic) { var parameterData = analyze.GetVariableData(new ArgumentVariable("_this")); if (parameterData != EscapingMode.Unused) { var argumentTypeDescription = UsedTypeList.Set(method.DeclaringType.GetMappedType(), crRuntime); var thisText = String.Format("const {0}& _this", argumentTypeDescription.ClrType.ToCppName(true)); if (!escapingBools[0]) { thisText = String.Format("{0} _this", argumentTypeDescription.ClrType.ToCppName(true, EscapingMode.Pointer)); } sb.Append(thisText); index++; } } var isFirst = index == 0; for (index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; var parameterData = analyze.GetVariableData(new ArgumentVariable(parameterInfo.Name)); if (parameterData == EscapingMode.Unused) { continue; } if (isFirst) { isFirst = false; } else { sb.Append(", "); } var isSmartPtr = escapingBools[index]; var nonEscapingMode = isSmartPtr ? EscapingMode.Smart : EscapingMode.Pointer; var argumentTypeDescription = UsedTypeList.Set(parameterInfo.ParameterType.GetMappedType(), crRuntime); sb.AppendFormat("{0} {1}", argumentTypeDescription.ClrType.ToCppName(true, nonEscapingMode), parameterInfo.Name); } return(sb.ToString()); }
public ClosureTypeComparer(List <Type> typesToSort, CrRuntimeLibrary crRuntime) { _typesToSort = typesToSort; foreach (var type in typesToSort) { var typeDesc = UsedTypeList.Set(type, crRuntime); var layout = typeDesc.Layout.Where(kind => kind.TypeDescription.ClrTypeCode == TypeCode.Object) .Select(field => field.TypeDescription.ClrType) .ToArray(); var hashSet = new HashSet <Type>(layout); _dictionary[type] = hashSet; } }
private static void WriteClosureStructBodies(Type[] typeDatas, StringBuilder sb, CrRuntimeLibrary crRuntime) { foreach (var typeData in typeDatas) { var mappedType = typeData.GetMappedType(); if (!mappedType.IsGenericType) { sb.AppendFormat("struct {0}; ", mappedType.ToCppMangling()).AppendLine(); } } foreach (var typeData in typeDatas) { if (DelegateManager.IsTypeDelegate(typeData)) { continue; } var type = typeData.GetMappedType(); var mappedType = typeData; if (mappedType.IsGenericType) { var genericTypeCount = mappedType.GetGenericArguments().Length; var typeNames = new List <string>(); for (var i = 1; i <= genericTypeCount; i++) { typeNames.Add("class T" + i); } sb.AppendFormat("template <{0}> ", string.Join(", ", typeNames)).AppendLine(); } if (!type.IsValueType && type.BaseType != null) { sb.AppendFormat("struct {0} : public {1} {{", type.ToCppMangling(), type.BaseType.ToCppMangling()); } else { sb.AppendFormat("struct {0} {{", type.ToCppMangling()); } sb.AppendLine(); if (type == typeof(object)) { sb.AppendLine("int _typeId;"); } WriteClassFieldsBody(sb, mappedType, crRuntime); sb.AppendFormat("}};").AppendLine(); var typedesc = UsedTypeList.Set(type, crRuntime); typedesc.WriteStaticFieldInitialization(sb); } }
private static void WriteStructWithFields(StringBuilder sb, ClosureEntities crRuntime, Type type) { if (DelegateManager.IsTypeDelegate(type)) { return; } var mappedType = type.GetMappedType(crRuntime); type = mappedType.GetReversedMappedType(crRuntime); if (!type.IsValueType && type.BaseType != null) { //Not Necessary // sb.AppendFormat("struct {0} : public {1} {2} {{", type.ToCppMangling(), type.BaseType.ToCppMangling(),type.GetInterfaces().Any()? " ,"+type.GetInterfaces().Select(j=>j.ToCppMangling()).Aggregate((a,b)=>a + " , " + b):""); sb.AppendFormat("struct {0} : public {1} {{", type.ToCppMangling(), type.BaseType.ToCppMangling()); } else if (!type.IsValueType && type.IsInterface) { sb.AppendFormat("struct {0} : public {1} {{", type.ToCppMangling(), typeof(object).ToCppMangling()); } else { sb.AppendFormat("struct {0} {{", type.ToCppMangling()); } sb.AppendLine(); if (type == typeof(object)) { sb.AppendLine("int _typeId;"); } //String Support if (type == typeof(string)) { crRuntime.AddType(typeof(string)); List <Type> usedTypes = crRuntime.MappedTypes.Values.ToList(); var typeTable = new TypeDescriptionTable(usedTypes, crRuntime); sb.AppendLine(String.Format("System_String() {{_typeId = {0}; }}", typeTable.GetTypeId(typeof(string)))); } WriteClassFieldsBody(sb, mappedType, crRuntime); sb.AppendFormat("}};").AppendLine(); var typedesc = UsedTypeList.Set(type, crRuntime); typedesc.WriteStaticFieldInitialization(sb); }
public static string GetArgumentsAsTextWithEscaping(this MethodBase method) { var parameterInfos = method.GetParameters(); var escapingBools = BuildEscapingBools(method); var sb = new StringBuilder(); var index = 0; if (!method.IsStatic) { var argumentTypeDescription = UsedTypeList.Set(method.DeclaringType.GetMappedType()); var thisText = String.Format("const {0}& _this", argumentTypeDescription.ClrType.ToCppName(true)); if (!escapingBools[0]) { thisText = String.Format("{0} _this", argumentTypeDescription.ClrType.ToCppName(true, EscapingMode.Pointer)); } sb.Append(thisText); index++; } var isFirst = index == 0; for (index = 0; index < parameterInfos.Length; index++) { if (isFirst) { isFirst = false; } else { sb.Append(", "); } var parameterInfo = parameterInfos[index]; var isSmartPtr = escapingBools[index]; var nonEscapingMode = isSmartPtr ? EscapingMode.Smart : EscapingMode.Pointer; var argumentTypeDescription = UsedTypeList.Set(parameterInfo.ParameterType.GetMappedType()); sb.AppendFormat("{0} {1}", argumentTypeDescription.ClrType.ToCppName(true, isSmartPtr: nonEscapingMode), parameterInfo.Name); } return(sb.ToString()); }
public static string GetArgumentsAsTextWithEscaping(this MethodInterpreter interpreter, ClosureEntities closureEntities) { var method = interpreter.Method; var parameterInfos = method.GetParameters(); var escapingBools = method.BuildEscapingBools(closureEntities); var sb = new StringBuilder(); var index = 0; var analyze = interpreter.AnalyzeProperties; if (!method.IsStatic) { var parameterData = analyze.GetVariableData(new LocalVariable { VarName = "_this", Kind = VariableKind.Argument, Id = 0 }); if (parameterData != EscapingMode.Unused) { TypeDescription argumentTypeDescription = UsedTypeList.Set(method.DeclaringType.GetReversedMappedType(closureEntities) ?? method.DeclaringType.GetMappedType(closureEntities), closureEntities); var thisText = String.Format("const {0}& _this", argumentTypeDescription.GetClrType(closureEntities).ToCppName()); // all "_this" should be smart pointers //For some reason at three Virtual Test 4 fails this, is something wrong with the escaping ? // if ((!escapingBools[0])) // { // thisText = String.Format("{0} _this", // argumentTypeDescription.ClrType.ToCppName(true, EscapingMode.Pointer)); // } sb.Append(thisText); index++; } } var isFirst = index == 0; for (index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; var parameterData = analyze.GetVariableData(new LocalVariable() { Kind = VariableKind.Argument, VarName = parameterInfo.Name }); if (parameterData == EscapingMode.Unused) { continue; } if (isFirst) { isFirst = false; } else { sb.Append(", "); } var isSmartPtr = escapingBools[index]; var nonEscapingMode = isSmartPtr ? EscapingMode.Smart : EscapingMode.Pointer; var parameterType = parameterInfo.ParameterType.GetReversedMappedType(closureEntities); var argumentTypeDescription = UsedTypeList.Set(parameterType, closureEntities); sb.AppendFormat("{0} {1}", argumentTypeDescription.GetClrType(closureEntities).ToCppName(nonEscapingMode, isPInvoke: method.IsPinvoke()), //Handle byref parameterInfo.Name); } return(sb.ToString()); }
static void WriteClassFieldsBody(CodeOutput codeOutput, Type mappedType, ClosureEntities crRuntime) { var typeDesc = UsedTypeList.Set(mappedType, crRuntime); typeDesc.WriteLayout(codeOutput); }
private static void WriteClassFieldsBody(StringBuilder sb, Type mappedType, ClosureEntities crRuntime) { var typeDesc = UsedTypeList.Set(mappedType, crRuntime); typeDesc.WriteLayout(sb); }
private static HashSet <Type> BuildScannedDictionaryFromTypesAndInstructions(HashSet <Type> typesSet, CrRuntimeLibrary crRuntime) { bool isAdded; do { var toAdd = new HashSet <Type>(typesSet); foreach (var type in typesSet) { AddBaseTypesToHash(type, toAdd); var mappedType = crRuntime.GetMappedType(type); if (type.IsPrimitive) { continue; } var fieldTypes = UsedTypeList.GetFieldTypeDependencies(type); toAdd.AddRange(fieldTypes); var fields = mappedType.GetFields().ToList(); fields.AddRange(mappedType.GetFields( BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)); foreach (var fieldInfo in fields) { var fieldType = fieldInfo.FieldType; if (fieldType.IsInterface) { continue; } if (fieldType.IsSubclassOf(typeof(Array))) { fieldType = fieldType.GetElementType(); } if (fieldType.IsPointer || fieldType.IsByRef) { fieldType = fieldType.GetElementType(); } var typeDesc = UsedTypeList.Set(type, crRuntime); if (typeDesc == null) { continue; } toAdd.Add(fieldType); AddBaseTypesToHash(fieldType, toAdd); } } isAdded = (toAdd.Count != typesSet.Count); typesSet = toAdd; } while (isAdded); var typesClosure = typesSet.Where(t => IsRefClassType(t) && !t.IsInterface).ToList(); foreach (var type in typesClosure) { UsedTypeList.Set(type, crRuntime); } typesSet.Remove(typeof(void)); typesSet.Remove(typeof(IntPtr)); typesSet.Remove(typeof(Array)); typesSet.RemoveWhere(t => t.IsInterface); typesSet.RemoveWhere(t => t.IsPrimitive); typesSet.RemoveWhere(t => t.IsSubclassOf(typeof(Array))); typesSet.RemoveWhere(t => t.GetMappedType() == t && string.IsNullOrEmpty(t.FullName)); return(typesSet); }
public static string GetArgumentsAsTextWithEscaping(this MethodInterpreter interpreter, ClosureEntities closureEntities) { var method = interpreter.Method; var parameterInfos = method.GetParameters(); var escapingBools = method.BuildEscapingBools(closureEntities); var sb = new StringBuilder(); var index = 0; var analyze = interpreter.AnalyzeProperties; if (!method.IsStatic) { var parameterData = analyze.GetVariableData(new LocalVariable { VarName = "_this", Kind = VariableKind.Argument, Id = 0 }); if (parameterData != EscapingMode.Unused) { var argumentTypeDescription = UsedTypeList.Set( method.DeclaringType.GetReversedMappedType(closureEntities) ?? method.DeclaringType.GetMappedType(closureEntities), closureEntities); var isSmartPtr = interpreter.AnalyzeProperties.Arguments.First(it => it.Name == "_this").Escaping; var thisText = $"{argumentTypeDescription.ClrType.ToCppName(isSmartPtr)} _this"; sb.Append(thisText); index++; } } var isFirst = index == 0; for (index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; var parameterData = analyze.GetVariableData(new LocalVariable { Kind = VariableKind.Argument, VarName = parameterInfo.Name }); if (parameterData == EscapingMode.Unused) { continue; } if (isFirst) { isFirst = false; } else { sb.Append(", "); } var isSmartPtr = escapingBools[index]; var nonEscapingMode = isSmartPtr ? EscapingMode.Smart : EscapingMode.Pointer; var parameterType = parameterInfo.ParameterType.GetReversedMappedType(closureEntities); var argumentTypeDescription = UsedTypeList.Set(parameterType, closureEntities); sb.AppendFormat("{0} {1}", argumentTypeDescription.GetClrType(closureEntities).ToCppName(nonEscapingMode, method.IsPinvoke()), //Handle byref parameterInfo.Name); } return(sb.ToString()); }