@@ -147,31 +147,31 @@ func (c *compiler) addVariable(name string) int {
147
147
func (c * compiler ) emitFunction (fn * builtin.Function , argsLen int ) {
148
148
switch argsLen {
149
149
case 0 :
150
- c .emit (OpCall0 , c .addFunction (fn ))
150
+ c .emit (OpCall0 , c .addFunction (fn . Name , fn . Func ))
151
151
case 1 :
152
- c .emit (OpCall1 , c .addFunction (fn ))
152
+ c .emit (OpCall1 , c .addFunction (fn . Name , fn . Func ))
153
153
case 2 :
154
- c .emit (OpCall2 , c .addFunction (fn ))
154
+ c .emit (OpCall2 , c .addFunction (fn . Name , fn . Func ))
155
155
case 3 :
156
- c .emit (OpCall3 , c .addFunction (fn ))
156
+ c .emit (OpCall3 , c .addFunction (fn . Name , fn . Func ))
157
157
default :
158
- c .emit (OpLoadFunc , c .addFunction (fn ))
158
+ c .emit (OpLoadFunc , c .addFunction (fn . Name , fn . Func ))
159
159
c .emit (OpCallN , argsLen )
160
160
}
161
161
}
162
162
163
163
// 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 {
165
165
if fn == nil {
166
166
panic ("function is nil" )
167
167
}
168
- if p , ok := c .functionsIndex [fn . Name ]; ok {
168
+ if p , ok := c .functionsIndex [name ]; ok {
169
169
return p
170
170
}
171
171
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
175
175
return p
176
176
}
177
177
@@ -904,6 +904,12 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) {
904
904
for _ , arg := range node .Arguments {
905
905
c .compile (arg )
906
906
}
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
+
907
913
if f .Fast != nil {
908
914
c .emit (OpCallBuiltin1 , id )
909
915
} else if f .Func != nil {
0 commit comments