From: Tobias C. R. <tc...@fr...> - 2009-05-09 19:31:50
|
Does anyone happen to know why SB-C::PROCESS-TOPLEVEL-FORM does not bind *CURRENT-PATH*? It'd provide proper context for warnings signalled in EVAL-WHEN during compile-time-too; for example the DUPLICATE-DEFINITION warning in %COMPILER-DEFUN. Such a change compiles through just fine. -T. |
From: John F. <jf...@ms...> - 2009-05-11 02:34:38
|
"Tobias C. Rittweiler" <tc...@fr...> writes: > Does anyone happen to know why SB-C::PROCESS-TOPLEVEL-FORM does not bind > *CURRENT-PATH*? This is tangentially related to my dream of tracking line numbers. If there could be more consistency between the two patterns of passing around a `path' parameter and using *current-path*, that would be great! [...] |
From: Nikodemus S. <nik...@ra...> - 2009-05-11 15:45:18
|
2009/5/9 Tobias C. Rittweiler <tc...@fr...>: > > Does anyone happen to know why SB-C::PROCESS-TOPLEVEL-FORM does not bind > *CURRENT-PATH*? > > It'd provide proper context for warnings signalled in EVAL-WHEN during > compile-time-too; for example the DUPLICATE-DEFINITION warning in > %COMPILER-DEFUN. > > Such a change compiles through just fine. I've commited this as part of 1.0.28.38 -- seems harmless enough. Cheers, -- Nikodemus |
From: Tobias C. R. <tc...@fr...> - 2009-05-11 16:44:27
|
Nikodemus Siivola <nik...@ra...> writes: > I've commited this as part of 1.0.28.38 -- seems harmless enough. Unfortunately not. It break compiling (C-c C-k) the following in Slime: #.'(defun x () (/ 1 0)) (defun bar () 42) The reason is that SB-C::FIND-ERROR-CONTEXT is invoked twice (I'm not sure why), once in a context where *CURRENT-PATH* is now set due to the new binding in PROCESS-TOPLEVEL-FORM, and then in a context where *CURRENT-PATH* is NIL. Thos results in two different source paths for the same source which violates an invariant of SWANK's M-. machinery. I'm just about polishing up and sending a patch which changes FIND-ERROR-CONTEXT to choose among *CURRENT-PATH* and the node's source-path, so the same source-path will be returned. The patch actually addresses a another issue, though. The real question is why FIND-ERROR-CONTEXT is invoked twice.[*] -T. [*] I see that that changeset also includes changes to prevent multiple signalling of stuff, so perhaps what I just described may in fact be fixed by that already. |
From: Nikodemus S. <nik...@ra...> - 2009-05-12 10:59:13
|
2009/5/11 Tobias C. Rittweiler <tc...@fr...>: > The reason is that SB-C::FIND-ERROR-CONTEXT is invoked twice (I'm not > sure why), once in a context where *CURRENT-PATH* is now set due to the > new binding in PROCESS-TOPLEVEL-FORM, and then in a context where > *CURRENT-PATH* is NIL. > > Thos results in two different source paths for the same source which > violates an invariant of SWANK's M-. machinery. I don't think that's an invariant you should not rely on: if you check the SOURCE-MAP in SWANK you'll see that even before this change some source forms get multiple locations. The problem in SWANK was that the source location wasn't as good as before, since F-E-C preferred *CURRENT-PATH* to NODE-SOURCE-PATH -- which in turn cause the lookup of a form with multiple source locations in the map. This has been fixed in 1.0.28.39. > I'm just about polishing up and sending a patch which changes > FIND-ERROR-CONTEXT to choose among *CURRENT-PATH* and the node's > source-path, so the same source-path will be returned. Looks interesting, thanks! Cheers, -- Nikodemus |
From: Tobias C. R. <tc...@fr...> - 2009-05-11 19:30:52
Attachments:
sbcl-find-error-context.diff
|
Consider (defmacro qx-macro (type n) `(let ((n ,n)) (declare (,type n)) (decf n))) (defun qx (a) (declare (optimize speed)) (qx-macro fixnum a)) Before 1.0.28.38, the effiency note would highlight the "LET" in QX-MACRO. With 1.0.28.38, the "DEFUN" in QX is highlighted. My patch will make it highlight the actual macro invocation "(QX-MACRO FIXNUM A)" It's implemented as follows: If in FIND-ERROR-CONTEXT *CURRENT-PATH* is set, and we have a node whose source-path is not "congruent" to *CURRENT-PATH*, the node came in via macro expansion or inlining. Hence, I grovel the CFG until I find a preceding note which is congruent to *CURRENT-PATH* and use that node's source-path. A few test cases are appended in PS. I cannot yet write actual test cases that can be included in SBCL's because COMPILE does not properly bind *CURRENT-PATH*. I'll look into that. Patch compiles through, and does not introduce any regression in the test suite. -T. PS. (defmacro qx-macro (type n) `(let ((n ,n)) (declare (,type n)) (decf n))) (defun qx (a) (declare (optimize speed)) (qx-macro fixnum a)) (macrolet ((foo (type n) `(let ((n ,n)) (declare (,type n)) (decf n)))) (defun qack (a) (declare (optimize speed)) (foo fixnum a) )) (declaim (inline foobar)) (defun foobar (x y) (decf x y)) (defun barfoo (n m) (declare (fixnum n m)) (declare (optimize speed)) (foobar n m)) (defun qurz () 1) (defun qurz () 2) #.'(defun x () (/ 1 0)) (defun bar () 42) (defun quux () (when nil (foo))) |