Skip to content

Commit e6aa754

Browse files
committed
VM: fi
1 parent 895601b commit e6aa754

6 files changed

Lines changed: 34 additions & 32 deletions

File tree

include/openminecraft/vm/pixeltower/om_pixeltower_class_structdef.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class OMClass
4848
std::list<std::shared_ptr<OMFieldInfo>> fields;
4949
std::list<std::shared_ptr<OMMethodInfo>> methods;
5050
std::unordered_map<uint16_t, std::shared_ptr<classfile::OMClassConstant>> *mapping;
51-
uint64_t objectLength = 0;
51+
uint64_t objectLength = sizeof(void *);
5252

5353
void *staticFieldBlock = nullptr;
5454
};

include/openminecraft/vm/pixeltower/om_pixeltower_interpreter.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,13 @@ class OMInterpreter
5959
util::OMResult<std::any, err::OMValidationError> operand_putstatic(std::shared_ptr<OMFrameMetadata> frame);
6060
util::OMResult<std::any, err::OMValidationError> operand_putfield(std::shared_ptr<OMFrameMetadata> frame);
6161

62+
void *newString(std::string data);
63+
6264
private:
6365
util::OMResult<std::any, err::OMValidationError> checkType(std::shared_ptr<OMFrameMetadata> frame, std::any data,
6466
std::string desc);
6567
std::string fetchName(OMArrayType type);
66-
void writeStackTop(void *target);
68+
void writeStackTop(void *target, std::string desc);
6769
std::string fetchCurrentPosition(std::shared_ptr<OMFrameMetadata> frame);
6870
util::OMResult<std::any, err::OMValidationError> popFrame(std::shared_ptr<OMFrameMetadata> frame);
6971

include/openminecraft/vm/pixeltower/om_pixeltower_memorymanager.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace openminecraft::vm::pixeltower
1212
{
13-
#define OBJECT_ACCESS(p) ((void *)((uint8_t *)p + sizeof(void *)))
13+
#define OBJECT_ACCESS(p, off) ((void *)((uint8_t *)p + off))
1414
#define ARRAY_ACCESS(p, t) ((t *)((uint8_t *)p + sizeof(openminecraft::vm::pixeltower::OMArrayHeader)))
1515
class OMMemoryManager
1616
{

src/boot/entrypoint.cpp

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -168,32 +168,15 @@ int boot(std::vector<std::string> args)
168168
break;
169169
}
170170
void *arr = pt->allocateArray(cls.unwrap(), 1);
171+
void *str = std::any_cast<std::shared_ptr<runtime::OMInterpreter>>(pt->interpreter)
172+
->newString("--debug");
173+
174+
ARRAY_ACCESS(arr, void *)[0] = str;
171175
std::any_cast<std::shared_ptr<runtime::OMInterpreter>>(pt->interpreter)
172176
->stack[std::this_thread::get_id()]
173177
.push(arr);
174-
void *rawarr = pt->allocateArray(Byte, 7);
175-
char *arrdata = ((char *)rawarr) + sizeof(OMArrayHeader);
176-
arrdata[0] = '-';
177-
arrdata[1] = '-';
178-
arrdata[2] = 'd';
179-
arrdata[3] = 'e';
180-
arrdata[4] = 'b';
181-
arrdata[5] = 'u';
182-
arrdata[6] = 'g';
183-
void *str = pt->allocate(cls.unwrap());
184-
std::any_cast<std::shared_ptr<runtime::OMInterpreter>>(pt->interpreter)
185-
->stack[std::this_thread::get_id()]
186-
.push(str);
187-
std::any_cast<std::shared_ptr<runtime::OMInterpreter>>(pt->interpreter)
188-
->stack[std::this_thread::get_id()]
189-
.push(rawarr);
190-
auto initresult = std::any_cast<std::shared_ptr<runtime::OMInterpreter>>(pt->interpreter)
191-
->execute(cls.unwrap(), "<init>", "([B)V");
192-
logger->warn(initresult.unwrap_err().what());
193-
194-
ARRAY_ACCESS(rawarr, void *)[0] = str;
195-
196178
auto c = pt->execute("openminecraft/Test", "main", "([Ljava/lang/String;)V");
179+
197180
logger->info(c.unwrap_err().what());
198181
commandBuffer.clear();
199182
}

src/vm/pixeltower/om_pixeltower_interpreter.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "openminecraft/vm/pixeltower/om_pixeltower_frame_structdef.hpp"
1313
#include "openminecraft/vm/pixeltower/om_pixeltower_memorymanager.hpp"
1414
#include <any>
15-
#include <list>
15+
#include <cstring>
1616
#include <memory>
1717
#include <stack>
1818
#include <string>
@@ -516,7 +516,7 @@ std::string OMInterpreter::fetchName(OMArrayType type)
516516
}
517517
}
518518
// TODO: other types
519-
void OMInterpreter::writeStackTop(void *target)
519+
void OMInterpreter::writeStackTop(void *target, std::string desc)
520520
{
521521
auto it = std::type_index(STACK_ACCESS.top().type());
522522

@@ -570,7 +570,7 @@ OMResult<std::any, err::OMValidationError> OMInterpreter::operand_putfield(std::
570570
{
571571
if (fi->name == name && (fi->accessFlag & JVM_Acc_Static) == 0)
572572
{
573-
writeStackTop((uint8_t *)OBJECT_ACCESS(std::any_cast<void *>(item)) + fi->offset);
573+
writeStackTop(OBJECT_ACCESS(std::any_cast<void *>(item), fi->offset), fi->desc);
574574
return OMResult<std::any, err::OMValidationError>::ok(nullptr);
575575
}
576576
}
@@ -601,7 +601,7 @@ OMResult<std::any, err::OMValidationError> OMInterpreter::operand_putstatic(std:
601601
{
602602
if (fi->name == name && (fi->accessFlag & JVM_Acc_Static))
603603
{
604-
writeStackTop((void *)((uint8_t *)res.unwrap()->staticFieldBlock + fi->offset));
604+
writeStackTop(OBJECT_ACCESS(res.unwrap()->staticFieldBlock, fi->offset), fi->desc);
605605
return OMResult<std::any, err::OMValidationError>::ok(nullptr);
606606
}
607607
}
@@ -787,4 +787,22 @@ void OMInterpreter::operand_pop(std::shared_ptr<OMFrameMetadata> frame)
787787
STACK_ACCESS.pop();
788788
frame->offset++;
789789
}
790+
void *OMInterpreter::newString(std::string data)
791+
{
792+
auto cls = tower.fetchClass("java/lang/String");
793+
if (cls.type == Err)
794+
{
795+
logger.warn(cls.unwrap_err().what());
796+
return nullptr;
797+
}
798+
799+
void *rawarr = tower.allocateArray(Byte, data.size());
800+
char *arrdata = ((char *)rawarr) + sizeof(OMArrayHeader);
801+
memcpy(arrdata, data.c_str(), data.size());
802+
void *str = tower.allocate(cls.unwrap());
803+
STACK_ACCESS.push(str);
804+
STACK_ACCESS.push(rawarr);
805+
auto initresult = execute(cls.unwrap(), "<init>", "([B)V");
806+
return str;
807+
}
790808
} // namespace openminecraft::vm::pixeltower::runtime

src/vm/pixeltower/om_pixeltower_memorymanager.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,11 @@ void OMMemoryManager::searchFromInstance(void *b)
135135
else
136136
{
137137
auto clazz = *((OMClass **)b);
138-
auto arrdata = (uint8_t *)OBJECT_ACCESS(b);
139138
for (auto fi : clazz->fields)
140139
{
141140
if (fi->type == OMFieldType::BytesP && (fi->accessFlag & JVM_Acc_Static) == 0)
142141
{
143-
searchFromInstance(*(void **)(arrdata + fi->offset));
142+
searchFromInstance(*(void **)OBJECT_ACCESS(b, fi->offset));
144143
}
145144
}
146145
}
@@ -151,7 +150,7 @@ void OMMemoryManager::seatchFromStatic(std::shared_ptr<OMClass> cls)
151150
{
152151
if (fi->type == OMFieldType::BytesP && (fi->accessFlag & JVM_Acc_Static) == 0)
153152
{
154-
searchFromInstance(*(void **)((uint8_t *)cls->staticFieldBlock + fi->offset));
153+
searchFromInstance(*(void **)OBJECT_ACCESS(cls->staticFieldBlock, fi->offset));
155154
}
156155
}
157156
}

0 commit comments

Comments
 (0)