From fee0953cc4733b96ad5c5354e590aaa386e4f40b Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 31 Aug 2009 18:51:47 -0500
Subject: [PATCH 1/5] make-mirror method on structs.  fix typo on struct-slots
 stack effect.  don't filter initial values in struct>assoc because structs
 are more low-level and you want to see the entire layout of the struct you're
 working with, imo.

---
 basis/classes/struct/prettyprint/prettyprint.factor | 2 +-
 basis/classes/struct/struct.factor                  | 2 +-
 basis/mirrors/mirrors.factor                        | 9 +++++----
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/basis/classes/struct/prettyprint/prettyprint.factor b/basis/classes/struct/prettyprint/prettyprint.factor
index 1769fafe06..0334b19ddd 100644
--- a/basis/classes/struct/prettyprint/prettyprint.factor
+++ b/basis/classes/struct/prettyprint/prettyprint.factor
@@ -12,7 +12,7 @@ IN: classes.struct.prettyprint
     [ drop \ STRUCT: ] if ;
 
 : struct>assoc ( struct -- assoc )
-    [ class struct-slots ] [ struct-slot-values ] bi zip filter-tuple-assoc ;
+    [ class struct-slots ] [ struct-slot-values ] bi zip ;
 
 : pprint-struct-slot ( slot -- )
     <flow \ { pprint-word
diff --git a/basis/classes/struct/struct.factor b/basis/classes/struct/struct.factor
index 87813f792f..731f305748 100644
--- a/basis/classes/struct/struct.factor
+++ b/basis/classes/struct/struct.factor
@@ -23,7 +23,7 @@ TUPLE: struct-slot-spec < slot-spec
 PREDICATE: struct-class < tuple-class
     { [ \ struct subclass-of? ] [ all-slots length 1 = ] } 1&& ;
 
-: struct-slots ( struct -- slots )
+: struct-slots ( struct-class -- slots )
     "struct-slots" word-prop ;
 
 ! struct allocation
diff --git a/basis/mirrors/mirrors.factor b/basis/mirrors/mirrors.factor
index 25486d127d..effcc51caa 100644
--- a/basis/mirrors/mirrors.factor
+++ b/basis/mirrors/mirrors.factor
@@ -1,9 +1,9 @@
 ! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: assocs hashtables kernel sequences generic words
-arrays classes slots slots.private classes.tuple
-classes.tuple.private math vectors quotations accessors
-combinators ;
+USING: accessors arrays assocs classes classes.struct
+classes.struct.prettyprint.private classes.tuple
+classes.tuple.private combinators generic hashtables kernel
+math quotations sequences slots slots.private vectors words ;
 IN: mirrors
 
 TUPLE: mirror { object read-only } ;
@@ -55,3 +55,4 @@ M: array make-mirror <enum> ;
 M: vector make-mirror <enum> ;
 M: quotation make-mirror <enum> ;
 M: object make-mirror <mirror> ;
+M: struct make-mirror struct>assoc [ [ class>> ] dip ] assoc-map ;

From 1732bd730a2a1bd437a0a48a287b00f45418656c Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 31 Aug 2009 18:57:03 -0500
Subject: [PATCH 2/5] better keys in sturct mirrors

---
 basis/mirrors/mirrors.factor | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/basis/mirrors/mirrors.factor b/basis/mirrors/mirrors.factor
index effcc51caa..4e4e97942a 100644
--- a/basis/mirrors/mirrors.factor
+++ b/basis/mirrors/mirrors.factor
@@ -55,4 +55,4 @@ M: array make-mirror <enum> ;
 M: vector make-mirror <enum> ;
 M: quotation make-mirror <enum> ;
 M: object make-mirror <mirror> ;
-M: struct make-mirror struct>assoc [ [ class>> ] dip ] assoc-map ;
+M: struct make-mirror struct>assoc [ [ [ name>> ] [ class>> ] bi 2array ] dip ] assoc-map ;

From 80e2feacd95a7472ecdfbb23f0c3eff485125d58 Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 31 Aug 2009 18:58:42 -0500
Subject: [PATCH 3/5] show c-type instead of factor type

---
 basis/mirrors/mirrors.factor | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/basis/mirrors/mirrors.factor b/basis/mirrors/mirrors.factor
index 4e4e97942a..c081e1015e 100644
--- a/basis/mirrors/mirrors.factor
+++ b/basis/mirrors/mirrors.factor
@@ -55,4 +55,6 @@ M: array make-mirror <enum> ;
 M: vector make-mirror <enum> ;
 M: quotation make-mirror <enum> ;
 M: object make-mirror <mirror> ;
-M: struct make-mirror struct>assoc [ [ [ name>> ] [ class>> ] bi 2array ] dip ] assoc-map ;
+
+M: struct make-mirror struct>assoc
+    [ [ [ name>> ] [ c-type>> ] bi 2array ] dip ] assoc-map ;

From 3d975ea7ab97ee7d6b19798c7c9879ca98676feb Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 31 Aug 2009 19:10:48 -0500
Subject: [PATCH 4/5] struct mirrors were not ready yet

---
 basis/mirrors/mirrors.factor | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/basis/mirrors/mirrors.factor b/basis/mirrors/mirrors.factor
index c081e1015e..7190d61240 100644
--- a/basis/mirrors/mirrors.factor
+++ b/basis/mirrors/mirrors.factor
@@ -3,7 +3,8 @@
 USING: accessors arrays assocs classes classes.struct
 classes.struct.prettyprint.private classes.tuple
 classes.tuple.private combinators generic hashtables kernel
-math quotations sequences slots slots.private vectors words ;
+math quotations sequences slots slots.private vectors words
+continuations fry ;
 IN: mirrors
 
 TUPLE: mirror { object read-only } ;
@@ -55,6 +56,3 @@ M: array make-mirror <enum> ;
 M: vector make-mirror <enum> ;
 M: quotation make-mirror <enum> ;
 M: object make-mirror <mirror> ;
-
-M: struct make-mirror struct>assoc
-    [ [ [ name>> ] [ c-type>> ] bi 2array ] dip ] assoc-map ;

From f0e14d1c3c5176df3d0c03a254a2641fcf168f3c Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 31 Aug 2009 19:27:29 -0500
Subject: [PATCH 5/5] mirrors on structs again, add summary method for structs

---
 basis/mirrors/mirrors.factor | 10 ++++++++++
 basis/summary/summary.factor | 11 ++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/basis/mirrors/mirrors.factor b/basis/mirrors/mirrors.factor
index 7190d61240..d9120da9dc 100644
--- a/basis/mirrors/mirrors.factor
+++ b/basis/mirrors/mirrors.factor
@@ -56,3 +56,13 @@ M: array make-mirror <enum> ;
 M: vector make-mirror <enum> ;
 M: quotation make-mirror <enum> ;
 M: object make-mirror <mirror> ;
+
+M: struct make-mirror
+    [
+        [ drop "underlying" ] [ (underlying)>> ] bi 2array 1array
+    ] [
+        '[
+            _ struct>assoc
+            [ [ [ name>> ] [ c-type>> ] bi 2array ] dip ] assoc-map
+        ] [ drop { } ] recover
+    ] bi append ;
diff --git a/basis/summary/summary.factor b/basis/summary/summary.factor
index 44e5374dc5..d8542c7f83 100644
--- a/basis/summary/summary.factor
+++ b/basis/summary/summary.factor
@@ -1,7 +1,8 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors classes sequences kernel namespaces
-make words math math.parser assocs ;
+make words math math.parser assocs classes.struct
+alien.c-types ;
 IN: summary
 
 GENERIC: summary ( object -- string )
@@ -31,3 +32,11 @@ M: assoc summary
 M: f summary object-summary ;
 
 M: integer summary object-summary ;
+
+M: struct summary
+    [
+        dup class name>> %
+        " struct of " %
+        byte-length #
+        " bytes " %
+    ] "" make ;