@@ -147,31 +147,31 @@ func (c *compiler) addVariable(name string) int {
147147func (c * compiler ) emitFunction (fn * builtin.Function , argsLen int ) {
148148 switch argsLen {
149149 case 0 :
150- c .emit (OpCall0 , c .addFunction (fn ))
150+ c .emit (OpCall0 , c .addFunction (fn . Name , fn . Func ))
151151 case 1 :
152- c .emit (OpCall1 , c .addFunction (fn ))
152+ c .emit (OpCall1 , c .addFunction (fn . Name , fn . Func ))
153153 case 2 :
154- c .emit (OpCall2 , c .addFunction (fn ))
154+ c .emit (OpCall2 , c .addFunction (fn . Name , fn . Func ))
155155 case 3 :
156- c .emit (OpCall3 , c .addFunction (fn ))
156+ c .emit (OpCall3 , c .addFunction (fn . Name , fn . Func ))
157157 default :
158- c .emit (OpLoadFunc , c .addFunction (fn ))
158+ c .emit (OpLoadFunc , c .addFunction (fn . Name , fn . Func ))
159159 c .emit (OpCallN , argsLen )
160160 }
161161}
162162
163163// addFunction adds builtin.Function.Func to the program.functions and returns its index.
164- func (c * compiler ) addFunction (fn * builtin. Function ) int {
164+ func (c * compiler ) addFunction (name string , fn Function ) int {
165165 if fn == nil {
166166 panic ("function is nil" )
167167 }
168- if p , ok := c .functionsIndex [fn . Name ]; ok {
168+ if p , ok := c .functionsIndex [name ]; ok {
169169 return p
170170 }
171171 p := len (c .functions )
172- c .functions = append (c .functions , fn . Func )
173- c .functionsIndex [fn . Name ] = p
174- c .debugInfo [fmt .Sprintf ("func_%d" , p )] = fn . Name
172+ c .functions = append (c .functions , fn )
173+ c .functionsIndex [name ] = p
174+ c .debugInfo [fmt .Sprintf ("func_%d" , p )] = name
175175 return p
176176}
177177
@@ -904,6 +904,12 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) {
904904 for _ , arg := range node .Arguments {
905905 c .compile (arg )
906906 }
907+
908+ if f .ValidateArgs != nil {
909+ c .emit (OpLoadFunc , c .addFunction ("$_validate_args_" + f .Name , f .ValidateArgs ))
910+ c .emit (OpValidateArgs , len (node .Arguments ))
911+ }
912+
907913 if f .Fast != nil {
908914 c .emit (OpCallBuiltin1 , id )
909915 } else if f .Func != nil {
0 commit comments