summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bytecomp/bytegen.ml9
-rw-r--r--bytecomp/emitcode.ml2
-rw-r--r--bytecomp/instruct.ml2
-rw-r--r--bytecomp/instruct.mli1
-rw-r--r--bytecomp/printinstr.ml1
-rw-r--r--bytecomp/translcore.ml10
-rw-r--r--tools/dumpobj.ml1
7 files changed, 21 insertions, 5 deletions
diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml
index 3b7541e92..26b93d7e8 100644
--- a/bytecomp/bytegen.ml
+++ b/bytecomp/bytegen.ml
@@ -76,6 +76,7 @@ let make_branch cont =
(Kbranch _ as branch) :: _ -> (branch, cont)
| (Kreturn _ as return) :: _ -> (return, cont)
| Kraise :: _ -> (Kraise, cont)
+ | Kreraise :: _ -> (Kreraise, cont)
| Klabel lbl :: _ -> make_branch_2 (Some lbl) 0 cont cont
| _ -> make_branch_2 (None) 0 cont cont
@@ -110,6 +111,7 @@ let rec add_pop n cont =
Kpop m :: cont -> add_pop (n + m) cont
| Kreturn m :: cont -> Kreturn(n + m) :: cont
| Kraise :: _ -> cont
+ | Kreraise :: _ -> cont
| _ -> Kpop n :: cont
(* Translates the accumulator + n-1 positions, m places down on the stack *)
@@ -534,7 +536,12 @@ let rec comp_expr env exp sz cont =
comp_expr env exp2 sz cont1)
end
| Lprim(Praise, [arg]) ->
- comp_expr env arg sz (Kraise :: discard_dead_code cont)
+ let raise_op =
+ match arg with
+ Lvar v -> Kreraise
+ | Levent(Lvar v, ev) -> Kreraise
+ | _ -> Kraise in
+ comp_expr env arg sz (raise_op :: discard_dead_code cont)
| Lprim(Paddint, [arg; Lconst(Const_base(Const_int n))])
when is_immed n ->
comp_expr env arg sz (Koffsetint n :: cont)
diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml
index 7913e5482..64da57469 100644
--- a/bytecomp/emitcode.ml
+++ b/bytecomp/emitcode.ml
@@ -275,6 +275,7 @@ let emit_instr = function
| Kpushtrap lbl -> out opPUSHTRAP; out_label lbl
| Kpoptrap -> out opPOPTRAP
| Kraise -> out opRAISE
+ | Kreraise -> out opRERAISE
| Kcheck_signals -> out opCHECK_SIGNALS
| Kccall(name, n) ->
if n <= 5
@@ -326,7 +327,6 @@ let rec emit = function
out_const k ;
out_label lbl ;
emit rem
-
| Kpush :: Kacc n :: c ->
if n < 8 then out(opPUSHACC0 + n) else (out opPUSHACC; out_int n);
emit c
diff --git a/bytecomp/instruct.ml b/bytecomp/instruct.ml
index 7aed995ad..bf1ad16e6 100644
--- a/bytecomp/instruct.ml
+++ b/bytecomp/instruct.ml
@@ -86,7 +86,7 @@ type instruction =
| Kboolnot
| Kpushtrap of label
| Kpoptrap
- | Kraise
+ | Kraise | Kreraise
| Kcheck_signals
| Kccall of string * int
| Knegint | Kaddint | Ksubint | Kmulint | Kdivint | Kmodint
diff --git a/bytecomp/instruct.mli b/bytecomp/instruct.mli
index 6fb979f4d..7bf4c60f0 100644
--- a/bytecomp/instruct.mli
+++ b/bytecomp/instruct.mli
@@ -106,6 +106,7 @@ type instruction =
| Kpushtrap of label
| Kpoptrap
| Kraise
+ | Kreraise
| Kcheck_signals
| Kccall of string * int
| Knegint | Kaddint | Ksubint | Kmulint | Kdivint | Kmodint
diff --git a/bytecomp/printinstr.ml b/bytecomp/printinstr.ml
index d175cf185..31737913a 100644
--- a/bytecomp/printinstr.ml
+++ b/bytecomp/printinstr.ml
@@ -70,6 +70,7 @@ let instruction ppf = function
| Kpushtrap lbl -> fprintf ppf "\tpushtrap L%i" lbl
| Kpoptrap -> fprintf ppf "\tpoptrap"
| Kraise -> fprintf ppf "\traise"
+ | Kreraise -> fprintf ppf "\treraise"
| Kcheck_signals -> fprintf ppf "\tcheck_signals"
| Kccall(s, n) ->
fprintf ppf "\tccall %s, %i" s n
diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml
index 67417b4d1..5a34ee6d6 100644
--- a/bytecomp/translcore.ml
+++ b/bytecomp/translcore.ml
@@ -467,8 +467,14 @@ let rec transl_exp e =
&& List.for_all (fun (arg,_) -> arg <> None) args ->
let args = List.map (function Some x, _ -> x | _ -> assert false) args in
let prim = transl_prim p args in
- let lam = Lprim(prim, transl_list args) in
- begin match prim with Pccall _ -> event_after e lam | _ -> lam end
+ begin match (prim, args) with
+ (Praise, [arg1]) ->
+ Lprim(Praise, [event_after arg1 (transl_exp arg1)])
+ | (Pccall _, _) ->
+ event_after e (Lprim(prim, transl_list args))
+ | (_, _) ->
+ Lprim(prim, transl_list args)
+ end
| Texp_apply(funct, oargs) ->
event_after e (transl_apply (transl_exp funct) oargs)
| Texp_match({exp_desc = Texp_tuple argl} as arg, pat_expr_list, partial) ->
diff --git a/tools/dumpobj.ml b/tools/dumpobj.ml
index f12e78cdb..1f08490c7 100644
--- a/tools/dumpobj.ml
+++ b/tools/dumpobj.ml
@@ -378,6 +378,7 @@ let op_shapes = [
opUGEINT, Nothing;
opBULTINT, Uint_Disp;
opBUGEINT, Uint_Disp;
+ opRERAISE, Nothing;
opSTOP, Nothing;
opEVENT, Nothing;
opBREAK, Nothing;