Ejemplo n.º 1
0
 /// <summary>
 /// Emit the code to generate an arithmetic conditional block.
 /// </summary>
 /// <param name="cg">A code generator object</param>
 public override void Generate(CodeGenerator cg)
 {
     if (cg == null) {
         throw new ArgumentNullException("cg");
     }
     SymType exprType = cg.GenerateExpression(SymType.NONE, ValueExpression);
     Symbol label1 = cg.GetLabel(Nodes[0]);
     Symbol label2 = cg.GetLabel(Nodes[1]);
     Symbol label3 = cg.GetLabel(Nodes[2]);
     LocalDescriptor tempIndex = cg.Emitter.GetTemporary(Symbol.SymTypeToSystemType(exprType));
     cg.Emitter.StoreLocal(tempIndex);
     cg.Emitter.LoadLocal(tempIndex);
     cg.Emitter.LoadValue(exprType, new Variant(0));
     cg.Emitter.BranchLess((Label)label1.Info);
     cg.Emitter.LoadLocal(tempIndex);
     cg.Emitter.LoadValue(exprType, new Variant(0));
     cg.Emitter.BranchEqual((Label)label2.Info);
     cg.Emitter.Branch((Label)label3.Info);
     cg.Emitter.ReleaseTemporary(tempIndex);
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Emit the code to generate a GOTO statement.
        /// </summary>
        /// <param name="cg">A code generator object</param>
        public override void Generate(CodeGenerator cg)
        {
            if (cg == null) {
                throw new ArgumentNullException("cg");
            }
            if (ValueExpression == null) {
                Symbol sym = cg.GetLabel(Nodes[0]);
                cg.Emitter.Branch((Label)sym.Info);
            } else {
                Collection<ParseNode> labelNodes = Nodes;

                if (labelNodes == null || labelNodes.Count == 0) {
                    labelNodes = cg.CurrentProcedure.LabelList;
                }

                Label [] jumpTable = new Label[labelNodes.Count];
                for (int c = 0; c < labelNodes.Count; ++c) {
                    Symbol sym = cg.GetLabel(labelNodes[c]);
                    if (sym.Type == SymType.LABEL) {
                        jumpTable[c] = (Label)sym.Info;
                    }
                }
                cg.GenerateExpression(SymType.INTEGER, ValueExpression);
                if (!IsZeroBased) {
                    cg.Emitter.LoadInteger(1);
                    cg.Emitter.Sub(SymType.INTEGER);
                }
                cg.Emitter.Switch(jumpTable);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cg">A code generator object</param>
        public override void Generate(CodeGenerator cg)
        {
            if (cg == null) {
                throw new ArgumentNullException("cg");
            }
            int switchCount = _caseList.Count;

            SymType exprType = cg.GenerateExpression(SymType.NONE, CompareExpression);
            if (switchCount == 1) {
                cg.GenerateExpression(exprType, _caseList[0]);
                Symbol sym = cg.GetLabel(_labelList[0]);
                cg.Emitter.BranchEqual((Label)sym.Info);
            } else {
                LocalDescriptor index = cg.Emitter.GetTemporary(Symbol.SymTypeToSystemType(exprType));
                cg.Emitter.StoreLocal(index);
                for (int switchIndex = 0; switchIndex < switchCount; ++switchIndex) {
                    cg.Emitter.LoadLocal(index);
                    cg.GenerateExpression(exprType, _caseList[switchIndex]);
                    Symbol sym = cg.GetLabel(_labelList[switchIndex]);
                    cg.Emitter.BranchEqual((Label)sym.Info);
                }
                cg.Emitter.ReleaseTemporary(index);
            }
        }