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+
137154inline 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 }
0 commit comments