protected override CompilerItem TranslateImpl(CompilerContext cc) { // translate using Instruction CompilerItem ret = base.TranslateImpl(cc); // we jump with item if it's InstructionCode.JMP (unconditional) and points to yet unknown location. if (Code == InstructionCode.Jmp && !JumpTarget.IsTranslated) { cc.AddBackwardCode(this); ret = JumpTarget; } else { _state = cc.SaveState(); if (JumpTarget.IsTranslated) { DoJump(cc); } else { // state is not known, so we need to call DoJump() later. Compiler will do it for us. cc.AddForwardJump(this); JumpTarget.State = _state; } // Mark next code as unrecheable, cleared by a next label (ETarget). if (Code == InstructionCode.Jmp) { cc.Unreachable = true; } } // Need to traverse over all active variables and unuse them if their scope ends here if (cc.Active != null) { CompilerVar first = cc.Active; CompilerVar var = first; do { cc.UnuseVarOnEndOfScope(this, var); var = var.NextActive; } while (var != first); } return ret; }