(arguments callArguments, i *interpreter)
| 193 | } |
| 194 | |
| 195 | func (closure *closure) evalCall(arguments callArguments, i *interpreter) (value, error) { |
| 196 | argThunks := make(bindingFrame, len(arguments.named)+len(arguments.positional)) |
| 197 | parameters := closure.parameters() |
| 198 | for i, arg := range arguments.positional { |
| 199 | argThunks[parameters[i].name] = arg |
| 200 | } |
| 201 | |
| 202 | for _, arg := range arguments.named { |
| 203 | argThunks[arg.name] = arg.pv |
| 204 | } |
| 205 | |
| 206 | var calledEnvironment environment |
| 207 | |
| 208 | for _, param := range parameters { |
| 209 | if _, exists := argThunks[param.name]; !exists { |
| 210 | argThunks[param.name] = &cachedThunk{ |
| 211 | // Default arguments are evaluated in the same environment as function body |
| 212 | env: &calledEnvironment, |
| 213 | body: param.defaultArg, |
| 214 | } |
| 215 | } |
| 216 | } |
| 217 | |
| 218 | if arguments.tailstrict { |
| 219 | err := forceThunks(i, &argThunks) |
| 220 | if err != nil { |
| 221 | return nil, err |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | calledEnvironment = makeEnvironment( |
| 226 | addBindings(closure.env.upValues, argThunks), |
| 227 | closure.env.selfBinding, |
| 228 | ) |
| 229 | return i.EvalInCleanEnv(&calledEnvironment, closure.function.Body, arguments.tailstrict) |
| 230 | } |
| 231 | |
| 232 | func (closure *closure) parameters() []namedParameter { |
| 233 | return closure.params |
nothing calls this directly
no test coverage detected