Skip to content

Commit 1bb26ad

Browse files
committed
VM (new pixeltower): 类加载器
1 parent 7bcc44e commit 1bb26ad

11 files changed

Lines changed: 313 additions & 17 deletions

include/openminecraft/vm/pixeltower/v0/om_pixeltower.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@ class OMPixelTower
1515
~OMPixelTower();
1616

1717
void init(std::string basePath);
18+
void load(std::string path);
1819
void init(std::vector<std::shared_ptr<std::istream>> &streams);
20+
void testAppendMethod();
1921
OMKlassLoader *loader;
22+
OMPixelTowerHeap *heap;
23+
OMPixelTowerHeap *metaspace;
2024

2125
private:
22-
OMPixelTowerHeap *heap;
2326
log::OMLogger logger;
2427
};
2528
} // namespace openminecraft::vm::pixeltower::v0
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef OM_PIXELTOWER_FIELD_HPP
2+
#define OM_PIXELTOWER_FIELD_HPP
3+
4+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_base.hpp"
5+
#include <string>
6+
namespace openminecraft::vm::pixeltower::v0
7+
{
8+
struct OMField
9+
{
10+
std::string name;
11+
std::string desc;
12+
jint offset;
13+
AccessFlags accessFlags;
14+
};
15+
} // namespace openminecraft::vm::pixeltower::v0
16+
17+
#endif

include/openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,31 @@ class OMPixelTowerHeap
2525
void debug();
2626
void merge();
2727

28+
void *heapBase()
29+
{
30+
return heap->block;
31+
}
32+
33+
bool enablePointerCompression()
34+
{
35+
return maxSize < 32ull * 1024 * 1024 * 1024 && (sizeof(void *) == 8);
36+
}
37+
uint64_t pointerSize()
38+
{
39+
return enablePointerCompression() ? 4 : sizeof(void *);
40+
}
41+
42+
uint32_t compressPointer(void *p)
43+
{
44+
return ((size_t)p - (size_t)heap->block) >> 3;
45+
}
46+
void *decompressPointer(uint32_t p)
47+
{
48+
return (void *)((size_t)(p << 3) + (size_t)heap->block);
49+
}
50+
2851
private:
52+
uint64_t maxSize;
2953
mem::OMHeap *heap;
3054
std::mutex emptyBlockMutex;
3155
std::vector<OMHeapEmptyBlock> emptyBlocks;

include/openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
#include "openminecraft/vm/classfile/om_class_file.hpp"
55
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_base.hpp"
6+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_field.hpp"
7+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
8+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_oop.hpp"
9+
#include <cassert>
610
#include <cstdint>
711
#include <memory>
812
#include <string>
@@ -14,14 +18,30 @@ enum OMKlassKind : uint8_t
1418
Array
1519
};
1620

21+
struct OMMethod;
22+
1723
class OMKlass
1824
{
1925
public:
2026
OMKlassKind kind;
2127
std::string name;
2228
std::shared_ptr<classfile::OMClassFile> raw;
2329
OMKlass *superClass;
30+
std::vector<OMKlass *> interfaces;
31+
OMMethod *methods;
2432
AccessFlags accessFlags;
33+
std::vector<OMField> fields;
34+
uint64_t length;
35+
void *staticBlock;
36+
uint64_t staticLength;
37+
38+
OMPixelTowerHeap *heap;
39+
40+
void *allocateInstance()
41+
{
42+
assert(kind == OMKlassKind::Normal);
43+
return heap->allocate(sizeof(OMOOPDesc) + length);
44+
}
2545
};
2646
} // namespace openminecraft::vm::pixeltower::v0
2747

include/openminecraft/vm/pixeltower/v0/om_pixeltower_klassloader.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "openminecraft/log/om_log_common.hpp"
55
#include "openminecraft/vm/classfile/om_class_file.hpp"
6+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
67
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp"
78
#include <memory>
89
#include <vector>
@@ -11,17 +12,21 @@ namespace openminecraft::vm::pixeltower::v0
1112
class OMKlassLoader
1213
{
1314
public:
14-
OMKlassLoader();
15+
OMKlassLoader(OMPixelTowerHeap *heap, OMPixelTowerHeap *metaspace);
1516
~OMKlassLoader();
1617

1718
void stagClass(std::shared_ptr<classfile::OMClassFile> file)
1819
{
1920
files.push_back(file);
2021
}
2122
void loadClass(std::string name);
23+
void loadSpecialClass(std::string name);
24+
void classInit(OMKlass *klass);
2225
OMKlass *fetchClass(std::string name);
2326

2427
private:
28+
OMPixelTowerHeap *metaspace;
29+
OMPixelTowerHeap *heap;
2530
log::OMLogger logger;
2631
std::vector<OMKlass *> classes;
2732
std::vector<std::shared_ptr<classfile::OMClassFile>> files;

include/openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp"
66
namespace openminecraft::vm::pixeltower::v0
77
{
8-
class OMMethod
8+
struct OMMethod
99
{
1010
OMKlass *klass;
11-
jbyte *code;
12-
jint codeSize;
11+
const jbyte *name;
12+
const jbyte *desc;
13+
OMMethod *next;
1314
jint *lineNumberTable;
1415
AccessFlags accessFlags;
16+
jint maxLocals;
17+
jint maxStack;
18+
jint codeSize;
19+
uint8_t code[0];
20+
// code space
1521
};
1622
} // namespace openminecraft::vm::pixeltower::v0
1723

include/openminecraft/vm/pixeltower/v0/om_pixeltower_oop.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,25 @@
22
#define OM_PIXELTOWER_OOP_HPP
33

44
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_base.hpp"
5-
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp"
65

76
namespace openminecraft::vm::pixeltower::v0
87
{
9-
class OMOOPDesc
8+
class OMKlass;
9+
struct OMOOPDesc
1010
{
11-
jint mark;
1211
OMKlass *klass;
12+
jint mark;
13+
jbyte data[0];
1314
// object data area
1415
};
16+
struct OMOOPArrDesc
17+
{
18+
OMKlass *klass;
19+
jint mark;
20+
jint length;
21+
jbyte data[0];
22+
// array data area
23+
};
1524
} // namespace openminecraft::vm::pixeltower::v0
1625

1726
#endif

src/boot/entrypoint.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include "openminecraft/vfs/om_vfs_base.hpp"
3838
#include "openminecraft/vm/pixeltower/v0/om_pixeltower.hpp"
3939
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
40+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp"
41+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_oop.hpp"
4042
#include <SDL3/SDL.h>
4143
#include <boost/stacktrace.hpp>
4244
#include <fmt/format.h>
@@ -153,9 +155,12 @@ int boot(std::vector<std::string> args)
153155
if (commandBuffer.size() >= 3 && commandBuffer[1] == "init")
154156
{
155157
tower->init(commandBuffer[2]);
156-
tower->loader->loadClass("vmstd/internal/SystemPrintStream");
157-
logger->info("{}", (void *)tower->loader->fetchClass("vmstd/internal/SystemPrintStream"));
158+
tower->load("../Test.class");
159+
tower->loader->loadClass("openminecraft/Test");
160+
auto cls = tower->loader->fetchClass("openminecraft/Test");
161+
logger->info("{}", (void *)cls);
158162
commandBuffer.clear();
163+
159164
break;
160165
}
161166
goto unk;

src/vm/pixeltower/v0/om_pixeltower.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "openminecraft/util/om_util_result.hpp"
44
#include "openminecraft/vm/classfile/om_class_file.hpp"
55
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
6+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp"
67
#include <filesystem>
78
#include <fstream>
89
#include <memory>
@@ -12,12 +13,51 @@ namespace openminecraft::vm::pixeltower::v0
1213
OMPixelTower::OMPixelTower() : logger("OMPixelTower", this)
1314
{
1415
heap = new OMPixelTowerHeap(1ul * 1024 * 1024, 1ul * 1024 * 1024 * 1024);
15-
loader = new OMKlassLoader();
16+
metaspace = new OMPixelTowerHeap(1ul * 1024 * 1024, 8ul * 1024 * 1024);
17+
loader = new OMKlassLoader(heap, metaspace);
1618
}
1719
OMPixelTower::~OMPixelTower()
1820
{
1921
delete loader;
2022
delete heap;
23+
delete metaspace;
24+
}
25+
26+
void OMPixelTower::testAppendMethod()
27+
{
28+
auto alloc = (OMMethod *)metaspace->allocate(sizeof(OMMethod) + 128);
29+
loader->loadClass("java/lang/Object");
30+
alloc->klass = loader->fetchClass("java/lang/Object");
31+
alloc->name = "equals";
32+
alloc->desc = "(Ljava/lang/Object;)Z";
33+
alloc->accessFlags = JVM_Acc_Public;
34+
alloc->codeSize = 128;
35+
alloc->lineNumberTable = nullptr;
36+
37+
for (auto i = 0; i < 128; i++)
38+
{
39+
alloc->code[i] = 0xcc;
40+
}
41+
logger.debug("function inserted at {}", (void *)alloc);
42+
43+
if (alloc == metaspace->heapBase())
44+
{
45+
return;
46+
}
47+
48+
auto currentMet = (OMMethod *)metaspace->heapBase();
49+
while (true)
50+
{
51+
if (currentMet->next == nullptr)
52+
{
53+
currentMet->next = alloc;
54+
break;
55+
}
56+
else
57+
{
58+
currentMet = currentMet->next;
59+
}
60+
}
2161
}
2262

2363
void OMPixelTower::init(std::string basePath)
@@ -35,6 +75,13 @@ void OMPixelTower::init(std::string basePath)
3575
init(target);
3676
}
3777

78+
void OMPixelTower::load(std::string path)
79+
{
80+
std::vector<std::shared_ptr<std::istream>> target;
81+
target.push_back(std::make_shared<std::ifstream>(path, std::ios::binary));
82+
init(target);
83+
}
84+
3885
void OMPixelTower::init(std::vector<std::shared_ptr<std::istream>> &streams)
3986
{
4087
for (auto &s : streams)

src/vm/pixeltower/v0/om_pixeltower_heap.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
namespace openminecraft::vm::pixeltower::v0
77
{
8-
OMPixelTowerHeap::OMPixelTowerHeap(uint64_t minSize, uint64_t maxSize) : logger("OMPixelTowerHeap", this)
8+
OMPixelTowerHeap::OMPixelTowerHeap(uint64_t minSize, uint64_t maxSize)
9+
: logger("OMPixelTowerHeap", this), maxSize(maxSize)
910
{
1011
heap = new mem::OMHeap(minSize, maxSize);
1112
heap->init();

0 commit comments

Comments
 (0)