Skip to content

Commit

Permalink
introduce implicit texpr type instances
Browse files Browse the repository at this point in the history
  • Loading branch information
Simn committed Jan 18, 2024
1 parent ab8f870 commit ddaf46c
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 78 deletions.
148 changes: 81 additions & 67 deletions src/compiler/hxb/hxbReader.ml
Original file line number Diff line number Diff line change
Expand Up @@ -935,39 +935,40 @@ class hxb_reader
let loop2 () =
match IO.read_byte ch with
(* values 0-19 *)
| 0 -> TConst TNull
| 1 -> TConst TThis
| 2 -> TConst TSuper
| 3 -> TConst (TBool false)
| 4 -> TConst (TBool true)
| 5 -> TConst (TInt self#read_i32)
| 6 -> TConst (TFloat self#read_string)
| 7 -> TConst (TString self#read_string)
| 0 -> TConst TNull,None
| 1 -> TConst TThis,fctx.tthis
| 2 -> TConst TSuper,None
| 3 -> TConst (TBool false),(Some api#basic_types.tbool)
| 4 -> TConst (TBool true),(Some api#basic_types.tbool)
| 5 -> TConst (TInt self#read_i32),(Some api#basic_types.tint)
| 6 -> TConst (TFloat self#read_string),(Some api#basic_types.tfloat)
| 7 -> TConst (TString self#read_string),(Some api#basic_types.tstring)

(* vars 20-29 *)
| 20 ->
TLocal (fctx.vars.(read_uleb128 ch))
TLocal (fctx.vars.(read_uleb128 ch)),None
| 21 ->
let v = declare_local () in
TVar (v,None)
TVar (v,None),(Some api#basic_types.tvoid)
| 22 ->
let v = declare_local () in
let e = loop () in
TVar (v, Some e)
let v = declare_local () in
let e = loop () in
TVar (v, Some e),(Some api#basic_types.tvoid)

(* blocks 30-49 *)
| 30 -> TBlock []
| 30 ->
TBlock [],None
| 31 | 32 | 33 | 34 | 35 as i ->
let l = i - 30 in
let el = List.init l (fun _ -> loop ()) in
TBlock el;
TBlock el,None
| 36 ->
let l = IO.read_byte ch in
let el = List.init l (fun _ -> loop ()) in
TBlock el;
TBlock el,None
| 39 ->
let el = self#read_list loop in
TBlock el;
TBlock el,None

(* function 50-59 *)
| 50 ->
Expand All @@ -983,16 +984,17 @@ class hxb_reader
tf_args = args;
tf_type = r;
tf_expr = e;
}
},None
(* texpr compounds 60-79 *)
| 60 ->
let e1 = loop () in
let e2 = loop () in
TArray (e1,e2)
TArray (e1,e2),None
| 61 ->
TParenthesis (loop ())
let e = loop () in
TParenthesis e,Some e.etype
| 62 ->
TArrayDecl (loop_el())
TArrayDecl (loop_el()),None
| 63 ->
let fl = self#read_list (fun () ->
let name = self#read_string in
Expand All @@ -1005,39 +1007,35 @@ class hxb_reader
let e = loop () in
((name,p,qs),e)
) in
TObjectDecl fl
| 64 ->
let e1 = loop () in
let el = loop_el() in
TCall(e1,el)
TObjectDecl fl,None
| 65 ->
let m = self#read_metadata_entry in
let e1 = loop () in
TMeta (m,e1)
TMeta (m,e1),(Some e1.etype)

(* calls 70 - 79 *)
| 70 ->
let e1 = loop () in
TCall(e1,[])
TCall(e1,[]),None
| 71 | 72 | 73 | 74 as i ->
let e1 = loop () in
let el = List.init (i - 70) (fun _ -> loop ()) in
TCall(e1,el)
TCall(e1,el),None
| 79 ->
let e1 = loop () in
let el = self#read_list loop in
TCall(e1,el)
TCall(e1,el),None

(* branching 80-89 *)
| 80 ->
let e1 = loop () in
let e2 = loop () in
TIf(e1,e2,None)
TIf(e1,e2,None),(Some api#basic_types.tvoid)
| 81 ->
let e1 = loop () in
let e2 = loop () in
let e3 = loop () in
TIf(e1,e2,Some e3)
TIf(e1,e2,Some e3),None
| 82 ->
let subject = loop () in
let cases = self#read_list (fun () ->
Expand All @@ -1051,138 +1049,154 @@ class hxb_reader
switch_cases = cases;
switch_default = def;
switch_exhaustive = true;
}
},None
| 83 ->
let e1 = loop () in
let catches = self#read_list (fun () ->
let v = declare_local () in
let e = loop () in
(v,e)
) in
TTry(e1,catches)
TTry(e1,catches),None
| 84 ->
let e1 = loop () in
let e2 = loop () in
TWhile(e1,e2,NormalWhile)
TWhile(e1,e2,NormalWhile),(Some api#basic_types.tvoid)
| 85 ->
let e1 = loop () in
let e2 = loop () in
TWhile(e1,e2,DoWhile)
TWhile(e1,e2,DoWhile),(Some api#basic_types.tvoid)
| 86 ->
let v = declare_local () in
let e1 = loop () in
let e2 = loop () in
TFor(v,e1,e2)
TFor(v,e1,e2),(Some api#basic_types.tvoid)

(* control flow 90-99 *)
| 90 -> TReturn None
| 91 -> TReturn (Some (loop ()))
| 92 -> TContinue
| 93 -> TBreak
| 94 -> TThrow (loop ())
| 90 ->
TReturn None,(Some t_dynamic)
| 91 ->
TReturn (Some (loop ())),(Some t_dynamic)
| 92 ->
TContinue,(Some t_dynamic)
| 93 ->
TBreak,(Some t_dynamic)
| 94 ->
TThrow (loop ()),(Some t_dynamic)

(* access 100-119 *)
| 100 -> TEnumIndex (loop ())
| 100 ->
TEnumIndex (loop ()),(Some api#basic_types.tint)
| 101 ->
let e1 = loop () in
let ef = self#read_enum_field_ref in
let i = read_uleb128 ch in
TEnumParameter(e1,ef,i)
TEnumParameter(e1,ef,i),None
| 102 ->
let e1 = loop () in
let c = self#read_class_ref in
let tl = self#read_types in
let cf = self#read_field_ref in
TField(e1,FInstance(c,tl,cf))
TField(e1,FInstance(c,tl,cf)),None
| 103 ->
let e1 = loop () in
let c = self#read_class_ref in
let cf = self#read_field_ref in
TField(e1,FStatic(c,cf))
TField(e1,FStatic(c,cf)),None
| 104 ->
let e1 = loop () in
let cf = self#read_anon_field_ref in
TField(e1,FAnon(cf))
TField(e1,FAnon(cf)),None
| 105 ->
let e1 = loop () in
let c = self#read_class_ref in
let tl = self#read_types in
let cf = self#read_field_ref in
TField(e1,FClosure(Some(c,tl),cf))
TField(e1,FClosure(Some(c,tl),cf)),None
| 106 ->
let e1 = loop () in
let cf = self#read_anon_field_ref in
TField(e1,FClosure(None,cf))
TField(e1,FClosure(None,cf)),None
| 107 ->
let e1 = loop () in
let en = self#read_enum_ref in
let ef = self#read_enum_field_ref in
TField(e1,FEnum(en,ef))
TField(e1,FEnum(en,ef)),None
| 108 ->
let e1 = loop () in
let s = self#read_string in
TField(e1,FDynamic s)
TField(e1,FDynamic s),None

| 110 ->
let p = read_relpos () in
let c = self#read_class_ref in
let cf = self#read_field_ref in
let e1 = Texpr.Builder.make_static_this c p in
TField(e1,FStatic(c,cf))
TField(e1,FStatic(c,cf)),None
| 111 ->
let p = read_relpos () in
let c = self#read_class_ref in
let tl = self#read_types in
let cf = self#read_field_ref in
let ethis = mk (TConst TThis) (Option.get fctx.tthis) p in
TField(ethis,FInstance(c,tl,cf))
TField(ethis,FInstance(c,tl,cf)),None

(* module types 120-139 *)
| 120 -> TTypeExpr (TClassDecl self#read_class_ref)
| 121 -> TTypeExpr (TEnumDecl self#read_enum_ref)
| 122 -> TTypeExpr (TAbstractDecl self#read_abstract_ref)
| 123 -> TTypeExpr (TTypeDecl self#read_typedef_ref)
| 124 -> TCast(loop (),None)
| 120 ->
let c = self#read_class_ref in
TTypeExpr (TClassDecl c),(Some c.cl_type)
| 121 ->
let en = self#read_enum_ref in
TTypeExpr (TEnumDecl en),(Some en.e_type)
| 122 ->
TTypeExpr (TAbstractDecl self#read_abstract_ref),None
| 123 ->
TTypeExpr (TTypeDecl self#read_typedef_ref),None
| 124 ->
TCast(loop (),None),None
| 125 ->
let e1 = loop () in
let (pack,mname,tname) = self#read_full_path in
let mt = self#resolve_type pack mname tname in
TCast(e1,Some mt)
TCast(e1,Some mt),None
| 126 ->
let c = self#read_class_ref in
let tl = self#read_types in
let el = loop_el() in
TNew(c,tl,el)
TNew(c,tl,el),None
| 127 ->
let ttp = self#resolve_ttp_ref (read_uleb128 ch) in
let tl = self#read_types in
let el = loop_el() in
TNew(ttp.ttp_class,tl,el)
TNew(ttp.ttp_class,tl,el),None
| 128 ->
let ttp = self#resolve_ttp_ref (read_uleb128 ch) in
TTypeExpr (TClassDecl ttp.ttp_class)
TTypeExpr (TClassDecl ttp.ttp_class),None

(* unops 140-159 *)
| i when i >= 140 && i < 160 ->
let (op,flag) = self#get_unop (i - 140) in
let e = loop () in
TUnop(op,flag,e)
TUnop(op,flag,e),None

(* binops 160-219 *)
| i when i >= 160 && i < 220 ->
let op = self#get_binop (i - 160) in
let e1 = loop () in
let e2 = loop () in
TBinop(op,e1,e2)
TBinop(op,e1,e2),None
(* rest 250-254 *)
| 250 ->
TIdent (self#read_string)
TIdent (self#read_string),None

| i ->
die (Printf.sprintf " [ERROR] Unhandled texpr %d at:" i) __LOC__
in
let e = loop2 () in
let t = fctx.t_pool.(read_uleb128 ch) in
let e,t = loop2 () in
let t = match t with
| None -> fctx.t_pool.(read_uleb128 ch)
| Some t -> t
in
let p = read_relpos () in
let e = {
eexpr = e;
Expand Down
Loading

1 comment on commit ddaf46c

@Simn
Copy link
Member Author

@Simn Simn commented on ddaf46c Jan 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  hxb                  |   0.608 |  12 |  33 |   2233 | 
    TestNumericCasts   |   0.012 |   0 |   2 |      1 | unit
    Printer            |   0.012 |   0 |   2 |      2 | haxe.macro

Less improvement than I'm seeing locally, but this should scale quite nicely. There might also be further opportunities to avoid type instance writes, I tried to be conservative for now.

Please sign in to comment.