Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#trace ne marche pas sur les fonctions de bibliotheque #2682

Closed
vicuna opened this issue Feb 9, 2001 · 4 comments
Closed

#trace ne marche pas sur les fonctions de bibliotheque #2682

vicuna opened this issue Feb 9, 2001 · 4 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Feb 9, 2001

Original bug ID: 283
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Full_Name: Jacques Garrigue
Version: 3.00+22
OS: FreeBSD
Submission from: isdnppp2.kurims.kyoto-u.ac.jp (130.54.16.103)
Submitted by: garrigue

#trace ne marche toujours pas sur les fonctions de bibliotheque.
Par contre ca a l'air de marcher pour les fonctions recursives definies au
toplevel.

#trace List.map;;

List.map is now traced.

List.map succ [1;2;3];;

List.map <--
f:List.map <--
f:List.map <--
f:List.map <--
f:List.map <--
....

@vicuna
Copy link
Author

vicuna commented Feb 12, 2001

Comment author: administrator

#trace ne marche toujours pas sur les fonctions de bibliotheque.

Mais si, mais si. Le problème est que si l'on trace une fonction de
bibliothèque comme List.map qui est elle-même appelée par le code de trace
(e.g. indirectement via le formatteur), alors ça boucle, bien sûr...

(Gag récurrent qui était déjà là en Caml V2.6 je crois... Les joies
du partage de code entre système et utilisateur...)

Amicalement,

  • Xavier

@vicuna
Copy link
Author

vicuna commented Feb 12, 2001

Comment author: administrator

Problem specific to functions called by the compiler.
Corrected by Jacques on 2000-02-12.

@vicuna vicuna closed this as completed Feb 12, 2001
@vicuna
Copy link
Author

vicuna commented Feb 12, 2001

Comment author: administrator

#trace ne marche toujours pas sur les fonctions de bibliotheque.

Mais si, mais si. Le problème est que si l'on trace une fonction de
bibliothèque comme List.map qui est elle-même appelée par le code de trace
(e.g. indirectement via le formatteur), alors ça boucle, bien sûr...

Ah, je n'y avais pas pense'.

(Gag récurrent qui était déjà là en Caml V2.6 je crois... Les joies
du partage de code entre système et utilisateur...)

Mouais, le fait que c'etait deja comme ca en 2.6 ne me parait pas un argument. Il n'est jamais agreable de se faire mettre a la porte du
toplevel de facon aussi incivique.

Une fois compris le probleme, la correction est relativement simple:
j'ai ajoute' un lock "may_trace" dans toploop, qui n'est valide que
quand on execute du code utilisateur.
En passant je n'ai pas completement compris pourquoi le (fun v -> v)
est obligatoire dans
if not !may_trace then
(fun v -> v) (invoke_traced_function actual_code closure arg)
Tout ca doit dependre horriblement du bytecode, mais comme je suppose
que c'est le cas de tout trace.ml...

Voici le log de mon commit, si tu veux verifier qu'il n'y a pas de
gaffe.

Checking in toplevel/topdirs.ml;
/net/pauillac/caml/repository/csl/toplevel/topdirs.ml,v <-- topdirs.ml
new revision: 1.50; previous revision: 1.49
done
Checking in toplevel/toploop.ml;
/net/pauillac/caml/repository/csl/toplevel/toploop.ml,v <-- toploop.ml
new revision: 1.54; previous revision: 1.53
done
Checking in toplevel/toploop.mli;
/net/pauillac/caml/repository/csl/toplevel/toploop.mli,v <-- toploop.mli
new revision: 1.14; previous revision: 1.13
done
Checking in toplevel/trace.ml;
/net/pauillac/caml/repository/csl/toplevel/trace.ml,v <-- trace.ml
new revision: 1.18; previous revision: 1.17
done

Amicalement,

Jacques

@vicuna
Copy link
Author

vicuna commented Feb 13, 2001

Comment author: administrator

Une fois compris le probleme, la correction est relativement simple:
j'ai ajoute' un lock "may_trace" dans toploop, qui n'est valide que
quand on execute du code utilisateur.

Jacques, ton souci du détail t'honore! Merci d'avoir rebidouillé ce
code, je ne m'en sentais plus le courage :-) (C'est vraiment une
super grosse bidouille.)

En passant je n'ai pas completement compris pourquoi le (fun v -> v)
est obligatoire dans
if not !may_trace then
(fun v -> v) (invoke_traced_function actual_code closure arg)
Tout ca doit dependre horriblement du bytecode, mais comme je suppose
que c'est le cas de tout trace.ml...

"invoke_traced_function" ne doit pas être appelée en position tail-call,
afin d'avoir sur la pile exactement le nombre d'arguments attendu par
le code dans meta.c. J'ai simplifié ton code en

     if not !may_trace then begin
       let res = invoke_traced_function actual_code closure arg
       in res
     end

avec un petit commentaire pour dire de ne pas enlever le "let"!

Voici le log de mon commit, si tu veux verifier qu'il n'y a pas de
gaffe.

Ça a l'air très bien.

Amicalement,

  • Xavier

@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant