private static void HandleAssign(StringBuilder sb, LocalOperation operation, MidRepresentationVariables vars)
        {
            var assignment = (Assignment)operation.Value;

            if (assignment.Right is NewConstructedObject)
            {
                HandleNewObject(operation, sb, vars);
                return;
            }
            var assignedTo    = assignment.AssignedTo;
            var localVariable = assignment.Right as LocalVariable;

            if (localVariable != null)
            {
                var leftVarType  = assignment.AssignedTo.ComputedType();
                var rightVarType = assignment.Right.ComputedType();
                if (leftVarType != rightVarType)
                {
                    if (rightVarType.ClrType.IsPointer)
                    {
                        sb.AppendFormat("{0} = *{1};", assignedTo, localVariable.Name);
                        return;
                    }
                }
                var assignedToData    = vars.GetVariableData(assignedTo);
                var localVariableData = vars.GetVariableData(localVariable);
                var rightVar          = localVariable;
                if (assignedToData.Escaping == localVariableData.Escaping ||
                    assignedTo.ComputedType().ClrTypeCode != TypeCode.Object)
                {
                    sb.AppendFormat("{0} = {1};", assignedTo.Name, rightVar.Name);
                    return;
                }
                switch (assignedToData.Escaping)
                {
                case EscapingMode.Pointer:
                    switch (localVariableData.Escaping)
                    {
                    case EscapingMode.Stack:
                        sb.AppendFormat("{0} = &{1};", assignedTo.Name, rightVar.Name);
                        return;

                    case EscapingMode.Smart:
                        sb.AppendFormat("{0} = ({1}).get();", assignedTo.Name, rightVar.Name);
                        return;
                    }
                    break;

                case EscapingMode.Smart:
                    throw new InvalidDataException("Case not possible!");
                }
                throw new InvalidDataException("Case not handled");
            }
            else
            {
                sb.AppendFormat("{0} = {1};", assignedTo.Name, assignment.Right.ComputedValue());
            }
        }
        private static void AddVariableContent(StringBuilder variablesSb, string format, LocalVariable localVariable, MidRepresentationVariables vars)
        {
            var localVariableData = vars.GetVariableData(localVariable);

            if (localVariableData.Escaping == EscapingMode.Stack)
            {
                return;
            }
            if (localVariable.ComputedType().ClrType.IsSubclassOf(typeof(MethodInfo)))
            {
                variablesSb
                .AppendFormat("void (*{0})({1});",
                              localVariable.Name,
                              ComputeCommaSeparatedParameterTypes(localVariable))
                .AppendLine();
                return;
            }
            if (localVariableData.Escaping == EscapingMode.Pointer)
            {
                var cppName = localVariable.ComputedType()
                              .ClrType.ToDeclaredVariableType(true, isSmartPtr: localVariableData.Escaping);
                variablesSb
                .AppendFormat(format, cppName, localVariable.Id)
                .AppendLine();
                return;
            }
            variablesSb
            .AppendFormat(format, localVariable.ComputedType()
                          .ClrType.ToDeclaredVariableType(true, isSmartPtr: localVariableData.Escaping), localVariable.Id)
            .AppendLine();
        }
        private static void HandleNewObject(LocalOperation operation, StringBuilder bodySb, MidRepresentationVariables vars)
        {
            var value      = (Assignment)operation.Value;
            var rightValue = (NewConstructedObject)value.Right;
            var localValue = rightValue.Info;

            var declaringType = localValue.DeclaringType;
            var cppName       = declaringType.ToDeclaredVariableType(true, EscapingMode.Stack);
            var assignedData  = vars.GetVariableData(value.AssignedTo);

            switch (assignedData.Escaping)
            {
            case EscapingMode.Stack:
                bodySb
                .AppendFormat("{1} {0};", value.AssignedTo.Name, cppName)
                .AppendLine();
                break;

            default:
                bodySb
                .AppendFormat("{0} = std::make_shared<{1}>();", value.AssignedTo.Name, cppName)
                .AppendLine();;
                break;
            }
        }
        private static void HandleNewArray(LocalOperation operation, StringBuilder bodySb,
                                           MidRepresentationVariables vars)
        {
            var assignment = (Assignment)operation.Value;
            var arrayData  = (NewArrayObject)assignment.Right;

            var assignedData = vars.GetVariableData(assignment.AssignedTo);

            switch (assignedData.Escaping)
            {
            case EscapingMode.Stack:
                bodySb.AppendFormat("Array <{1}> {0} ({2}); ",
                                    assignment.AssignedTo.Name,
                                    arrayData.TypeArray.ToCppName(),
                                    arrayData.ArrayLength.Name);
                break;

            default:
                bodySb.AppendFormat("{0} = std::make_shared< Array <{1}> >({2}); ",
                                    assignment.AssignedTo.Name,
                                    arrayData.TypeArray.ToCppName(),
                                    arrayData.ArrayLength.Name);
                break;
            }
        }
        private static void HandleReadArrayItem(LocalOperation operation, StringBuilder bodySb, MidRepresentationVariables vars)
        {
            var value        = (Assignment)operation.Value;
            var valueSrc     = (ArrayVariable)value.Right;
            var parentType   = valueSrc.Parent.ComputedType();
            var variableData = vars.GetVariableData(value.AssignedTo);

            switch (variableData.Escaping)
            {
            case EscapingMode.Smart:
                bodySb.AppendFormat(parentType.ClrType.IsClass
                        ? "{0} = (*{1})[{2}];"
                        : "{0} = {1}[{2}];",
                                    value.AssignedTo.Name, valueSrc.Parent.Name, valueSrc.Index.Name);
                return;

            case EscapingMode.Pointer:
                bodySb.AppendFormat(parentType.ClrType.IsClass
                        ? "{0} = ((*{1})[{2}]).get();"
                        : "{0} = ({1}[{2}]).get();",
                                    value.AssignedTo.Name, valueSrc.Parent.Name, valueSrc.Index.Name);

                return;
            }
        }
        private static void HandleLoadField(LocalOperation operation, StringBuilder bodySb, MidRepresentationVariables vars)
        {
            var fieldGetterInfo  = (FieldGetter)operation.Value;
            var assignedFrom     = fieldGetterInfo.Instance;
            var assignedFromData = vars.GetVariableData(assignedFrom);
            var isOnStack        = assignedFromData.Escaping == EscapingMode.Stack;
            var fieldText        = String.Format(isOnStack ? "{0}.{1}" : "{0}->{1}", fieldGetterInfo.Instance.Name,
                                                 fieldGetterInfo.FieldName.ValidName());

            var assignedTo     = fieldGetterInfo.AssignedTo;
            var assignedToData = vars.GetVariableData(assignedTo);

            switch (assignedToData.Escaping)
            {
            case EscapingMode.Smart:
                bodySb.AppendFormat("{0} = {1};", assignedTo.Name, fieldText);
                break;

            case EscapingMode.Pointer:
                bodySb.AppendFormat("{0} = {1}.get();", assignedTo.Name, fieldText);
                break;
            }
        }
Esempio n. 7
0
        public static void HandleCall(LocalOperation operation, StringBuilder sbCode, MidRepresentationVariables vars)
        {
            var operationData = (MethodData)operation.Value;
            var sb            = new StringBuilder();
            var methodInfo    = operationData.Info.GetReversedMethod();

            #region Write method name

            var isVoidMethod = methodInfo.GetReturnType().IsVoid();
            if (isVoidMethod)
            {
                sb.AppendFormat("{0}", methodInfo.ClangMethodSignature());
            }
            else
            {
                if (operationData.Result == null)
                {
                    sb.AppendFormat("{0}", methodInfo.ClangMethodSignature());
                }
                else
                {
                    sb.AppendFormat("{1} = {0}", methodInfo.ClangMethodSignature(),
                                    operationData.Result.Name);
                }
            }
            var identifierValues = operationData.Parameters;

            var escapingData = CppFullFileMethodWriter.BuildEscapingBools(methodInfo);
            if (escapingData == null)
            {
                var argumentsCall = String.Join(", ", identifierValues.Select(p =>
                {
                    var computeValue = p.ComputedValue();
                    return(computeValue);
                }));

                sb.AppendFormat("({0});", argumentsCall);
                return;
            }

            #endregion

            sb.Append("(");

            #region Parameters

            var pos           = 0;
            var isFirst       = true;
            var argumentTypes = operationData.Info.GetMethodArgumentTypes();
            foreach (var value in identifierValues)
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    sb.Append(", ");
                }
                var localValue   = value as LocalVariable;
                var argumentData = argumentTypes[pos];
                var isEscaping   = escapingData[pos];
                pos++;
                if (localValue == null)
                {
                    sb.Append(value.ComputedValue());
                    continue;
                }
                if (localValue.Kind == VariableKind.Argument)
                {
                }

                if (localValue.ComputedType().ClrType == typeof(IntPtr))
                {
                    var argumentTypeCast = argumentData.ToCppMangling();
                    sb.AppendFormat("({0}){1}", argumentTypeCast, localValue.Name);
                    continue;
                }

                var localValueData = vars.GetVariableData(localValue);
                switch (localValueData.Escaping)
                {
                case EscapingMode.Smart:
                    if (!isEscaping && localValue.ComputedType().ClrType.IsClass)
                    {
                        sb.AppendFormat("{0}.get()", localValue.Name);
                    }
                    else
                    {
                        sb.AppendFormat("{0}", localValue.Name);
                    }
                    continue;

                case EscapingMode.Stack:
                    sb.AppendFormat("&{0}", localValue.Name);
                    continue;

                case EscapingMode.Pointer:
                    sb.AppendFormat(!isEscaping ? "{0}" : "{0}.get()", localValue.Name);
                    continue;
                }
            }

            sb.Append(");");

            #endregion

            sbCode.Append(sb);
        }