11use alloc:: vec;
22
33use java_class_proto:: { JavaFieldProto , JavaMethodProto } ;
4- use jvm:: { ClassInstanceRef , Jvm , Result , runtime:: JavaLangString } ;
4+ use java_constants:: { FieldAccessFlags , MethodAccessFlags } ;
5+ use jvm:: { ClassInstanceRef , JavaChar , Jvm , Result , runtime:: JavaLangString } ;
56
67use crate :: { FileType , RuntimeClassProto , RuntimeContext , classes:: java:: lang:: String } ;
78
@@ -15,6 +16,7 @@ impl File {
1516 parent_class : Some ( "java/lang/Object" ) ,
1617 interfaces : vec ! [ ] ,
1718 methods : vec ! [
19+ JavaMethodProto :: new( "<clinit>" , "()V" , Self :: clinit, MethodAccessFlags :: STATIC ) ,
1820 JavaMethodProto :: new( "<init>" , "(Ljava/lang/String;)V" , Self :: init, Default :: default ( ) ) ,
1921 JavaMethodProto :: new( "getPath" , "()Ljava/lang/String;" , Self :: get_path, Default :: default ( ) ) ,
2022 JavaMethodProto :: new( "exists" , "()Z" , Self :: exists, Default :: default ( ) ) ,
@@ -23,11 +25,63 @@ impl File {
2325 JavaMethodProto :: new( "delete" , "()Z" , Self :: delete, Default :: default ( ) ) ,
2426 JavaMethodProto :: new( "length" , "()J" , Self :: length, Default :: default ( ) ) ,
2527 ] ,
26- fields : vec ! [ JavaFieldProto :: new( "path" , "Ljava/lang/String;" , Default :: default ( ) ) ] ,
28+ fields : vec ! [
29+ JavaFieldProto :: new(
30+ "separatorChar" ,
31+ "C" ,
32+ FieldAccessFlags :: PUBLIC | FieldAccessFlags :: STATIC | FieldAccessFlags :: FINAL ,
33+ ) ,
34+ JavaFieldProto :: new(
35+ "separator" ,
36+ "Ljava/lang/String;" ,
37+ FieldAccessFlags :: PUBLIC | FieldAccessFlags :: STATIC | FieldAccessFlags :: FINAL ,
38+ ) ,
39+ JavaFieldProto :: new(
40+ "pathSeparatorChar" ,
41+ "C" ,
42+ FieldAccessFlags :: PUBLIC | FieldAccessFlags :: STATIC | FieldAccessFlags :: FINAL ,
43+ ) ,
44+ JavaFieldProto :: new(
45+ "pathSeparator" ,
46+ "Ljava/lang/String;" ,
47+ FieldAccessFlags :: PUBLIC | FieldAccessFlags :: STATIC | FieldAccessFlags :: FINAL ,
48+ ) ,
49+ JavaFieldProto :: new( "path" , "Ljava/lang/String;" , Default :: default ( ) ) ,
50+ ] ,
2751 access_flags : Default :: default ( ) ,
2852 }
2953 }
3054
55+ async fn clinit ( jvm : & Jvm , _: & mut RuntimeContext ) -> Result < ( ) > {
56+ tracing:: debug!( "java.io.File::<clinit>()" ) ;
57+
58+ let separator_char = if cfg ! ( windows) { '\\' } else { '/' } ;
59+ let separator = if cfg ! ( windows) { "\\ " } else { "/" } ;
60+ let path_separator_char = if cfg ! ( windows) { ';' } else { ':' } ;
61+ let path_separator = if cfg ! ( windows) { ";" } else { ":" } ;
62+
63+ jvm. put_static_field ( "java/io/File" , "separatorChar" , "C" , separator_char as JavaChar )
64+ . await ?;
65+ jvm. put_static_field (
66+ "java/io/File" ,
67+ "separator" ,
68+ "Ljava/lang/String;" ,
69+ JavaLangString :: from_rust_string ( jvm, separator) . await ?,
70+ )
71+ . await ?;
72+ jvm. put_static_field ( "java/io/File" , "pathSeparatorChar" , "C" , path_separator_char as JavaChar )
73+ . await ?;
74+ jvm. put_static_field (
75+ "java/io/File" ,
76+ "pathSeparator" ,
77+ "Ljava/lang/String;" ,
78+ JavaLangString :: from_rust_string ( jvm, path_separator) . await ?,
79+ )
80+ . await ?;
81+
82+ Ok ( ( ) )
83+ }
84+
3185 async fn init ( jvm : & Jvm , _: & mut RuntimeContext , mut this : ClassInstanceRef < Self > , pathname : ClassInstanceRef < String > ) -> Result < ( ) > {
3286 tracing:: debug!( "java.io.File::<init>({this:?}, {pathname:?})" ) ;
3387
0 commit comments