public override void Accept (ListCompExpression list)
		{
			IodineLabel foreachLabel = methodBuilder.CreateLabel ();
			IodineLabel breakLabel = methodBuilder.CreateLabel ();
			IodineLabel predicateSkip = methodBuilder.CreateLabel ();
			int tmp = methodBuilder.CreateTemporary (); 
			int set = methodBuilder.CreateTemporary ();
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.BuildList, 0);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.StoreLocal, set);
			symbolTable.NextScope ();
			list.Iterator.Visit (this);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.Dup);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.StoreLocal, tmp);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.IterReset);
			methodBuilder.MarkLabelPosition (foreachLabel);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.LoadLocal, tmp);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.IterMoveNext);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.JumpIfFalse,
				breakLabel);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.LoadLocal, tmp);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.IterGetNext);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.StoreLocal,
				symbolTable.GetSymbol
				(list.Identifier).Index);
			if (list.Predicate != null) {
				list.Predicate.Visit (this);
				methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.JumpIfFalse, predicateSkip);
			}
			list.Expression.Visit (this);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.LoadLocal, set);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.LoadAttribute,
				methodBuilder.Module.DefineConstant (new IodineName ("add")));
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.Invoke, 1);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.Pop);
			if (list.Predicate != null) {
				methodBuilder.MarkLabelPosition (predicateSkip);
			}
			methodBuilder.EmitInstruction (list.Expression.Location, Opcode.Jump, foreachLabel);
			methodBuilder.MarkLabelPosition (breakLabel);
			methodBuilder.EmitInstruction (list.Iterator.Location, Opcode.LoadLocal, set);
			symbolTable.LeaveScope ();
		}
Exemple #2
0
 public void Accept(ListCompExpression list)
 {
     list.Visit (functionCompiler);
 }
 public virtual void Accept(ListCompExpression list)
 {
 }
		public override void Accept (ListCompExpression list)
		{
			errorLog.AddError (ErrorType.ParserError, list.Location,
				"List can not exist inside pattern!");
		}
 public void Accept(ListCompExpression list)
 {
     symbolTable.BeginScope ();
     symbolTable.AddSymbol (list.Identifier);
     list.VisitChildren (this);
     symbolTable.EndScope ();
 }