|
@@ -429,13 +429,21 @@ class inline_state ctx ethis params cf f p = object(self)
|
|
|
(*
|
|
|
Build the expr/var subst list
|
|
|
*)
|
|
|
- let ethis = (match ethis.eexpr with TConst TSuper -> { ethis with eexpr = TConst TThis } | _ -> ethis) in
|
|
|
- let vthis = alloc_var VInlined "_this" ethis.etype ethis.epos in
|
|
|
- let args1 = (ethis :: params) in
|
|
|
- let args2 = ((vthis,None) :: f.tf_args) in
|
|
|
- let vars = loop [] args1 args2 true in
|
|
|
- _inlined_vars <- vars; (* Order is reversed due to tail-recursion *)
|
|
|
- vthis
|
|
|
+ let set_inlined_vars args1 args2 =
|
|
|
+ let vars = loop [] args1 args2 true in
|
|
|
+ _inlined_vars <- vars; (* Order is reversed due to tail-recursion *)
|
|
|
+ in
|
|
|
+ match ethis.eexpr with
|
|
|
+ | TConst TNull ->
|
|
|
+ set_inlined_vars params f.tf_args;
|
|
|
+ None
|
|
|
+ | _ ->
|
|
|
+ let ethis = (match ethis.eexpr with TConst TSuper -> { ethis with eexpr = TConst TThis } | _ -> ethis) in
|
|
|
+ let vthis = alloc_var VInlined "_this" ethis.etype ethis.epos in
|
|
|
+ let args1 = (ethis :: params) in
|
|
|
+ let args2 = ((vthis,None) :: f.tf_args) in
|
|
|
+ set_inlined_vars args1 args2;
|
|
|
+ Some vthis
|
|
|
|
|
|
method finalize config e tl tret p =
|
|
|
let has_params,map_type = match config with Some config -> config | None -> inline_default_config cf ethis.etype in
|
|
@@ -578,7 +586,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
|
|
|
| Some e -> Some e)
|
|
|
with Exit ->
|
|
|
let state = new inline_state ctx ethis params cf f p in
|
|
|
- let vthis = state#initialize in
|
|
|
+ let vthis_opt = state#initialize in
|
|
|
let opt f = function
|
|
|
| None -> None
|
|
|
| Some e -> Some (f e)
|
|
@@ -609,9 +617,14 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
|
|
|
let e = { e with eexpr = TLocal l.i_subst } in
|
|
|
if l.i_abstract_this then mk (TCast(e,None)) v.v_type e.epos else e
|
|
|
| TConst TThis ->
|
|
|
- let l = state#read vthis in
|
|
|
- l.i_read <- l.i_read + (if !in_loop then 2 else 1);
|
|
|
- { e with eexpr = TLocal l.i_subst }
|
|
|
+ (match vthis_opt with
|
|
|
+ | Some vthis ->
|
|
|
+ let l = state#read vthis in
|
|
|
+ l.i_read <- l.i_read + (if !in_loop then 2 else 1);
|
|
|
+ { e with eexpr = TLocal l.i_subst }
|
|
|
+ | None ->
|
|
|
+ error "Could not inline `this` outside of an instance context" po
|
|
|
+ )
|
|
|
| TVar (v,eo) ->
|
|
|
{ e with eexpr = TVar ((state#declare v).i_subst,opt (map false false) eo)}
|
|
|
| TReturn eo when not state#in_local_fun ->
|