summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2003-12-06 11:38:17 +0000
committerJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2003-12-06 11:38:17 +0000
commit6cecdc521feb4bfa7928fd92f5c8be354023fafb (patch)
treedc7bcb984f56d17b236df42d09e1c7fa51fe9d8c
parent06cfc23fadb40a4902161abf213c37387006c488 (diff)
protect recursion (Jun)
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@6006 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--bytecomp/translclass.ml17
1 files changed, 14 insertions, 3 deletions
diff --git a/bytecomp/translclass.ml b/bytecomp/translclass.ml
index 81b1fb52e..25d16c91a 100644
--- a/bytecomp/translclass.ml
+++ b/bytecomp/translclass.ml
@@ -629,9 +629,20 @@ let transl_class ids cl_id arity pub_meths cl =
Llet(Strict, class_init, Lfunction(Curried, [cla], cl_init),
lam class_init)
and lbody class_init =
- Lapply (oo_prim "make_class",
- [transl_meth_list pub_meths; Lvar class_init])
- and lbody_virt lenvs =
+ let fv = free_variables cl_init in
+ if List.for_all (fun id -> not (IdentSet.mem id fv)) ids then
+ Lapply (oo_prim "make_class",
+ [transl_meth_list pub_meths; Lvar class_init])
+ else
+ ltable table (
+ Llet(
+ Strict, env_init, Lapply(Lvar class_init, [Lvar table]),
+ Lsequence(
+ Lapply (oo_prim "init_class", [Lvar table]),
+ Lprim(Pmakeblock(0, Immutable),
+ [Lapply(Lvar env_init, [lambda_unit]);
+ Lvar class_init; Lvar env_init; lambda_unit]))))
+ and lbody_virt lenvs =
Lprim(Pmakeblock(0, Immutable),
[lambda_unit; Lfunction(Curried,[cla], cl_init); lambda_unit; lenvs])
in