(node *ast.BinaryNode)
| 445 | } |
| 446 | |
| 447 | func (c *compiler) BinaryNode(node *ast.BinaryNode) { |
| 448 | switch node.Operator { |
| 449 | case "==": |
| 450 | c.equalBinaryNode(node) |
| 451 | |
| 452 | case "!=": |
| 453 | c.equalBinaryNode(node) |
| 454 | c.emit(OpNot) |
| 455 | |
| 456 | case "or", "||": |
| 457 | if c.config != nil && !c.config.ShortCircuit { |
| 458 | c.compile(node.Left) |
| 459 | c.derefInNeeded(node.Left) |
| 460 | c.compile(node.Right) |
| 461 | c.derefInNeeded(node.Right) |
| 462 | c.emit(OpOr) |
| 463 | break |
| 464 | } |
| 465 | c.compile(node.Left) |
| 466 | c.derefInNeeded(node.Left) |
| 467 | end := c.emit(OpJumpIfTrue, placeholder) |
| 468 | c.emit(OpPop) |
| 469 | c.compile(node.Right) |
| 470 | c.derefInNeeded(node.Right) |
| 471 | c.patchJump(end) |
| 472 | |
| 473 | case "and", "&&": |
| 474 | if c.config != nil && !c.config.ShortCircuit { |
| 475 | c.compile(node.Left) |
| 476 | c.derefInNeeded(node.Left) |
| 477 | c.compile(node.Right) |
| 478 | c.derefInNeeded(node.Right) |
| 479 | c.emit(OpAnd) |
| 480 | break |
| 481 | } |
| 482 | c.compile(node.Left) |
| 483 | c.derefInNeeded(node.Left) |
| 484 | end := c.emit(OpJumpIfFalse, placeholder) |
| 485 | c.emit(OpPop) |
| 486 | c.compile(node.Right) |
| 487 | c.derefInNeeded(node.Right) |
| 488 | c.patchJump(end) |
| 489 | |
| 490 | case "<": |
| 491 | c.compile(node.Left) |
| 492 | c.derefInNeeded(node.Left) |
| 493 | c.compile(node.Right) |
| 494 | c.derefInNeeded(node.Right) |
| 495 | c.emit(OpLess) |
| 496 | |
| 497 | case ">": |
| 498 | c.compile(node.Left) |
| 499 | c.derefInNeeded(node.Left) |
| 500 | c.compile(node.Right) |
| 501 | c.derefInNeeded(node.Right) |
| 502 | c.emit(OpMore) |
| 503 | |
| 504 | case "<=": |
no test coverage detected