--- /dev/null
+! :folding=indent:collapseFolds=1:
+
+! $Id$
+!
+! Copyright (C) 2004 Slava Pestov.
+!
+! Redistribution and use in source and binary forms, with or without
+! modification, are permitted provided that the following conditions are met:
+!
+! 1. Redistributions of source code must retain the above copyright notice,
+! this list of conditions and the following disclaimer.
+!
+! 2. Redistributions in binary form must reproduce the above copyright notice,
+! this list of conditions and the following disclaimer in the documentation
+! and/or other materials provided with the distribution.
+!
+! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+IN: kernel
+USE: combinators
+USE: kernel
+USE: lists
+USE: math
+USE: namespaces
+USE: prettyprint
+USE: stack
+USE: stdio
+USE: words
+USE: vectors
+USE: unparser
+
+: heap-stat. ( type instances bytes -- )
+ dup 0 = [
+ 3drop
+ ] [
+ rot type-name write ": " write
+ unparse write " bytes, " write
+ unparse write " instances" print
+ ] ifte ;
+
+: heap-stats. ( -- )
+ #! Print heap allocation breakdown.
+ 0 heap-stats [ dupd uncons heap-stat. succ ] each drop ;
{
dpush(tag_object(s48_ulong_to_bignum(dpop())));
}
+
+void primitive_heap_stats(void)
+{
+ int instances[TYPE_COUNT], bytes[TYPE_COUNT];
+ int i;
+ CELL ptr;
+ CELL list = F;
+
+ for(i = 0; i < TYPE_COUNT; i++)
+ instances[i] = 0;
+
+ for(i = 0; i < TYPE_COUNT; i++)
+ bytes[i] = 0;
+
+ ptr = active.base;
+ while(ptr < active.here)
+ {
+ CELL value = get(ptr);
+ CELL size;
+ CELL type;
+
+ if(TAG(value) == HEADER_TYPE)
+ {
+ size = align8(untagged_object_size(ptr));
+ type = untag_header(value);
+ }
+ else
+ {
+ size = CELLS * 2;
+ type = CONS_TYPE;
+ }
+
+ instances[type]++;
+ bytes[type] += size;
+ ptr += size;
+ }
+
+ for(i = TYPE_COUNT - 1; i >= 0; i--)
+ {
+ list = cons(
+ cons(tag_fixnum(instances[i]),tag_fixnum(bytes[i])),
+ list);
+ }
+
+ dpush(list);
+}