Skip to content

Commit 50447cd

Browse files
committed
Merge branch 'develop' into feat/support-client
2 parents d1a4261 + 65e55f7 commit 50447cd

43 files changed

Lines changed: 648 additions & 591 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.16.7] - 2026-01-13
11+
12+
### Changed
13+
14+
- Used shared_ptr to manage script::ScriptEngine @ShrBox
15+
16+
## [0.16.6] - 2026-01-13
17+
18+
### Changed
19+
20+
- No need to copy raw pointer of nbt @ShrBox
21+
- Optimized ItemAPI
22+
- Added `std::monostate` to `DB::Any` for preventing some exceptions @ShrBox
23+
- Avoided unnecessary `new` and raw pointer @ShrBox
24+
25+
### Fixed
26+
27+
- Fixed potential memory leak in `_extractValue(RemoteCall::ItemType&& v)` of RemoteCallAPI @ShrBox
28+
1029
## [0.16.5] - 2026-01-12
1130

1231
### Changed
@@ -31,7 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3150

3251
- Fixed several potential memory leak issues(FileSystemAPI, InternationalAPI, SystemAPI, IniHelper) @ShrBox
3352

34-
## [0.16.2] - 2026-01-12
53+
## [0.16.2] - 2026-01-11
3554

3655
### Changed
3756

@@ -1087,7 +1106,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10871106
[#332]: https://github.com/LiteLDev/LegacyScriptEngine/issues/332
10881107
[#339]: https://github.com/LiteLDev/LegacyScriptEngine/issues/339
10891108

1090-
[Unreleased]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.5...HEAD
1109+
[Unreleased]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.7...HEAD
1110+
[0.16.7]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.6...v0.16.7
1111+
[0.16.6]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.5...v0.16.6
10911112
[0.16.5]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.4...v0.16.5
10921113
[0.16.4]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.3...v0.16.4
10931114
[0.16.3]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.2...v0.16.3

src/legacy/api/BlockEntityAPI.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ Local<Value> BlockEntityClass::getType() {
7171

7272
Local<Value> BlockEntityClass::getNbt(const Arguments&) {
7373
try {
74-
CompoundTag* tag = new CompoundTag();
74+
auto tag = std::make_unique<CompoundTag>();
7575
blockEntity->save(*tag, *SaveContextFactory::createCloneSaveContext());
7676
return NbtCompoundClass::pack(std::move(tag)); // Not sure is that will get right value
7777
}

src/legacy/api/CommandAPI.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ ClassDefine<CommandClass> CommandClassBuilder =
7474

7575
//////////////////// Helper ////////////////////
7676

77-
bool LLSERemoveCmdCallback(script::ScriptEngine* engine) {
78-
std::erase_if(localShareData->commandCallbacks, [&engine](auto& data) { return data.second.fromEngine == engine; });
77+
bool LLSERemoveCmdCallback(std::shared_ptr<script::ScriptEngine> engine) {
78+
std::erase_if(localShareData->commandCallbacks, [&engine](auto& data) {
79+
return data.second.fromEngine == engine.get();
80+
});
7981
return true;
8082
}
8183

@@ -93,13 +95,10 @@ Local<Value> convertResult(ParamStorageType const& result, CommandOrigin const&
9395
);
9496
} else if (result.hold(ParamKind::Kind::Item)) {
9597
return ItemClass::newItem(
96-
new ItemStack(
97-
ll::service::getLevel()->getItemRegistry().getNameFromLegacyID(
98-
std::get<CommandItem>(result.value()).mId
99-
)
100-
),
101-
false
102-
); // Not managed by BDS, pointer will be saved as unique_ptr
98+
std::make_unique<ItemStack>(ll::service::getLevel()->getItemRegistry().getNameFromLegacyID(
99+
std::get<CommandItem>(result.value()).mId
100+
))
101+
);
103102
} else if (result.hold(ParamKind::Kind::Actor)) {
104103
auto arr = Array::newArray();
105104
for (auto i : std::get<CommandSelector<Actor>>(result.value()).results(origin)) {

src/legacy/api/CommandAPI.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ extern ClassDefine<void> ParamTypeStaticBuilder;
66
extern ClassDefine<void> PermissionStaticBuilder;
77
extern ClassDefine<void> ParamOptionStaticBuilder;
88

9-
bool LLSERemoveCmdCallback(script::ScriptEngine* engine);
9+
bool LLSERemoveCmdCallback(std::shared_ptr<script::ScriptEngine> engine);
1010

1111
enum class OldCommandPermissionLevel : schar {
1212
Any = 0x0,

src/legacy/api/CommandCompatibleAPI.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ void LLSERegisterNewCmd(
4848
else toRegCmdQueue.push_back({cmd, describe, level});
4949
}
5050

51-
bool LLSERemoveCmdRegister(ScriptEngine* engine) {
51+
bool LLSERemoveCmdRegister(std::shared_ptr<ScriptEngine> engine) {
5252
std::erase_if(localShareData->playerCmdCallbacks, [&engine](auto& data) {
53-
return data.second.fromEngine == engine;
53+
return data.second.fromEngine == engine.get();
5454
});
5555
std::erase_if(localShareData->consoleCmdCallbacks, [&engine](auto& data) {
56-
return data.second.fromEngine == engine;
56+
return data.second.fromEngine == engine.get();
5757
});
5858
return true;
5959
}

src/legacy/api/CommandCompatibleAPI.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ std::vector<std::string> SplitCmdLine(const std::string& paras);
1414
std::string
1515
LLSEFindCmdReg(bool isPlayerCmd, const std::string& cmd, std::vector<std::string>& receiveParas, bool* fromOtherEngine);
1616
// 删除指定引擎的所有命令
17-
bool LLSERemoveCmdRegister(script::ScriptEngine* engine);
17+
bool LLSERemoveCmdRegister(std::shared_ptr<script::ScriptEngine> engine);
1818

1919
// 处理命令延迟注册
2020
void ProcessRegCmdQueue();

src/legacy/api/DatabaseAPI.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ KVDBClass::KVDBClass(const Local<Object>& scriptObj, const std::string& dir) : S
178178
kvdb.reset();
179179
}
180180

181-
unloadCallbackIndex = getEngineOwnData()->addUnloadCallback([&](ScriptEngine*) { kvdb.reset(); });
181+
unloadCallbackIndex = getEngineOwnData()->addUnloadCallback([&](std::shared_ptr<ScriptEngine>) { kvdb.reset(); });
182182
}
183183

184184
KVDBClass::KVDBClass(const std::string& dir) : ScriptClass(script::ScriptClass::ConstructFromCpp<KVDBClass>{}) {
@@ -187,7 +187,7 @@ KVDBClass::KVDBClass(const std::string& dir) : ScriptClass(script::ScriptClass::
187187
} catch (...) {
188188
kvdb.reset();
189189
}
190-
unloadCallbackIndex = getEngineOwnData()->addUnloadCallback([&](ScriptEngine*) { kvdb.reset(); });
190+
unloadCallbackIndex = getEngineOwnData()->addUnloadCallback([&](std::shared_ptr<ScriptEngine>) { kvdb.reset(); });
191191
}
192192

193193
KVDBClass::~KVDBClass() {}

src/legacy/api/EventAPI.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,35 +109,35 @@ LLSEAddEventListener(ScriptEngine* engine, const string& eventName, const Local<
109109
}
110110
}
111111

112-
bool LLSERemoveAllEventListeners(ScriptEngine* engine) {
112+
bool LLSERemoveAllEventListeners(std::shared_ptr<ScriptEngine> engine) {
113113
for (auto& listeners : listenerList) {
114-
listeners.remove_if([engine](auto& listener) { return listener.engine == engine; });
114+
listeners.remove_if([engine](auto& listener) { return listener.engine == engine.get(); });
115115
}
116116
return true;
117117
}
118118

119-
bool LLSECallEventsOnHotLoad(ScriptEngine* engine) {
120-
FakeCallEvent(engine, EVENT_TYPES::onServerStarted);
119+
bool LLSECallEventsOnHotLoad(std::shared_ptr<ScriptEngine> engine) {
120+
FakeCallEvent(engine.get(), EVENT_TYPES::onServerStarted);
121121

122122
ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool {
123-
FakeCallEvent(engine, EVENT_TYPES::onPreJoin, PlayerClass::newPlayer(&pl));
123+
FakeCallEvent(engine.get(), EVENT_TYPES::onPreJoin, PlayerClass::newPlayer(&pl));
124124
return true;
125125
});
126126
ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool {
127-
FakeCallEvent(engine, EVENT_TYPES::onJoin, PlayerClass::newPlayer(&pl));
127+
FakeCallEvent(engine.get(), EVENT_TYPES::onJoin, PlayerClass::newPlayer(&pl));
128128
return true;
129129
});
130130

131131
return true;
132132
}
133133

134-
bool LLSECallEventsOnUnload(ScriptEngine* engine) {
134+
bool LLSECallEventsOnUnload(std::shared_ptr<ScriptEngine> engine) {
135135
// Players may be online when the server is stopping
136136
ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool {
137-
FakeCallEvent(engine, EVENT_TYPES::onLeft, PlayerClass::newPlayer(&pl));
137+
FakeCallEvent(engine.get(), EVENT_TYPES::onLeft, PlayerClass::newPlayer(&pl));
138138
return true;
139139
});
140-
EngineScope scope(engine);
140+
EngineScope scope(engine.get());
141141
for (auto& [index, cb] : getEngineData(engine)->unloadCallbacks) {
142142
try {
143143
cb(engine);
@@ -883,15 +883,16 @@ void InitBasicEventListeners() {
883883
}
884884
#ifndef LSE_BACKEND_NODEJS
885885
try {
886-
std::list<ScriptEngine*> tmpList;
886+
std::list<std::shared_ptr<ScriptEngine>> tmpList;
887887
{
888888
std::shared_lock<std::shared_mutex> lock(globalShareData->engineListLock);
889889
// low efficiency
890890
tmpList = globalShareData->globalEngineList;
891891
}
892892
for (auto engine : tmpList) {
893-
if (EngineManager::isValid(engine) && EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE) {
894-
EngineScope enter(engine);
893+
if (EngineManager::isValid(engine.get())
894+
&& EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE) {
895+
EngineScope enter(engine.get());
895896
engine->messageQueue()->loopQueue(script::utils::MessageQueue::LoopType::kLoopOnce);
896897
}
897898
}

src/legacy/api/EventAPI.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ void InitBasicEventListeners();
1010
void EnableEventListener(int eventId);
1111
optional_ref<EventListener>
1212
LLSEAddEventListener(ScriptEngine* engine, const std::string& eventName, const Local<Function>& func);
13-
bool LLSERemoveAllEventListeners(ScriptEngine* engine);
14-
bool LLSECallEventsOnHotLoad(ScriptEngine* engine);
15-
bool LLSECallEventsOnUnload(ScriptEngine* engine);
13+
bool LLSERemoveAllEventListeners(std::shared_ptr<ScriptEngine> engine);
14+
bool LLSECallEventsOnHotLoad(std::shared_ptr<ScriptEngine> engine);
15+
bool LLSECallEventsOnUnload(std::shared_ptr<ScriptEngine> engine);
1616

1717
//////////////////// Callback ////////////////////
1818

@@ -157,13 +157,13 @@ extern bool hasListened[int(EVENT_TYPES::EVENT_COUNT)];
157157
// 监听器异常拦截
158158
inline std::string EventTypeToString(EVENT_TYPES e) { return std::string(magic_enum::enum_name(e)); }
159159

160-
#define CallEvent(type, ...) \
160+
#define CallEvent(TYPE, ...) \
161161
[&]() { \
162-
std::list<EventListener>& nowList = listenerList[(int)type]; \
162+
std::list<EventListener>& nowList = listenerList[(int)TYPE]; \
163163
bool returnValue = true; \
164164
for (auto& listener : nowList | std::views::filter([](auto& l) { return !l.removed; })) { \
165165
EngineScope enter(listener.engine); \
166-
CallEventImpl(listener, returnValue, type, __VA_ARGS__); \
166+
CallEventImpl(listener, returnValue, TYPE, __VA_ARGS__); \
167167
} \
168168
return returnValue; \
169169
}()
@@ -192,11 +192,11 @@ void CallEventImpl(EventListener& listener, bool& returnValue, EVENT_TYPES type,
192192
}
193193
}
194194

195-
#define FakeCallEvent(engine, type, ...) \
196-
std::list<EventListener>& nowList = listenerList[(int)type]; \
195+
#define FakeCallEvent(ENGINE, TYPE, ...) \
196+
std::list<EventListener>& nowList = listenerList[(int)TYPE]; \
197197
for (auto& listener : nowList | std::views::filter([](auto& l) { return !l.removed; })) { \
198198
EngineScope enter(listener.engine); \
199-
FakeCallEventImpl(listener, engine, type, __VA_ARGS__); \
199+
FakeCallEventImpl(listener, ENGINE, TYPE, __VA_ARGS__); \
200200
}
201201

202202
template <typename... T>

src/legacy/api/ItemAPI.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,20 @@ ClassDefine<ItemClass> ItemClassBuilder = defineClass<ItemClass>("LLSE_Item")
7373

7474
//////////////////// Classes ////////////////////
7575

76-
ItemClass::ItemClass(ItemStack* itemStack, bool isManagedByBDS)
76+
ItemClass::ItemClass(std::variant<std::monostate, std::unique_ptr<ItemStack>, ItemStack*> itemStack)
7777
: ScriptClass(ScriptClass::ConstructFromCpp<ItemClass>{}) {
78-
if (isManagedByBDS) {
79-
item = itemStack;
80-
} else {
81-
item = std::unique_ptr<ItemStack>(itemStack);
82-
}
78+
item = std::move(itemStack);
8379
preloadData();
8480
}
8581

8682
// 生成函数
87-
Local<Object> ItemClass::newItem(ItemStack* itemStack, bool isManagedByBDS) {
88-
auto newp = new ItemClass(itemStack, isManagedByBDS);
83+
Local<Object> ItemClass::newItem(ItemStack* itemStack) {
84+
auto newp = new ItemClass(itemStack);
85+
return newp->getScriptObject();
86+
}
87+
88+
Local<Object> ItemClass::newItem(std::unique_ptr<ItemStack> itemStack) {
89+
auto newp = new ItemClass(std::move(itemStack));
8990
return newp->getScriptObject();
9091
}
9192

@@ -358,9 +359,8 @@ Local<Value> ItemClass::set(const Arguments& args) {
358359
Local<Value> ItemClass::clone(const Arguments&) {
359360
try {
360361
auto itemStack = get();
361-
if (!itemStack) return Local<Value>(); // Null
362-
auto itemNew = new ItemStack(*itemStack);
363-
return ItemClass::newItem(itemNew, false);
362+
if (!itemStack) return Local<Value>();
363+
return ItemClass::newItem(std::make_unique<ItemStack>(*itemStack));
364364
}
365365
CATCH("Fail in cloneItem!");
366366
}
@@ -469,20 +469,17 @@ Local<Value> McClass::newItem(const Arguments& args) {
469469
std::string type = args[0].asString().toString();
470470
int cnt = args[1].asNumber().toInt32();
471471

472-
ItemStack* item = new ItemStack{type, cnt, 0, nullptr};
473-
if (!item) return Local<Value>(); // Null
474-
else return ItemClass::newItem(item, false); // Not managed by BDS, pointer will be saved as unique_ptr
472+
return ItemClass::newItem(std::make_unique<ItemStack>(type, cnt, 0, nullptr));
475473
} else {
476474
LOG_TOO_FEW_ARGS(__FUNCTION__);
477475
return Local<Value>();
478476
}
479477
} else {
480478
auto nbt = NbtCompoundClass::extract(args[0]);
481479
if (nbt) {
482-
auto newItem = new ItemStack{ItemStack::EMPTY_ITEM()};
480+
auto newItem = std::make_unique<ItemStack>(ItemStack::EMPTY_ITEM());
483481
ItemHelper::load(*newItem, *nbt);
484-
return ItemClass::newItem(newItem,
485-
false); // Not managed by BDS, pointer will be saved as unique_ptr
482+
return ItemClass::newItem(std::move(newItem));
486483
} else {
487484
LOG_WRONG_ARG_TYPE(__FUNCTION__);
488485
return Local<Value>();

0 commit comments

Comments
 (0)