Skip to content

Commit e787578

Browse files
committed
fix sever bug: V8 backend confused ScriptClass* pointer with the real instance (Polymorphic) pointer.
causing crash when a binding class is not directly inherited from ScriptClass.
1 parent 916b37d commit e787578

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

backend/Lua/LuaEngine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ class LuaEngine : public ScriptEngine {
167167
static void* getNativeThis(lua_State* lua, const internal::ClassDefineState* classDefine,
168168
int selfIndex);
169169

170-
using PushInstanceFunctionCallback = Local<Value> (*)(lua_State*, void*, void*, const Arguments&);
170+
using PushInstanceFunctionCallback = Local<Value> (*)(lua_State*, void* data, void* thiz,
171+
const Arguments&);
171172
/**
172173
* [0, +1, -]
173174
*/

backend/V8/V8Engine.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ void V8Engine::removeKeptReference(size_t id) {
323323
// Native
324324

325325
constexpr int kInstanceObjectAlignedPointer_ScriptClass = 0; // ScriptClass* pointer
326-
constexpr int kInstanceObjectAlignedPointer_PolymorphicPointer = 0; // the actual type pointer
326+
constexpr int kInstanceObjectAlignedPointer_PolymorphicPointer = 1; // the actual type pointer
327327

328328
void V8Engine::performRegisterNativeClass(
329329
internal::TypeIndex typeIndex, const internal::ClassDefineState* classDefine,
@@ -442,7 +442,7 @@ v8::Local<v8::FunctionTemplate> V8Engine::newConstructor(
442442
}
443443
},
444444
data);
445-
funcT->InstanceTemplate()->SetInternalFieldCount(1);
445+
funcT->InstanceTemplate()->SetInternalFieldCount(2);
446446
return funcT;
447447
}
448448

test/src/NativeTest.cc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,18 @@ class BaseClass {
716716
// actually BaseClassScriptWrapper* and ScriptClass* will be different memory address
717717
class BaseClassScriptWrapper : public BaseClass, public ScriptClass {
718718
public:
719-
explicit BaseClassScriptWrapper(const Local<Object>& thiz) : BaseClass(), ScriptClass(thiz) {}
719+
// used to check callback used the right pointer
720+
void* ctorCalledInstancePtr_ = nullptr;
721+
void* nameCalledInstancePtr_ = nullptr;
722+
723+
explicit BaseClassScriptWrapper(const Local<Object>& thiz) : BaseClass(), ScriptClass(thiz) {
724+
ctorCalledInstancePtr_ = this;
725+
}
726+
727+
std::string name() override {
728+
nameCalledInstancePtr_ = this;
729+
return "BaseWrapper";
730+
}
720731
};
721732

722733
const auto baseWrapperDefine =
@@ -737,6 +748,8 @@ TEST_F(NativeTest, BindBaseClass) {
737748
engine->registerNativeClass(baseWrapperDefine);
738749
auto base = engine->newNativeClass<BaseClassScriptWrapper>();
739750
auto ptr = engine->getNativeInstance<BaseClassScriptWrapper>(base);
751+
ASSERT_EQ(ptr, ptr->ctorCalledInstancePtr_);
752+
740753
engine->set("base", base);
741754

742755
engine->eval("base.age = 10");
@@ -750,6 +763,11 @@ TEST_F(NativeTest, BindBaseClass) {
750763
auto num = engine->eval(TS().js("base.num").lua("return base.num").select());
751764
ASSERT_TRUE(num.isNumber());
752765
EXPECT_EQ(ptr->getNum(), num.asNumber().toInt32());
766+
767+
EXPECT_EQ(ptr->nameCalledInstancePtr_, nullptr);
768+
engine->eval(TS().js("base.name()").lua("return base:name()").select()); // invoke getter func
769+
EXPECT_EQ(ptr->nameCalledInstancePtr_, ptr);
770+
753771
} catch (const Exception& e) {
754772
FAIL() << e;
755773
}

0 commit comments

Comments
 (0)