Skip to content

Commit 4489f15

Browse files
committed
refactor: optimize ItemAPI
fix: fix potential memory leak in `_extractValue(RemoteCall::ItemType&& v)` of RemoteCallAPI
1 parent deb5548 commit 4489f15

4 files changed

Lines changed: 27 additions & 33 deletions

File tree

src/legacy/api/CommandAPI.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,10 @@ Local<Value> convertResult(ParamStorageType const& result, CommandOrigin const&
9393
);
9494
} else if (result.hold(ParamKind::Kind::Item)) {
9595
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
96+
std::make_unique<ItemStack>(ll::service::getLevel()->getItemRegistry().getNameFromLegacyID(
97+
std::get<CommandItem>(result.value()).mId
98+
))
99+
);
103100
} else if (result.hold(ParamKind::Kind::Actor)) {
104101
auto arr = Array::newArray();
105102
for (auto i : std::get<CommandSelector<Actor>>(result.value()).results(origin)) {

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>();

src/legacy/api/ItemAPI.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@ class ItemStack;
1010

1111
class ItemClass : public ScriptClass {
1212
private:
13-
// ItemStack* is managed by BDS// ItemStack* is managed by BDS
14-
std::variant<ItemStack*, std::unique_ptr<ItemStack>> item;
13+
// ItemStack* is managed by BDS
14+
std::variant<std::monostate, std::unique_ptr<ItemStack>, ItemStack*> item;
1515

1616
// Pre data
1717
std::string name, type;
1818
int id, maxCount, count, aux;
1919

2020
public:
21-
explicit ItemClass(ItemStack* itemStack, bool isManagedByBDS = true);
21+
explicit ItemClass(std::variant<std::monostate, std::unique_ptr<ItemStack>, ItemStack*> itemStack);
2222
void preloadData();
2323

2424
ItemStack* get() {
25-
if (std::holds_alternative<std::unique_ptr<ItemStack>>(item)) {
25+
if (std::holds_alternative<std::monostate>(item)) return nullptr;
26+
if (std::holds_alternative<std::unique_ptr<ItemStack>>(item))
2627
return std::get<std::unique_ptr<ItemStack>>(item).get();
27-
} else {
28-
return std::get<ItemStack*>(item);
29-
}
28+
return std::get<ItemStack*>(item);
3029
}
3130

32-
static Local<Object> newItem(ItemStack* itemStack, bool isManagedByBDS = true);
31+
static Local<Object> newItem(ItemStack* itemStack);
32+
static Local<Object> newItem(std::unique_ptr<ItemStack> itemStack);
3333
static ItemStack* extract(Local<Value> v);
3434

3535
Local<Value> getName();

src/legacy/api/RemoteCallAPI.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Local<Value> _extractValue(RemoteCall::BlockType v) {
111111
};
112112
Local<Value> _extractValue(RemoteCall::NumberType v) { return Number::newNumber(v.get<double>()); };
113113
Local<Value> _extractValue(RemoteCall::ItemType&& v) {
114-
if (v.own) return ItemClass::newItem(v.tryGetUniquePtr().release());
114+
if (v.own) return ItemClass::newItem(std::move(v.tryGetUniquePtr()));
115115
else return ItemClass::newItem(const_cast<ItemStack*>(v.ptr));
116116
};
117117
Local<Value> _extractValue(RemoteCall::NbtType&& v) {

0 commit comments

Comments
 (0)