Skip to content

Commit 9ba3d58

Browse files
committed
VM (new pixeltower): putfield 指令实现
1 parent 7674f64 commit 9ba3d58

5 files changed

Lines changed: 132 additions & 4 deletions

File tree

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ typedef int64_t jlong;
1111
typedef float jfloat;
1212
typedef double jdouble;
1313
typedef uint16_t jchar;
14-
typedef bool jbool;
14+
typedef bool jboolean;
1515
typedef char jbyte;
16+
typedef short jshort;
1617

1718
typedef int AccessFlags;
1819

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
#include <string>
66
namespace openminecraft::vm::pixeltower::v0
77
{
8+
class OMKlass;
89
struct OMField
910
{
1011
std::string name;
1112
std::string desc;
13+
OMKlass *klass;
1214
jint offset;
1315
AccessFlags accessFlags;
1416
};

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

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
#ifndef OM_PIXELTOWER_THREADS_HPP
22
#define OM_PIXELTOWER_THREADS_HPP
33

4+
#include "openminecraft/binary/om_bin_hash.hpp"
5+
#include "openminecraft/util/om_util_result.hpp"
6+
#include "openminecraft/vm/bytecode/om_bytecode_descriptor.hpp"
7+
#include "openminecraft/vm/err/om_validation_error.hpp"
48
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_base.hpp"
9+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_field.hpp"
510
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_frame.hpp"
11+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_oop.hpp"
12+
#include <cstdio>
613
#include <string>
714
#include <thread>
815
#include <type_traits>
16+
17+
using namespace openminecraft::binary::hash;
918
namespace openminecraft::vm::pixeltower::v0
1019
{
1120
class OMPixelTowerThread
@@ -125,6 +134,91 @@ template <typename T> inline T localAccessValueW(int idx, OMFrame *f = currentTh
125134
}
126135
}
127136

137+
inline void accessField(OMField *field)
138+
{
139+
int p = 0;
140+
auto res = bytecode::descriptor::decodeType(field->desc, &p);
141+
if (res.type == util::Err)
142+
{
143+
throw err::OMValidationError{err::Instructions, "unknown field descriptor", field->desc};
144+
}
145+
146+
switch (hash_compile_time(res.unwrap().c_str()))
147+
{
148+
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;
154+
break;
155+
}
156+
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;
162+
break;
163+
}
164+
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;
170+
break;
171+
}
172+
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+
break;
179+
}
180+
case "float"_hash: {
181+
auto data = stackTopAccess<jfloat>();
182+
stackPop();
183+
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
184+
stackPop();
185+
*reinterpret_cast<jfloat *>(&obj->data[field->offset]) = data;
186+
break;
187+
}
188+
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;
194+
break;
195+
}
196+
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;
202+
break;
203+
}
204+
default: {
205+
auto data = stackTopAccess<void *>();
206+
stackPop();
207+
auto obj = static_cast<OMOOPDesc *>(stackTopAccess<void *>());
208+
stackPop();
209+
if (obj->klass->heap->ptrCompEnabled())
210+
{
211+
*reinterpret_cast<uint32_t *>(&obj->data[field->offset]) = obj->klass->heap->compressPtr(obj);
212+
}
213+
else
214+
{
215+
*reinterpret_cast<void **>(&obj->data[field->offset]) = obj;
216+
}
217+
break;
218+
}
219+
}
220+
}
221+
128222
} // namespace openminecraft::vm::pixeltower::v0
129223

130224
#endif

src/vm/pixeltower/v0/om_pixeltower_interpreter.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "openminecraft/log/om_log_common.hpp"
44
#include "openminecraft/vm/bytecode/om_bytecodes.hpp"
55
#include "openminecraft/vm/pixeltower/v0/om_pixeltower.hpp"
6+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_field.hpp"
67
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_frame.hpp"
78
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
89
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp"
@@ -288,6 +289,14 @@ jint OMInterpreter::execute()
288289
popLastFrame();
289290
return isClinit ? 2 : 0;
290291
}
292+
case op_putfield: {
293+
auto n = *static_cast<OMField **>(static_cast<void *>(
294+
frame->method->klass->constantPool + binary::be16ToNative(*(uint16_t *)(currentThread.pc + 1))));
295+
accessField(n);
296+
currentThread.pc += 3;
297+
298+
return 0;
299+
}
291300
case op_invokevirtual: {
292301
auto n = *static_cast<OMMethod **>(static_cast<void *>(
293302
frame->method->klass->constantPool + binary::be16ToNative(*(uint16_t *)(currentThread.pc + 1))));
@@ -310,6 +319,7 @@ jint OMInterpreter::execute()
310319
return 0;
311320
}
312321
default: {
322+
endExec:
313323
logger.debug("unknown operand at {}", (void *)currentThread.pc);
314324
logger.debug("thread {}", (void *)&currentThread.id);
315325
logger.debug("pc pointed at {} ({}.{}{} + {})", (void *)currentThread.pc,

src/vm/pixeltower/v0/om_pixeltower_klassloader.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ void OMKlassLoader::loadClass(std::string name)
172172
for (auto field : klass->raw->fields)
173173
{
174174
klass->fields.push_back({klass->raw->mapping[field->nameIndex]->to<classfile::OMClassConstantUtf8>()->data,
175-
klass->raw->mapping[field->descIndex]->to<classfile::OMClassConstantUtf8>()->data, 0,
176-
field->accessFlags});
175+
klass->raw->mapping[field->descIndex]->to<classfile::OMClassConstantUtf8>()->data,
176+
klass, 0, field->accessFlags});
177177
}
178178

179179
klass->constantPool = (uint64_t *)mem::allocator::tracedCallocVMData(klass->raw->mapping.size(), sizeof(uint64_t));
@@ -226,10 +226,31 @@ void OMKlassLoader::loadClass(std::string name)
226226
}
227227
break;
228228
}
229+
case classfile::OMClassConstantType::FieldRef: {
230+
auto temp = cppair.second->to<classfile::OMClassConstantFieldRef>();
231+
auto &clsname =
232+
klass->raw
233+
->mapping[klass->raw->mapping[temp->classIndex]->to<classfile::OMClassConstantClass>()->nameIndex]
234+
->to<classfile::OMClassConstantUtf8>()
235+
->data;
236+
loadClass(clsname);
237+
auto temp2 = klass->raw->mapping[temp->nameAndTypeIndex]->to<classfile::OMClassConstantNameAndType>();
238+
auto &name = klass->raw->mapping[temp2->nameIndex]->to<classfile::OMClassConstantUtf8>()->data;
239+
auto &desc = klass->raw->mapping[temp2->descIndex]->to<classfile::OMClassConstantUtf8>()->data;
240+
241+
for (auto &fi : fetchClass(clsname)->fields)
242+
{
243+
if (fi.name == name && fi.desc == desc)
244+
{
245+
*(OMField **)acc = &fi;
246+
break;
247+
}
248+
}
249+
break;
250+
}
229251

230252
case classfile::OMClassConstantType::Utf8:
231253
case classfile::OMClassConstantType::String:
232-
case classfile::OMClassConstantType::FieldRef:
233254
case classfile::OMClassConstantType::InterfaceMethodRef:
234255
case classfile::OMClassConstantType::NameAndType:
235256
case classfile::OMClassConstantType::MethodHandle:

0 commit comments

Comments
 (0)