Skip to content

Commit c0acd32

Browse files
committed
VM (new pixeltower): 异常堆栈追踪
1 parent f92e5b6 commit c0acd32

7 files changed

Lines changed: 106 additions & 13 deletions

File tree

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,19 @@ class OMPixelTowerHeap
4848
inline uint32_t compressPtr(void *p)
4949
{
5050
assert(sizeof(void *) == 8);
51+
if (!p)
52+
{
53+
return 0x1;
54+
}
5155
return ((size_t)p - (size_t)heap->block) >> 3;
5256
}
5357
inline void *decompressPtr(uint32_t p)
5458
{
5559
assert(sizeof(void *) == 8);
60+
if (p == 0x1)
61+
{
62+
return nullptr;
63+
}
5664
return (void *)((size_t)(p << 3) + (size_t)heap->block);
5765
}
5866

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ struct OMMethod
2222
std::unordered_map<jint, OMKlass *> *argCheck;
2323
std::unordered_map<jint, jint> *sourceMap;
2424
OMMethod *next;
25-
jint *lineNumberTable;
2625
AccessFlags accessFlags;
2726
jint maxLocals;
2827
jint maxStack;

‎src/vm/impl/om_impl_throwable.cpp‎

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,82 @@
11
#include "openminecraft/vm/impl/om_impl_throwable.hpp"
22

3+
using namespace openminecraft::vm::pixeltower::v0;
4+
35
namespace openminecraft::vm::impl
46
{
5-
std::any java_lang_Throwable_fillInStackTrace(pixeltower::v0::OMPixelTower *tower, std::any *d)
7+
std::any java_lang_Throwable_fillInStackTrace(OMPixelTower *tower, std::any *d)
68
{
7-
std::cout << "filling for " << std::any_cast<void *>(d[0]) << std::endl;
9+
auto arrcls = tower->loader->fetchClass({bytecode::descriptor::Array, "java/lang/StackTraceElement", 1, bytecode::descriptor::Reference});
10+
auto cls = tower->loader->fetchClass({bytecode::descriptor::Reference, "java/lang/StackTraceElement"});
11+
auto thr = tower->loader->fetchClass({bytecode::descriptor::Reference, "java/lang/Throwable"});
12+
auto fr = currentThread.currentFrame;
13+
auto pc = currentThread.pc;
14+
15+
std::vector<OMOOPDesc *> frames;
16+
while (fr)
17+
{
18+
auto frame = cls->allocateInstance();
19+
frames.push_back(frame);
20+
for (auto &f : cls->fields)
21+
{
22+
if (f.name == "declaringClass")
23+
{
24+
stackPushAccess<void *>(frame);
25+
stackPushAccess<void *>(fr->method->klass->oop);
26+
accessField(&f);
27+
}
28+
else if (f.name == "name")
29+
{
30+
stackPushAccess<void *>(frame);
31+
stackPushAccess<void *>(tower->createString(fr->method->name));
32+
accessField(&f);
33+
}
34+
else if (f.name == "descriptor")
35+
{
36+
stackPushAccess<void *>(frame);
37+
stackPushAccess<void *>(tower->createString(fr->method->desc));
38+
accessField(&f);
39+
}
40+
else if (f.name == "sourceFile")
41+
{
42+
stackPushAccess<void *>(frame);
43+
stackPushAccess<void *>(tower->createString(fr->method->klass->source));
44+
accessField(&f);
45+
}
46+
else if (fr->method->sourceMap && f.name == "line")
47+
{
48+
stackPushAccess<void *>(frame);
49+
stackPushAccess<jint>(fr->method->sourceMap->at(static_cast<jint>(static_cast<size_t>(pc - fr->method->code))));
50+
accessField(&f);
51+
}
52+
}
53+
pc = static_cast<uint8_t *>(fr->returnAddr);
54+
fr = fr->prev;
55+
}
56+
57+
auto result = arrcls->allocateArray(static_cast<jint>(frames.size()));
58+
for (int i = 0; i < frames.size(); i++)
59+
{
60+
if (tower->heap->ptrCompEnabled())
61+
{
62+
result->array<uint32_t>()[i] = tower->heap->compressPtr(frames[i]);
63+
}
64+
else
65+
{
66+
result->array<void *>()[i] = frames[i];
67+
}
68+
}
69+
70+
for (auto &field : thr->fields)
71+
{
72+
if (field.name == "stacktrace")
73+
{
74+
stackPushAccess<void *>(std::any_cast<void *>(d[0]));
75+
stackPushAccess<void *>(result);
76+
accessField(&field);
77+
}
78+
}
79+
880
return nullptr;
981
}
1082
} // namespace openminecraft::vm::impl

‎src/vm/pixeltower/v0/om_pixeltower_interpreter.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,8 +1394,8 @@ jint OMInterpreter::execute()
13941394

13951395
#define icmpcond(op, sign) \
13961396
case op: { \
1397-
auto item = stackTopAccess<jint>(true); \
13981397
auto item2 = stackTopAccess<jint>(true); \
1398+
auto item = stackTopAccess<jint>(true); \
13991399
if (item sign item2) \
14001400
{ \
14011401
currentThread.pc += binary::be16SignedToNative(currentThread.pc[1], currentThread.pc[2]); \

‎src/vm/pixeltower/v0/om_pixeltower_klassloader.cpp‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ OMKlassLoader::~OMKlassLoader()
6969

7070
void OMKlassLoader::initBase()
7171
{
72+
loadClass({bytecode::descriptor::Reference, "java/lang/Class"});
7273
loadClass({bytecode::descriptor::Reference, "java/lang/String"});
7374
}
7475

@@ -129,17 +130,17 @@ void OMKlassLoader::loadClass(OMTypeDesc name)
129130

130131
void OMKlassLoader::klassOopCreate(OMKlass *klass)
131132
{
132-
auto clsklass = fetchClass({bytecode::descriptor::Reference, "java/lang/String"});
133+
auto clsklass = fetchClass({bytecode::descriptor::Reference, "java/lang/Class"});
133134
auto tgt = clsklass->allocateInstance();
135+
tgt->mark |= mconst;
134136
klass->oop = tgt;
135-
auto ii = interpreter->tower->createString(klass->name);
136137

137138
for (auto &f : clsklass->fields)
138139
{
139140
if (f.name == "name")
140141
{
141142
stackPushAccess<void *>(tgt);
142-
stackPushAccess<void *>(ii);
143+
stackPushAccess<void *>(interpreter->tower->createString(klass->name));
143144
accessField(&f);
144145
}
145146
if (f.name == "nativePtr")
@@ -160,7 +161,8 @@ OMKlass *OMKlassLoader::klassConstruct(
160161
void *rawmap = metaspace->allocate(sizeof(std::unordered_map<std::string, OMMethod *>));
161162
klass->vtable = new (rawmap) std::unordered_map<std::string, OMMethod *>();
162163
klass->heap = heap;
163-
klass->name = bytecode::descriptor::restore(desc);
164+
auto nn = bytecode::descriptor::restore(desc);
165+
klass->name = nn;
164166
klass->accessFlags = f->accessFlags;
165167
klass->raw = f;
166168
files.erase(fi);

‎vmstd/src/java/lang/StackTraceElement.java‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
public class StackTraceElement
44
{
5-
private Class<?> declaringClass;
6-
private String name;
7-
private String descriptor;
5+
Class<?> declaringClass;
6+
String name;
7+
String descriptor;
88

9-
private String sourceFile;
10-
private int line;
9+
String sourceFile;
10+
int line;
1111

1212
private StackTraceElement()
1313
{

‎vmstd/src/java/lang/Throwable.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,16 @@ public Throwable(Throwable cause)
3434
}
3535

3636
private native void fillInStackTrace();
37+
38+
public void printStackTrace()
39+
{
40+
for (StackTraceElement e : stacktrace)
41+
{
42+
System.out.println(e.declaringClass.getName());
43+
System.out.println(e.name);
44+
System.out.println(e.descriptor);
45+
System.out.println(e.sourceFile);
46+
System.out.println(e.line);
47+
}
48+
}
3749
}

0 commit comments

Comments
 (0)