Skip to content

Commit 0027ce6

Browse files
committed
make sure default userdata_getter does not error everything horribly
update single
1 parent 0c20d06 commit 0027ce6

6 files changed

Lines changed: 143 additions & 6 deletions

File tree

examples/interop/Player.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef PLAYER_H
2+
#define PLAYER_H
3+
4+
class Player {
5+
private:
6+
int m_health;
7+
8+
public:
9+
Player()
10+
: m_health(0) {
11+
}
12+
void setHealth(int health) {
13+
m_health - health;
14+
}
15+
int getHealth() const {
16+
return m_health;
17+
}
18+
};
19+
20+
#endif // PLAYER_H

examples/interop/Player.pkg

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
$#include "Player.h"
2+
3+
class Player {
4+
Player();
5+
~Player();
6+
void setHealth(int _health);
7+
int getHealth();
8+
};

examples/interop/tolua.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#define SOL_CHECK_ARGUMENTS 1
2+
#define SOL_ENABLE_INTEROP 1 // MUST be defined to use interop features
3+
#include <sol.hpp>
4+
5+
#include "Player.h"
6+
// pick or replace the includes
7+
// with whatever generated file you've created
8+
#include <tolua++.h>
9+
#include "tolua_Player.h"
10+
11+
#include <iostream>
12+
#include <cassert>
13+
14+
// tolua code lifted from some blog, if the link dies
15+
// I don't know where else you're gonna find the reference,
16+
// http://usefulgamedev.weebly.com/tolua-example.html
17+
18+
namespace sol {
19+
namespace stack {
20+
template <typename T>
21+
struct userdata_checker<extensible<T>> {
22+
template <typename Handler>
23+
static bool check(
24+
lua_State* L, int relindex, type index_type, Handler&& handler, record& tracking) {
25+
// just marking unused parameters for no compiler warnings
26+
(void)index_type;
27+
(void)handler;
28+
int index = lua_absindex(L, relindex);
29+
std::string name = sol::detail::short_demangle<T>();
30+
tolua_Error tolua_err;
31+
return tolua_isusertype(L, index, name.c_str(), 0, &tolua_err);
32+
}
33+
};
34+
}
35+
} // namespace sol::stack
36+
37+
void register_sol_stuff(lua_State* L) {
38+
// grab raw state and put into state_view
39+
// state_view is cheap to construct
40+
sol::state_view lua(L);
41+
// bind and set up your things: everything is entirely self-contained
42+
lua["f"] = sol::overload(
43+
[](Player& from_tolua) {
44+
std::cout << "calling 1-argument version with tolua-created Player { health:" << from_tolua.getHealth() << "}" << std::endl;
45+
},
46+
[](Player& from_tolua, int second_arg) {
47+
std::cout << "calling 2-argument version with tolua-created Player { health: " << from_tolua.getHealth() << "} and integer argument of " << second_arg << std::endl;
48+
});
49+
}
50+
51+
void check_with_sol(lua_State* L) {
52+
sol::state_view lua(L);
53+
Player& obj = lua["obj"];
54+
(void)obj;
55+
assert(obj.getHealth() == 4);
56+
}
57+
58+
int main(int, char* []) {
59+
60+
std::cout << "=== interop example (tolua) ===" << std::endl;
61+
std::cout << "(code lifted from a sol2 user's use case: https://github.com/ThePhD/sol2/issues/511#issuecomment-331729884)" << std::endl;
62+
63+
lua_State* L = luaL_newstate();
64+
65+
luaL_openlibs(L); // initalize all lua standard library functions
66+
tolua_open(L); // initalize tolua
67+
tolua_Player_open(L); // make Player class accessible from LUA
68+
69+
70+
register_sol_stuff(L);
71+
72+
const auto code = R"(
73+
obj = Player:new()
74+
obj:setHealth(4)
75+
76+
f(obj) -- call 1 argument version
77+
f(obj, 5) -- call 2 argument version
78+
)";
79+
80+
if (luaL_dostring(L, code)) {
81+
lua_error(L); // crash on error
82+
}
83+
84+
check_with_sol(L);
85+
86+
return 0;
87+
}

single/sol/sol.hpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
// This file was generated with a script.
23-
// Generated 2017-09-24 00:26:27.067649 UTC
24-
// This header was generated with sol v2.18.3 (revision 6d879f5)
23+
// Generated 2017-09-24 20:03:42.743518 UTC
24+
// This header was generated with sol v2.18.3 (revision 0c20d06)
2525
// https://github.com/ThePhD/sol2
2626

2727
#ifndef SOL_SINGLE_INCLUDE_HPP
@@ -6623,6 +6623,15 @@ namespace sol {
66236623
template <typename T>
66246624
using strip_t = typename strip<T>::type;
66256625

6626+
template <typename T>
6627+
struct strip_extensible { typedef T type; };
6628+
6629+
template <typename T>
6630+
struct strip_extensible<extensible<T>> { typedef T type; };
6631+
6632+
template <typename T>
6633+
using strip_extensible_t = typename strip_extensible<T>::type;
6634+
66266635
const bool default_check_arguments =
66276636
#ifdef SOL_CHECK_ARGUMENTS
66286637
true;
@@ -7640,8 +7649,10 @@ namespace sol {
76407649
namespace sol {
76417650
namespace stack {
76427651

7643-
template <typename T>
7644-
struct userdata_getter<T> {
7652+
template <typename U>
7653+
struct userdata_getter<U> {
7654+
typedef stack_detail::strip_extensible_t<U> T;
7655+
76457656
static std::pair<bool, T*> get(lua_State*, int, void*, record&) {
76467657
return { false, nullptr };
76477658
}

sol/stack_core.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ namespace sol {
179179
template <typename T>
180180
using strip_t = typename strip<T>::type;
181181

182+
template <typename T>
183+
struct strip_extensible { typedef T type; };
184+
185+
template <typename T>
186+
struct strip_extensible<extensible<T>> { typedef T type; };
187+
188+
template <typename T>
189+
using strip_extensible_t = typename strip_extensible<T>::type;
190+
182191
const bool default_check_arguments =
183192
#ifdef SOL_CHECK_ARGUMENTS
184193
true;

sol/stack_get.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@
4444
namespace sol {
4545
namespace stack {
4646

47-
template <typename T>
48-
struct userdata_getter<T> {
47+
template <typename U>
48+
struct userdata_getter<U> {
49+
typedef stack_detail::strip_extensible_t<U> T;
50+
4951
static std::pair<bool, T*> get(lua_State*, int, void*, record&) {
5052
return { false, nullptr };
5153
}

0 commit comments

Comments
 (0)