예제 #1
0
        public override void Generate(ILGenerator gen)
        {
            Type t = array.GetResultType();

            if (t.IsArray)
            {
                CodeBlock block = new CodeBlock();
                CodeVariableDeclaration indexDec;
                CodeWhile          cw;
                CodeValueReference index;
                CodeValueReference item;

                block.Add(itemDec);
                item = itemDec.Variable;
                block.Add(indexDec = new CodeVariableDeclaration(typeof(int), "n"));
                index = indexDec.Variable;
                block.Add(new CodeAssignment(index, new CodeLiteral(0)));

                block.Add(cw = new CodeWhile(CodeExpression.IsSmallerThan(index, array.ArrayLength)));
                CodeBlock loopBlock = new CodeBlock();
                loopBlock.Add(new CodeAssignment(item, array[index]));
                loopBlock.Add(new CodeIncrement(index));
                loopBlock.Add(forBlock);
                cw.WhileBlock = loopBlock;

                block.Generate(gen);
            }
            else
            {
                CodeBlock block = new CodeBlock();
                CodeVariableDeclaration dec;
                CodeWhile          cw;
                CodeValueReference enumerator;
                CodeValueReference item;

                block.Add(itemDec);
                item          = itemDec.Variable;
                block.Add(dec = new CodeVariableDeclaration(typeof(IEnumerator), "e"));
                enumerator    = dec.Variable;
                block.Add(new CodeAssignment(enumerator, array.Call("GetEnumerator")));

                block.Add(cw = new CodeWhile(enumerator.Call("MoveNext")));
                CodeBlock loopBlock = new CodeBlock();
                loopBlock.Add(new CodeAssignment(item, enumerator["Current"]));
                loopBlock.Add(forBlock);
                cw.WhileBlock = loopBlock;

                block.Generate(gen);
            }
        }
예제 #2
0
파일: CodeFor.cs 프로젝트: nlhepler/mono
		public override void Generate (ILGenerator gen)
		{
			CodeBlock block = new CodeBlock();
			CodeWhile cw;
			
			block.Add (initExp);
			block.Add (cw = new CodeWhile (conditionExp));
			CodeBlock loopBlock = new CodeBlock ();
			loopBlock.Add (forBlock);
			loopBlock.Add (nextExp);
			cw.WhileBlock = loopBlock;
			
			block.Generate (gen);
		}
예제 #3
0
		public override void Generate (ILGenerator gen)
		{
			Type t = array.GetResultType ();
			if (t.IsArray)
			{
				CodeBlock block = new CodeBlock();
				CodeVariableDeclaration indexDec;
				CodeWhile cw;
				CodeValueReference index;
				CodeValueReference item;
				
				block.Add (itemDec);
				item = itemDec.Variable;
				block.Add (indexDec = new CodeVariableDeclaration (typeof(int), "n"));
				index = indexDec.Variable;
				block.Add (new CodeAssignment (index, new CodeLiteral (0)));
				
				block.Add (cw = new CodeWhile (CodeExpression.IsSmallerThan (index, array.ArrayLength)));
				CodeBlock loopBlock = new CodeBlock ();
				loopBlock.Add (new CodeAssignment (item, array[index]));
				loopBlock.Add (new CodeIncrement(index));
				loopBlock.Add (forBlock);
				cw.WhileBlock = loopBlock;
				
				block.Generate (gen);
			}
			else
			{
				CodeBlock block = new CodeBlock();
				CodeVariableDeclaration dec;
				CodeWhile cw;
				CodeValueReference enumerator;
				CodeValueReference item;
				
				block.Add (itemDec);
				item = itemDec.Variable;
				block.Add (dec = new CodeVariableDeclaration (typeof(IEnumerator), "e"));
				enumerator = dec.Variable;
				block.Add (new CodeAssignment (enumerator, array.Call("GetEnumerator")));
				
				block.Add (cw = new CodeWhile (enumerator.Call ("MoveNext")));
				CodeBlock loopBlock = new CodeBlock ();
				loopBlock.Add (new CodeAssignment (item, enumerator["Current"]));
				loopBlock.Add (forBlock);
				cw.WhileBlock = loopBlock;
				
				block.Generate (gen);
			}
		}
예제 #4
0
파일: CodeFor.cs 프로젝트: raj581/Marvin
        public override void Generate(ILGenerator gen)
        {
            CodeBlock block = new CodeBlock();
            CodeWhile cw;

            block.Add(initExp);
            block.Add(cw = new CodeWhile(conditionExp));
            CodeBlock loopBlock = new CodeBlock();

            loopBlock.Add(forBlock);
            loopBlock.Add(nextExp);
            cw.WhileBlock = loopBlock;

            block.Generate(gen);
        }
예제 #5
0
		public override void Generate (ILGenerator gen)
		{
			if (blocks.Count == 0) return;
			
			CodeIf initialIf = new CodeIf ((CodeExpression)conditions[0]);
			initialIf.TrueBlock = (CodeBlock) blocks[0];
			CodeIf prevCif = initialIf;
			
			for (int n=1; n<blocks.Count; n++) {
				CodeIf cif = new CodeIf ((CodeExpression)conditions[n]);
				cif.TrueBlock = (CodeBlock) blocks[n];
				CodeBlock cb = new CodeBlock ();
				cb.Add (cif);
				prevCif.FalseBlock = cb;
				prevCif = cif;
			}

			initialIf.Generate (gen);
		}
예제 #6
0
        public override void Generate(ILGenerator gen)
        {
            if (blocks.Count == 0)
            {
                return;
            }

            CodeIf initialIf = new CodeIf((CodeExpression)conditions[0]);

            initialIf.TrueBlock = (CodeBlock)blocks[0];
            CodeIf prevCif = initialIf;

            for (int n = 1; n < blocks.Count; n++)
            {
                CodeIf cif = new CodeIf((CodeExpression)conditions[n]);
                cif.TrueBlock = (CodeBlock)blocks[n];
                CodeBlock cb = new CodeBlock();
                cb.Add(cif);
                prevCif.FalseBlock = cb;
                prevCif            = cif;
            }

            initialIf.Generate(gen);
        }
예제 #7
0
        public CodeVariableReference DeclareVariable(Type type, CodeExpression initValue)
        {
            string name = "v" + (varId++);
            CodeVariableDeclaration var = new CodeVariableDeclaration(type, name);

            currentBlock.Add(var);
            if (!object.ReferenceEquals(initValue, null))
            {
                Assign(var.Variable, initValue);
            }
            return(var.Variable);
        }