|
@@ -33,6 +33,7 @@ class hxb_reader
|
|
|
val vars = Hashtbl.create 0
|
|
|
val mutable type_type_parameters = Array.make 0 (mk_type_param "" t_dynamic None)
|
|
|
val mutable field_type_parameters = Array.make 0 (mk_type_param "" t_dynamic None)
|
|
|
+ val mutable local_type_parameters = []
|
|
|
|
|
|
val mutable tvoid = None
|
|
|
method get_tvoid =
|
|
@@ -594,6 +595,18 @@ class hxb_reader
|
|
|
let i = self#read_uleb128 in
|
|
|
(* Printf.eprintf " Get type type param %d\n" i; *)
|
|
|
(type_type_parameters.(i)).ttp_type
|
|
|
+ | 7 ->
|
|
|
+ let k = self#read_uleb128 in
|
|
|
+ let i = self#read_uleb128 in
|
|
|
+ let rec loop left params = match params with
|
|
|
+ | _ :: params when left > 0 ->
|
|
|
+ loop (left - 1) params
|
|
|
+ | params :: _ ->
|
|
|
+ params.(i).ttp_type
|
|
|
+ | _ ->
|
|
|
+ error (Printf.sprintf "Bad index into local params: %i" k)
|
|
|
+ in
|
|
|
+ loop k local_type_parameters
|
|
|
| 10 ->
|
|
|
TInst(self#read_class_ref,[])
|
|
|
| 11 ->
|
|
@@ -735,6 +748,7 @@ class hxb_reader
|
|
|
let args = self#read_list (fun () -> self#read_tfunction_arg) in
|
|
|
let r = self#read_type_instance in
|
|
|
let e = self#read_texpr in
|
|
|
+ let args = List.map (fun ((v,close),cto) -> close(); (v,cto)) args in
|
|
|
{
|
|
|
tf_args = args;
|
|
|
tf_type = r;
|
|
@@ -757,17 +771,24 @@ class hxb_reader
|
|
|
| _ -> assert false
|
|
|
|
|
|
method read_var =
|
|
|
+ let close = ref (fun () -> ()) in (* TODO: awkward *)
|
|
|
let id = IO.read_i32 ch in
|
|
|
let name = self#read_string in
|
|
|
- let t = self#read_type_instance in
|
|
|
- let kind = self#read_var_kind in
|
|
|
let extra = self#read_option (fun () ->
|
|
|
+ let params = ref [] in
|
|
|
+ self#read_type_parameters null_module ([],name) (fun a ->
|
|
|
+ local_type_parameters <- a :: local_type_parameters;
|
|
|
+ params := Array.to_list a;
|
|
|
+ close := (fun () -> local_type_parameters <- List.tl local_type_parameters)
|
|
|
+ );
|
|
|
let vexpr = self#read_option (fun () -> self#read_texpr) in
|
|
|
{
|
|
|
- v_params = []; (* TODO *)
|
|
|
+ v_params = !params;
|
|
|
v_expr = vexpr;
|
|
|
};
|
|
|
) in
|
|
|
+ let t = self#read_type_instance in
|
|
|
+ let kind = self#read_var_kind in
|
|
|
let flags = IO.read_i32 ch in
|
|
|
let meta = self#read_metadata in
|
|
|
let pos = self#read_pos in
|
|
@@ -782,7 +803,7 @@ class hxb_reader
|
|
|
v_flags = flags;
|
|
|
} in
|
|
|
Hashtbl.add vars id v;
|
|
|
- v
|
|
|
+ v,!close
|
|
|
|
|
|
method read_texpr =
|
|
|
let t = self#read_type_instance in
|
|
@@ -803,10 +824,14 @@ class hxb_reader
|
|
|
|
|
|
(* vars 20-29 *)
|
|
|
| 20 -> TLocal (Hashtbl.find vars (IO.read_i32 ch))
|
|
|
- | 21 -> TVar (self#read_var,None)
|
|
|
+ | 21 ->
|
|
|
+ let v,close = self#read_var in
|
|
|
+ close();
|
|
|
+ TVar (v,None)
|
|
|
| 22 ->
|
|
|
- let v = self#read_var in
|
|
|
+ let v,close = self#read_var in
|
|
|
let e = self#read_texpr in
|
|
|
+ close();
|
|
|
TVar (v, Some e)
|
|
|
|
|
|
(* blocks 30-49 *)
|
|
@@ -887,8 +912,9 @@ class hxb_reader
|
|
|
| 83 ->
|
|
|
let e1 = self#read_texpr in
|
|
|
let catches = self#read_list (fun () ->
|
|
|
- let v = self#read_var in
|
|
|
+ let v,close = self#read_var in
|
|
|
let e = self#read_texpr in
|
|
|
+ close();
|
|
|
(v,e)
|
|
|
) in
|
|
|
TTry(e1,catches)
|
|
@@ -901,9 +927,10 @@ class hxb_reader
|
|
|
let e2 = self#read_texpr in
|
|
|
TWhile(e1,e2,DoWhile)
|
|
|
| 86 ->
|
|
|
- let v = self#read_var in
|
|
|
+ let v,close = self#read_var in
|
|
|
let e1 = self#read_texpr in
|
|
|
let e2 = self#read_texpr in
|
|
|
+ close();
|
|
|
TFor(v,e1,e2)
|
|
|
|
|
|
(* control flow 90-99 *)
|