home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 June (DVD) / DPPRO0605DVD.iso / dotNETSDK / SETUP.EXE / netfxsd1.cab / Asm_cs_1________.3643236F_FC70_11D3_A536_0090278A1BB8 < prev    next >
Encoding:
Text File  |  2001-07-19  |  10.2 KB  |  423 lines

  1. namespace MyC
  2. {
  3. using System;
  4. using System.Text;
  5.  
  6. class Asm
  7.   {
  8.   private Io io;
  9.  
  10.   public Asm(Io ihandle)
  11.     {
  12.     io = ihandle;
  13.     }
  14.   
  15.   /*
  16.    * determine the IL static type
  17.    */
  18.   private String ilSType(int type)
  19.     {
  20.     switch (type)
  21.       {
  22.       case Tok.T_CHAR:    return "char";
  23.       case Tok.T_SHORT:    return "int16";
  24.       case Tok.T_DEFTYPE:
  25.       case Tok.T_INT:
  26.       case Tok.T_LONG:    return "int32";
  27.       case Tok.T_FLOAT:    return "float";
  28.       case Tok.T_DOUBLE:    return "double float";
  29.       case Tok.T_VOID:    return "void";
  30.       default:
  31.     Console.WriteLine("?Unhandled type " + type);
  32.     Environment.Exit(1);
  33.     break;
  34.       }
  35.     return null;
  36.     }
  37.  
  38.   /*
  39.    * common routine to construct a signature string for a given varlist item
  40.    * requires a destination ptr, will return the updated dest ptr
  41.    */
  42.   private String genDataTypeSig(Var e)
  43.     {
  44.     if (e == null)
  45.       return null;
  46.  
  47.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  48.  
  49.     if (e.getSign() == Tok.T_UNSIGNED)    /* if var is unsigned, put it in sig */
  50.       sb.Append("unsigned ");
  51.  
  52.     sb.Append(ilSType(e.getTypeId()));    /* get the datatype */
  53.     return (sb.ToString());
  54.     }
  55.  
  56.   private String genFieldRef(Var e)
  57.     {
  58.     if (e == null)
  59.       return null;
  60.  
  61.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  62.  
  63.     if (e.getSign() == Tok.T_UNSIGNED)    /* if var is unsigned, put it in sig */
  64.       sb.Append("unsigned ");
  65.  
  66.     sb.Append(ilSType(e.getTypeId()));    /* get the datatype */
  67.     sb.Append(" ");
  68.     sb.Append(Io.GetClassname());    /* get the current classname */
  69.     sb.Append(".");
  70.     sb.Append(e.getName());    /* copy the variable name */
  71.     return (sb.ToString());
  72.     }
  73.  
  74.   public void Load(IAsm a)
  75.     {
  76.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  77.     Var e = a.getVar();
  78.     if (e == null)
  79.       {
  80.       Console.WriteLine("?Load instruction with no variable ptr");
  81.       Environment.Exit(1);
  82.       }
  83.     switch (e.getClassId())
  84.       {
  85.       case Tok.T_STATIC:
  86.     {
  87.     sb.Append("\tldsfld ");
  88.     sb.Append(genFieldRef(e));
  89.     sb.Append("\t//");
  90.     sb.Append(a.getICount());
  91.     sb.Append(", ");
  92.     sb.Append(e.getName());
  93.     sb.Append("\r\n");
  94.     break;
  95.     }
  96.       case Tok.T_AUTO:
  97.       case Tok.T_DEFCLASS:
  98.     sb.Append("\tldloc ");
  99.     sb.Append(e.getIndex());
  100.     sb.Append("\t//");
  101.     sb.Append(a.getICount());
  102.     sb.Append(", ");
  103.     sb.Append(e.getName());
  104.     sb.Append("\r\n");
  105.     break;
  106.       case Tok.T_PARAM:
  107.     sb.Append("\tldarg ");
  108.     sb.Append(e.getIndex());
  109.     sb.Append("\t//");
  110.     sb.Append(a.getICount());
  111.     sb.Append(", ");
  112.     sb.Append(e.getName());
  113.     sb.Append("\r\n");
  114.     break;
  115.       default:
  116.     Console.Write("?Instruction load of unknown class (");
  117.     Console.Write(e.getClassId());
  118.     Console.WriteLine(")");
  119.     Environment.Exit(1);
  120.     break;
  121.       }
  122.     io.Out(sb.ToString());
  123.     }
  124.  
  125.   public void Store(IAsm a)
  126.     {
  127.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  128.     Var e = a.getVar();
  129.     if (e == null)
  130.       {
  131.       Console.WriteLine("?Store instruction with no variable ptr");
  132.       Environment.Exit(1);
  133.       }
  134.     switch (e.getClassId())
  135.       {
  136.       case Tok.T_STATIC:
  137.     sb.Append("\tstsfld ");
  138.     sb.Append(genFieldRef(e));
  139.     sb.Append("\t//");
  140.     sb.Append(a.getICount());
  141.     sb.Append(", ");
  142.     sb.Append(e.getName());
  143.     sb.Append("\r\n");
  144.     break;
  145.       case Tok.T_AUTO:
  146.       case Tok.T_DEFCLASS:
  147.     sb.Append("\tstloc ");
  148.     sb.Append(e.getIndex());
  149.     sb.Append("\t//");
  150.     sb.Append(a.getICount());
  151.     sb.Append(", ");
  152.     sb.Append(e.getName());
  153.     sb.Append("\r\n");
  154.     break;
  155.       case Tok.T_PARAM:
  156.     sb.Append("\tstarg ");
  157.     sb.Append(e.getIndex());
  158.     sb.Append("\t//");
  159.     sb.Append(a.getICount());
  160.     sb.Append(", ");
  161.     sb.Append(e.getName());
  162.     sb.Append("\r\n");
  163.     break;
  164.       default:
  165.     Console.Write("?Instruction load of unknown class (");
  166.     Console.Write(e.getClassId());
  167.     Console.WriteLine(")");
  168.     Environment.Exit(1);
  169.     break;
  170.       }
  171.     io.Out(sb.ToString());
  172.     }
  173.  
  174.   public void FuncBegin(IAsm a)
  175.     {
  176.     Var func = a.getVar();
  177.     String funcsig = genDataTypeSig(a.getVar()); /* gen type info */
  178.  
  179.     VarList x = func.getParams(); /* get any params */
  180.     String paramsig = "";
  181.     if (x.Length() > 0)
  182.       {
  183.       int max = x.Length();
  184.       StringBuilder t = new StringBuilder(MyC.MAXSTR);
  185.       for (int i = 0; i < max; i++)
  186.     {
  187.     Var e = x.FindByIndex(i);
  188.     t.Append(genDataTypeSig(e));
  189.     if (i < max-1)
  190.       t.Append(",");
  191.     }
  192.       paramsig = t.ToString();
  193.       }
  194.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  195.     sb.Append("\t.method ");
  196.     sb.Append(funcsig);
  197.     sb.Append(" ");
  198.     sb.Append(func.getName());
  199.     sb.Append("(");
  200.     sb.Append(paramsig);
  201.     sb.Append("){\r\n");
  202.     io.Out(sb.ToString());
  203.  
  204.     if (func.getName().Equals("main")) /* special entry point for main */
  205.       io.Out("\t.entrypoint\r\n");
  206.     }
  207.   
  208.   public void Call(IAsm a)
  209.     {
  210.     Var func = a.getVar();
  211.     String funcsig = genDataTypeSig(a.getVar()); /* gen type info */
  212.  
  213.     VarList x = func.getParams(); /* get any params */
  214.     String paramsig = "";
  215.     if (x.Length() > 0)
  216.       {
  217.       int max = x.Length();
  218.       StringBuilder t = new StringBuilder(MyC.MAXSTR);
  219.       for (int i = 0; i < max; i++)
  220.     {
  221.     Var e = x.FindByIndex(i);
  222.     t.Append(genDataTypeSig(e));
  223.     if (i < max-1)
  224.       t.Append(",");
  225.     }
  226.       paramsig = t.ToString();
  227.       }
  228.  
  229.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  230.     sb.Append("\tcall ");
  231.     sb.Append(funcsig);
  232.     sb.Append("(");
  233.     sb.Append(paramsig);
  234.     sb.Append(")\t//");
  235.     sb.Append(a.getICount());
  236.     sb.Append("\r\n");
  237.     io.Out(sb.ToString());
  238.     }
  239.  
  240.   public void Comment(IAsm a)
  241.     {
  242.     String sp = a.getComment();    /* source ptr */
  243.     if (sp == null)
  244.       return;            // empty comment
  245.     sp.Trim();            // remove extra whitespace
  246.     if (sp == null || sp.Length == 0) /* sanity check, is there a comment? */
  247.       return;            /* no, then nothing to do */
  248.  
  249. #if DEBUG
  250.     Console.Write("Comment SP=");
  251.     for (int _debug_i=0; _debug_i<sp.Length;_debug_i++)
  252.       {
  253.       int _debug_d = sp[_debug_i];
  254.       char _debug_c = (char) (_debug_d + 96);
  255.       if (_debug_d < 32)
  256.     Console.Write("^"+Char.ToString(_debug_c));
  257.       else
  258.     Console.Write(sp[_debug_i]);
  259.       Console.Write("[");
  260.       Console.Write(_debug_d);
  261.       Console.Write("],");
  262.       }
  263.     Console.WriteLine(";");
  264. #endif
  265.     StringBuilder buf = new StringBuilder(MyC.MAXSTR); /* a buffer to work with */
  266.     buf.Append("//");
  267.     buf.Append(a.getCommentLine());
  268.     buf.Append(": ");
  269.     int i = 0;
  270.     int p = 0;
  271.     while ((i = sp.IndexOf('\n', i)) >= 0)
  272.       {
  273.       i++;            // move past the newline
  274.       string ts = sp.Substring(p, i-p);
  275.       String s = ts.Trim();
  276.       if (s.Length > 0)
  277.     buf.Append(s);        // copy the substr
  278.       buf.Append("\r\n");        // add the line seperator
  279.       if (i < sp.Length)
  280.     buf.Append("//");    // insert the comment block
  281.       p = i;
  282.       }
  283.  
  284.     buf.Append(sp.Substring(p)); // append the remaining chars
  285.     buf.Append("\r\n");
  286.  
  287.     io.Out(buf.ToString());    /* output the comment */
  288.     }
  289.  
  290.   public void Insn(IAsm a)
  291.     {
  292.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  293.     sb.Append("\t");
  294.     sb.Append(a.getInsn());
  295.     sb.Append("\t//");
  296.     sb.Append(a.getICount());
  297.     sb.Append("\r\n");
  298.     io.Out(sb.ToString());
  299.     }
  300.  
  301.   public void Label(IAsm a)
  302.     {
  303.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  304.     sb.Append(a.getLabel());
  305.     sb.Append(":\r\n");
  306.     io.Out(sb.ToString());
  307.     }
  308.  
  309.   public void Branch(IAsm a)
  310.     {
  311.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  312.     sb.Append("\t");
  313.     sb.Append(a.getInsn());
  314.     sb.Append(" ");
  315.     sb.Append(a.getLabel());
  316.     sb.Append("\t//");
  317.     sb.Append(a.getICount());
  318.     sb.Append("\r\n");
  319.     io.Out(sb.ToString());
  320.     }
  321.  
  322.   public void Ret(IAsm a)
  323.     {
  324.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  325.     sb.Append("\tret\t\t//");
  326.     sb.Append(a.getICount());
  327.     sb.Append("\r\n");
  328.     io.Out(sb.ToString());
  329.     }
  330.  
  331.   public void FuncEnd()
  332.     {
  333.     io.Out("\t}\r\n");
  334.     }
  335.  
  336.   public void LocalVars(VarList v)
  337.     {
  338.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  339.     sb.Append("\t.locals (");
  340.     int max = v.Length();
  341.  
  342.     for (int i = 0; i < max; i++)    // loop thru the local params
  343.       {
  344.       Var e = v.FindByIndex(i);    // indexed by number
  345.       String stype = "";
  346.       switch (e.getTypeId())
  347.     {
  348.     case Tok.T_CHAR:    stype = "char"; break;
  349.     case Tok.T_SHORT:    stype = "int16"; break;
  350.     case Tok.T_INT:
  351.     case Tok.T_LONG:    stype = "int32"; break;
  352.     case Tok.T_FLOAT:    stype = "float"; break;
  353.     case Tok.T_DOUBLE:    stype = "double float"; break;
  354.     default:
  355.       Console.WriteLine("?Could not find type for local\n");
  356.       Environment.Exit(1);
  357.       break;
  358.     }
  359.       sb.Append(stype);        // append it now
  360.       if (i < max-1)
  361.     sb.Append(",");        // if not last, seperate with comma
  362.       }
  363.  
  364.     sb.Append(")\r\n");
  365.     io.Out(sb.ToString());
  366.     }
  367.  
  368.   public void FieldDef(IAsm a)
  369.     {
  370.     Var e = a.getVar();        /* get the field var ptr */
  371.     String prefix = "";
  372.     switch (e.getClassId())
  373.       {
  374.       case Tok.T_STATIC:
  375.     prefix = "\t.field ";
  376.     break;
  377.       case Tok.T_AUTO:
  378.       case Tok.T_DEFCLASS:
  379.     prefix = "\t.field ";
  380.     break;
  381.       default:
  382.     Console.WriteLine("?Unhandled field def type\n");
  383.     Environment.Exit(1);
  384.     break;
  385.       }
  386.  
  387.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  388.     sb.Append(prefix);        /* copy the prefix */
  389.     sb.Append(genDataTypeSig(e)); /* gen type info, rets updated dp */
  390.     sb.Append(" ");
  391.     sb.Append(e.getName());    /* copy the variable name */
  392.     sb.Append("\r\n");
  393.     io.Out(sb.ToString());
  394.     }
  395.  
  396.   public void LoadConst(IAsm a)
  397.     {
  398.     StringBuilder sb = new StringBuilder(MyC.MAXSTR);
  399.     int value = Convert.ToInt32(a.getInsn());
  400.  
  401.     sb.Append("\tldc.i4");
  402.     if (value > 127 || value < -128) /* if must use long form */
  403.       {
  404.       sb.Append(" ");
  405.       }
  406.     else if (value > 8 || value < -1)    /* if must use medium form */
  407.       {
  408.       sb.Append(".s ");
  409.       }
  410.     else                /* else use short form */
  411.       {
  412.       sb.Append(".");
  413.       }
  414.     sb.Append(a.getInsn());
  415.     sb.Append("\t//");
  416.     sb.Append(a.getICount());
  417.     sb.Append("\r\n");
  418.  
  419.     io.Out(sb.ToString());
  420.     }
  421.   }
  422. }
  423.