Skip to content

Commit 646df28

Browse files
committed
VM (new pixeltower): putstatic 指令实现
1 parent 9ba3d58 commit 646df28

3 files changed

Lines changed: 116 additions & 42 deletions

File tree

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

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_field.hpp"
1010
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_frame.hpp"
1111
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_oop.hpp"
12-
#include <cstdio>
1312
#include <string>
1413
#include <thread>
1514
#include <type_traits>
@@ -134,6 +133,24 @@ template <typename T> inline T localAccessValueW(int idx, OMFrame *f = currentTh
134133
}
135134
}
136135

136+
template <typename Ttarget, typename Tvalue> inline void accessFieldI(OMField *field)
137+
{
138+
auto data = stackTopAccess<Tvalue>();
139+
stackPop();
140+
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
141+
stackPop();
142+
*reinterpret_cast<Ttarget *>(&obj->data[field->offset]) = data;
143+
}
144+
145+
template <typename Ttarget, typename Tvalue> inline void accessFieldW(OMField *field)
146+
{
147+
auto data = stackTopAccessW<Tvalue>();
148+
stackPopW();
149+
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
150+
stackPop();
151+
*reinterpret_cast<Ttarget *>(&obj->data[field->offset]) = data;
152+
}
153+
137154
inline void accessField(OMField *field)
138155
{
139156
int p = 0;
@@ -146,73 +163,118 @@ inline void accessField(OMField *field)
146163
switch (hash_compile_time(res.unwrap().c_str()))
147164
{
148165
case "byte"_hash: {
149-
auto data = stackTopAccess<jint>();
150-
stackPop();
151-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
152-
stackPop();
153-
*reinterpret_cast<jbyte *>(&obj->data[field->offset]) = data;
166+
accessFieldI<jbyte, jint>(field);
154167
break;
155168
}
156169
case "short"_hash: {
157-
auto data = stackTopAccess<jint>();
158-
stackPop();
159-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
160-
stackPop();
161-
*reinterpret_cast<jshort *>(&obj->data[field->offset]) = data;
170+
accessFieldI<jshort, jint>(field);
162171
break;
163172
}
164173
case "boolean"_hash: {
165-
auto data = stackTopAccess<jint>();
166-
stackPop();
167-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
168-
stackPop();
169-
*reinterpret_cast<jboolean *>(&obj->data[field->offset]) = data;
174+
accessFieldI<jboolean, jint>(field);
170175
break;
171176
}
172177
case "int"_hash: {
173-
auto data = stackTopAccess<jint>();
174-
stackPop();
175-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
176-
stackPop();
177-
*reinterpret_cast<jint *>(&obj->data[field->offset]) = data;
178+
accessFieldI<jint, jint>(field);
178179
break;
179180
}
180181
case "float"_hash: {
181-
auto data = stackTopAccess<jfloat>();
182+
accessFieldI<jfloat, jfloat>(field);
183+
break;
184+
}
185+
case "long"_hash: {
186+
accessFieldW<jlong, jlong>(field);
187+
break;
188+
}
189+
case "double"_hash: {
190+
accessFieldW<jdouble, jdouble>(field);
191+
break;
192+
}
193+
default: {
194+
auto data = stackTopAccess<void *>();
182195
stackPop();
183196
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
184197
stackPop();
185-
*reinterpret_cast<jfloat *>(&obj->data[field->offset]) = data;
198+
auto target = &obj->data[field->offset];
199+
if (obj->klass->heap->ptrCompEnabled())
200+
{
201+
*reinterpret_cast<uint32_t *>(target) = obj->klass->heap->compressPtr(data);
202+
}
203+
else
204+
{
205+
*reinterpret_cast<void **>(target) = data;
206+
}
207+
break;
208+
}
209+
}
210+
}
211+
212+
template <typename Ttarget, typename Tvalue> inline void accessFieldStaticI(OMField *field)
213+
{
214+
auto data = stackTopAccess<Tvalue>();
215+
stackPop();
216+
*reinterpret_cast<Ttarget *>(
217+
static_cast<void *>(static_cast<uint8_t *>(field->klass->staticBlock) + field->offset)) = data;
218+
}
219+
220+
template <typename Ttarget, typename Tvalue> inline void accessFieldStaticW(OMField *field)
221+
{
222+
auto data = stackTopAccessW<Tvalue>();
223+
stackPopW();
224+
*reinterpret_cast<Ttarget *>(
225+
static_cast<void *>(static_cast<uint8_t *>(field->klass->staticBlock) + field->offset)) = data;
226+
}
227+
228+
inline void accessFieldStatic(OMField *field)
229+
{
230+
int p = 0;
231+
auto res = bytecode::descriptor::decodeType(field->desc, &p);
232+
if (res.type == util::Err)
233+
{
234+
throw err::OMValidationError{err::Instructions, "unknown field descriptor", field->desc};
235+
}
236+
237+
switch (hash_compile_time(res.unwrap().c_str()))
238+
{
239+
case "byte"_hash: {
240+
accessFieldStaticI<jbyte, jint>(field);
241+
break;
242+
}
243+
case "short"_hash: {
244+
accessFieldStaticI<jshort, jint>(field);
245+
break;
246+
}
247+
case "boolean"_hash: {
248+
accessFieldStaticI<jboolean, jint>(field);
249+
break;
250+
}
251+
case "int"_hash: {
252+
accessFieldStaticI<jint, jint>(field);
253+
break;
254+
}
255+
case "float"_hash: {
256+
accessFieldStaticI<jfloat, jfloat>(field);
186257
break;
187258
}
188259
case "long"_hash: {
189-
auto data = stackTopAccessW<jlong>();
190-
stackPopW();
191-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
192-
stackPop();
193-
*reinterpret_cast<jlong *>(&obj->data[field->offset]) = data;
260+
accessFieldStaticW<jlong, jlong>(field);
194261
break;
195262
}
196263
case "double"_hash: {
197-
auto data = stackTopAccessW<jdouble>();
198-
stackPopW();
199-
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
200-
stackPop();
201-
*reinterpret_cast<jdouble *>(&obj->data[field->offset]) = data;
264+
accessFieldStaticW<jdouble, jdouble>(field);
202265
break;
203266
}
204267
default: {
205-
auto data = stackTopAccess<void *>();
206-
stackPop();
207268
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
208269
stackPop();
270+
auto target = static_cast<void *>(static_cast<uint8_t *>(field->klass->staticBlock) + field->offset);
209271
if (obj->klass->heap->ptrCompEnabled())
210272
{
211-
*reinterpret_cast<uint32_t *>(&obj->data[field->offset]) = obj->klass->heap->compressPtr(obj);
273+
*reinterpret_cast<uint32_t *>(target) = obj->klass->heap->compressPtr(obj);
212274
}
213275
else
214276
{
215-
*reinterpret_cast<void **>(&obj->data[field->offset]) = obj;
277+
*reinterpret_cast<void **>(target) = obj;
216278
}
217279
break;
218280
}

src/boot/entrypoint.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,7 @@ int boot(std::vector<std::string> args)
163163
tower->loader->loadClass("openminecraft/Test");
164164
auto cls = tower->loader->fetchClass("openminecraft/Test");
165165
logger->debug("{}", (void *)cls);
166-
pixeltower::v1::OMDebugger deb;
167-
deb.debugStack();
168-
/*
166+
169167
auto met = cls->methods;
170168
while (met != nullptr)
171169
{
@@ -176,7 +174,7 @@ int boot(std::vector<std::string> args)
176174
break;
177175
}
178176
met = met->next;
179-
}*/
177+
}
180178
tower->destroyCurrentThread();
181179
commandBuffer.clear();
182180

src/vm/pixeltower/v0/om_pixeltower_interpreter.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,24 @@ OMInterpreter::~OMInterpreter()
2424

2525
void OMInterpreter::call(OMMethod *met)
2626
{
27+
logger.info("{}.{}{}, first frame: {}", met->klass->name, met->name, met->desc,
28+
currentThread.currentFrame == nullptr);
2729
if (!currentThread.currentFrame)
2830
{
31+
currentThread.stackPointer = currentThread.stack;
2932
auto frame = (OMFrame *)((uint8_t *)currentThread.stackPointer - sizeof(OMFrame));
3033
currentThread.stackPointer = (jbyte *)currentThread.stackPointer - sizeof(OMFrame) -
3134
met->maxLocals * sizeof(void *); // allocate whole frame + locals
3235
stackPush();
3336
frame->returnAddr = (void *)0x33550336;
3437
frame->prev = nullptr;
3538
frame->method = met;
36-
3739
currentThread.currentFrame = frame;
3840
currentThread.pc = met->code;
41+
for (int i = 0; i < met->maxLocals; i++)
42+
{
43+
*localAccess<void *>(i) = nullptr;
44+
}
3945
return;
4046
}
4147

@@ -289,6 +295,14 @@ jint OMInterpreter::execute()
289295
popLastFrame();
290296
return isClinit ? 2 : 0;
291297
}
298+
case op_putstatic: {
299+
auto n = *static_cast<OMField **>(static_cast<void *>(
300+
frame->method->klass->constantPool + binary::be16ToNative(*(uint16_t *)(currentThread.pc + 1))));
301+
accessFieldStatic(n);
302+
currentThread.pc += 3;
303+
304+
return 0;
305+
}
292306
case op_putfield: {
293307
auto n = *static_cast<OMField **>(static_cast<void *>(
294308
frame->method->klass->constantPool + binary::be16ToNative(*(uint16_t *)(currentThread.pc + 1))));

0 commit comments

Comments
 (0)