Skip to content

Commit 7772ea0

Browse files
authored
feat: extract code for compiling equal operator (#614)
1 parent d523107 commit 7772ea0

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

compiler/compiler.go

+24-24
Original file line numberDiff line numberDiff line change
@@ -395,34 +395,12 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) {
395395
}
396396

397397
func (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+
583583
func isSimpleType(node ast.Node) bool {
584584
if node == nil {
585585
return false

0 commit comments

Comments
 (0)