11#include " openminecraft/vm/impl/om_impl_throwable.hpp"
22
3+ using namespace openminecraft ::vm::pixeltower::v0;
4+
35namespace 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
0 commit comments