@@ -265,11 +265,23 @@ impl Jvm {
265265 where
266266 T : From < JavaValue > ,
267267 {
268- tracing:: trace!( "Get field {}.{name}:{descriptor}" , instance. class_definition( ) . name( ) ) ;
268+ self . get_field_from_class ( instance, & instance. class_definition ( ) . name ( ) , name, descriptor)
269+ . await
270+ }
269271
270- let field = self . find_field ( & * instance. class_definition ( ) , name, descriptor) ?;
272+ pub async fn get_field_from_class < T > ( & self , instance : & Box < dyn ClassInstance > , class_name : & str , name : & str , descriptor : & str ) -> Result < T >
273+ where
274+ T : From < JavaValue > ,
275+ {
276+ tracing:: trace!( "Get field {class_name}.{name}:{descriptor}" ) ;
271277
272- if let Some ( field) = field {
278+ let class = self . resolve_class ( class_name) . await ?;
279+ if let Some ( ( _, field) ) = self . resolve_field ( & class, name, descriptor) {
280+ if field. access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
281+ return Err ( self
282+ . exception ( "java/lang/IncompatibleClassChangeError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
283+ . await ) ;
284+ }
273285 let value = instance. get_field ( & * field) ?;
274286 if let JavaValue :: Object ( Some ( instance) ) = & value {
275287 let thread_id = ( self . inner . get_current_thread_id ) ( ) ;
@@ -285,10 +297,7 @@ impl Jvm {
285297 Ok ( value. into ( ) )
286298 } else {
287299 Err ( self
288- . exception (
289- "java/lang/NoSuchFieldError" ,
290- & format ! ( "{}.{}:{}" , instance. class_definition( ) . name( ) , name, descriptor) ,
291- )
300+ . exception ( "java/lang/NoSuchFieldError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
292301 . await )
293302 }
294303 }
@@ -297,18 +306,34 @@ impl Jvm {
297306 where
298307 T : Into < JavaValue > + Debug ,
299308 {
300- tracing:: trace!( "Put field {}.{name}:{descriptor} = {value:?}" , instance. class_definition( ) . name( ) ) ;
309+ self . put_field_from_class ( instance, & instance. class_definition ( ) . name ( ) , name, descriptor, value)
310+ . await
311+ }
301312
302- let field = self . find_field ( & * instance. class_definition ( ) , name, descriptor) ?;
313+ pub async fn put_field_from_class < T > (
314+ & self ,
315+ instance : & mut Box < dyn ClassInstance > ,
316+ class_name : & str ,
317+ name : & str ,
318+ descriptor : & str ,
319+ value : T ,
320+ ) -> Result < ( ) >
321+ where
322+ T : Into < JavaValue > + Debug ,
323+ {
324+ tracing:: trace!( "Put field {class_name}.{name}:{descriptor} = {value:?}" ) ;
303325
304- if let Some ( field) = field {
326+ let class = self . resolve_class ( class_name) . await ?;
327+ if let Some ( ( _, field) ) = self . resolve_field ( & class, name, descriptor) {
328+ if field. access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
329+ return Err ( self
330+ . exception ( "java/lang/IncompatibleClassChangeError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
331+ . await ) ;
332+ }
305333 instance. put_field ( & * field, value. into ( ) )
306334 } else {
307335 Err ( self
308- . exception (
309- "java/lang/NoSuchFieldError" ,
310- & format ! ( "{}.{}:{}" , instance. class_definition( ) . name( ) , name, descriptor) ,
311- )
336+ . exception ( "java/lang/NoSuchFieldError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
312337 . await )
313338 }
314339 }
0 commit comments