Skip to content

Commit

Permalink
Fix references to members
Browse files Browse the repository at this point in the history
  • Loading branch information
kunitoki committed Mar 6, 2023
1 parent 417f9b1 commit 30f7d74
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
7 changes: 6 additions & 1 deletion Source/LuaBridge/detail/Userdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,11 @@ struct RefStackHelper<T, false>
{
using ReturnType = TypeResult<std::reference_wrapper<T>>;

static Result push(lua_State* L, T& t)
{
return UserdataPtr::push(L, std::addressof(t));
}

static Result push(lua_State* L, const T& t)
{
return UserdataPtr::push(L, std::addressof(t));
Expand Down Expand Up @@ -984,7 +989,7 @@ struct StackOpSelector<T&, true>
using Helper = RefStackHelper<T, IsContainer<T>::value>;
using ReturnType = typename Helper::ReturnType;

static Result push(lua_State* L, T& value) { return UserdataPtr::push(L, &value); }
static Result push(lua_State* L, T& value) { return Helper::push(L, value); }

static ReturnType get(lua_State* L, int index) { return Helper::get(L, index); }

Expand Down
47 changes: 47 additions & 0 deletions Tests/Source/Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,53 @@ TEST_F(LuaBridgeTest, StdSharedPtrDerivedPolymorphic)
EXPECT_EQ("VirtualC", x3);
}

namespace {
class TestClassInner : public std::enable_shared_from_this<TestClassInner>
{
public:
inline int getValue() const { return 42; }
};

class TestClassOuter
{
public:
TestClassOuter()
: sharedPointerNested(std::make_shared<TestClassInner>())
{
}

inline std::shared_ptr<TestClassInner> getNested() const { return sharedPointerNested; }

TestClassInner valueNested;
std::shared_ptr<TestClassInner> sharedPointerNested;
};
} // namespace

TEST_F(LuaBridgeTest, StdSharedPtrAsProperty)
{
luabridge::getGlobalNamespace(L)
.beginNamespace("test")
.beginClass<TestClassInner>("TestClassInner")
.addFunction("getValue", &TestClassInner::getValue)
.endClass()
.beginClass<TestClassOuter>("TestClassOuter")
.addConstructor<void()>()
.addProperty("getNested", &TestClassOuter::getNested)
.addProperty("valueNested", &TestClassOuter::valueNested)
.addProperty("sharedPointerNested", &TestClassOuter::sharedPointerNested)
.endClass()
.endNamespace();

ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.getNested:getValue()"));
EXPECT_EQ(42, result<int>());

ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.valueNested:getValue()"));
EXPECT_EQ(42, result<int>());

ASSERT_TRUE(runLua("local x = test.TestClassOuter(); result = x.sharedPointerNested:getValue()"));
EXPECT_EQ(42, result<int>());
}

#if LUABRIDGE_HAS_EXCEPTIONS
namespace {
template <class... Args>
Expand Down

0 comments on commit 30f7d74

Please sign in to comment.