]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorJoe Groff <arcata@gmail.com>
Fri, 2 Oct 2009 04:10:11 +0000 (23:10 -0500)
committerJoe Groff <arcata@gmail.com>
Fri, 2 Oct 2009 04:14:16 +0000 (23:14 -0500)
Conflicts:
basis/compiler/codegen/codegen.factor

19 files changed:
basis/checksums/md5/md5-tests.factor
basis/compiler/cfg/builder/builder-tests.factor
basis/compiler/cfg/gc-checks/gc-checks-tests.factor
basis/compiler/cfg/hats/hats.factor
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/intrinsics/alien/alien.factor
basis/compiler/cfg/intrinsics/allot/allot.factor
basis/compiler/cfg/intrinsics/slots/slots.factor
basis/compiler/cfg/representations/representations.factor
basis/compiler/cfg/value-numbering/value-numbering-tests.factor
basis/compiler/codegen/codegen.factor
basis/compiler/tests/low-level-ir.factor
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/x86.factor
basis/math/vectors/simd/functor/functor.factor
basis/random/random-tests.factor
basis/random/random.factor
basis/unix/statfs/openbsd/openbsd.factor

index 730c0b851662d93fef29e13475ed6b4d56299d50..45dc253c86a9032514b4b0791ea2876bf8445810 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: byte-arrays checksums checksums.md5 io.encodings.binary
-io.streams.byte-array kernel math namespaces tools.test ;
+io.streams.byte-array kernel math namespaces tools.test
+sequences ;
 IN: checksums.md5.tests 
 
 [ "d41d8cd98f00b204e9800998ecf8427e" ] [ "" >byte-array md5 checksum-bytes hex-string ] unit-test
@@ -33,3 +34,9 @@ IN: checksums.md5.tests
     <md5-state> "asdf" binary <byte-reader> add-checksum-stream
     [ get-checksum ] [ get-checksum ] bi =
 ] unit-test
+
+[
+    t
+] [
+    { "abcd" "efg" } md5 checksum-lines length 16 =
+] unit-test
index 9a77ee4017f7fb44e2fd9e9ecac56458b8835ff4..d303cc597fdde54627a9d574340fdda33d6140be 100644 (file)
@@ -159,9 +159,12 @@ IN: compiler.cfg.builder.tests
     { pinned-c-ptr class fixnum } \ set-alien-cell '[ _ declare _ execute ] unit-test-cfg
 ] each
 
-: contains-insn? ( quot insn-check -- ? )
+: count-insns ( quot insn-check -- ? )
     [ test-mr [ instructions>> ] map ] dip
-    '[ _ any? ] any? ; inline
+    '[ _ count ] sigma ; inline
+
+: contains-insn? ( quot insn-check -- ? )
+    count-insns 0 > ; inline
 
 [ t ] [ [ swap ] [ ##replace? ] contains-insn? ] unit-test
 
@@ -197,14 +200,16 @@ IN: compiler.cfg.builder.tests
     [ f t ] [
         [ { byte-array fixnum } declare alien-cell 4 alien-float ]
         [ [ ##box-alien? ] contains-insn? ]
-        [ [ ##box-float? ] contains-insn? ] bi
+        [ [ ##allot? ] contains-insn? ] bi
     ] unit-test
 
     [ f t ] [
         [ { byte-array fixnum } declare alien-cell { simple-alien } declare 4 alien-float ]
         [ [ ##box-alien? ] contains-insn? ]
-        [ [ ##box-float? ] contains-insn? ] bi
+        [ [ ##allot? ] contains-insn? ] bi
     ] unit-test
+    
+    [ 1 ] [ [ dup float+ ] [ ##alien-double? ] count-insns ] unit-test
 ] when
 
 ! Regression. Make sure everything is inlined correctly
index 5580de9a478b1af64839ea6ac40aca7431b31845..27d37b115f46b6b546cd60a43369a6fead2a8d8c 100644 (file)
@@ -16,7 +16,7 @@ V{
 } 0 test-bb
 
 V{
-    T{ ##box-float f 0 1 }
+    T{ ##box-alien f 0 1 }
 } 1 test-bb
 
 0 1 edge
index cf5c0095ca41d382ee153b3c6d658813a363ecb7..42aa5512bc1aa60321b1e0afe9813a690c7827f8 100644 (file)
@@ -49,24 +49,9 @@ insn-classes get [
         [ ##load-reference ]
     } cond ;
 
-: ^^unbox-c-ptr ( src class -- dst )
-    [ next-vreg dup ] 2dip next-vreg ##unbox-c-ptr ;
-
-: ^^allot-tuple ( n -- dst )
-    2 + cells tuple ^^allot ;
-
-: ^^allot-array ( n -- dst )
-    2 + cells array ^^allot ;
-
-: ^^allot-byte-array ( n -- dst )
-    2 cells + byte-array ^^allot ;
-
 : ^^offset>slot ( slot -- vreg' )
     cell 4 = [ 1 ^^shr-imm ] [ any-rep ^^copy ] if ;
 
-: ^^tag-offset>slot ( slot tag -- vreg' )
-    [ ^^offset>slot ] dip ^^sub-imm ;
-
 : ^^tag-fixnum ( src -- dst )
     tag-bits get ^^shl-imm ;
 
index d40aabcb1992b798929fff3ac20b24e4043eadca..68cd1736838cb5f9ee6ee6b47d0adc1184948475 100644 (file)
@@ -199,15 +199,6 @@ def: dst/int-rep
 use: src/int-rep ;
 
 ! Float arithmetic
-PURE-INSN: ##unbox-float
-def: dst/double-rep
-use: src/int-rep ;
-
-PURE-INSN: ##box-float
-def: dst/int-rep
-use: src/double-rep
-temp: temp/int-rep ;
-
 PURE-INSN: ##add-float
 def: dst/double-rep
 use: src1/double-rep src2/double-rep ;
@@ -266,18 +257,6 @@ def: dst/double-rep
 use: src/int-rep ;
 
 ! SIMD operations
-
-PURE-INSN: ##box-vector
-def: dst/int-rep
-use: src
-literal: rep
-temp: temp/int-rep ;
-
-PURE-INSN: ##unbox-vector
-def: dst
-use: src/int-rep
-literal: rep ;
-
 PURE-INSN: ##zero-vector
 def: dst
 literal: rep ;
@@ -760,8 +739,6 @@ literal: n ;
 
 UNION: ##allocation
 ##allot
-##box-float
-##box-vector
 ##box-alien
 ##box-displaced-alien ;
 
index bc6baa21b7549ca6973ba6793def6841acacd33f..a37e100c3e5c823afb8be082e2c2c2d2a6843c89 100644 (file)
@@ -3,8 +3,9 @@
 USING: accessors kernel sequences alien math classes.algebra fry
 locals combinators combinators.short-circuit cpu.architecture
 compiler.tree.propagation.info compiler.cfg.hats
-compiler.cfg.stacks compiler.cfg.instructions
-compiler.cfg.utilities compiler.cfg.builder.blocks ;
+compiler.cfg.registers compiler.cfg.stacks
+compiler.cfg.instructions compiler.cfg.utilities
+compiler.cfg.builder.blocks ;
 IN: compiler.cfg.intrinsics.alien
 
 : emit-<displaced-alien>? ( node -- ? )
@@ -33,6 +34,9 @@ IN: compiler.cfg.intrinsics.alien
     [ second class>> fixnum class<= ]
     bi and ;
 
+: ^^unbox-c-ptr ( src class -- dst )
+    [ next-vreg dup ] 2dip next-vreg ##unbox-c-ptr ;
+
 : prepare-alien-accessor ( info -- ptr-vreg offset )
     class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ;
 
index d4aa2750c002ccab82d6314da37591ac24539dc0..6ad5450bfc0a91919dfbd218f5c66a2b9e91b3b8 100644 (file)
@@ -18,6 +18,9 @@ IN: compiler.cfg.intrinsics.allot
 : tuple-slot-regs ( layout -- vregs )
     [ second ds-load ] [ ^^load-literal ] bi prefix ;
 
+: ^^allot-tuple ( n -- dst )
+    2 + cells tuple ^^allot ;
+
 : emit-<tuple-boa> ( node -- )
     dup node-input-infos last literal>>
     dup array? [
@@ -36,6 +39,9 @@ IN: compiler.cfg.intrinsics.allot
 : expand-<array>? ( obj -- ? )
     dup integer? [ 0 8 between? ] [ drop f ] if ;
 
+: ^^allot-array ( n -- dst )
+    2 + cells array ^^allot ;
+
 :: emit-<array> ( node -- )
     [let | len [ node node-input-infos first literal>> ] |
         len expand-<array>? [
@@ -54,6 +60,9 @@ IN: compiler.cfg.intrinsics.allot
 
 : bytes>cells ( m -- n ) cell align cell /i ;
 
+: ^^allot-byte-array ( n -- dst )
+    2 cells + byte-array ^^allot ;
+
 : emit-allot-byte-array ( len -- dst )
     ds-drop
     dup ^^allot-byte-array
index 07202ae60b53465694d96944a2b382451e551aac..8ee1c41cfbdd32ccdb74a01a078019a5c0ccd22b 100644 (file)
@@ -8,6 +8,9 @@ IN: compiler.cfg.intrinsics.slots
 
 : value-tag ( info -- n ) class>> class-tag ; inline
 
+: ^^tag-offset>slot ( slot tag -- vreg' )
+    [ ^^offset>slot ] dip ^^sub-imm ;
+
 : (emit-slot) ( infos -- dst )
     [ 2inputs ] [ first value-tag ] bi*
     ^^tag-offset>slot ^^slot ;
index 423f4157423c08a9ee6646866bd300d548686792..a2311ca9643db4077e5583a480ee5d0b5d44abf5 100644 (file)
@@ -1,8 +1,10 @@
 ! Copyright (C) 2009 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel fry accessors sequences assocs sets namespaces
-arrays combinators combinators.short-circuit make locals deques
-dlists layouts cpu.architecture compiler.utilities
+arrays combinators combinators.short-circuit math make locals
+deques dlists layouts byte-arrays cpu.architecture
+compiler.utilities
+compiler.constants
 compiler.cfg
 compiler.cfg.rpo
 compiler.cfg.hats
@@ -25,24 +27,31 @@ GENERIC: emit-unbox ( dst src rep -- )
 M:: float-rep emit-box ( dst src rep -- )
     double-rep next-vreg-rep :> temp
     temp src ##single>double-float
-    dst temp int-rep next-vreg-rep ##box-float ;
+    dst temp double-rep emit-box ;
 
 M:: float-rep emit-unbox ( dst src rep -- )
     double-rep next-vreg-rep :> temp
-    temp src ##unbox-float
+    temp src double-rep emit-unbox
     dst temp ##double>single-float ;
 
 M: double-rep emit-box
-    drop int-rep next-vreg-rep ##box-float ;
+    drop
+    [ drop 16 float int-rep next-vreg-rep ##allot ]
+    [ float-offset swap ##set-alien-double ]
+    2bi ;
 
 M: double-rep emit-unbox
-    drop ##unbox-float ;
+    drop float-offset ##alien-double ;
 
-M: vector-rep emit-box
-    int-rep next-vreg-rep ##box-vector ;
+M:: vector-rep emit-box ( dst src rep -- )
+    int-rep next-vreg-rep :> temp
+    dst 16 2 cells + byte-array int-rep next-vreg-rep ##allot
+    temp 16 tag-fixnum ##load-immediate
+    temp dst 1 byte-array tag-number ##set-slot-imm
+    dst byte-array-offset src rep ##set-alien-vector ;
 
 M: vector-rep emit-unbox
-    ##unbox-vector ;
+    [ byte-array-offset ] dip ##alien-vector ;
 
 M:: scalar-rep emit-box ( dst src rep -- )
     int-rep next-vreg-rep :> temp
@@ -143,6 +152,9 @@ SYMBOL: costs
 ! Insert conversions. This introduces new temporaries, so we need
 ! to rename opearands too.
 
+! Mapping from vreg,rep pairs to vregs
+SYMBOL: alternatives
+
 :: emit-def-conversion ( dst preferred required -- new-dst' )
     ! If an instruction defines a register with representation 'required',
     ! but the register has preferred representation 'preferred', then
@@ -155,7 +167,13 @@ SYMBOL: costs
     ! but the register has preferred representation 'preferred', then
     ! we rename the instruction's input to a new register, which
     ! becomes the output of a conversion instruction.
-    required next-vreg-rep [ src required preferred emit-conversion ] keep ;
+    preferred required eq? [ src ] [
+        src required alternatives get [
+            required next-vreg-rep :> new-src
+            [ new-src ] 2dip preferred emit-conversion
+            new-src
+        ] 2cache
+    ] if ;
 
 SYMBOLS: renaming-set needs-renaming? ;
 
@@ -236,6 +254,7 @@ M: insn conversions-for-insn , ;
     dup kill-block? [ drop ] [
         [
             [
+                H{ } clone alternatives set
                 [ conversions-for-insn ] each
             ] V{ } make
         ] change-instructions drop
index ba33885aacc13ef703c7b3eaee851a578d12a62f..00e2d33fb479470c2f328992cddcf5fcc8d7d9ef 100644 (file)
@@ -109,19 +109,15 @@ IN: compiler.cfg.value-numbering.tests
     {
         T{ ##peek f 8 D 0 }
         T{ ##peek f 9 D -1 }
-        T{ ##unbox-float f 10 8 }
-        T{ ##unbox-float f 11 9 }
-        T{ ##compare-float-unordered f 12 10 11 cc< }
-        T{ ##compare-float-unordered f 14 10 11 cc/< }
+        T{ ##compare-float-unordered f 12 8 9 cc< }
+        T{ ##compare-float-unordered f 14 8 9 cc/< }
         T{ ##replace f 14 D 0 }
     }
 ] [
     {
         T{ ##peek f 8 D 0 }
         T{ ##peek f 9 D -1 }
-        T{ ##unbox-float f 10 8 }
-        T{ ##unbox-float f 11 9 }
-        T{ ##compare-float-unordered f 12 10 11 cc< }
+        T{ ##compare-float-unordered f 12 8 9 cc< }
         T{ ##compare-imm f 14 12 5 cc= }
         T{ ##replace f 14 D 0 }
     } value-numbering-step trim-temps
index 839e1aef05a40b0940b175d712a8c63a95153b14..6352401bfdc1638f0e33b8fb8b3b1a774688e8d7 100755 (executable)
@@ -146,8 +146,6 @@ CODEGEN: ##not %not
 CODEGEN: ##neg %neg
 CODEGEN: ##log2 %log2
 CODEGEN: ##copy %copy
-CODEGEN: ##unbox-float %unbox-float
-CODEGEN: ##box-float %box-float
 CODEGEN: ##add-float %add-float
 CODEGEN: ##sub-float %sub-float
 CODEGEN: ##mul-float %mul-float
@@ -161,14 +159,12 @@ CODEGEN: ##single>double-float %single>double-float
 CODEGEN: ##double>single-float %double>single-float
 CODEGEN: ##integer>float %integer>float
 CODEGEN: ##float>integer %float>integer
-CODEGEN: ##unbox-vector %unbox-vector
 CODEGEN: ##zero-vector %zero-vector
 CODEGEN: ##gather-vector-2 %gather-vector-2
 CODEGEN: ##gather-vector-4 %gather-vector-4
 CODEGEN: ##shuffle-vector %shuffle-vector
 CODEGEN: ##compare-vector %compare-vector
 CODEGEN: ##test-vector %test-vector
-CODEGEN: ##box-vector %box-vector
 CODEGEN: ##add-vector %add-vector
 CODEGEN: ##saturated-add-vector %saturated-add-vector
 CODEGEN: ##add-sub-vector %add-sub-vector
index 0b2da6463660f77b532c9df06484d7b9c8f6671b..e508b55b8d02fa7863c408ec294cc923205fd5b2 100644 (file)
@@ -46,20 +46,6 @@ IN: compiler.tests.low-level-ir
     } compile-test-bb
 ] unit-test
 
-! ##copy on floats. We can only run this test if float intrinsics
-! are enabled.
-\ float+ "intrinsic" word-prop [
-    [ 1.5 ] [
-        V{
-            T{ ##load-reference f 4 1.5 }
-            T{ ##unbox-float f 1 4 }
-            T{ ##copy f 2 1 double-rep }
-            T{ ##box-float f 3 2 }
-            T{ ##copy f 0 3 int-rep }
-        } compile-test-bb
-    ] unit-test
-] when
-
 ! make sure slot access works when the destination is
 ! one of the sources
 [ t ] [
index 41b3fed08d819b7fe9d11cad0de3380007bf96ca..eecfd13e66069df6d57bf50c2e36ff688b28fd2c 100644 (file)
@@ -197,9 +197,6 @@ HOOK: %fixnum-add cpu ( label dst src1 src2 -- )
 HOOK: %fixnum-sub cpu ( label dst src1 src2 -- )
 HOOK: %fixnum-mul cpu ( label dst src1 src2 -- )
 
-HOOK: %unbox-float cpu ( dst src -- )
-HOOK: %box-float cpu ( dst src temp -- )
-
 HOOK: %add-float cpu ( dst src1 src2 -- )
 HOOK: %sub-float cpu ( dst src1 src2 -- )
 HOOK: %mul-float cpu ( dst src1 src2 -- )
@@ -216,9 +213,6 @@ HOOK: %double>single-float cpu ( dst src -- )
 HOOK: %integer>float cpu ( dst src -- )
 HOOK: %float>integer cpu ( dst src -- )
 
-HOOK: %box-vector cpu ( dst src temp rep -- )
-HOOK: %unbox-vector cpu ( dst src rep -- )
-
 HOOK: %zero-vector cpu ( dst rep -- )
 HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
 HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
index cfad8259d833234941f00e33d49842b8cad2bde9..7336d225442e6b583241e1a14cfb66c525a7f25b 100644 (file)
@@ -230,12 +230,6 @@ M: ppc %copy ( dst src rep -- )
         } case
     ] if ;
 
-M: ppc %unbox-float ( dst src -- ) float-offset LFD ;
-
-M:: ppc %box-float ( dst src temp -- )
-    dst 16 float temp %allot
-    src dst float-offset STFD ;
-
 GENERIC: float-function-param* ( dst src -- )
 
 M: spill-slot float-function-param* [ 1 ] dip n>> spill@ LFD ;
@@ -399,13 +393,13 @@ M: ppc %alien-cell LWZ ;
 M: ppc %alien-float LFS ;
 M: ppc %alien-double LFD ;
 
-M: ppc %set-alien-integer-1 swapd STB ;
-M: ppc %set-alien-integer-2 swapd STH ;
+M: ppc %set-alien-integer-1 -rot STB ;
+M: ppc %set-alien-integer-2 -rot STH ;
 
-M: ppc %set-alien-cell swapd STW ;
+M: ppc %set-alien-cell -rot STW ;
 
-M: ppc %set-alien-float swapd STFS ;
-M: ppc %set-alien-double swapd STFD ;
+M: ppc %set-alien-float -rot STFS ;
+M: ppc %set-alien-double -rot STFD ;
 
 : load-zone-ptr ( reg -- )
     "nursery" %load-vm-field-addr ;
index cca8e617ca297cd3fa7918243bc002a5942e3c5b..48c97e9322b2f954420f2ced3d0371f2c45e68ae 100644 (file)
@@ -474,13 +474,6 @@ M: x86 %double>single-float CVTSD2SS ;
 M: x86 %integer>float CVTSI2SD ;
 M: x86 %float>integer CVTTSD2SI ;
 
-M: x86 %unbox-float ( dst src -- )
-    float-offset [+] MOVSD ;
-
-M:: x86 %box-float ( dst src temp -- )
-    dst 16 float temp %allot
-    dst float-offset [+] src MOVSD ;
-
 : %cmov-float= ( dst src -- )
     [
         "no-move" define-label
@@ -561,16 +554,6 @@ M: x86 %compare-float-ordered-branch ( label src1 src2 cc -- )
 M: x86 %compare-float-unordered-branch ( label src1 src2 cc -- )
     \ UCOMISD (%compare-float-branch) ;
 
-M:: x86 %box-vector ( dst src rep temp -- )
-    dst rep rep-size 2 cells + byte-array temp %allot
-    16 tag-fixnum dst 1 byte-array tag-number %set-slot-imm
-    dst byte-array-offset [+]
-    src rep %copy ;
-
-M:: x86 %unbox-vector ( dst src rep -- )
-    dst src byte-array-offset [+]
-    rep %copy ;
-
 MACRO: available-reps ( alist -- )
     ! Each SSE version adds new representations and supports
     ! all old ones
index 6439069fc7bb5d5fff36e8bf13c3c9116acd248a..fa1f2081881229b41a64ed006f6ad097b0f15502 100644 (file)
@@ -8,6 +8,7 @@ sequences.private strings words definitions macros cpu.architecture
 namespaces arrays quotations combinators combinators.short-circuit sets
 layouts ;
 QUALIFIED-WITH: alien.c-types c
+QUALIFIED: math.private
 IN: math.vectors.simd.functor
 
 ERROR: bad-length got expected ;
@@ -36,8 +37,8 @@ MACRO: simd-boa ( rep class -- simd-array )
 
 : can-be-unboxed? ( type -- ? )
     {
-        { c:float [ t ] }
-        { c:double [ t ] }
+        { c:float [ \ math.private:float+ "intrinsic" word-prop ] }
+        { c:double [ \ math.private:float+ "intrinsic" word-prop ] }
         [ c:heap-size cell < ]
     } case ;
 
@@ -57,7 +58,7 @@ MACRO: simd-boa ( rep class -- simd-array )
 : simd-with ( rep class x -- simd-array )
     [ rep-components ] [ new ] [ '[ _ ] ] tri* swap replicate-as ; inline
 
-: simd-with-fast? ( rep -- ? )
+: simd-with/nth-fast? ( rep -- ? )
     [ \ (simd-vshuffle) supported-simd-op? ]
     [ rep-component-type can-be-unboxed? ]
     bi and ;
@@ -65,16 +66,11 @@ MACRO: simd-boa ( rep class -- simd-array )
 :: define-with-custom-inlining ( word rep class -- )
     word [
         drop
-        rep simd-with-fast? [
+        rep simd-with/nth-fast? [
             [ rep rep-coerce rep (simd-with) class boa ]
         ] [ word def>> ] if
     ] "custom-inlining" set-word-prop ;
 
-: simd-nth-fast? ( rep -- ? )
-    [ \ (simd-vshuffle) supported-simd-op? ]
-    [ rep-component-type can-be-unboxed? ]
-    bi and ;
-
 : simd-nth-fast ( rep -- quot )
     [ rep-components ] keep
     '[ swap _ '[ _ _ (simd-select) ] 2array ] map-index
@@ -84,7 +80,7 @@ MACRO: simd-boa ( rep class -- simd-array )
     rep-component-type dup c:c-type-getter-boxer c:array-accessor ;
 
 MACRO: simd-nth ( rep -- x )
-    dup simd-nth-fast? [ simd-nth-fast ] [ simd-nth-slow ] if ;
+    dup simd-with/nth-fast? [ simd-nth-fast ] [ simd-nth-slow ] if ;
 
 : boa-effect ( rep n -- effect )
     [ rep-components ] dip *
index da8d4a18448eaa8123de854210e81880e36c3ddc..96dc8cc783c9fdf4d48bec12a58da076f439954f 100644 (file)
@@ -30,3 +30,6 @@ IN: random.tests
 
 [ 3 ] [ { 1 2 3 4 } 3 sample prune length ] unit-test
 [ 99 ] [ 100 99 sample prune length ] unit-test
+
+[ ]
+[ [ 100 random-bytes ] with-system-random drop ] unit-test
index 1f2408556f8a93e0d2dfae2f583702915889a562..197c2324046bf5461e3485d5c43ca2ccc251ca3d 100755 (executable)
@@ -22,7 +22,7 @@ M: object random-bytes* ( n tuple -- byte-array )
         [ 2drop ] [ random-32* 4 >le swap head over push-all ] if
     ] bi-curry bi* ;
 
-M: object random-32* ( tuple -- r ) 4 random-bytes* le> ;
+M: object random-32* ( tuple -- r ) 4 swap random-bytes* le> ;
 
 ERROR: no-random-number-generator ;
 
index cd720d74d41eb3eb6cc865ff9f51a14e9b8322fe..4e65e74c2c085f37ced2478c446b8124aa67e9c5 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types alien.syntax unix.types unix.stat classes.struct ;
+USING: alien.c-types alien.syntax unix.types classes.struct 
+unix.stat ;
 IN: unix.statfs.openbsd
 
 CONSTANT: MFSNAMELEN 16
@@ -30,4 +31,4 @@ STRUCT: statfs
     { f_mntfromname { char MNAMELEN } }
     { mount_info char[160] } ;
 
-FUNCTION: int statfs ( char* path, statvfs* buf ) ;
+FUNCTION: int statfs ( char* path, statfs* buf ) ;