diff options
author | Maxime Dénès <mail@maximedenes.fr> | 2014-04-08 20:42:06 -0400 |
---|---|---|
committer | Maxime Dénès <mail@maximedenes.fr> | 2014-04-09 01:05:48 -0400 |
commit | d356af7f7d8601f4897978587429297d05a934ce (patch) | |
tree | a01c21f88ab4d35a7bb79dfd25a0416295c99d0b | |
parent | 2e8c02d5644e8e8e446ab6dfd832322276e44f89 (diff) |
Int31 decompilation in native compiler was still partial. Now fixed.
-rw-r--r-- | kernel/environ.ml | 13 | ||||
-rw-r--r-- | kernel/nativelambda.ml | 20 | ||||
-rw-r--r-- | kernel/nativelambda.mli | 3 |
3 files changed, 27 insertions, 9 deletions
diff --git a/kernel/environ.ml b/kernel/environ.ml index be0b65d91..d306599ad 100644 --- a/kernel/environ.ml +++ b/kernel/environ.ml @@ -484,10 +484,13 @@ let register = add_native_compiling_info rk v (Nativelambda.compile_prim prim kn) in - let add_int31_before_match rk v = + let add_int31_before_match rk grp v = let rk = add_vm_before_match_info rk v Cbytegen.int31_escape_before_match in - let rk = add_native_before_match_info rk v Nativelambda.before_match_int31 in - rk + match kind_of_term (Retroknowledge.find rk (KInt31 (grp,Int31Bits))) with + | Ind i31bit_type -> + add_native_before_match_info rk v (Nativelambda.before_match_int31 i31bit_type) + | _ -> + anomaly ~label:"Environ.register" (Pp.str "Int31Bits should be an inductive type") in fun env field value -> @@ -525,14 +528,14 @@ fun env field value -> {env with retroknowledge = let retroknowledge_with_reactive_info = match field with - | KInt31 (_, Int31Type) -> + | KInt31 (grp, Int31Type) -> let i31c = match kind_of_term value with | Ind i31t -> mkConstruct (i31t, 1) | _ -> anomaly ~label:"Environ.register" (Pp.str "should be an inductive type") in add_int31_decompilation_from_type (add_int31_before_match - (retroknowledge add_int31c env i31c) value) + (retroknowledge add_int31c env i31c) grp value) | KInt31 (_, Int31Plus) -> add_int31_binop_from_const Cbytecodes.Kaddint31 Primitives.Int31add | KInt31 (_, Int31PlusC) -> add_int31_binop_from_const Cbytecodes.Kaddcint31 diff --git a/kernel/nativelambda.ml b/kernel/nativelambda.ml index 631349c07..c9733c5fd 100644 --- a/kernel/nativelambda.ml +++ b/kernel/nativelambda.ml @@ -727,13 +727,27 @@ let compile_dynamic_int31 fc prefix c args = if not fc then raise Not_found else Luint (UintDigits (prefix,c,args)) -let before_match_int31 fc prefix c t = +(* We are relying here on the order of digits constructors *) +let digits_from_uint digits_ind prefix i = + let d0 = Lconstruct (prefix, (digits_ind, 1)) in + let d1 = Lconstruct (prefix, (digits_ind, 2)) in + let digits = Array.make 31 d0 in + for k = 0 to 30 do + if Int.equal ((Uint31.to_int i lsr k) land 1) 1 then + digits.(30-k) <- d1 + done; + digits + +let before_match_int31 digits_ind fc prefix c t = if not fc then raise Not_found else match t with - | Luint (UintVal i) -> assert false - | Luint (UintDigits (prefix,c,args)) -> assert false + | Luint (UintVal i) -> + let digits = digits_from_uint digits_ind prefix i in + mkLapp (Lconstruct (prefix,c)) digits + | Luint (UintDigits (prefix,c,args)) -> + mkLapp (Lconstruct (prefix,c)) args | _ -> Luint (UintDecomp (prefix,c,t)) let compile_prim prim kn fc prefix args = diff --git a/kernel/nativelambda.mli b/kernel/nativelambda.mli index afebf8087..da1a07d5d 100644 --- a/kernel/nativelambda.mli +++ b/kernel/nativelambda.mli @@ -35,7 +35,8 @@ val compile_static_int31 : bool -> Constr.constr array -> lambda val compile_dynamic_int31 : bool -> prefix -> constructor -> lambda array -> lambda -val before_match_int31 : bool -> prefix -> constructor -> lambda -> lambda +val before_match_int31 : inductive -> bool -> prefix -> constructor -> lambda -> + lambda val compile_prim : Primitives.t -> constant -> bool -> prefix -> lambda array -> lambda |