@@ -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