Skip to content

Commit 40a6a15

Browse files
feat: array parsing, nested array parsing!!!!
1 parent 314352a commit 40a6a15

File tree

11 files changed

+153
-21
lines changed

11 files changed

+153
-21
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,5 @@
3939

4040
# debug information files
4141
*.dwo
42+
/.idea
43+
/tests/java/.idea

CMakeLists.txt

Lines changed: 6 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.1)
2+
project(JavaObjectStreams VERSION 1.3.2)
33

44
set(CMAKE_CXX_STANDARD 20)
55

@@ -133,6 +133,11 @@ set(FILES
133133
src/type/object/types/NullObject.cpp
134134
src/type/object/parsers/NullObjectParser.cpp
135135
include/JavaObject/type/object/parsers/NullObjectParser.h
136+
src/type/object/types/ArrayObject.cpp
137+
include/JavaObject/type/object/types/ArrayObject.h
138+
include/JavaObject/type/object/types/descriptor/NewClassDescriptorObject.h
139+
src/type/object/parsers/ArrayObjectParser.cpp
140+
include/JavaObject/type/object/parsers/ArrayObjectParser.h
136141
)
137142

138143
add_library(JavaObjectStreams SHARED ${FILES})

include/JavaObject/stream/ObjectInputStream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ namespace javaobject::stream {
2424
explicit ObjectInputStream(std::istream &input);
2525

2626
std::shared_ptr<type::object::IObject> readObject();
27+
28+
ObjectInputStream &operator>>(std::shared_ptr<type::object::IObject> &object);
2729
private:
2830
type::HandleContainer m_handleContainer;
2931

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/** @file ArrayObjectParser.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/25/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_ARRAYOBJECTPARSER_H
12+
#define JAVAOBJECTSTREAMS_ARRAYOBJECTPARSER_H
13+
#include "JavaObject/type/object/parsers/IObjectParser.h"
14+
15+
namespace javaobject::type::object::parsers {
16+
// the c lion does not concern itself with compiler errors
17+
struct ArrayObjectParser : IObjectParser {
18+
std::shared_ptr<object::IObject> operator()(type::object::ObjectTypeCodeParser &parser) const override;
19+
};
20+
} // namespace javaobject::type::object::parsers
21+
22+
#endif // JAVAOBJECTSTREAMS_ARRAYOBJECTPARSER_H
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/** @file ArrayObject.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/25/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_ARRAYOBJECT_H
12+
#define JAVAOBJECTSTREAMS_ARRAYOBJECT_H
13+
#include "BinaryIO/container/FixedArray.h"
14+
#include "JavaObject/type/object/types/IObject.h"
15+
#include "JavaObject/type/object/types/descriptor/NewClassDescriptorObject.h"
16+
#include "JavaObject/type/primitive/types/IPrimitiveObject.h"
17+
18+
#include <memory>
19+
#include <vector>
20+
21+
namespace javaobject::type::object::types {
22+
struct ArrayObject : IObject {
23+
ArrayObject(const std::shared_ptr<descriptor::NewClassDescriptorObject> &typeDescriptor, const std::vector<std::shared_ptr<primitive::types::IPrimitiveObject>> &values)
24+
: typeDescriptor(typeDescriptor), values(values) {}
25+
26+
explicit ArrayObject(const std::shared_ptr<descriptor::NewClassDescriptorObject> &typeDescriptor)
27+
: typeDescriptor(typeDescriptor) {}
28+
29+
std::string toString() override;
30+
31+
std::shared_ptr<descriptor::NewClassDescriptorObject> typeDescriptor;
32+
std::vector<std::shared_ptr<primitive::types::IPrimitiveObject>> values;
33+
};
34+
} // namespace javaobject::type::object::types
35+
36+
#endif // JAVAOBJECTSTREAMS_ARRAYOBJECT_H

src/type/object/ObjectTypeCodeParser.cpp

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

10+
#include "JavaObject/type/object/parsers/ArrayObjectParser.h"
11+
1012
#include <cassert>
1113
#include <format>
1214

@@ -35,6 +37,7 @@ namespace javaobject::type::object {
3537
this->m_parsers[EObjectTypeCode::TC_BLOCKDATA] = std::make_unique<object::parsers::ShortBlockDataObjectParser>();
3638
this->m_parsers[EObjectTypeCode::TC_BLOCKDATALONG] = std::make_unique<object::parsers::LongBlockDataObjectParser>();
3739
this->m_parsers[EObjectTypeCode::TC_NULL] = std::make_unique<parsers::NullObjectParser>();
40+
this->m_parsers[EObjectTypeCode::TC_ARRAY] = std::make_unique<parsers::ArrayObjectParser>();
3841
}
3942

4043
std::shared_ptr<object::IObject> ObjectTypeCodeParser::readNext() {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/** @file ArrayObjectParser.cpp
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/25/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/ArrayObjectParser.h"
12+
13+
#include "JavaObject/type/object/types/ArrayObject.h"
14+
15+
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
16+
#include "JavaObject/type/primitive/PrimitiveTypeCodeParser.h"
17+
18+
namespace javaobject::type::object::parsers {
19+
std::shared_ptr<object::IObject> ArrayObjectParser::operator()(type::object::ObjectTypeCodeParser &parser) const {
20+
auto dc = std::dynamic_pointer_cast<descriptor::NewClassDescriptorObject>(parser.readNext());
21+
22+
if (!dc) {
23+
throw std::runtime_error("Array type descriptor is TC_NULL!!!!!");
24+
}
25+
26+
auto obj = std::make_shared<types::ArrayObject>(dc);
27+
parser.handleContainer().registerHandle(obj);
28+
29+
const int32_t size = parser.stream().readBE<int32_t>();
30+
obj->values.resize(size);
31+
32+
const auto primitiveParser = parser.parserStorage().primitiveParser;
33+
const auto parserClass = primitiveParser->getParser(static_cast<EPrimitiveTypeCode>(dc->name.at(1)));
34+
for (int32_t i = 0; i < size; i++) {
35+
obj->values[i] = primitiveParser->readUsingParser(*parserClass);
36+
}
37+
38+
return obj;
39+
}
40+
} // namespace javaobject::type::object::parsers
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/** @file ArrayObject.cpp
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/25/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/types/ArrayObject.h"
12+
13+
#include <format>
14+
15+
namespace javaobject::type::object::types {
16+
std::string ArrayObject::toString() {
17+
return std::format("Array(type={}, size={})", typeDescriptor->toString(), this->values.size());
18+
}
19+
} // namespace javaobject::type::object::types

src/type/primitive/PrimitiveTypeCodeParser.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "JavaObject/type/primitive/PrimitiveTypeCodeParser.h"
1212

1313
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
14+
#include "JavaObject/type/primitive/parsers/PrimitiveArrayObjectParser.h"
1415
#include "JavaObject/type/primitive/parsers/PrimitiveBooleanObjectParser.h"
1516
#include "JavaObject/type/primitive/parsers/PrimitiveByteObjectParser.h"
1617
#include "JavaObject/type/primitive/parsers/PrimitiveCharObjectParser.h"
@@ -32,7 +33,7 @@ namespace javaobject::type::primitive {
3233
this->m_parsers[EPrimitiveTypeCode::TYPE_INT] = std::make_unique<parsers::PrimitiveIntegerObjectParser>();
3334
this->m_parsers[EPrimitiveTypeCode::TYPE_LONG] = std::make_unique<parsers::PrimitiveLongObjectParser>();
3435
this->m_parsers[EPrimitiveTypeCode::TYPE_SHORT] = std::make_unique<parsers::PrimitiveShortObjectParser>();
35-
// this->m_parsers[EPrimitiveTypeCode::TYPE_ARRAY] = std::make_unique<parsers::PrimitiveByteObjectParser>();
36+
this->m_parsers[EPrimitiveTypeCode::TYPE_ARRAY] = std::make_unique<parsers::PrimitiveArrayObjectParser>();
3637
this->m_parsers[EPrimitiveTypeCode::TYPE_OBJECT] = std::make_unique<parsers::PrimitiveJavaObjectParser>();
3738
}
3839

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
/** @file PrimitiveArrayObjectParser.cpp
2-
*
3-
* @author Zero_DSRS_VX
4-
* @date 3/25/26
5-
*
6-
* @device mac-8
7-
*
8-
* @copyright Copyright (c) 2026 Team Lodestone
9-
* @license This project is licensed under the LGPL 3.0 license, see the LICENSE file for details.
10-
*/
11-
#include "../../../../include/JavaObject/type/primitive/parsers/PrimitiveArrayObjectParser.h"
2+
*
3+
* @author Zero_DSRS_VX
4+
* @date 3/25/26
5+
*
6+
* @device mac-8
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the LGPL 3.0 license, see the LICENSE file for details.
10+
*/
11+
#include "JavaObject/type/primitive/parsers/PrimitiveArrayObjectParser.h"
1212

13-
namespace javaobject {
14-
namespace type {
15-
namespace primitive {
16-
namespace parsers {
17-
} // parsers
18-
} // primitive
19-
} // type
20-
} // javaobject
13+
#include "JavaObject/type/object/ObjectTypeCodeParser.h"
14+
#include "JavaObject/type/primitive/PrimitiveTypeCodeParser.h"
15+
#include "JavaObject/type/primitive/types/PrimitiveArrayObject.h"
16+
#include "JavaObject/type/primitive/types/PrimitiveJavaObject.h"
17+
18+
namespace javaobject::type::primitive::parsers {
19+
std::shared_ptr<types::IPrimitiveObject> PrimitiveArrayObjectParser::operator()(PrimitiveTypeCodeParser &parser) const {
20+
return std::make_shared<types::PrimitiveJavaObject>(parser.parserStorage().objectParser->readNext());
21+
}
22+
} // namespace javaobject::type::primitive::parsers

0 commit comments

Comments
 (0)