Beispiel #1
0
 public void Visit(IntrinsicEntry entry)
 {
     foreach (var argument in entry.Arguments)
     {
         argument.Accept(this);
     }
     SetNext(entry);
 }
Beispiel #2
0
 public void Visit(IntrinsicEntry entry)
 {
     Print($"{entry.TargetMethod}");
     _indent++;
     foreach (var argument in entry.Arguments)
     {
         argument.Accept(this);
     }
     _indent--;
 }
Beispiel #3
0
        public void Visit(IntrinsicEntry entry)
        {
            var firstArg = true;

            foreach (var argument in entry.Arguments)
            {
                if (firstArg)
                {
                    _sb.Append("       ");
                    _sb.Append(firstArg ? "┌──▌" : "├──▌");
                    _sb.Append("  ");
                    _sb.AppendLine($"t{argument.TreeID}");
                }
                firstArg = false;
            }

            // TODO: Consider intrinsics that return data
            _sb.AppendLine($"       {entry.TargetMethod}");
        }
Beispiel #4
0
        private static bool ImportIntrinsicCall(MethodDef methodToCall, IList <StackEntry> arguments, IILImporterProxy importer)
        {
            // Not yet implemented methods with non void return type
            if (methodToCall.HasReturnType)
            {
                throw new NotSupportedException();
            }

            // Map method name to string that code generator will understand
            var targetMethodName = "";

            switch (methodToCall.Name)
            {
            // TODO: Suspect this won't stay as an intrinsic but at least we have the mechanism for instrincs
            case "Write":
                if (IsTypeName(methodToCall, "System", "Console"))
                {
                    var argtype = methodToCall.Parameters[0].Type;
                    targetMethodName = argtype.FullName switch
                    {
                        "System.String" => "WriteString",
                        "System.Int32" => "WriteInt32",
                        "System.UInt32" => "WriteUInt32",
                        "System.Char" => "WriteChar",
                        _ => throw new NotSupportedException(),
                    };
                }
                break;

            default:
                return(false);
            }

            var callNode = new IntrinsicEntry(targetMethodName, arguments, StackValueKind.Unknown);

            importer.ImportAppendTree(callNode);

            return(true);
        }
 public void Visit(IntrinsicEntry entry)
 {
     _genericStackEntryVisitor.Visit <IntrinsicEntry>(entry);
 }