@@ -395,34 +395,12 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) {
395395}
396396
397397func (c * compiler ) BinaryNode (node * ast.BinaryNode ) {
398- l := kind (node .Left )
399- r := kind (node .Right )
400- 401- leftIsSimple := isSimpleType (node .Left )
402- rightIsSimple := isSimpleType (node .Right )
403- leftAndRightAreSimple := leftIsSimple && rightIsSimple
404- 405398 switch node .Operator {
406399 case "==" :
407- c .compile (node .Left )
408- c .derefInNeeded (node .Left )
409- c .compile (node .Right )
410- c .derefInNeeded (node .Right )
411- 412- if l == r && l == reflect .Int && leftAndRightAreSimple {
413- c .emit (OpEqualInt )
414- } else if l == r && l == reflect .String && leftAndRightAreSimple {
415- c .emit (OpEqualString )
416- } else {
417- c .emit (OpEqual )
418- }
400+ c .equalBinaryNode (node )
419401
420402 case "!=" :
421- c .compile (node .Left )
422- c .derefInNeeded (node .Left )
423- c .compile (node .Right )
424- c .derefInNeeded (node .Right )
425- c .emit (OpEqual )
403+ c .equalBinaryNode (node )
426404 c .emit (OpNot )
427405
428406 case "or" , "||" :
@@ -580,6 +558,28 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) {
580558 }
581559}
582560
561+ func (c * compiler ) equalBinaryNode (node * ast.BinaryNode ) {
562+ l := kind (node .Left )
563+ r := kind (node .Right )
564+ 565+ leftIsSimple := isSimpleType (node .Left )
566+ rightIsSimple := isSimpleType (node .Right )
567+ leftAndRightAreSimple := leftIsSimple && rightIsSimple
568+ 569+ c .compile (node .Left )
570+ c .derefInNeeded (node .Left )
571+ c .compile (node .Right )
572+ c .derefInNeeded (node .Right )
573+ 574+ if l == r && l == reflect .Int && leftAndRightAreSimple {
575+ c .emit (OpEqualInt )
576+ } else if l == r && l == reflect .String && leftAndRightAreSimple {
577+ c .emit (OpEqualString )
578+ } else {
579+ c .emit (OpEqual )
580+ }
581+ }
582+ 583583func isSimpleType (node ast.Node ) bool {
584584 if node == nil {
585585 return false
0 commit comments