@@ -1650,13 +1650,13 @@ func compileLogicalOpExprAux(context *funcContext, reg int, expr ast.Expr, ec *e
16501650 isLastAnd := elselabel == lb .e && thenlabel != elselabel
16511651 isLastOr := thenlabel == lb .e && hasnextcond
16521652
1653- if ident , ok := expr .(* ast.IdentExpr ); ok && getIdentRefType (context , context , ident ) == ecLocal && ( isLastAnd || isLastOr ) {
1653+ if ident , ok := expr .(* ast.IdentExpr ); ok && ( isLastAnd || isLastOr ) && getIdentRefType (context , context , ident ) == ecLocal {
16541654 b := context .FindLocalVar (ident .Value )
1655- if sreg != b {
1656- code .AddABC (OP_TESTSET , sreg , b , 0 ^ flip , sline (expr ))
1657- } else {
1658- code .AddABC (OP_TEST , sreg , b , 0 ^ flip , sline (expr ))
1655+ op := OP_TESTSET
1656+ if sreg == b {
1657+ op = OP_TEST
16591658 }
1659+ code .AddABC (op , sreg , b , 0 ^ flip , sline (expr ))
16601660 } else if ! hasnextcond && thenlabel == elselabel {
16611661 reg += compileExpr (context , reg , expr , & expcontext {ec .ctype , intMax (a , sreg ), ec .varargopt })
16621662 last := context .Code .Last ()
@@ -1667,7 +1667,11 @@ func compileLogicalOpExprAux(context *funcContext, reg int, expr ast.Expr, ec *e
16671667 }
16681668 } else {
16691669 reg += compileExpr (context , reg , expr , ecnone (0 ))
1670- code .AddABC (OP_TEST , a , 0 , 0 ^ flip , sline (expr ))
1670+ if ! hasnextcond {
1671+ code .AddABC (OP_TEST , a , 0 , 0 ^ flip , sline (expr ))
1672+ } else {
1673+ code .AddABC (OP_TESTSET , sreg , a , 0 ^ flip , sline (expr ))
1674+ }
16711675 }
16721676 code .AddASbx (OP_JMP , 0 , jumplabel , sline (expr ))
16731677} // }}}
0 commit comments