MCPcopy
hub / github.com/expr-lang/expr / BuiltinNode

Method BuiltinNode

compiler/compiler.go:840–1181  ·  view source on GitHub ↗
(node *ast.BuiltinNode)

Source from the content-addressed store, hash-verified

838}
839
840func (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 })

Callers 1

compileMethod · 0.95

Calls 15

compileMethod · 0.95
derefInNeededMethod · 0.95
emitMethod · 0.95
emitLoopMethod · 0.95
patchJumpMethod · 0.95
emitCondMethod · 0.95
emitPushMethod · 0.95
addConstantMethod · 0.95
emitLoopBackwardsMethod · 0.95
emitFunctionMethod · 0.95
IsUnknownMethod · 0.80
DerefMethod · 0.80

Tested by

no test coverage detected