(node *ast.BuiltinNode)
| 838 | } |
| 839 | |
| 840 | func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { |
| 841 | switch node.Name { |
| 842 | case "all": |
| 843 | c.compile(node.Arguments[0]) |
| 844 | c.derefInNeeded(node.Arguments[0]) |
| 845 | c.emit(OpBegin) |
| 846 | var loopBreak int |
| 847 | c.emitLoop(func() { |
| 848 | c.compile(node.Arguments[1]) |
| 849 | loopBreak = c.emit(OpJumpIfFalse, placeholder) |
| 850 | c.emit(OpPop) |
| 851 | }) |
| 852 | c.emit(OpTrue) |
| 853 | c.patchJump(loopBreak) |
| 854 | c.emit(OpEnd) |
| 855 | return |
| 856 | |
| 857 | case "none": |
| 858 | c.compile(node.Arguments[0]) |
| 859 | c.derefInNeeded(node.Arguments[0]) |
| 860 | c.emit(OpBegin) |
| 861 | var loopBreak int |
| 862 | c.emitLoop(func() { |
| 863 | c.compile(node.Arguments[1]) |
| 864 | c.emit(OpNot) |
| 865 | loopBreak = c.emit(OpJumpIfFalse, placeholder) |
| 866 | c.emit(OpPop) |
| 867 | }) |
| 868 | c.emit(OpTrue) |
| 869 | c.patchJump(loopBreak) |
| 870 | c.emit(OpEnd) |
| 871 | return |
| 872 | |
| 873 | case "any": |
| 874 | c.compile(node.Arguments[0]) |
| 875 | c.derefInNeeded(node.Arguments[0]) |
| 876 | c.emit(OpBegin) |
| 877 | var loopBreak int |
| 878 | c.emitLoop(func() { |
| 879 | c.compile(node.Arguments[1]) |
| 880 | loopBreak = c.emit(OpJumpIfTrue, placeholder) |
| 881 | c.emit(OpPop) |
| 882 | }) |
| 883 | c.emit(OpFalse) |
| 884 | c.patchJump(loopBreak) |
| 885 | c.emit(OpEnd) |
| 886 | return |
| 887 | |
| 888 | case "one": |
| 889 | c.compile(node.Arguments[0]) |
| 890 | c.derefInNeeded(node.Arguments[0]) |
| 891 | c.emit(OpBegin) |
| 892 | c.emitLoop(func() { |
| 893 | c.compile(node.Arguments[1]) |
| 894 | c.emitCond(func() { |
| 895 | c.emit(OpIncrementCount) |
| 896 | }) |
| 897 | }) |
no test coverage detected