Skip to content

Commit c3952e1

Browse files
feat: deserialize TC_EXCEPTION, TC_CLASS, and properly handle TC_RESET
1 parent 8b8ef56 commit c3952e1

File tree

12 files changed

+191
-2
lines changed

12 files changed

+191
-2
lines changed

CMakeLists.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION VERSION 3.30)
2-
project(JavaObjectStreams VERSION 1.3.7)
2+
project(JavaObjectStreams VERSION 1.3.8)
33

44
set(CMAKE_CXX_STANDARD 20)
55

@@ -139,6 +139,14 @@ set(FILES
139139
include/JavaObject/type/object/types/descriptor/NewClassDescriptorObject.h
140140
src/type/object/parsers/ArrayObjectParser.cpp
141141
include/JavaObject/type/object/parsers/ArrayObjectParser.h
142+
include/JavaObject/type/object/types/ResetObject.h
143+
src/type/object/types/ResetObject.cpp
144+
include/JavaObject/type/object/parsers/ResetObjectParser.h
145+
src/type/object/parsers/ResetObjectParser.cpp
146+
include/JavaObject/type/object/parsers/ExceptionObjectParser.h
147+
src/type/object/parsers/ExceptionObjectParser.cpp
148+
include/JavaObject/type/object/parsers/ClassObjectParser.h
149+
src/type/object/parsers/ClassObjectParser.cpp
142150
)
143151

144152
add_library(JavaObjectStreams SHARED ${FILES})

include/JavaObject/type/HandleContainer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ namespace javaobject::type {
2828
std::shared_ptr<object::IObject> resolveReference(const object::ReferenceObject *reference);
2929
std::shared_ptr<object::IObject> resolveReference(const std::shared_ptr<object::ReferenceObject> &reference);
3030

31+
/** TC_RESET requires reset of all handles */
32+
void reset();
33+
3134
protected:
3235
static constexpr size_t getIndex(const object::ReferenceObject::handle_t handle) {
3336
return handle & ~HANDLE_START;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/** @file ClassObjectParser.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_CLASSOBJECTPARSER_H
12+
#define JAVAOBJECTSTREAMS_CLASSOBJECTPARSER_H
13+
#include "JavaObject/type/object/parsers/IObjectParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
struct ClassObjectParser : public IObjectParser {
17+
std::shared_ptr<object::IObject> operator()(type::object::ObjectTypeCodeParser &parser) const override;
18+
};
19+
} // namespace javaobject::type::object::parsers
20+
21+
#endif //JAVAOBJECTSTREAMS_CLASSOBJECTPARSER_H
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/** @file ExceptionObjectParser.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_EXCEPTIONOBJECTPARSER_H
12+
#define JAVAOBJECTSTREAMS_EXCEPTIONOBJECTPARSER_H
13+
#include "JavaObject/type/object/parsers/IObjectParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
struct ExceptionObjectParser : public IObjectParser {
17+
std::shared_ptr<object::IObject> operator()(type::object::ObjectTypeCodeParser &parser) const override;
18+
};
19+
} // namespace javaobject::type::object::parsers
20+
21+
#endif //JAVAOBJECTSTREAMS_EXCEPTIONOBJECTPARSER_H
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/** @file ResetObjectParser.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_RESETOBJECTPARSER_H
12+
#define JAVAOBJECTSTREAMS_RESETOBJECTPARSER_H
13+
#include "JavaObject/type/object/parsers/IObjectParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
struct ResetObjectParser : public IObjectParser {
17+
std::shared_ptr<object::IObject> operator()(type::object::ObjectTypeCodeParser &parser) const override;
18+
};
19+
} // namespace javaobject::type::object::parsers
20+
21+
#endif //JAVAOBJECTSTREAMS_RESETOBJECTPARSER_H
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/** @file ResetObject.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_RESETOBJECT_H
12+
#define JAVAOBJECTSTREAMS_RESETOBJECT_H
13+
#include "JavaObject/type/object/types/IObject.h"
14+
15+
namespace javaobject::type::object::types {
16+
struct ResetObject : public IObject {
17+
std::string toString() override;
18+
};
19+
} // namespace javaobject::type::object
20+
21+
#endif //JAVAOBJECTSTREAMS_RESETOBJECT_H

src/type/HandleContainer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,8 @@ namespace javaobject::type {
4040
std::shared_ptr<object::IObject> HandleContainer::resolveReference(const std::shared_ptr<object::ReferenceObject> &reference) {
4141
return this->resolveReference(reference.get());
4242
}
43-
}
43+
// TODO or maybe reset should just increment the base and we count from there, would prevent references from being nuked
44+
void HandleContainer::reset() {
45+
this->m_handles.clear();
46+
}
47+
} // namespace javaobject::type

src/type/object/ObjectTypeCodeParser.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
99

1010
#include "JavaObject/type/object/parsers/ArrayObjectParser.h"
11+
#include "JavaObject/type/object/parsers/ClassObjectParser.h"
1112

1213
#include <cassert>
1314
#include <format>
@@ -23,21 +24,26 @@
2324
#include <istream>
2425

2526
#include "JavaObject/type/object/parsers/EndBlockDataObjectParser.h"
27+
#include "JavaObject/type/object/parsers/ExceptionObjectParser.h"
2628
#include "JavaObject/type/object/parsers/LongBlockDataObjectParser.h"
2729
#include "JavaObject/type/object/parsers/NullObjectParser.h"
30+
#include "JavaObject/type/object/parsers/ResetObjectParser.h"
2831
#include "JavaObject/type/object/parsers/ShortBlockDataObjectParser.h"
2932

3033
namespace javaobject::type::object {
3134
ObjectTypeCodeParser::ObjectTypeCodeParser(std::istream &input, HandleContainer &handleContainer, TypeCodeParserStorage &parserStorage) : ITypeCodeParser(input, handleContainer), ITypeCodeParserStorageHolder(parserStorage) {
3235
this->m_parsers[EObjectTypeCode::TC_STRING] = std::make_unique<object::parsers::StringParser>();
3336
this->m_parsers[EObjectTypeCode::TC_OBJECT] = std::make_unique<object::parsers::ObjectParser>();
3437
this->m_parsers[EObjectTypeCode::TC_CLASSDESC] = std::make_unique<object::parsers::descriptor::NewClassDescriptorParser>();
38+
this->m_parsers[EObjectTypeCode::TC_CLASS] = std::make_unique<object::parsers::ClassObjectParser>();
3539
this->m_parsers[EObjectTypeCode::TC_REFERENCE] = std::make_unique<object::parsers::ReferenceParser>();
3640
this->m_parsers[EObjectTypeCode::TC_ENDBLOCKDATA] = std::make_unique<object::parsers::EndBlockDataObjectParser>();
3741
this->m_parsers[EObjectTypeCode::TC_BLOCKDATA] = std::make_unique<object::parsers::ShortBlockDataObjectParser>();
3842
this->m_parsers[EObjectTypeCode::TC_BLOCKDATALONG] = std::make_unique<object::parsers::LongBlockDataObjectParser>();
3943
this->m_parsers[EObjectTypeCode::TC_NULL] = std::make_unique<parsers::NullObjectParser>();
4044
this->m_parsers[EObjectTypeCode::TC_ARRAY] = std::make_unique<parsers::ArrayObjectParser>();
45+
this->m_parsers[EObjectTypeCode::TC_RESET] = std::make_unique<parsers::ResetObjectParser>();
46+
this->m_parsers[EObjectTypeCode::TC_EXCEPTION] = std::make_unique<parsers::ExceptionObjectParser>();
4147
}
4248

4349
std::shared_ptr<IObject> ObjectTypeCodeParser::readUsingTypeCode(const EObjectTypeCode &typecode) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/** @file ClassObjectParser.cpp
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#include "JavaObject/type/object/parsers/ClassObjectParser.h"
12+
13+
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
std::shared_ptr<object::IObject> ClassObjectParser::operator()(type::object::ObjectTypeCodeParser &parser) const {
17+
std::shared_ptr<object::IObject> desc = parser.readNext();
18+
parser.handleContainer().registerHandle(desc);
19+
20+
return desc;
21+
}
22+
} // namespace javaobject::type::object::parsers
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/** @file ExceptionObjectParser.cpp
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/28/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#include "JavaObject/type/object/parsers/ExceptionObjectParser.h"
12+
13+
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
std::shared_ptr<object::IObject> ExceptionObjectParser::operator()(type::object::ObjectTypeCodeParser &parser) const {
17+
parser.handleContainer().reset();
18+
19+
std::shared_ptr<IObject> ex = parser.readNext();
20+
21+
parser.handleContainer().reset();
22+
23+
return ex;
24+
}
25+
} // namespace javaobject::type::object::parsers

0 commit comments

Comments
 (0)