public override void Generate(Generator generator, TypeReference returnType) { base.Generate(generator, returnType); expression.Prepare(generator, null); // boolean expression.Generate(generator); // boolean boolType.GenerateConversion(this, generator, expression.TypeReference); JumpToken elseToken = generator.Assembler.CreateJumpToken(); generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this); generator.Assembler.JumpIfFalse(elseToken); generator.Resolver.EnterContext(); if (statement.IsEmptyBlock()) { throw new CompilerException(statement, string.Format(Resource.Culture, Resource.IfBranchIsEmpty)); } statement.Generate(generator, returnType); Resolver.Context trueContext = generator.Resolver.LeaveContextAcquire(); if (elseStatement != null) { if (elseStatement.IsEmptyBlock()) { throw new CompilerException(elseStatement, string.Format(Resource.Culture, Resource.IfBranchIsEmpty)); } JumpToken skipElseToken = generator.Assembler.CreateJumpToken(); generator.Assembler.Jump(skipElseToken); generator.Assembler.SetDestination(elseToken); generator.Resolver.EnterContext(); elseStatement.Generate(generator, returnType); returns = statement.Returns() && elseStatement.Returns(); Resolver.Context falseContext = generator.Resolver.LeaveContextAcquire(); generator.Resolver.IntersectContexts(trueContext, falseContext); generator.Resolver.ReleaseContext(falseContext); generator.Assembler.SetDestination(skipElseToken); } else { generator.Assembler.SetDestination(elseToken); } generator.Resolver.ReleaseContext(trueContext); }