Lua/LuaClass: Don't remove instance from the Lua stack

The instance Lua entry now remains as the first index, shifting all the
parameters indexes by 1
This commit is contained in:
Lynix 2016-10-27 11:22:35 +02:00
parent c58ec94e2d
commit 5ffc5a8784
11 changed files with 171 additions and 155 deletions

View File

@ -124,7 +124,7 @@ namespace Ndk
Nz::String name; Nz::String name;
}; };
ComponentBinding* QueryComponentIndex(Nz::LuaInstance& lua, int argIndex = 1); ComponentBinding* QueryComponentIndex(Nz::LuaInstance& lua, int argIndex = 2);
std::vector<ComponentBinding> m_componentBinding; std::vector<ComponentBinding> m_componentBinding;
std::unordered_map<Nz::String, ComponentIndex> m_componentBindingByName; std::unordered_map<Nz::String, ComponentIndex> m_componentBindingByName;

View File

@ -41,7 +41,7 @@ namespace Ndk
music.BindMethod("Stop", &Nz::Music::Stop); music.BindMethod("Stop", &Nz::Music::Stop);
// Manual // Manual
music.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Music& music) -> int music.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Music& music, std::size_t /*argumentCount*/) -> int
{ {
Nz::StringStream stream("Music("); Nz::StringStream stream("Music(");
stream << music.GetFilePath() << ')'; stream << music.GetFilePath() << ')';
@ -65,7 +65,7 @@ namespace Ndk
sound.BindMethod("SetPlayingOffset", &Nz::Sound::SetPlayingOffset); sound.BindMethod("SetPlayingOffset", &Nz::Sound::SetPlayingOffset);
// Manual // Manual
sound.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Sound& sound) -> int sound.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Sound& sound, std::size_t /*argumentCount*/) -> int
{ {
Nz::StringStream stream("Sound("); Nz::StringStream stream("Sound(");
if (const Nz::SoundBuffer* buffer = sound.GetBuffer()) if (const Nz::SoundBuffer* buffer = sound.GetBuffer())
@ -101,9 +101,9 @@ namespace Ndk
soundBuffer.BindStaticMethod("IsFormatSupported", &Nz::SoundBuffer::IsFormatSupported); soundBuffer.BindStaticMethod("IsFormatSupported", &Nz::SoundBuffer::IsFormatSupported);
// Manual // Manual
soundBuffer.BindMethod("Create", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance) -> int soundBuffer.BindMethod("Create", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance, std::size_t /*argumentCount*/) -> int
{ {
int index = 1; int index = 2;
Nz::AudioFormat format = lua.Check<Nz::AudioFormat>(&index); Nz::AudioFormat format = lua.Check<Nz::AudioFormat>(&index);
unsigned int sampleCount = lua.Check<unsigned int>(&index); unsigned int sampleCount = lua.Check<unsigned int>(&index);
unsigned int sampleRate = lua.Check<unsigned int>(&index); unsigned int sampleRate = lua.Check<unsigned int>(&index);
@ -116,13 +116,13 @@ namespace Ndk
return 1; return 1;
}); });
soundBuffer.BindMethod("GetSamples", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance) -> int soundBuffer.BindMethod("GetSamples", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance, std::size_t /*argumentCount*/) -> int
{ {
lua.PushString(reinterpret_cast<const char*>(instance->GetSamples()), instance->GetSampleCount() * sizeof(Nz::Int16)); lua.PushString(reinterpret_cast<const char*>(instance->GetSamples()), instance->GetSampleCount() * sizeof(Nz::Int16));
return 1; return 1;
}); });
soundBuffer.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance) -> int soundBuffer.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::SoundBufferRef& instance, std::size_t /*argumentCount*/) -> int
{ {
Nz::StringStream stream("SoundBuffer("); Nz::StringStream stream("SoundBuffer(");
if (instance->IsValid()) if (instance->IsValid())

View File

@ -15,7 +15,7 @@ namespace Ndk
/*********************************** Nz::Clock **********************************/ /*********************************** Nz::Clock **********************************/
clock.SetConstructor([](Nz::LuaInstance& lua, Nz::Clock* clock, std::size_t /*argumentCount*/) clock.SetConstructor([](Nz::LuaInstance& lua, Nz::Clock* clock, std::size_t /*argumentCount*/)
{ {
int argIndex = 1; int argIndex = 2;
Nz::Int64 startingValue = lua.Check<Nz::Int64>(&argIndex, 0); Nz::Int64 startingValue = lua.Check<Nz::Int64>(&argIndex, 0);
bool paused = lua.Check<bool>(&argIndex, false); bool paused = lua.Check<bool>(&argIndex, false);
@ -32,7 +32,7 @@ namespace Ndk
clock.BindMethod("Unpause", &Nz::Clock::Unpause); clock.BindMethod("Unpause", &Nz::Clock::Unpause);
// Manual // Manual
clock.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Clock& clock) -> int { clock.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Clock& clock, std::size_t /*argumentCount*/) -> int {
Nz::StringStream stream("Clock(Elapsed: "); Nz::StringStream stream("Clock(Elapsed: ");
stream << clock.GetSeconds(); stream << clock.GetSeconds();
stream << "s, Paused: "; stream << "s, Paused: ";
@ -48,7 +48,7 @@ namespace Ndk
{ {
std::size_t argCount = std::min<std::size_t>(argumentCount, 1U); std::size_t argCount = std::min<std::size_t>(argumentCount, 1U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -85,7 +85,7 @@ namespace Ndk
directory.BindStaticMethod("SetCurrent", Nz::Directory::SetCurrent); directory.BindStaticMethod("SetCurrent", Nz::Directory::SetCurrent);
// Manual // Manual
directory.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Directory& directory) -> int { directory.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::Directory& directory, std::size_t /*argumentCount*/) -> int {
Nz::StringStream stream("Directory("); Nz::StringStream stream("Directory(");
stream << directory.GetPath(); stream << directory.GetPath();
stream << ')'; stream << ')';
@ -110,8 +110,8 @@ namespace Ndk
stream.BindMethod("IsWritable", &Nz::Stream::IsWritable); stream.BindMethod("IsWritable", &Nz::Stream::IsWritable);
stream.BindMethod("SetCursorPos", &Nz::Stream::SetCursorPos); stream.BindMethod("SetCursorPos", &Nz::Stream::SetCursorPos);
stream.BindMethod("Read", [] (Nz::LuaInstance& lua, Nz::Stream& stream) -> int { stream.BindMethod("Read", [] (Nz::LuaInstance& lua, Nz::Stream& stream, std::size_t /*argumentCount*/) -> int {
int argIndex = 1; int argIndex = 2;
std::size_t length = lua.Check<std::size_t>(&argIndex); std::size_t length = lua.Check<std::size_t>(&argIndex);
@ -122,8 +122,8 @@ namespace Ndk
return 1; return 1;
}); });
stream.BindMethod("Write", [] (Nz::LuaInstance& lua, Nz::Stream& stream) -> int { stream.BindMethod("Write", [] (Nz::LuaInstance& lua, Nz::Stream& stream, std::size_t /*argumentCount*/) -> int {
int argIndex = 1; int argIndex = 2;
std::size_t bufferSize = 0; std::size_t bufferSize = 0;
const char* buffer = lua.CheckString(argIndex, &bufferSize); const char* buffer = lua.CheckString(argIndex, &bufferSize);
@ -142,7 +142,7 @@ namespace Ndk
{ {
std::size_t argCount = std::min<std::size_t>(argumentCount, 1U); std::size_t argCount = std::min<std::size_t>(argumentCount, 1U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -201,11 +201,11 @@ namespace Ndk
file.BindStaticMethod("Rename", &Nz::File::Rename); file.BindStaticMethod("Rename", &Nz::File::Rename);
// Manual // Manual
file.BindMethod("Open", [] (Nz::LuaInstance& lua, Nz::File& file) -> int file.BindMethod("Open", [] (Nz::LuaInstance& lua, Nz::File& file, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 2U); std::size_t argCount = std::min<std::size_t>(argumentCount, 2U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -224,11 +224,11 @@ namespace Ndk
return 0; return 0;
}); });
file.BindMethod("SetCursorPos", [] (Nz::LuaInstance& lua, Nz::File& file) -> int file.BindMethod("SetCursorPos", [] (Nz::LuaInstance& lua, Nz::File& file, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 2U); std::size_t argCount = std::min<std::size_t>(argumentCount, 2U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 1: case 1:
@ -246,7 +246,7 @@ namespace Ndk
return 0; return 0;
}); });
file.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::File& file) -> int { file.BindMethod("__tostring", [] (Nz::LuaInstance& lua, Nz::File& file, std::size_t /*argumentCount*/) -> int {
Nz::StringStream stream("File("); Nz::StringStream stream("File(");
if (file.IsOpen()) if (file.IsOpen())
stream << "Path: " << file.GetPath(); stream << "Path: " << file.GetPath();

View File

@ -25,19 +25,19 @@ namespace Ndk
case 1: case 1:
{ {
if (lua.IsOfType(1, "MaterialPipeline")) int argIndex = 1;
if (lua.IsOfType(argIndex, "MaterialPipeline"))
{ {
Nz::PlacementNew(instance, Nz::Material::New(*static_cast<Nz::MaterialPipelineRef*>(lua.ToUserdata(1)))); Nz::PlacementNew(instance, Nz::Material::New(*static_cast<Nz::MaterialPipelineRef*>(lua.ToUserdata(argIndex))));
return true; return true;
} }
else if (lua.IsOfType(1, "Material")) else if (lua.IsOfType(argIndex, "Material"))
{ {
Nz::PlacementNew(instance, Nz::Material::New(**static_cast<Nz::MaterialRef*>(lua.ToUserdata(1)))); Nz::PlacementNew(instance, Nz::Material::New(**static_cast<Nz::MaterialRef*>(lua.ToUserdata(argIndex))));
return true; return true;
} }
else else
{ {
int argIndex = 1;
Nz::PlacementNew(instance, Nz::Material::New(lua.Check<Nz::String>(&argIndex))); Nz::PlacementNew(instance, Nz::Material::New(lua.Check<Nz::String>(&argIndex)));
return true; return true;
} }
@ -48,16 +48,16 @@ namespace Ndk
return false; return false;
}); });
material.BindMethod("Configure", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("Configure", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "MaterialPipeline")) int argIndex = 2;
if (lua.IsOfType(argIndex, "MaterialPipeline"))
{ {
instance->Configure(*static_cast<Nz::MaterialPipelineRef*>(lua.ToUserdata(1))); instance->Configure(*static_cast<Nz::MaterialPipelineRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->Configure(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->Configure(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
@ -146,106 +146,106 @@ namespace Ndk
material.BindStaticMethod("GetDefault", &Nz::Material::GetDefault); material.BindStaticMethod("GetDefault", &Nz::Material::GetDefault);
material.BindMethod("SetAlphaMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetAlphaMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetAlphaMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetAlphaMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetAlphaMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetAlphaMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetDiffuseMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetDiffuseMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetDiffuseMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetDiffuseMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetDiffuseMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetDiffuseMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetEmissiveMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetEmissiveMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetEmissiveMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetEmissiveMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetEmissiveMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetEmissiveMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetHeightMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetHeightMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetHeightMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetHeightMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetHeightMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetHeightMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetNormalMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetNormalMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetNormalMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetNormalMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetNormalMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetNormalMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetShader", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetShader", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "UberShader")) int argIndex = 2;
if (lua.IsOfType(argIndex, "UberShader"))
{ {
instance->SetShader(*static_cast<Nz::UberShaderRef*>(lua.ToUserdata(1))); instance->SetShader(*static_cast<Nz::UberShaderRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetShader(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetShader(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }
}); });
material.BindMethod("SetSpecularMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance) -> int material.BindMethod("SetSpecularMap", [] (Nz::LuaInstance& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int
{ {
if (lua.IsOfType(1, "Texture")) int argIndex = 2;
if (lua.IsOfType(argIndex, "Texture"))
{ {
instance->SetSpecularMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(1))); instance->SetSpecularMap(*static_cast<Nz::TextureRef*>(lua.ToUserdata(argIndex)));
return 0; return 0;
} }
else else
{ {
int argIndex = 1;
lua.Push(instance->SetSpecularMap(lua.Check<Nz::String>(&argIndex))); lua.Push(instance->SetSpecularMap(lua.Check<Nz::String>(&argIndex)));
return 1; return 1;
} }

View File

@ -42,7 +42,7 @@ namespace Ndk
eulerAngles.SetGetter([] (Nz::LuaInstance& lua, Nz::EulerAnglesd& instance) eulerAngles.SetGetter([] (Nz::LuaInstance& lua, Nz::EulerAnglesd& instance)
{ {
std::size_t length; std::size_t length;
const char* ypr = lua.CheckString(1, &length); const char* ypr = lua.CheckString(2, &length);
switch (length) switch (length)
{ {
@ -99,8 +99,8 @@ namespace Ndk
eulerAngles.SetSetter([] (Nz::LuaInstance& lua, Nz::EulerAnglesd& instance) eulerAngles.SetSetter([] (Nz::LuaInstance& lua, Nz::EulerAnglesd& instance)
{ {
std::size_t length; std::size_t length;
const char* ypr = lua.CheckString(1, &length); const char* ypr = lua.CheckString(2, &length);
double value = lua.CheckNumber(2); double value = lua.CheckNumber(3);
switch (length) switch (length)
{ {
@ -191,9 +191,9 @@ namespace Ndk
matrix4d.SetGetter([] (Nz::LuaInstance& lua, Nz::Matrix4d& instance) matrix4d.SetGetter([] (Nz::LuaInstance& lua, Nz::Matrix4d& instance)
{ {
int argIndex = 1; bool succeeded = false;
std::size_t index = lua.Check<std::size_t>(&argIndex); std::size_t index = static_cast<std::size_t>(lua.ToInteger(2, &succeeded));
if (index < 1 || index > 16) if (!succeeded || index < 1 || index > 16)
return false; return false;
lua.Push(instance[index - 1]); lua.Push(instance[index - 1]);
@ -202,12 +202,12 @@ namespace Ndk
matrix4d.SetSetter([] (Nz::LuaInstance& lua, Nz::Matrix4d& instance) matrix4d.SetSetter([] (Nz::LuaInstance& lua, Nz::Matrix4d& instance)
{ {
int argIndex = 1; bool succeeded = false;
std::size_t index = lua.Check<std::size_t>(&argIndex); std::size_t index = static_cast<std::size_t>(lua.ToInteger(2, &succeeded));
if (index < 1 || index > 16) if (!succeeded || index < 1 || index > 16)
return false; return false;
instance[index - 1] = lua.CheckNumber(argIndex); instance[index - 1] = lua.CheckNumber(3);
return true; return true;
}); });
@ -265,11 +265,11 @@ namespace Ndk
rect.SetGetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance) rect.SetGetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
auto index = lua.CheckBoundInteger<std::size_t>(1); auto index = lua.CheckBoundInteger<std::size_t>(2);
if (index < 1 || index > 4) if (index < 1 || index > 4)
return false; return false;
@ -280,7 +280,7 @@ namespace Ndk
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xywh = lua.CheckString(1, &length); const char* xywh = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
@ -318,11 +318,11 @@ namespace Ndk
rect.SetSetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance) rect.SetSetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
auto index = lua.CheckBoundInteger<std::size_t>(1); auto index = lua.CheckBoundInteger<std::size_t>(2);
if (index < 1 || index > 4) if (index < 1 || index > 4)
return false; return false;
@ -333,12 +333,12 @@ namespace Ndk
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xywh = lua.CheckString(1, &length); const char* xywh = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
double value = lua.CheckNumber(2); double value = lua.CheckNumber(3);
switch (xywh[0]) switch (xywh[0])
{ {
@ -412,7 +412,7 @@ namespace Ndk
quaternion.SetGetter([] (Nz::LuaInstance& lua, Nz::Quaterniond& instance) quaternion.SetGetter([] (Nz::LuaInstance& lua, Nz::Quaterniond& instance)
{ {
std::size_t length; std::size_t length;
const char* wxyz = lua.CheckString(1, &length); const char* wxyz = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
return false; return false;
@ -442,12 +442,12 @@ namespace Ndk
quaternion.SetSetter([] (Nz::LuaInstance& lua, Nz::Quaterniond& instance) quaternion.SetSetter([] (Nz::LuaInstance& lua, Nz::Quaterniond& instance)
{ {
std::size_t length; std::size_t length;
const char* wxyz = lua.CheckString(1, &length); const char* wxyz = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
return false; return false;
double value = lua.CheckNumber(2); double value = lua.CheckNumber(3);
switch (wxyz[0]) switch (wxyz[0])
{ {
@ -507,11 +507,11 @@ namespace Ndk
vector2d.SetGetter([](Nz::LuaInstance& lua, Nz::Vector2d& instance) vector2d.SetGetter([](Nz::LuaInstance& lua, Nz::Vector2d& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
long long index = lua.CheckInteger(1); long long index = lua.CheckInteger(2);
if (index < 1 || index > 2) if (index < 1 || index > 2)
return false; return false;
@ -522,7 +522,7 @@ namespace Ndk
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xy = lua.CheckString(1, &length); const char* xy = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
@ -552,27 +552,27 @@ namespace Ndk
vector2d.SetSetter([](Nz::LuaInstance& lua, Nz::Vector2d& instance) vector2d.SetSetter([](Nz::LuaInstance& lua, Nz::Vector2d& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
long long index = lua.CheckInteger(1); long long index = lua.CheckInteger(2);
if (index < 1 || index > 2) if (index < 1 || index > 2)
return false; return false;
instance[index - 1] = lua.CheckNumber(2); instance[index - 1] = lua.CheckNumber(3);
return true; return true;
} }
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xy = lua.CheckString(1, &length); const char* xy = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
double value = lua.CheckNumber(2); double value = lua.CheckNumber(3);
switch (xy[0]) switch (xy[0])
{ {
@ -644,11 +644,11 @@ namespace Ndk
vector3d.SetGetter([] (Nz::LuaInstance& lua, Nz::Vector3d& instance) vector3d.SetGetter([] (Nz::LuaInstance& lua, Nz::Vector3d& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
long long index = lua.CheckInteger(1); long long index = lua.CheckInteger(2);
if (index < 1 || index > 3) if (index < 1 || index > 3)
return false; return false;
@ -659,7 +659,7 @@ namespace Ndk
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xyz = lua.CheckString(1, &length); const char* xyz = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
@ -693,27 +693,27 @@ namespace Ndk
vector3d.SetSetter([] (Nz::LuaInstance& lua, Nz::Vector3d& instance) vector3d.SetSetter([] (Nz::LuaInstance& lua, Nz::Vector3d& instance)
{ {
switch (lua.GetType(1)) switch (lua.GetType(2))
{ {
case Nz::LuaType_Number: case Nz::LuaType_Number:
{ {
long long index = lua.CheckInteger(1); long long index = lua.CheckInteger(2);
if (index < 1 || index > 3) if (index < 1 || index > 3)
return false; return false;
instance[index - 1] = lua.CheckNumber(2); instance[index - 1] = lua.CheckNumber(3);
return true; return true;
} }
case Nz::LuaType_String: case Nz::LuaType_String:
{ {
std::size_t length; std::size_t length;
const char* xyz = lua.CheckString(1, &length); const char* xyz = lua.CheckString(2, &length);
if (length != 1) if (length != 1)
break; break;
double value = lua.CheckNumber(2); double value = lua.CheckNumber(3);
switch (xyz[0]) switch (xyz[0])
{ {

View File

@ -25,7 +25,7 @@ namespace Ndk
{ {
std::size_t argCount = std::min<std::size_t>(argumentCount, 9U); std::size_t argCount = std::min<std::size_t>(argumentCount, 9U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -83,7 +83,7 @@ namespace Ndk
Nz::String service; Nz::String service;
Nz::ResolveError error = Nz::ResolveError_Unknown; Nz::ResolveError error = Nz::ResolveError_Unknown;
int argIndex = 1; int argIndex = 2;
Nz::String hostName = Nz::IpAddress::ResolveAddress(instance.Check<Nz::IpAddress>(&argIndex), &service, &error); Nz::String hostName = Nz::IpAddress::ResolveAddress(instance.Check<Nz::IpAddress>(&argIndex), &service, &error);
if (error == Nz::ResolveError_NoError) if (error == Nz::ResolveError_NoError)
@ -104,7 +104,7 @@ namespace Ndk
{ {
Nz::ResolveError error = Nz::ResolveError_Unknown; Nz::ResolveError error = Nz::ResolveError_Unknown;
int argIndex = 1; int argIndex = 2;
Nz::NetProtocol protocol = instance.Check<Nz::NetProtocol>(&argIndex); Nz::NetProtocol protocol = instance.Check<Nz::NetProtocol>(&argIndex);
Nz::String hostname = instance.Check<Nz::String>(&argIndex); Nz::String hostname = instance.Check<Nz::String>(&argIndex);
Nz::String service = instance.Check<Nz::String>(&argIndex, "http"); Nz::String service = instance.Check<Nz::String>(&argIndex, "http");

View File

@ -25,7 +25,7 @@ namespace Ndk
application.BindMethod("IsFPSCounterEnabled", &Application::IsFPSCounterEnabled); application.BindMethod("IsFPSCounterEnabled", &Application::IsFPSCounterEnabled);
#endif #endif
application.BindMethod("AddWorld", [] (Nz::LuaInstance& instance, Application* application) -> int application.BindMethod("AddWorld", [] (Nz::LuaInstance& instance, Application* application, std::size_t /*argumentCount*/) -> int
{ {
instance.Push(application->AddWorld().CreateHandle()); instance.Push(application->AddWorld().CreateHandle());
return 1; return 1;
@ -73,21 +73,21 @@ namespace Ndk
entity.BindMethod("RemoveAllComponents", &Entity::RemoveAllComponents); entity.BindMethod("RemoveAllComponents", &Entity::RemoveAllComponents);
entity.BindMethod("__tostring", &EntityHandle::ToString); entity.BindMethod("__tostring", &EntityHandle::ToString);
entity.BindMethod("AddComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle) -> int entity.BindMethod("AddComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle, std::size_t /*argumentCount*/) -> int
{ {
ComponentBinding* binding = QueryComponentIndex(instance); ComponentBinding* binding = QueryComponentIndex(instance);
return binding->adder(instance, handle); return binding->adder(instance, handle);
}); });
entity.BindMethod("GetComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle) -> int entity.BindMethod("GetComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle, std::size_t /*argumentCount*/) -> int
{ {
ComponentBinding* binding = QueryComponentIndex(instance); ComponentBinding* binding = QueryComponentIndex(instance);
return binding->getter(instance, handle->GetComponent(binding->index)); return binding->getter(instance, handle->GetComponent(binding->index));
}); });
entity.BindMethod("RemoveComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle) -> int entity.BindMethod("RemoveComponent", [this] (Nz::LuaInstance& instance, EntityHandle& handle, std::size_t /*argumentCount*/) -> int
{ {
ComponentBinding* binding = QueryComponentIndex(instance); ComponentBinding* binding = QueryComponentIndex(instance);
@ -105,7 +105,7 @@ namespace Ndk
velocityComponent.SetGetter([] (Nz::LuaInstance& lua, VelocityComponentHandle& instance) velocityComponent.SetGetter([] (Nz::LuaInstance& lua, VelocityComponentHandle& instance)
{ {
std::size_t length; std::size_t length;
const char* member = lua.CheckString(1, &length); const char* member = lua.CheckString(2, &length);
if (std::strcmp(member, "Linear") == 0) if (std::strcmp(member, "Linear") == 0)
{ {
@ -119,9 +119,9 @@ namespace Ndk
velocityComponent.SetSetter([] (Nz::LuaInstance& lua, VelocityComponentHandle& instance) velocityComponent.SetSetter([] (Nz::LuaInstance& lua, VelocityComponentHandle& instance)
{ {
std::size_t length; std::size_t length;
const char* member = lua.CheckString(1, &length); const char* member = lua.CheckString(2, &length);
int argIndex = 2; int argIndex = 3;
if (std::strcmp(member, "Linear") == 0) if (std::strcmp(member, "Linear") == 0)
{ {
instance->linearVelocity = lua.Check<Nz::Vector3f>(&argIndex); instance->linearVelocity = lua.Check<Nz::Vector3f>(&argIndex);
@ -139,38 +139,38 @@ namespace Ndk
#ifndef NDK_SERVER #ifndef NDK_SERVER
/*********************************** Ndk::GraphicsComponent **********************************/ /*********************************** Ndk::GraphicsComponent **********************************/
graphicsComponent.BindMethod("Attach", [] (Nz::LuaInstance& lua, Ndk::GraphicsComponent *gfxComponent) -> int graphicsComponent.BindMethod("Attach", [] (Nz::LuaInstance& lua, Ndk::GraphicsComponent *gfxComponent, std::size_t argumentCount) -> int
{ {
/* /*
void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0); void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0);
void Attach(Nz::InstancedRenderableRef renderable, const Nz::Matrix4f& localMatrix, int renderOrder = 0); void Attach(Nz::InstancedRenderableRef renderable, const Nz::Matrix4f& localMatrix, int renderOrder = 0);
*/ */
unsigned int argCount = std::min(lua.GetStackTop(), 3U); std::size_t argCount = std::min<std::size_t>(argumentCount, 3U);
switch (argCount) switch (argCount)
{ {
case 1: case 1:
{ {
int argIndex = 1; int argIndex = 2;
gfxComponent->Attach(lua.Check<Nz::InstancedRenderableRef>(&argIndex)); gfxComponent->Attach(lua.Check<Nz::InstancedRenderableRef>(&argIndex));
return 0; return 0;
} }
case 2: case 2:
{ {
int index = 1; int argIndex = 2;
Nz::InstancedRenderableRef renderable = lua.Check<Nz::InstancedRenderableRef>(&index); Nz::InstancedRenderableRef renderable = lua.Check<Nz::InstancedRenderableRef>(&argIndex);
if (lua.IsOfType(index, Nz::LuaType_Number)) if (lua.IsOfType(argIndex, Nz::LuaType_Number))
{ {
int renderOrder = lua.Check<int>(&index); int renderOrder = lua.Check<int>(&argIndex);
gfxComponent->Attach(renderable, renderOrder); gfxComponent->Attach(renderable, renderOrder);
} }
else if (lua.IsOfType(index, "Matrix4")) else if (lua.IsOfType(argIndex, "Matrix4"))
{ {
Nz::Matrix4f localMatrix = lua.Check<Nz::Matrix4f>(&index); Nz::Matrix4f localMatrix = lua.Check<Nz::Matrix4f>(&argIndex);
gfxComponent->Attach(renderable, localMatrix); gfxComponent->Attach(renderable, localMatrix);
} }
@ -182,10 +182,10 @@ namespace Ndk
case 3: case 3:
{ {
int index = 1; int argIndex = 2;
Nz::InstancedRenderableRef renderable = lua.Check<Nz::InstancedRenderableRef>(&index); Nz::InstancedRenderableRef renderable = lua.Check<Nz::InstancedRenderableRef>(&argIndex);
Nz::Matrix4f localMatrix = lua.Check<Nz::Matrix4f>(&index); Nz::Matrix4f localMatrix = lua.Check<Nz::Matrix4f>(&argIndex);
int renderOrder = lua.Check<int>(&index); int renderOrder = lua.Check<int>(&argIndex);
gfxComponent->Attach(renderable, localMatrix, renderOrder); gfxComponent->Attach(renderable, localMatrix, renderOrder);
return 0; return 0;

View File

@ -25,9 +25,9 @@ namespace Ndk
abstractImage.BindMethod("IsCompressed", &Nz::AbstractImage::IsCompressed); abstractImage.BindMethod("IsCompressed", &Nz::AbstractImage::IsCompressed);
abstractImage.BindMethod("IsCubemap", &Nz::AbstractImage::IsCubemap); abstractImage.BindMethod("IsCubemap", &Nz::AbstractImage::IsCubemap);
abstractImage.BindMethod("GetMemoryUsage", [] (Nz::LuaInstance& lua, Nz::AbstractImage* abstractImage) -> int abstractImage.BindMethod("GetMemoryUsage", [] (Nz::LuaInstance& lua, Nz::AbstractImage* abstractImage, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 1U); std::size_t argCount = std::min<std::size_t>(argumentCount, 1U);
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -35,8 +35,8 @@ namespace Ndk
case 1: case 1:
{ {
int index = 1; int argIndex = 2;
Nz::UInt8 level(lua.Check<Nz::UInt8>(&index)); Nz::UInt8 level(lua.Check<Nz::UInt8>(&argIndex));
return lua.Push(abstractImage->GetMemoryUsage(level)); return lua.Push(abstractImage->GetMemoryUsage(level));
} }
@ -46,10 +46,10 @@ namespace Ndk
return 0; return 0;
}); });
abstractImage.BindMethod("Update", [] (Nz::LuaInstance& lua, Nz::AbstractImage* abstractImage) -> int abstractImage.BindMethod("Update", [] (Nz::LuaInstance& lua, Nz::AbstractImage* abstractImage, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 6U); std::size_t argCount = std::min<std::size_t>(argumentCount, 6U);
int argIndex = 1; int argIndex = 2;
std::size_t bufferSize = 0; std::size_t bufferSize = 0;
const Nz::UInt8* pixels = reinterpret_cast<const Nz::UInt8*>(lua.CheckString(argIndex++, &bufferSize)); const Nz::UInt8* pixels = reinterpret_cast<const Nz::UInt8*>(lua.CheckString(argIndex++, &bufferSize));
@ -105,11 +105,11 @@ namespace Ndk
font.BindMethod("Destroy", &Nz::Font::Destroy); font.BindMethod("Destroy", &Nz::Font::Destroy);
font.BindMethod("GetCachedGlyphCount", [] (Nz::LuaInstance& lua, Nz::FontRef& instance) -> int font.BindMethod("GetCachedGlyphCount", [] (Nz::LuaInstance& lua, Nz::FontRef& instance, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 2U); std::size_t argCount = std::min<std::size_t>(argumentCount, 2U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 0: case 0:
@ -199,9 +199,9 @@ namespace Ndk
node.BindMethod("SetPosition", (void(Nz::Node::*)(const Nz::Vector3f&, Nz::CoordSys)) &Nz::Node::SetPosition, Nz::CoordSys_Local); node.BindMethod("SetPosition", (void(Nz::Node::*)(const Nz::Vector3f&, Nz::CoordSys)) &Nz::Node::SetPosition, Nz::CoordSys_Local);
node.BindMethod("SetRotation", (void(Nz::Node::*)(const Nz::Quaternionf&, Nz::CoordSys)) &Nz::Node::SetRotation, Nz::CoordSys_Local); node.BindMethod("SetRotation", (void(Nz::Node::*)(const Nz::Quaternionf&, Nz::CoordSys)) &Nz::Node::SetRotation, Nz::CoordSys_Local);
node.BindMethod("Move", [] (Nz::LuaInstance& lua, Nz::Node& node) -> int node.BindMethod("Move", [] (Nz::LuaInstance& lua, Nz::Node& node, std::size_t /*argumentCount*/) -> int
{ {
int argIndex = 1; int argIndex = 2;
Nz::Vector3f offset = lua.Check<Nz::Vector3f>(&argIndex); Nz::Vector3f offset = lua.Check<Nz::Vector3f>(&argIndex);
Nz::CoordSys coordSys = lua.Check<Nz::CoordSys>(&argIndex, Nz::CoordSys_Local); Nz::CoordSys coordSys = lua.Check<Nz::CoordSys>(&argIndex, Nz::CoordSys_Local);
@ -210,9 +210,9 @@ namespace Ndk
return 0; return 0;
}); });
node.BindMethod("Rotate", [] (Nz::LuaInstance& lua, Nz::Node& node) -> int node.BindMethod("Rotate", [] (Nz::LuaInstance& lua, Nz::Node& node, std::size_t /*argumentCount*/) -> int
{ {
int argIndex = 1; int argIndex = 2;
Nz::Quaternionf rotation = lua.Check<Nz::Quaternionf>(&argIndex); Nz::Quaternionf rotation = lua.Check<Nz::Quaternionf>(&argIndex);
Nz::CoordSys coordSys = lua.Check<Nz::CoordSys>(&argIndex, Nz::CoordSys_Local); Nz::CoordSys coordSys = lua.Check<Nz::CoordSys>(&argIndex, Nz::CoordSys_Local);
@ -221,11 +221,11 @@ namespace Ndk
return 0; return 0;
}); });
node.BindMethod("Scale", [] (Nz::LuaInstance& lua, Nz::Node& node) -> int node.BindMethod("Scale", [] (Nz::LuaInstance& lua, Nz::Node& node, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 4U); std::size_t argCount = std::min<std::size_t>(argumentCount, 4U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 1: case 1:
@ -247,11 +247,11 @@ namespace Ndk
return 0; return 0;
}); });
node.BindMethod("SetScale", [] (Nz::LuaInstance& lua, Nz::Node& node) -> int node.BindMethod("SetScale", [] (Nz::LuaInstance& lua, Nz::Node& node, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 4U); std::size_t argCount = std::min<std::size_t>(argumentCount, 4U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 1: case 1:
@ -284,11 +284,11 @@ namespace Ndk
return 0; return 0;
}); });
node.BindMethod("SetInitialScale", [] (Nz::LuaInstance& lua, Nz::Node& node) -> int node.BindMethod("SetInitialScale", [] (Nz::LuaInstance& lua, Nz::Node& node, std::size_t argumentCount) -> int
{ {
unsigned int argCount = std::min(lua.GetStackTop(), 4U); std::size_t argCount = std::min<std::size_t>(argumentCount, 4U);
int argIndex = 1; int argIndex = 2;
switch (argCount) switch (argCount)
{ {
case 1: case 1:

View File

@ -26,7 +26,7 @@ namespace Nz
friend class LuaClass; friend class LuaClass;
public: public:
using ClassFunc = std::function<int(LuaInstance& lua, T& instance)>; using ClassFunc = std::function<int(LuaInstance& lua, T& instance, std::size_t argumentCount)>;
using ClassIndexFunc = std::function<bool(LuaInstance& lua, T& instance)>; using ClassIndexFunc = std::function<bool(LuaInstance& lua, T& instance)>;
using ConstructorFunc = std::function<bool(LuaInstance& lua, T* instance, std::size_t argumentCount)>; using ConstructorFunc = std::function<bool(LuaInstance& lua, T* instance, std::size_t argumentCount)>;
template<typename P> using ConvertToParent = std::function<P*(T*)>; template<typename P> using ConvertToParent = std::function<P*(T*)>;

View File

@ -85,7 +85,7 @@ namespace Nz
// Let's create the metatable which will be associated with every instance. // Let's create the metatable which will be associated with every instance.
SetupMetatable(lua); SetupMetatable(lua);
if (m_info->constructor || m_info->staticGetter || m_info->staticSetter || !m_info->staticMethods.empty()) if (m_info->constructor || m_info->staticGetter || m_info->staticSetter || !m_staticMethods.empty())
SetupGlobalTable(lua); SetupGlobalTable(lua);
lua.Pop(); // Pop our ClassInfo, which is now referenced by all our functions lua.Pop(); // Pop our ClassInfo, which is now referenced by all our functions
@ -127,7 +127,7 @@ namespace Nz
{ {
typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...); typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...);
BindMethod(name, [func, handler] (LuaInstance& lua, T& object) -> int BindMethod(name, [func, handler] (LuaInstance& lua, T& object, std::size_t /*argumentCount*/) -> int
{ {
handler.ProcessArgs(lua); handler.ProcessArgs(lua);
@ -141,7 +141,7 @@ namespace Nz
{ {
typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...); typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...);
BindMethod(name, [func, handler] (LuaInstance& lua, T& object) -> int BindMethod(name, [func, handler] (LuaInstance& lua, T& object, std::size_t /*argumentCount*/) -> int
{ {
handler.ProcessArgs(lua); handler.ProcessArgs(lua);
@ -155,7 +155,7 @@ namespace Nz
{ {
typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...); typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...);
BindMethod(name, [func, handler] (LuaInstance& lua, T& object) -> int BindMethod(name, [func, handler] (LuaInstance& lua, T& object, std::size_t /*argumentCount*/) -> int
{ {
handler.ProcessArgs(lua); handler.ProcessArgs(lua);
@ -169,7 +169,7 @@ namespace Nz
{ {
typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...); typename LuaImplMethodProxy<Args...>::template Impl<DefArgs...> handler(std::forward<DefArgs>(defArgs)...);
BindMethod(name, [func, handler] (LuaInstance& lua, T& object) -> int BindMethod(name, [func, handler] (LuaInstance& lua, T& object, std::size_t /*argumentCount*/) -> int
{ {
handler.ProcessArgs(lua); handler.ProcessArgs(lua);
@ -449,7 +449,7 @@ namespace Nz
{ {
// Query from the metatable // Query from the metatable
lua.GetMetatable(info->name); //< Metatable lua.GetMetatable(info->name); //< Metatable
lua.PushValue(1); //< Field lua.PushValue(2); //< Field
lua.GetTable(); // Metatable[Field] lua.GetTable(); // Metatable[Field]
lua.Remove(-2); // Remove Metatable lua.Remove(-2); // Remove Metatable
@ -476,7 +476,6 @@ namespace Nz
std::shared_ptr<ClassInfo>& info = *static_cast<std::shared_ptr<ClassInfo>*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); std::shared_ptr<ClassInfo>& info = *static_cast<std::shared_ptr<ClassInfo>*>(lua.ToUserdata(lua.GetIndexOfUpValue(1)));
T* instance = static_cast<T*>(lua.CheckUserdata(1, info->name)); T* instance = static_cast<T*>(lua.CheckUserdata(1, info->name));
lua.Remove(1); //< Remove the instance from the Lua stack
Get(info, lua, instance); Get(info, lua, instance);
return 1; return 1;
@ -501,8 +500,6 @@ namespace Nz
instance = it->second(lua); instance = it->second(lua);
} }
lua.Pop(2); lua.Pop(2);
lua.Remove(1); //< Remove the instance from the Lua stack
} }
if (!instance) if (!instance)
@ -511,9 +508,11 @@ namespace Nz
return 0; return 0;
} }
std::size_t argCount = lua.GetStackTop() - 1U;
unsigned int index = static_cast<unsigned int>(lua.ToInteger(lua.GetIndexOfUpValue(2))); unsigned int index = static_cast<unsigned int>(lua.ToInteger(lua.GetIndexOfUpValue(2)));
const ClassFunc& method = info->methods[index]; const ClassFunc& method = info->methods[index];
return method(lua, *instance); return method(lua, *instance, argCount);
} }
template<class T> template<class T>
@ -525,7 +524,6 @@ namespace Nz
const ClassIndexFunc& setter = info->setter; const ClassIndexFunc& setter = info->setter;
T& instance = *static_cast<T*>(lua.CheckUserdata(1, info->name)); T& instance = *static_cast<T*>(lua.CheckUserdata(1, info->name));
lua.Remove(1); //< Remove the instance from the Lua stack
if (!setter(lua, instance)) if (!setter(lua, instance))
{ {

View File

@ -209,6 +209,24 @@ namespace Nz
return LuaImplReplyVal(instance, val, TypeTag<T>()); return LuaImplReplyVal(instance, val, TypeTag<T>());
} }
template<typename T>
std::enable_if_t<!std::is_arithmetic<T>::value && !std::is_enum<T>::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag<T&>)
{
return LuaImplReplyVal(instance, std::move(val), TypeTag<T>());
}
template<typename T>
std::enable_if_t<!std::is_arithmetic<T>::value && !std::is_enum<T>::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag<const T&>)
{
return LuaImplReplyVal(instance, std::move(val), TypeTag<T>());
}
template<typename T>
int LuaImplReplyVal(const LuaInstance& instance, T&& val, TypeTag<T&&>)
{
return LuaImplReplyVal(instance, std::forward<T>(val), TypeTag<T>());
}
inline int LuaImplReplyVal(const LuaInstance& instance, std::string&& val, TypeTag<std::string>) inline int LuaImplReplyVal(const LuaInstance& instance, std::string&& val, TypeTag<std::string>)
{ {
instance.PushString(val.c_str(), val.size()); instance.PushString(val.c_str(), val.size());
@ -375,7 +393,7 @@ namespace Nz
void ProcessArgs(const LuaInstance& instance) const void ProcessArgs(const LuaInstance& instance) const
{ {
m_index = 1; m_index = 2; //< 1 being the instance
ProcessArgs<0, Args...>(instance); ProcessArgs<0, Args...>(instance);
} }