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);
        }
Beispiel #6
0
        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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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());
        }