Skip to content

Commit d779337

Browse files
feat: store handles in a vector, update tests
1 parent dca88bb commit d779337

File tree

13 files changed

+114
-64
lines changed

13 files changed

+114
-64
lines changed

CMakeLists.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
cmake_minimum_required(VERSION VERSION 3.30)
2-
project(JavaObjectStreams VERSION 1.3.4)
2+
project(JavaObjectStreams VERSION 1.3.5)
33

44
set(CMAKE_CXX_STANDARD 20)
55

6+
include(FetchContent)
7+
68
if (NOT TARGET bio)
7-
include(FetchContent)
89
FetchContent_Declare(
910
bio
1011
GIT_REPOSITORY https://codeberg.org/Dexrn/libBIO.git
@@ -112,8 +113,8 @@ set(FILES
112113
src/type/object/ObjectTypeCodeParser.cpp
113114
src/type/TypeCodeParserStorage.cpp
114115
include/JavaObject/type/TypeCodeParserStorage.h
115-
src/type/ITypeCodeStorageHolder.cpp
116-
include/JavaObject/type/ITypeCodeStorageHolder.h
116+
src/type/ITypeCodeParserStorageHolder.cpp
117+
include/JavaObject/type/ITypeCodeParserStorageHolder.h
117118
src/type/primitive/parsers/PrimitiveJavaObjectParser.cpp
118119
include/JavaObject/type/primitive/parsers/PrimitiveJavaObjectParser.h
119120
src/type/primitive/parsers/PrimitiveArrayObjectParser.cpp
@@ -155,7 +156,7 @@ option(JAVAOBJECTSTREAMS_BUILD_TESTS "Build JavaObjectStreams Tests" ON)
155156

156157
if (JAVAOBJECTSTREAMS_BUILD_TESTS)
157158
add_subdirectory(tests)
158-
endif()
159+
endif ()
159160

160161
unset(JAVAOBJECTSTREAMS_BUILD_TESTS CACHE)
161162

include/JavaObject/type/HandleContainer.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,27 @@
1515

1616
#include <memory>
1717
#include <unordered_map>
18+
#include <vector>
1819

1920
namespace javaobject::type {
2021
class HandleContainer {
2122
public:
23+
static constexpr int HANDLE_START = 0x007E0000;
24+
2225
void registerHandle(const std::shared_ptr<object::IObject> &object);
2326

2427
std::shared_ptr<object::IObject> resolveHandle(const object::ReferenceObject::handle_t handle);
2528
std::shared_ptr<object::IObject> resolveReference(const object::ReferenceObject *reference);
2629
std::shared_ptr<object::IObject> resolveReference(const std::shared_ptr<object::ReferenceObject> &reference);
2730

31+
protected:
32+
static constexpr size_t getIndex(const object::ReferenceObject::handle_t handle) {
33+
return handle & ~HANDLE_START;
34+
}
2835
private:
2936
/** Links handles to objects by pointer, these objects are expected to be stored already, otherwise it would leave a dangling/invalid pointer. */
30-
std::unordered_map<object::ReferenceObject::handle_t, std::shared_ptr<object::IObject>> m_handles;
31-
object::ReferenceObject::handle_t m_nextHandle = 0x007E0000;
37+
std::vector<std::shared_ptr<object::IObject>> m_handles;
38+
// object::ReferenceObject::handle_t m_nextHandle = 0x007E0000;
3239
};
3340
} // namespace javaobject::type
3441

include/JavaObject/type/ITypeCodeStorageHolder.h renamed to include/JavaObject/type/ITypeCodeParserStorageHolder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
#include "TypeCodeParserStorage.h"
1414

1515
namespace javaobject::type {
16-
class ITypeCodeStorageHolder {
16+
class ITypeCodeParserStorageHolder {
1717
public:
18-
explicit ITypeCodeStorageHolder(TypeCodeParserStorage &parserStorage);
18+
explicit ITypeCodeParserStorageHolder(TypeCodeParserStorage &parserStorage);
1919

2020
TypeCodeParserStorage &parserStorage();
2121

include/JavaObject/type/object/ObjectTypeCodeParser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
#include <iosfwd>
1616
#include <memory>
1717

18-
#include "JavaObject/type/ITypeCodeStorageHolder.h"
18+
#include "JavaObject/type/ITypeCodeParserStorageHolder.h"
1919

2020
namespace javaobject::type::primitive {
2121
class PrimitiveTypeCodeParser;
2222
}
2323

2424
namespace javaobject::type::object {
25-
class ObjectTypeCodeParser : public ITypeCodeParser<IObject, parsers::IObjectParser, EObjectTypeCode>, public ITypeCodeStorageHolder {
25+
class ObjectTypeCodeParser : public ITypeCodeParser<IObject, parsers::IObjectParser, EObjectTypeCode>, public ITypeCodeParserStorageHolder {
2626
public:
2727
explicit ObjectTypeCodeParser(std::istream &input, HandleContainer &handleContainer, TypeCodeParserStorage &parserStorage);
2828

include/JavaObject/type/primitive/PrimitiveTypeCodeParser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919

2020
#include <memory>
2121

22-
#include "JavaObject/type/ITypeCodeStorageHolder.h"
22+
#include "JavaObject/type/ITypeCodeParserStorageHolder.h"
2323
#include "JavaObject/type/TypeCodeParserStorage.h"
2424

2525
namespace javaobject::type::object {
2626
class ObjectTypeCodeParser;
2727
}
2828

2929
namespace javaobject::type::primitive {
30-
class PrimitiveTypeCodeParser : public ITypeCodeParser<types::IPrimitiveObject, parsers::IPrimitiveObjectParser, EPrimitiveTypeCode>, public ITypeCodeStorageHolder {
30+
class PrimitiveTypeCodeParser : public ITypeCodeParser<types::IPrimitiveObject, parsers::IPrimitiveObjectParser, EPrimitiveTypeCode>, public ITypeCodeParserStorageHolder {
3131
public:
3232
PrimitiveTypeCodeParser(std::istream &input, HandleContainer &handleContainer, TypeCodeParserStorage &parserStorage);
3333

src/type/HandleContainer.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,22 @@
1515

1616
namespace javaobject::type {
1717
void HandleContainer::registerHandle(const std::shared_ptr<object::IObject> &object) {
18-
this->m_handles.emplace(m_nextHandle, object);
19-
std::cout << std::format("new handle at {:#05x}: {}", m_nextHandle, object->toString()) << std::endl;
20-
21-
this->m_nextHandle++;
18+
this->m_handles.push_back(object);
19+
#ifdef DEBUG
20+
std::cout << std::format("New handle @ {:#05x}: {}", this->m_handles.size() - 1, object->toString()) << std::endl;
21+
#endif
2222
}
2323

2424
std::shared_ptr<object::IObject> HandleContainer::resolveHandle(const object::ReferenceObject::handle_t handle) {
25-
if (const auto it = m_handles.find(handle); it != this->m_handles.end()) {
26-
std::cout << std::format("resolved handle at {:#05x}: {}", m_nextHandle, it->second->toString()) << std::endl;
27-
return it->second;
28-
}
25+
#ifdef DEBUG
26+
size_t idx = this->getIndex(handle);
27+
std::shared_ptr<object::IObject> o = this->m_handles[idx];
2928

30-
static_assert("We should never be missing a handle!!!!");
31-
return nullptr;
29+
std::cout << std::format("Resolved handle @ {:#05x}: {}", idx, o->toString()) << std::endl;
30+
return o;
31+
#else
32+
return this->m_handles[this->getIndex(handle)];
33+
#endif
3234
}
3335

3436
std::shared_ptr<object::IObject> HandleContainer::resolveReference(const object::ReferenceObject *reference) {
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
* @copyright Copyright (c) 2026 Team Lodestone
99
* @license This project is licensed under the LGPL 3.0 license, see the LICENSE file for details.
1010
*/
11-
#include "JavaObject/type/ITypeCodeStorageHolder.h"
11+
#include "JavaObject/type/ITypeCodeParserStorageHolder.h"
1212

1313
namespace javaobject::type {
14-
ITypeCodeStorageHolder::ITypeCodeStorageHolder(TypeCodeParserStorage &parserStorage) : m_parserStorage(parserStorage) {}
14+
ITypeCodeParserStorageHolder::ITypeCodeParserStorageHolder(TypeCodeParserStorage &parserStorage) : m_parserStorage(parserStorage) {}
1515

16-
TypeCodeParserStorage &ITypeCodeStorageHolder::parserStorage() {
16+
TypeCodeParserStorage &ITypeCodeParserStorageHolder::parserStorage() {
1717
return this->m_parserStorage;
1818
}
1919
} // javaobject::type

src/type/object/ObjectTypeCodeParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include "JavaObject/type/object/parsers/ShortBlockDataObjectParser.h"
2929

3030
namespace javaobject::type::object {
31-
ObjectTypeCodeParser::ObjectTypeCodeParser(std::istream &input, HandleContainer &handleContainer, TypeCodeParserStorage &parserStorage) : ITypeCodeParser(input, handleContainer), ITypeCodeStorageHolder(parserStorage) {
31+
ObjectTypeCodeParser::ObjectTypeCodeParser(std::istream &input, HandleContainer &handleContainer, TypeCodeParserStorage &parserStorage) : ITypeCodeParser(input, handleContainer), ITypeCodeParserStorageHolder(parserStorage) {
3232
this->m_parsers[EObjectTypeCode::TC_STRING] = std::make_unique<object::parsers::StringParser>();
3333
this->m_parsers[EObjectTypeCode::TC_OBJECT] = std::make_unique<object::parsers::ObjectParser>();
3434
this->m_parsers[EObjectTypeCode::TC_CLASSDESC] = std::make_unique<object::parsers::descriptor::NewClassDescriptorParser>();

src/type/object/types/descriptor/NewClassDescriptorObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@
1515

1616
namespace javaobject::type::object::descriptor {
1717
std::string NewClassDescriptorObject::toString() {
18-
return std::format("NewClassDescriptorObject(name=\"{}\", uid={:#08x}, info={})", this->name, this->serialVersionUid, this->info != nullptr ? this->info->toString() : "null");
18+
return std::format("Class Descriptor for {}(uid={:#08x}, info={})", this->name, this->serialVersionUid, this->info != nullptr ? this->info->toString() : "null");
1919
}
2020
}

src/type/primitive/PrimitiveTypeCodeParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
namespace javaobject::type::primitive {
2626
PrimitiveTypeCodeParser::PrimitiveTypeCodeParser(std::istream &input, HandleContainer &handleContainer,
27-
TypeCodeParserStorage &parserStorage) : ITypeCodeParser(input, handleContainer), ITypeCodeStorageHolder(parserStorage) {
27+
TypeCodeParserStorage &parserStorage) : ITypeCodeParser(input, handleContainer), ITypeCodeParserStorageHolder(parserStorage) {
2828
this->m_parsers[EPrimitiveTypeCode::TYPE_BOOLEAN] = std::make_unique<parsers::PrimitiveBooleanObjectParser>();
2929
this->m_parsers[EPrimitiveTypeCode::TYPE_BYTE] = std::make_unique<parsers::PrimitiveByteObjectParser>();
3030
this->m_parsers[EPrimitiveTypeCode::TYPE_CHARACTER] = std::make_unique<parsers::PrimitiveCharObjectParser>();

0 commit comments

Comments
 (0)