@@ -261,15 +261,19 @@ impl Jvm {
261261 }
262262 }
263263
264- pub async fn get_field < T > ( & self , instance : & Box < dyn ClassInstance > , name : & str , descriptor : & str ) -> Result < T >
264+ pub async fn get_field < T > ( & self , instance : & Box < dyn ClassInstance > , class_name : & str , name : & str , descriptor : & str ) -> Result < T >
265265 where
266266 T : From < JavaValue > ,
267267 {
268- tracing:: trace!( "Get field {}.{name}:{descriptor}" , instance . class_definition ( ) . name ( ) ) ;
268+ tracing:: trace!( "Get field {class_name }.{name}:{descriptor}" ) ;
269269
270- let field = self . find_field ( & * instance. class_definition ( ) , name, descriptor) ?;
271-
272- if let Some ( field) = field {
270+ let class = self . resolve_class ( class_name) . await ?;
271+ if let Some ( ( _, field) ) = self . resolve_field ( & class, name, descriptor) {
272+ if field. access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
273+ return Err ( self
274+ . exception ( "java/lang/IncompatibleClassChangeError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
275+ . await ) ;
276+ }
273277 let value = instance. get_field ( & * field) ?;
274278 if let JavaValue :: Object ( Some ( instance) ) = & value {
275279 let thread_id = ( self . inner . get_current_thread_id ) ( ) ;
@@ -285,30 +289,28 @@ impl Jvm {
285289 Ok ( value. into ( ) )
286290 } else {
287291 Err ( self
288- . exception (
289- "java/lang/NoSuchFieldError" ,
290- & format ! ( "{}.{}:{}" , instance. class_definition( ) . name( ) , name, descriptor) ,
291- )
292+ . exception ( "java/lang/NoSuchFieldError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
292293 . await )
293294 }
294295 }
295296
296- pub async fn put_field < T > ( & self , instance : & mut Box < dyn ClassInstance > , name : & str , descriptor : & str , value : T ) -> Result < ( ) >
297+ pub async fn put_field < T > ( & self , instance : & mut Box < dyn ClassInstance > , class_name : & str , name : & str , descriptor : & str , value : T ) -> Result < ( ) >
297298 where
298299 T : Into < JavaValue > + Debug ,
299300 {
300- tracing:: trace!( "Put field {}.{name}:{descriptor} = {value:?}" , instance . class_definition ( ) . name ( ) ) ;
301+ tracing:: trace!( "Put field {class_name }.{name}:{descriptor} = {value:?}" ) ;
301302
302- let field = self . find_field ( & * instance. class_definition ( ) , name, descriptor) ?;
303-
304- if let Some ( field) = field {
303+ let class = self . resolve_class ( class_name) . await ?;
304+ if let Some ( ( _, field) ) = self . resolve_field ( & class, name, descriptor) {
305+ if field. access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
306+ return Err ( self
307+ . exception ( "java/lang/IncompatibleClassChangeError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
308+ . await ) ;
309+ }
305310 instance. put_field ( & * field, value. into ( ) )
306311 } else {
307312 Err ( self
308- . exception (
309- "java/lang/NoSuchFieldError" ,
310- & format ! ( "{}.{}:{}" , instance. class_definition( ) . name( ) , name, descriptor) ,
311- )
313+ . exception ( "java/lang/NoSuchFieldError" , & format ! ( "{class_name}.{name}:{descriptor}" ) )
312314 . await )
313315 }
314316 }
@@ -1099,7 +1101,7 @@ impl Jvm {
10991101 . get_mut ( & thread_id)
11001102 . unwrap ( )
11011103 . set_java_thread ( java_thread. clone ( ) ) ;
1102- let interrupted: bool = self . get_field ( & java_thread, "interrupted" , "Z" ) . await ?;
1104+ let interrupted: bool = self . get_field ( & java_thread, "java/lang/Thread" , " interrupted", "Z" ) . await ?;
11031105 self . inner . threads . write ( ) . get_mut ( & thread_id) . unwrap ( ) . interrupted |= interrupted;
11041106
11051107 Ok ( ( ) )
0 commit comments