Skip to content

Commit 5a6d5dd

Browse files
committed
check error of calling member function by wrong syntax: obj.func()
1 parent 518afbf commit 5a6d5dd

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

include/peacalm/luaw.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4336,7 +4336,11 @@ struct luaw::registrar<Return (Class::*)(Args...)> {
43364336
static void register_member_function(luaw& l,
43374337
const char* fname,
43384338
MemberFunction&& mf) {
4339-
auto f = [=](ObjectType o, Args... args) -> Return {
4339+
auto f = [mf, &l](ObjectType o, Args... args) -> Return {
4340+
if (!o) {
4341+
luaL_error(l.L(), "Calling member function by null pointer of object");
4342+
return Return();
4343+
}
43404344
PEACALM_LUAW_ASSERT(o);
43414345
return mf(*o, std::move(args)...);
43424346
};

test/unit_test/register_member.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ struct Obj {
2727
int cv_geti() const volatile { return i; }
2828

2929
int plus() { return ++i; }
30+
int plusby(int d) {
31+
i += d;
32+
return i;
33+
}
34+
35+
void reset() { i = 0; }
3036

3137
int overloaded_f() { return i + 1000; }
3238
int overloaded_f() const { return i + 2000; }
@@ -346,6 +352,46 @@ TEST(register_member, member_functions) {
346352
EXPECT_EQ(l.gettop(), 0);
347353
}
348354

355+
TEST(register_member, member_functions_by_wrong_syntax_call) {
356+
luaw l;
357+
358+
l.register_member("i", &Obj::i);
359+
l.register_member("plus", &Obj::plus);
360+
l.register_member("plusby", &Obj::plusby);
361+
l.register_member("reset", &Obj::reset);
362+
363+
Obj o;
364+
l.set("o", &o);
365+
366+
int ret_code = l.dostring("o.plus()");
367+
EXPECT_NE(ret_code, LUA_OK);
368+
l.log_error_out();
369+
EXPECT_EQ(o.i, 1);
370+
371+
bool failed;
372+
int reti = l.eval_int("return o.plus()", -1, false, &failed);
373+
EXPECT_EQ(reti, -1);
374+
EXPECT_TRUE(failed);
375+
376+
ret_code = l.dostring("o:plus()");
377+
EXPECT_EQ(ret_code, LUA_OK);
378+
EXPECT_EQ(o.i, 2);
379+
380+
ret_code = l.dostring("o:reset()");
381+
EXPECT_EQ(ret_code, LUA_OK);
382+
EXPECT_EQ(o.i, 0);
383+
384+
ret_code = l.dostring("o.plusby(3)");
385+
EXPECT_NE(ret_code, LUA_OK);
386+
l.log_error_out();
387+
EXPECT_EQ(o.i, 0);
388+
389+
EXPECT_EQ(l.eval_int("return o.plusby(o, 5)"), 5);
390+
EXPECT_EQ(l.eval_int("return o:plusby(5)"), 10);
391+
392+
EXPECT_EQ(l.gettop(), 0);
393+
}
394+
349395
TEST(register_member, result_status_of_get) {
350396
luaw l;
351397
l.set("o", Obj{});

0 commit comments

Comments
 (0)