From: Martin A. <ma...@at...> - 2001-05-28 21:20:36
Attachments:
hi-class-typep.diff.gz
|
Attached is a patch ported from CMUCL, that allows SBCL to inline type-tests not only for structures, but also for other classes. I had some difficulties in getting this to work in SBCL-0.6.12.07 but as it turned out, these were other problems ... Anyway, here is the summary of what the patch does: - Enhance the compiler instance typep transform to generate inline type tests for hierarchical classes, not just for structures. - Simplify the direct-superclasses computation for the condition classes. - Add support for computing class precedence lists, and use this to correctly calculate the CPL for the condition classes. - Add the new function order-layout-inherits to correctly order the layouts within the layout-inherits vector. This ensures that the compiler can generate inline type tests for hierarchical classes. - Modify the definition of the stream class to be hierarchical. - Have the condition classes correctly order their layout-inherits so that the hierarchical condition class is placed at its specified depth. I have no simple test case for this, unfortunately. An automatic test seemed not that obvious. But it is possible to see that the type-test is inlined by looking at a trace file, for example after compiling the following: (in-package :cl-user) (defun f (x) (typep x 'sb-impl::stream)) Hope this is useful. Cheers, Martin -- Martin Atzmueller <ma...@at...> |
From: William H. N. <wil...@ai...> - 2001-06-07 14:33:21
|
On Mon, May 28, 2001 at 11:20:09PM +0200, Martin Atzmueller wrote: > Attached is a patch ported from CMUCL, that allows SBCL to inline > type-tests not only for structures, but also for other classes. > I had some difficulties in getting this to work in SBCL-0.6.12.07 but as > it turned out, these were other problems ... > Anyway, here is the summary of what the patch does: > > - Enhance the compiler instance typep transform to generate inline > type tests for hierarchical classes, not just for structures. > > - Simplify the direct-superclasses computation for the condition > classes. > > - Add support for computing class precedence lists, and use this to > correctly calculate the CPL for the condition classes. > > - Add the new function order-layout-inherits to correctly order the > layouts within the layout-inherits vector. This ensures that > the compiler can generate inline type tests for hierarchical classes. > > - Modify the definition of the stream class to be hierarchical. > > - Have the condition classes correctly order their layout-inherits > so that the hierarchical condition class is placed at its specified > depth. > > > I have no simple test case for this, unfortunately. An automatic test > seemed not that obvious. > But it is possible to see that the type-test is inlined by looking at > a trace file, for example after compiling the following: > > (in-package :cl-user) > > (defun f (x) > (typep x 'sb-impl::stream)) > > > Hope this is useful. Thank you. Looking at the code and the list of things it's supposed to do, it looks good. However, it's a rather nontrivial set of changes. And while I agree that it's not obvious how to write tests for the new functionality, it's pretty easy to see how to test that it doesn't break the old functionality. Until that's been done, I'm not good enough at proof-reading to have much confidence that everything will still work. I'm not volunteering to write all the tests myself this time, at least not any time soon, but I did write a few examples in type.impure.lisp: ;;; Pierre Mai rewrote the CMU CL type test system to allow inline ;;; type tests for CONDITIONs and STANDARD-OBJECTs, and generally be ;;; nicer, and Martin Atzmueller ported the patches. They look nice ;;; but they're nontrivial enough that it's not obvious from ;;; inspection that everything is OK. Let's make sure that things ;;; still basically work. (defstruct foo1) (defstruct (foo2 (:include foo1)) x) (defstruct (foo3 (:include foo2))) (defstruct (foo4 (:include foo3)) y z) (assert (typep (make-foo3) 'foo2)) (assert (not (typep (make-foo1) 'foo4)) (assert (null (ignore-errors (setf (foo2-x (make-foo1)) 11)))) ;;; (More tests here would be nice before merging the patches. More ;;; tests for STRUCTURE-OBJECT, tests for CONDITION, tests for ;;; STANDARD-OBJECT, compiled tests to make sure that the inline ;;; versions of the tests work..) -- William Harold Newman <wil...@ai...> "99 little bugs in the code, 99 bugs in the code, fix one bug, compile it again... 101 little bugs in the code...." -- bgarcia (ga...@ho...) on Tuesday November 02, @11:09AM EST on slashdot PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C |
From: William H. N. <wil...@ai...> - 2001-06-12 19:25:20
|
On Mon, May 28, 2001 at 11:20:09PM +0200, Martin Atzmueller wrote: > Attached is a patch ported from CMUCL, that allows SBCL to inline > type-tests not only for structures, but also for other classes. > I had some difficulties in getting this to work in SBCL-0.6.12.07 but as > it turned out, these were other problems ... > Anyway, here is the summary of what the patch does: I've merged the patch into sbcl-0.6.12.33. There's one bit I'm confused by, however. @@ -1130,7 +1257,7 @@ ;;; is loaded and the class defined. (!cold-init-forms (/show0 "about to define temporary STANDARD-CLASSes") - (dolist (x '((fundamental-stream (t instance stream)))) + (dolist (x '((fundamental-stream (t instance stream stream)))) (/show0 "defining temporary STANDARD-CLASS") (let* ((name (first x)) (inherits-list (second x)) Could you explain what you're doing here? I'm guessing you might be preallocating just enough space in a table later used by the final definition of FUNDAMENTAL-STREAM. Perhaps the space is later used by Gray stream stuff? Anyway, it looks sufficiently devious that I think an explanatory comment would be in order. -- William Harold Newman <wil...@ai...> pending patches from sbcl-devel: MNA tests/interface.pure.lisp patch (2001-06-12) PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C |
From: Martin A. <ma...@at...> - 2001-06-13 19:13:36
Attachments:
comments-class-lisp-patch-20010613.diff.gz
|
William Harold Newman wrote: > I've merged the patch into sbcl-0.6.12.33. There's one bit I'm > confused by, however. > - (dolist (x '((fundamental-stream (t instance stream)))) > + (dolist (x '((fundamental-stream (t instance stream stream)))) > Could you explain what you're doing here? I'm guessing you might be ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > preallocating just enough space in a table later used by the final > definition of FUNDAMENTAL-STREAM. Perhaps the space is later used by > Gray stream stuff? Anyway, it looks sufficiently devious that I think > an explanatory comment would be in order. Yes, this one is a bit tricky. As far as I understand the code, the layouts-list provided above is the same list, that in essence would come out of ORDER-LAYOUT-INHERITS in class.lisp (as a vector). That means, the layout of STREAM, has a DEPTHOID of 3, and is therefore placed at index 3 in the vector; since index 2 remains empty, it is filled with a copy of [3], which is stream. Therefore, the layout-vector is as valid as the others. I have commented the code a bit more. A diff is attached. -- Martin Atzmueller <ma...@at...> |