| 375 | } |
| 376 | |
| 377 | static int Query(lua_State * L) |
| 378 | { |
| 379 | int numArgs = lua_gettop(L); |
| 380 | if (numArgs < 1) { |
| 381 | luaL_error(L, "Osiris query has no function data!"); |
| 382 | } |
| 383 | |
| 384 | auto signature = LuaOsiSignature::TypeCheck(L, 1); |
| 385 | if (signature->type != FunctionType::Query) { |
| 386 | luaL_error(L, "Expected a Query node"); |
| 387 | } |
| 388 | |
| 389 | if (numArgs - 1 != signature->numInputArgs) { |
| 390 | luaL_error(L, "Incorrect number of arguments for query '%s'; expected %d, got %d", |
| 391 | signature->name.c_str(), signature->numInputArgs, numArgs - 1); |
| 392 | } |
| 393 | |
| 394 | OsiArgumentListPin args(signature->numArgs); |
| 395 | uint32_t inputArg = 2; |
| 396 | for (uint32_t i = 0; i < signature->numArgs; i++) { |
| 397 | if (signature->args[i].output) { |
| 398 | args.Args()[i].Value.TypeId = signature->args[i].type; |
| 399 | } else { |
| 400 | LuaToOsiArg(L, inputArg++, args.Args()[i], signature->args[i]); |
| 401 | } |
| 402 | } |
| 403 | |
| 404 | bool handled = gOsirisProxy->GetWrappers().Query.CallWithHooks(signature->functionHandle, args.Args()); |
| 405 | uint32_t numOutputs = signature->numArgs - signature->numInputArgs; |
| 406 | if (handled) { |
| 407 | for (uint32_t i = 0; i < signature->numArgs; i++) { |
| 408 | if (signature->args[i].output) { |
| 409 | OsiToLuaArg(L, args.Args()[i]); |
| 410 | numOutputs++; |
| 411 | } |
| 412 | } |
| 413 | } else { |
| 414 | for (uint32_t i = 0; i < signature->numArgs - signature->numInputArgs; i++) { |
| 415 | lua_pushnil(L); |
| 416 | } |
| 417 | } |
| 418 | |
| 419 | return signature->numArgs - signature->numInputArgs; |
| 420 | } |
| 421 | |
| 422 | private: |
| 423 | OsiArgumentPool argumentPool_; |
nothing calls this directly
no test coverage detected