|
@@ -20,9 +20,9 @@ class hxb_reader
|
|
|
val mutable abstracts = Array.make 0 null_abstract
|
|
|
val mutable enums = Array.make 0 null_enum
|
|
|
val mutable typedefs = Array.make 0 null_typedef
|
|
|
- val mutable class_fields = Array.make 0 null_class_field
|
|
|
- val mutable abstract_fields = Array.make 0 null_abstract_field
|
|
|
- val mutable enum_fields = Array.make 0 null_enum_field
|
|
|
+ (* val mutable class_fields = Array.make 0 null_class_field *)
|
|
|
+ (* val mutable abstract_fields = Array.make 0 null_abstract_field *)
|
|
|
+ (* val mutable enum_fields = Array.make 0 null_enum_field *)
|
|
|
|
|
|
val vars = Hashtbl.create 0
|
|
|
(* val mutable vars = Array.make 0 null_tvar *)
|
|
@@ -107,10 +107,10 @@ class hxb_reader
|
|
|
(pack,name)
|
|
|
|
|
|
method read_full_path =
|
|
|
- let pack = self#read_list8 (fun () -> self#read_string) in
|
|
|
+ let pack = self#read_list16 (fun () -> self#read_string) in
|
|
|
let mname = self#read_string in
|
|
|
let tname = self#read_string in
|
|
|
- Printf.eprintf " Read full path %s.%s.%s\n" (ExtString.String.join "." pack) mname tname;
|
|
|
+ Printf.eprintf " Read full path %s\n" (ExtString.String.join "." (pack @ [mname; tname]));
|
|
|
(pack,mname,tname)
|
|
|
|
|
|
method read_documentation =
|
|
@@ -171,19 +171,19 @@ class hxb_reader
|
|
|
enums.(i)
|
|
|
|
|
|
method read_typedef_ref =
|
|
|
- typedefs.(self#read_uleb128)
|
|
|
+ let i = self#read_uleb128 in
|
|
|
+ typedefs.(i)
|
|
|
|
|
|
- method read_field_ref =
|
|
|
+ method read_field_ref fields =
|
|
|
let name = self#read_string in
|
|
|
- Printf.eprintf " TODO: resolve field %s...\n" name;
|
|
|
- null_field (* TODO *)
|
|
|
+ try PMap.find name fields with e ->
|
|
|
+ Printf.eprintf " TODO error reading field ref for %s\n" name;
|
|
|
+ (* raise e *)
|
|
|
+ null_field
|
|
|
|
|
|
method read_enum_field_ref =
|
|
|
assert false (* TODO *)
|
|
|
|
|
|
- method read_anon_field_ref =
|
|
|
- assert false (* TODO *)
|
|
|
-
|
|
|
(* Type instances *)
|
|
|
|
|
|
method read_type_instance =
|
|
@@ -198,7 +198,9 @@ class hxb_reader
|
|
|
(* Printf.eprintf " Get field type param %d\n" i; *)
|
|
|
(field_type_parameters.(i)).ttp_type
|
|
|
| 6 ->
|
|
|
- (type_type_parameters.(self#read_uleb128)).ttp_type
|
|
|
+ let i = self#read_uleb128 in
|
|
|
+ (* Printf.eprintf " Get type type param %d\n" i; *)
|
|
|
+ (type_type_parameters.(i)).ttp_type
|
|
|
| 10 ->
|
|
|
TInst(self#read_class_ref,[])
|
|
|
| 11 ->
|
|
@@ -215,21 +217,28 @@ class hxb_reader
|
|
|
let c = self#read_class_ref in
|
|
|
let tl = self#read_types in
|
|
|
TInst(c,tl)
|
|
|
- | 15
|
|
|
- | 16
|
|
|
+ | 15 ->
|
|
|
+ let e = self#read_enum_ref in
|
|
|
+ let tl = self#read_types in
|
|
|
+ TEnum(e,tl)
|
|
|
+ | 16 ->
|
|
|
+ let t = self#read_typedef_ref in
|
|
|
+ let tl = self#read_types in
|
|
|
+ TType(t,tl)
|
|
|
| 17 ->
|
|
|
- ignore(self#read_uleb128);
|
|
|
- let _ = self#read_types in
|
|
|
- Printf.eprintf " TODO TAbstract\n";
|
|
|
- t_dynamic (* TODO *)
|
|
|
+ let a = self#read_abstract_ref in
|
|
|
+ let tl = self#read_types in
|
|
|
+ TAbstract(a,tl)
|
|
|
| 32 ->
|
|
|
let f () =
|
|
|
let name = self#read_string in
|
|
|
+ (* Printf.eprintf " Read type instance for %s\n" name; *)
|
|
|
let opt = self#read_bool in
|
|
|
let t = self#read_type_instance in
|
|
|
(name,opt,t)
|
|
|
in
|
|
|
let args = self#read_list16 f in
|
|
|
+ (* Printf.eprintf " Read type instance for TFun\n"; *)
|
|
|
let ret = self#read_type_instance in
|
|
|
TFun(args,ret)
|
|
|
| 40 ->
|
|
@@ -255,10 +264,10 @@ class hxb_reader
|
|
|
let a = Array.init l (fun _ ->
|
|
|
let name = self#read_string in
|
|
|
let pos = self#read_pos in
|
|
|
- (* Printf.eprintf " Read ttp pos for %s: %s\n" name (Printer.s_pos pos); *)
|
|
|
- (* Printf.eprintf " - Path was %s\n" (s_type_path path); *)
|
|
|
+ Printf.eprintf " Read ttp pos for %s: %s\n" name (Printer.s_pos pos);
|
|
|
+ Printf.eprintf " - Path was %s\n" (s_type_path path);
|
|
|
|
|
|
- (* This is wrong for field ttp *)
|
|
|
+ (* This is wrong for field ttp (why again?) *)
|
|
|
let c = mk_class m (fst path @ [snd path],name) pos pos in
|
|
|
mk_type_param name (TInst(c,[])) None
|
|
|
) in
|
|
@@ -367,31 +376,6 @@ class hxb_reader
|
|
|
(* let e = self#read_texpr in *)
|
|
|
(* (v,e) *)
|
|
|
|
|
|
- method read_tfield_access =
|
|
|
- match IO.read_byte ch with
|
|
|
- | 0 ->
|
|
|
- let c = self#read_class_ref in
|
|
|
- let tl = self#read_types in
|
|
|
- let cf = self#read_field_ref in
|
|
|
- FInstance(c,tl,cf)
|
|
|
- | 1 ->
|
|
|
- let c = self#read_class_ref in
|
|
|
- let cf = self#read_field_ref in
|
|
|
- FStatic(c,cf)
|
|
|
- | 2 -> FAnon(self#read_anon_field_ref)
|
|
|
- | 3 -> FDynamic(self#read_string)
|
|
|
- | 4 -> FClosure(None,self#read_field_ref)
|
|
|
- | 5 ->
|
|
|
- let c = self#read_class_ref in
|
|
|
- let tl = self#read_types in
|
|
|
- let cf = self#read_field_ref in
|
|
|
- FClosure(Some(c,tl),cf)
|
|
|
- | 6 ->
|
|
|
- let en = self#read_enum_ref in
|
|
|
- let ef = self#read_enum_field_ref in
|
|
|
- FEnum(en,ef)
|
|
|
- | _ -> assert false
|
|
|
-
|
|
|
method read_var_kind =
|
|
|
match IO.read_byte ch with
|
|
|
| 0 -> VUser TVOLocalVariable
|
|
@@ -554,12 +538,12 @@ class hxb_reader
|
|
|
let e1 = self#read_texpr in
|
|
|
let c = self#read_class_ref in
|
|
|
let tl = self#read_types in
|
|
|
- let cf = self#read_field_ref in
|
|
|
+ let cf = self#read_field_ref c.cl_fields in
|
|
|
TField(e1,FInstance(c,tl,cf))
|
|
|
| 103 ->
|
|
|
let e1 = self#read_texpr in
|
|
|
let c = self#read_class_ref in
|
|
|
- let cf = self#read_field_ref in
|
|
|
+ let cf = self#read_field_ref c.cl_statics in
|
|
|
TField(e1,FStatic(c,cf))
|
|
|
| 104 ->
|
|
|
let e1 = self#read_texpr in
|
|
@@ -570,7 +554,7 @@ class hxb_reader
|
|
|
let e1 = self#read_texpr in
|
|
|
let c = self#read_class_ref in
|
|
|
let tl = self#read_types in
|
|
|
- let cf = self#read_field_ref in
|
|
|
+ let cf = self#read_field_ref c.cl_fields in
|
|
|
TField(e1,FClosure(Some(c,tl),cf))
|
|
|
| 106 ->
|
|
|
let e1 = self#read_texpr in
|
|
@@ -686,11 +670,14 @@ class hxb_reader
|
|
|
|
|
|
method read_class_field (m : module_def) : tclass_field =
|
|
|
let name = self#read_string in
|
|
|
+ Printf.eprintf " field type parameters for %s\n" name;
|
|
|
self#read_type_parameters m ([],name) (fun a ->
|
|
|
field_type_parameters <- a
|
|
|
);
|
|
|
let params = Array.to_list field_type_parameters in
|
|
|
+ (* Printf.eprintf " read type instance for %s\n" name; *)
|
|
|
let t = self#read_type_instance in
|
|
|
+ (* Printf.eprintf " flags for %s (done) \n" name; *)
|
|
|
let flags = IO.read_i32 ch in
|
|
|
let pos = self#read_pos in
|
|
|
let name_pos = self#read_pos in
|
|
@@ -728,6 +715,8 @@ class hxb_reader
|
|
|
| _ ->
|
|
|
type_type_parameters <- Array.of_list c.cl_params
|
|
|
end;
|
|
|
+ Printf.eprintf " read class fields with type parameters for %s: %d\n" (snd c.cl_path) (Array.length type_type_parameters);
|
|
|
+ Printf.eprintf " own class params: %d\n" (List.length c.cl_params);
|
|
|
c.cl_constructor <- self#read_option f;
|
|
|
c.cl_ordered_fields <- self#read_list16 f;
|
|
|
c.cl_ordered_statics <- self#read_list16 f;
|
|
@@ -740,7 +729,9 @@ class hxb_reader
|
|
|
(* TODO: fix that *)
|
|
|
(* infos.mt_doc <- self#read_option (fun () -> self#read_documentation); *)
|
|
|
infos.mt_meta <- self#read_metadata;
|
|
|
+ Printf.eprintf " read type parameters for %s\n" (snd infos.mt_path);
|
|
|
self#read_type_parameters m infos.mt_path (fun a ->
|
|
|
+ Printf.eprintf " read type parameters for %s: %d\n" (snd infos.mt_path) (Array.length a);
|
|
|
type_type_parameters <- a
|
|
|
);
|
|
|
infos.mt_params <- Array.to_list type_type_parameters;
|
|
@@ -790,34 +781,47 @@ class hxb_reader
|
|
|
c.cl_array_access <- self#read_option (fun () -> self#read_type_instance);
|
|
|
|
|
|
method read_abstract (m : module_def) (a : tabstract) =
|
|
|
+ Printf.eprintf " Read abstract %s\n" (snd a.a_path);
|
|
|
self#read_common_module_type m (Obj.magic a);
|
|
|
+ Printf.eprintf "1";
|
|
|
a.a_impl <- self#read_option (fun () -> self#read_class_ref);
|
|
|
+ Printf.eprintf "2";
|
|
|
a.a_this <- self#read_type_instance;
|
|
|
+ Printf.eprintf "3";
|
|
|
a.a_from <- self#read_list16 (fun () -> self#read_type_instance);
|
|
|
+ Printf.eprintf "4";
|
|
|
a.a_from_field <- self#read_list16 (fun () ->
|
|
|
let name = self#read_string in
|
|
|
self#read_type_parameters m ([],name) (fun a ->
|
|
|
field_type_parameters <- a
|
|
|
);
|
|
|
let t = self#read_type_instance in
|
|
|
- let cf = self#read_field_ref in
|
|
|
+ let cf = self#read_field_ref (Option.get a.a_impl).cl_statics in
|
|
|
(t,cf)
|
|
|
);
|
|
|
+ Printf.eprintf "5";
|
|
|
a.a_to <- self#read_list16 (fun () -> self#read_type_instance);
|
|
|
+ Printf.eprintf "6";
|
|
|
a.a_to_field <- self#read_list16 (fun () ->
|
|
|
let name = self#read_string in
|
|
|
self#read_type_parameters m ([],name) (fun a ->
|
|
|
field_type_parameters <- a
|
|
|
);
|
|
|
let t = self#read_type_instance in
|
|
|
- let cf = self#read_field_ref in
|
|
|
+ let cf = self#read_field_ref (Option.get a.a_impl).cl_fields in
|
|
|
(t,cf)
|
|
|
);
|
|
|
- a.a_array <- self#read_list16 (fun () -> self#read_field_ref);
|
|
|
- a.a_read <- self#read_option (fun () -> self#read_field_ref);
|
|
|
- a.a_write <- self#read_option (fun () -> self#read_field_ref);
|
|
|
- a.a_call <- self#read_option (fun () -> self#read_field_ref);
|
|
|
+ Printf.eprintf "7";
|
|
|
+ a.a_array <- self#read_list16 (fun () -> self#read_field_ref (Option.get a.a_impl).cl_statics);
|
|
|
+ Printf.eprintf "8";
|
|
|
+ a.a_read <- self#read_option (fun () -> self#read_field_ref (Option.get a.a_impl).cl_fields);
|
|
|
+ Printf.eprintf "9";
|
|
|
+ a.a_write <- self#read_option (fun () -> self#read_field_ref (Option.get a.a_impl).cl_fields);
|
|
|
+ Printf.eprintf "10";
|
|
|
+ a.a_call <- self#read_option (fun () -> self#read_field_ref (Option.get a.a_impl).cl_fields);
|
|
|
+ Printf.eprintf "11";
|
|
|
a.a_enum <- self#read_bool;
|
|
|
+ Printf.eprintf "12\n";
|
|
|
|
|
|
method read_enum (m : module_def) (e : tenum) =
|
|
|
(* TODO *)
|
|
@@ -917,7 +921,7 @@ class hxb_reader
|
|
|
let l = self#read_uleb128 in
|
|
|
enums <- (Array.init l (fun i ->
|
|
|
let (pack,mname,tname) = self#read_full_path in
|
|
|
- (* Printf.eprintf " Read enmr %d of %d for abstract %s\n" i l tname; *)
|
|
|
+ Printf.eprintf " Read enmr %d of %d for abstract %s\n" i l tname;
|
|
|
match resolve_type pack mname tname with
|
|
|
| TEnumDecl en ->
|
|
|
en
|
|
@@ -929,7 +933,7 @@ class hxb_reader
|
|
|
let l = self#read_uleb128 in
|
|
|
typedefs <- (Array.init l (fun i ->
|
|
|
let (pack,mname,tname) = self#read_full_path in
|
|
|
- (* Printf.eprintf " Read absr %d of %d for abstract %s\n" i l tname; *)
|
|
|
+ Printf.eprintf " Read tpdr %d of %d for typedef %s.%s\n" i l mname tname;
|
|
|
match resolve_type pack mname tname with
|
|
|
| TTypeDecl tpd ->
|
|
|
tpd
|
|
@@ -989,7 +993,7 @@ class hxb_reader
|
|
|
) chunks in
|
|
|
let rec pass_0 chunks = match chunks with
|
|
|
| [] ->
|
|
|
- raise (HxbFailure "Missing HHDR chunk")
|
|
|
+ error "Missing HHDR chunk"
|
|
|
| (kind,data) :: chunks ->
|
|
|
ch <- IO.input_bytes data;
|
|
|
match kind with
|
|
@@ -1011,11 +1015,11 @@ class hxb_reader
|
|
|
(* ) doc_pool; *)
|
|
|
pass_0 chunks
|
|
|
| _ ->
|
|
|
- raise (HxbFailure ("Unexpected early chunk: " ^ (string_of_chunk_kind kind)))
|
|
|
+ error ("Unexpected early chunk: " ^ (string_of_chunk_kind kind))
|
|
|
in
|
|
|
let m,chunks = pass_0 chunks in
|
|
|
List.iter (fun (kind,data) ->
|
|
|
- (* Printf.eprintf "Reading chunk %s\n" (string_of_chunk_kind kind); *)
|
|
|
+ Printf.eprintf " Reading chunk %s\n" (string_of_chunk_kind kind);
|
|
|
ch <- IO.input_bytes data;
|
|
|
match kind with
|
|
|
| TYPF ->
|
|
@@ -1029,18 +1033,18 @@ class hxb_reader
|
|
|
self#read_enmr;
|
|
|
| TPDR ->
|
|
|
self#read_tpdr;
|
|
|
+ | ABSD ->
|
|
|
+ self#read_absd m;
|
|
|
| CLSD ->
|
|
|
self#read_clsd m;
|
|
|
| CFLD ->
|
|
|
self#read_cfld m;
|
|
|
- | ABSD ->
|
|
|
- self#read_absd m;
|
|
|
| ENMD ->
|
|
|
self#read_enmd m;
|
|
|
| TPDD ->
|
|
|
self#read_tpdd m;
|
|
|
| _ ->
|
|
|
- raise (HxbFailure ("Unexpected late chunk: " ^ (string_of_chunk_kind kind)))
|
|
|
+ error ("Unexpected late chunk: " ^ (string_of_chunk_kind kind))
|
|
|
) chunks;
|
|
|
m
|
|
|
end
|