Skip to content

Commit 5762739

Browse files
committed
fix: 修复 Linux 上 IntType 注册问题;
1 parent 339e540 commit 5762739

4 files changed

Lines changed: 50 additions & 7 deletions

File tree

TestPlugin/testplugin.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,8 @@ void TestPlugin::onRegisterScriptObj(WingHex::IWingAngel *o) {
615615
WingHex::IWingAngel::asCallConvTypes::asCALL_GENERIC);
616616

617617
// register test object
618+
// must add asOBJ_APP_CLASS_ALLINTS on linux
619+
// this class is a wrapper for int
618620
struct TestObj {
619621
TestObj() : _v(0) {}
620622
TestObj(int v) : _v(v) {}
@@ -623,6 +625,14 @@ void TestPlugin::onRegisterScriptObj(WingHex::IWingAngel *o) {
623625
int _v;
624626
};
625627

628+
static_assert(std::is_trivially_copyable_v<TestObj>,
629+
"Must be trivially copyable to use asOBJ_APP_CLASS_ALLINTS");
630+
static_assert(
631+
std::is_trivially_destructible_v<TestObj>,
632+
"Must be trivially destructible to use asOBJ_APP_CLASS_ALLINTS");
633+
static_assert(std::is_standard_layout_v<TestObj>,
634+
"Must be standard layout to use asOBJ_APP_CLASS_ALLINTS");
635+
626636
auto r = o->registerObjectType(
627637
"TestObj", sizeof(TestObj),
628638
WingHex::IWingAngel::asOBJ_VALUE | WingHex::IWingAngel::asOBJ_POD |

src/class/wingcstruct.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,9 +373,25 @@ QList<WingHex::SettingPage *> WingCStruct::registeredSettingPages() const {
373373
void WingCStruct::onRegisterScriptObj(WingHex::IWingAngel *o) {
374374
using asCallConvTypes = WingHex::IWingAngel::asCallConvTypes;
375375

376-
o->registerObjectType("IntType", sizeof(CINT_TYPE),
377-
WingHex::IWingAngel::asOBJ_VALUE |
378-
WingHex::asGetTypeTraits<CINT_TYPE>());
376+
static_assert(std::is_trivially_copyable_v<CINT_TYPE>,
377+
"Must be trivially copyable to use asOBJ_APP_CLASS_ALLINTS");
378+
static_assert(
379+
std::is_trivially_destructible_v<CINT_TYPE>,
380+
"Must be trivially destructible to use asOBJ_APP_CLASS_ALLINTS");
381+
static_assert(std::is_standard_layout_v<CINT_TYPE>,
382+
"Must be standard layout to use asOBJ_APP_CLASS_ALLINTS");
383+
o->registerObjectType(
384+
"IntType", sizeof(CINT_TYPE),
385+
WingHex::IWingAngel::asOBJ_VALUE |
386+
WingHex::IWingAngel::asOBJ_APP_CLASS_ALLINTS |
387+
WingHex::IWingAngel::asOBJ_APP_CLASS_UNION |
388+
WingHex::IWingAngel::asOBJ_APP_CLASS_MORE_CONSTRUCTORS |
389+
WingHex::asGetTypeTraits<CINT_TYPE>());
390+
o->registerObjectBehaviour(
391+
"IntType", WingHex::IWingAngel::asBEHAVE_CONSTRUCT, "void f()",
392+
asWINGFUNCTIONPR([](void *memory) { new (memory) CINT_TYPE(); },
393+
(void *), void),
394+
asCallConvTypes::asCALL_CDECL_OBJFIRST);
379395
o->registerObjectBehaviour(
380396
"IntType", WingHex::IWingAngel::asBEHAVE_CONSTRUCT, "void f(int64 v)",
381397
asWINGFUNCTIONPR(

src/scriptaddon/scriptcolor.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,19 @@ void RegisterColor(asIScriptEngine *engine) {
337337
engine->SetDefaultNamespace("");
338338

339339
// color class
340-
r = engine->RegisterObjectType("color", sizeof(QColor),
341-
asOBJ_VALUE | asOBJ_APP_CLASS_ALLINTS |
342-
asOBJ_APP_CLASS_UNION |
343-
asGetTypeTraits<QColor>());
340+
static_assert(std::is_trivially_copyable_v<QColor>,
341+
"Must be trivially copyable to use asOBJ_APP_CLASS_ALLINTS");
342+
static_assert(
343+
std::is_trivially_destructible_v<QColor>,
344+
"Must be trivially destructible to use asOBJ_APP_CLASS_ALLINTS");
345+
static_assert(std::is_standard_layout_v<QColor>,
346+
"Must be standard layout to use asOBJ_APP_CLASS_ALLINTS");
347+
348+
r = engine->RegisterObjectType(
349+
"color", sizeof(QColor),
350+
asOBJ_VALUE | asOBJ_APP_CLASS_MORE_CONSTRUCTORS |
351+
asOBJ_APP_CLASS_ALLINTS | asOBJ_APP_CLASS_UNION |
352+
asGetTypeTraits<QColor>());
344353
ASSERT(r >= 0);
345354

346355
// Constructors

src/scriptaddon/scriptqstring.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,16 @@ void RegisterQString_Native(asIScriptEngine *engine) {
665665
int r = 0;
666666

667667
// register the char type
668+
static_assert(std::is_trivially_copyable_v<QChar>,
669+
"Must be trivially copyable to use asOBJ_APP_CLASS_ALLINTS");
670+
static_assert(
671+
std::is_trivially_destructible_v<QChar>,
672+
"Must be trivially destructible to use asOBJ_APP_CLASS_ALLINTS");
673+
static_assert(std::is_standard_layout_v<QChar>,
674+
"Must be standard layout to use asOBJ_APP_CLASS_ALLINTS");
668675
r = engine->RegisterObjectType("char", sizeof(QChar),
669676
asOBJ_VALUE | asOBJ_APP_CLASS_ALLINTS |
677+
asOBJ_APP_CLASS_MORE_CONSTRUCTORS |
670678
asGetTypeTraits<QChar>());
671679
ASSERT(r >= 0);
672680

0 commit comments

Comments
 (0)