]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorDaniel Ehrenberg <littledan@pool-224-36.res.carleton.edu>
Tue, 4 May 2010 14:52:34 +0000 (09:52 -0500)
committerDaniel Ehrenberg <littledan@pool-224-36.res.carleton.edu>
Tue, 4 May 2010 14:52:34 +0000 (09:52 -0500)
27 files changed:
basis/bit-arrays/bit-arrays-tests.factor
basis/bit-arrays/bit-arrays.factor
basis/compiler/cfg/registers/registers.factor
basis/compiler/cfg/value-numbering/alien/alien.factor
basis/compiler/cfg/value-numbering/value-numbering-tests.factor
basis/compiler/tests/codegen.factor
basis/compiler/tests/float.factor
basis/compression/lzw/lzw.factor [changed mode: 0644->0755]
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/assembler/assembler-tests.factor
basis/cpu/ppc/assembler/assembler.factor
basis/cpu/ppc/bootstrap.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/assembler/assembler-tests.factor
basis/cpu/x86/x86.factor
basis/images/ppm/ppm.factor [changed mode: 0644->0755]
basis/images/tiff/tiff.factor [changed mode: 0644->0755]
basis/peg/ebnf/ebnf-tests.factor
basis/peg/ebnf/ebnf.factor
basis/tools/deploy/shaker/shaker.factor
basis/tools/deploy/shaker/strip-debugger.factor
basis/ui/gadgets/tables/tables-docs.factor
basis/ui/gadgets/tables/tables.factor
basis/ui/tools/error-list/error-list.factor
basis/windows/directx/dinput/constants/constants.factor [changed mode: 0644->0755]
build-support/cleanup
vm/gc.cpp

index f08db68441c9484a7f17c2f3c9752abdf42719c2..46089e3f7b97d90cfe089cfe36b6198b75e045bc 100644 (file)
@@ -1,4 +1,4 @@
-USING: sequences sequences.private arrays bit-arrays kernel
+USING: alien sequences sequences.private arrays bit-arrays kernel
 tools.test math random ;
 IN: bit-arrays.tests
 
@@ -79,4 +79,8 @@ IN: bit-arrays.tests
 
 [ 49 ] [ 49 <bit-array> dup set-bits [ ] count ] unit-test
 
+[ 1 ] [ ?{ f t f t } byte-length ] unit-test
+
+[ HEX: a ] [ ?{ f t f t } bit-array>integer ] unit-test
+
 [ HEX: 100 ] [ ?{ f f f f f f f f t } bit-array>integer ] unit-test
index 798bfb8ae94cd5c2cd151b34b4799f018177d2e2..ade7d8ddac0f399c765920b7c8349625a725a6fa 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.data accessors math alien.accessors kernel
-kernel.private sequences sequences.private byte-arrays
-parser prettyprint.custom fry ;
+USING: alien alien.data accessors io.binary math math.bitwise
+alien.accessors kernel kernel.private sequences
+sequences.private byte-arrays parser prettyprint.custom fry
+locals ;
 IN: bit-arrays
 
 TUPLE: bit-array
@@ -13,11 +14,10 @@ TUPLE: bit-array
 
 : n>byte ( m -- n ) -3 shift ; inline
 
-: byte/bit ( n alien -- byte bit )
-    over n>byte alien-unsigned-1 swap 7 bitand ; inline
+: bit/byte ( n -- bit byte ) [ 7 bitand ] [ n>byte ] bi ; inline
 
-: set-bit ( ? byte bit -- byte )
-    2^ rot [ bitor ] [ bitnot bitand ] if ; inline
+: bit-index ( n bit-array -- bit# byte# byte-array )
+    [ >fixnum bit/byte ] [ underlying>> ] bi* ; inline
 
 : bits>cells ( m -- n ) 31 + -5 shift ; inline
 
@@ -25,7 +25,7 @@ TUPLE: bit-array
 
 : (set-bits) ( bit-array n -- )
     [ [ length bits>cells ] keep ] dip swap underlying>>
-    '[ 2 shift [ _ _ ] dip set-alien-unsigned-4 ] each-integer ; inline
+    '[ [ _ _ ] dip 4 * set-alien-unsigned-4 ] each-integer ; inline
 
 : clean-up ( bit-array -- )
     ! Zero bits after the end.
@@ -47,12 +47,13 @@ PRIVATE>
 M: bit-array length length>> ; inline
 
 M: bit-array nth-unsafe
-    [ >fixnum ] [ underlying>> ] bi* byte/bit bit? ; inline
+    bit-index nth-unsafe swap bit? ; inline
+
+:: toggle-bit ( ? n x -- y )
+    x n ? [ set-bit ] [ clear-bit ] if ; inline
 
 M: bit-array set-nth-unsafe
-    [ >fixnum ] [ underlying>> ] bi*
-    [ byte/bit set-bit ] 2keep
-    swap n>byte set-alien-unsigned-1 ; inline
+    bit-index [ toggle-bit ] change-nth-unsafe ; inline
 
 GENERIC: clear-bits ( bit-array -- )
 
@@ -83,25 +84,17 @@ M: bit-array resize
     bit-array boa
     dup clean-up ; inline
 
-M: bit-array byte-length length 7 + -3 shift ; inline
+M: bit-array byte-length length bits>bytes ; inline
 
 SYNTAX: ?{ \ } [ >bit-array ] parse-literal ;
 
 : integer>bit-array ( n -- bit-array )
-    dup 0 = [
-        <bit-array>
-    ] [
-        [ log2 1 + <bit-array> 0 ] keep
-        [ dup 0 = ] [
-            [ pick underlying>> pick set-alien-unsigned-1 ] keep
-            [ 1 + ] [ -8 shift ] bi*
-        ] until 2drop
-    ] if ;
+    dup 0 =
+    [ <bit-array> ]
+    [ dup log2 1 + [ nip ] [ bits>bytes >le ] 2bi bit-array boa ] if ;
 
 : bit-array>integer ( bit-array -- n )
-    0 swap underlying>> dup length iota <reversed> [
-        alien-unsigned-1 swap 8 shift bitor
-    ] with each ;
+    underlying>> le> ;
 
 INSTANCE: bit-array sequence
 
index 2f4f2a99e69be5735c423c0b1b048fd672b48e5a..9c7896be7e9f5cbb351300e9bac48633457ab04b 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors namespaces kernel parser assocs sequences ;
+USING: accessors namespaces kernel math parser assocs sequences ;
 IN: compiler.cfg.registers
 
 ! Virtual registers, used by CFG and machine IRs, are just integers
@@ -34,7 +34,7 @@ ERROR: bad-vreg vreg ;
 
 ! ##inc-d and ##inc-r affect locations as follows. Location D 0 before
 ! an ##inc-d 1 becomes D 1 after ##inc-d 1.
-TUPLE: loc { n read-only } ;
+TUPLE: loc { n integer read-only } ;
 
 TUPLE: ds-loc < loc ;
 C: <ds-loc> ds-loc
index 190d911ad58922b4a74c3750897d8c05a212d522..58674602d969267349eb0c3ed282588c5a4bc5fa 100644 (file)
@@ -70,7 +70,10 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ;
 ! construct a new ##load-memory or ##store-memory with the
 ! ##add's operand as the displacement
 : fuse-displacement? ( insn -- ? )
-    base>> vreg>insn ##add? ;
+    {
+        [ offset>> 0 = complex-addressing? or ]
+        [ base>> vreg>insn ##add? ]
+    } 1&& ;
 
 GENERIC: alien-insn-value ( insn -- value )
 
@@ -106,12 +109,14 @@ M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ;
     [ >>displacement ] [ >>scale ] bi* ;
 
 : rewrite-memory-op ( insn -- insn/f )
-    {
-        { [ dup fuse-base-offset? ] [ fuse-base-offset ] }
-        { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
-        { [ dup fuse-scale? ] [ fuse-scale ] }
-        [ drop f ]
-    } cond ;
+    complex-addressing? [
+        {
+            { [ dup fuse-base-offset? ] [ fuse-base-offset ] }
+            { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
+            { [ dup fuse-scale? ] [ fuse-scale ] }
+            [ drop f ]
+        } cond
+    ] [ drop f ] if ;
 
 : rewrite-memory-imm-op ( insn -- insn/f )
     {
index 7c281d0fe79c5658f41fc8ba86bb1606fe791ee6..00d8652279c4d9f401c1cf6a2055f7a2113b367c 100644 (file)
@@ -91,7 +91,7 @@ cpu x86.32? [
     [
         {
             T{ ##load-reference f 0 + }
-            T{ ##replace-imm f 10 D + }
+            T{ ##replace-imm f + D 0 }
         }
     ] [
         {
@@ -2576,7 +2576,8 @@ cpu x86? [
     } value-numbering-step
 ] unit-test
 
-! Base offset fusion on ##load/store-memory
+! Base offset fusion on ##load/store-memory -- only on x86
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2586,7 +2587,18 @@ cpu x86? [
         T{ ##add-imm f 4 2 31337 }
         T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
     }
-] [
+]
+[
+    V{
+        T{ ##peek f 0 D 0 }
+        T{ ##peek f 1 D 1 }
+        T{ ##tagged>integer f 2 0 }
+        T{ ##tagged>integer f 3 1 }
+        T{ ##add-imm f 4 2 31337 }
+        T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2597,7 +2609,8 @@ cpu x86? [
     } value-numbering-step
 ] unit-test
 
-! Displacement offset fusion on ##load/store-memory
+! Displacement offset fusion on ##load/store-memory -- only on x86
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2607,7 +2620,18 @@ cpu x86? [
         T{ ##add-imm f 4 3 31337 }
         T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
     }
-] [
+]
+[
+    V{
+        T{ ##peek f 0 D 0 }
+        T{ ##peek f 1 D 1 }
+        T{ ##tagged>integer f 2 0 }
+        T{ ##tagged>integer f 3 1 }
+        T{ ##add-imm f 4 3 31337 }
+        T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2632,6 +2656,7 @@ cpu x86? [
 ] unit-test
 
 ! Scale fusion on ##load/store-memory
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2641,7 +2666,8 @@ cpu x86? [
         T{ ##shl-imm f 4 3 2 }
         T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
     }
-] [
+]
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2649,29 +2675,41 @@ cpu x86? [
         T{ ##tagged>integer f 3 1 }
         T{ ##shl-imm f 4 3 2 }
         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
-    } value-numbering-step
-] unit-test
-
-! Don't do scale fusion if there's already a scale
-[ ] [
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
         T{ ##tagged>integer f 2 0 }
         T{ ##tagged>integer f 3 1 }
         T{ ##shl-imm f 4 3 2 }
-        T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
-    } dup value-numbering-step assert=
-] unit-test
-
-! Don't do scale fusion if the scale factor is out of range
-[ ] [
-    V{
-        T{ ##peek f 0 D 0 }
-        T{ ##peek f 1 D 1 }
-        T{ ##tagged>integer f 2 0 }
-        T{ ##tagged>integer f 3 1 }
-        T{ ##shl-imm f 4 3 4 }
         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
-    } dup value-numbering-step assert=
+    } value-numbering-step
 ] unit-test
+
+cpu x86? [
+    ! Don't do scale fusion if there's already a scale
+    [ ] [
+        V{
+            T{ ##peek f 0 D 0 }
+            T{ ##peek f 1 D 1 }
+            T{ ##tagged>integer f 2 0 }
+            T{ ##tagged>integer f 3 1 }
+            T{ ##shl-imm f 4 3 2 }
+            T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
+        } dup value-numbering-step assert=
+    ] unit-test
+
+    ! Don't do scale fusion if the scale factor is out of range
+    [ ] [
+        V{
+            T{ ##peek f 0 D 0 }
+            T{ ##peek f 1 D 1 }
+            T{ ##tagged>integer f 2 0 }
+            T{ ##tagged>integer f 3 1 }
+            T{ ##shl-imm f 4 3 4 }
+            T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
+        } dup value-numbering-step assert=
+    ] unit-test
+] when
index 288940e660e82a747dfaf32fee49a88de95d207e..2edb0167342d3755708e170646c80ab00cfe88f3 100644 (file)
@@ -462,3 +462,13 @@ TUPLE: myseq { underlying1 byte-array read-only } { underlying2 byte-array read-
     1 1
     [ [ HEX: f bitand ] bi@ [ shift ] [ drop -3 shift ] 2bi ] compile-call
 ] unit-test
+
+! GC root offsets were computed wrong on x86
+: gc-root-messup ( a -- b )
+    dup [
+        1024 (byte-array) 2array
+        10 void* "libc" "malloc" { ulong } alien-invoke
+        void "libc" "free" { void* } alien-invoke
+    ] when ;
+
+[ ] [ 2000 [ "hello" clone dup gc-root-messup first eq? t assert= ] times ] unit-test
index b1ce0e454d55c36be3d938abc3d4880e78c4508d..968587093696d1e19ad3c5ef96e16bf4751fccea 100644 (file)
@@ -99,9 +99,6 @@ IN: compiler.tests.float
 [ 2 ] [ 3.0 1.0 [ float-unordered? [ 1 ] [ 2 ] if ] compile-call ] unit-test
 [ 2 ] [ 1.0 3.0 [ float-unordered? [ 1 ] [ 2 ] if ] compile-call ] unit-test
 
-! Ensure that float-min and min, and float-max and max, have
-! consistent behavior with respect to NaNs
-
 : two-floats ( a b -- a b ) { float float } declare ; inline
 
 [ -11.3 ] [ -11.3 17.5 [ two-floats min ] compile-call ] unit-test
@@ -109,17 +106,7 @@ IN: compiler.tests.float
 [ 17.5 ] [ -11.3 17.5 [ two-floats max ] compile-call ] unit-test
 [ 17.5 ] [ 17.5 -11.3 [ two-floats max ] compile-call ] unit-test
 
-: check-compiled-binary-op ( a b word -- )
-    [ '[ [ [ two-floats _ execute ] compile-call ] call( a b -- c ) ] ]
-    [ '[ _ execute ] ]
-    bi 2bi fp-bitwise= ; inline
-
-[ t ] [ 0/0. 3.0 \ min check-compiled-binary-op ] unit-test
-[ t ] [ 3.0 0/0. \ min check-compiled-binary-op ] unit-test
-[ t ] [ 0/0. 3.0 \ max check-compiled-binary-op ] unit-test
-[ t ] [ 3.0 0/0. \ max check-compiled-binary-op ] unit-test
-
-! Test vector ops
+! Test loops
 [ 30.0 ] [
     float-array{ 1 2 3 4 } float-array{ 1 2 3 4 }
     [ { float-array float-array } declare [ * ] [ + ] 2map-reduce ] compile-call
@@ -134,3 +121,13 @@ IN: compiler.tests.float
     float-array{ 1 2 3 4 }
     [ { float-array } declare [ dup * ] [ + ] map-reduce ] compile-call
 ] unit-test
+
+[ 4.5 ] [
+    float-array{ 1.0 3.5 }
+    [ { float-array } declare 0.0 [ + ] reduce ] compile-call
+] unit-test
+
+[ float-array{ 2.0 4.5 } ] [
+    float-array{ 1.0 3.5 }
+    [ { float-array } declare [ 1 + ] map ] compile-call
+] unit-test
old mode 100644 (file)
new mode 100755 (executable)
index 340e455..f61a02c
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors combinators io kernel math namespaces
-prettyprint sequences vectors ;
+sequences vectors ;
 QUALIFIED-WITH: bitstreams bs
 IN: compression.lzw
 
index d156b2f39d92d12a66eb49a50b6925e715a86093..8f69b247292a2a2f5a12538676cd450b7d965159 100644 (file)
@@ -508,8 +508,6 @@ M: stack-params param-reg 2drop ;
 ! objects in %compare-imm?
 HOOK: fused-unboxing? cpu ( -- ? )
 
-M: object fused-unboxing? f ;
-
 ! Can this value be an immediate operand for %add-imm, %sub-imm,
 ! or %mul-imm?
 HOOK: immediate-arithmetic? cpu ( n -- ? )
index 8e412c4c832cbeeedf74392ee0c39de1fda89ff9..a30556444e80e473fafbbed4b8150f82ab3649ff 100644 (file)
@@ -72,6 +72,14 @@ HEX{ 7c 41 1a 2e } [ 1 2 3 LHZX ] test-assembler
 HEX{ 7c 41 1a 6e } [ 1 2 3 LHZUX ] test-assembler
 HEX{ 7c 41 18 2e } [ 1 2 3 LWZX ] test-assembler
 HEX{ 7c 41 18 6e } [ 1 2 3 LWZUX ] test-assembler
+HEX{ 7c 41 1c 2e } [ 1 2 3 LFSX ] test-assembler
+HEX{ 7c 41 1c 6e } [ 1 2 3 LFSUX ] test-assembler
+HEX{ 7c 41 1c ae } [ 1 2 3 LFDX ] test-assembler
+HEX{ 7c 41 1c ee } [ 1 2 3 LFDUX ] test-assembler
+HEX{ 7c 41 1d 2e } [ 1 2 3 STFSX ] test-assembler
+HEX{ 7c 41 1d 6e } [ 1 2 3 STFSUX ] test-assembler
+HEX{ 7c 41 1d ae } [ 1 2 3 STFDX ] test-assembler
+HEX{ 7c 41 1d ee } [ 1 2 3 STFDUX ] test-assembler
 HEX{ 48 00 00 01 } [ 1 B ] test-assembler
 HEX{ 48 00 00 01 } [ 1 BL ] test-assembler
 HEX{ 41 80 00 04 } [ 1 BLT ] test-assembler
index ca626a638eec8041590dacb4612a9f5b40646edc..30beabc09c30c31de1944bec4050f3847c0eaf4c 100644 (file)
@@ -66,6 +66,10 @@ X: FCMPO 0 32 63
 X: FCMPU 0 0 63
 X: LBZUX 0 119 31
 X: LBZX 0 87 31
+X: LFDUX 0 631 31
+X: LFDX 0 599 31
+X: LFSUX 0 567 31
+X: LFSX 0 535 31
 X: LHAUX 0 375 31
 X: LHAX 0 343 31
 X: LHZUX 0 311 31
@@ -89,6 +93,10 @@ X: SRW 0 536 31
 X: SRW. 1 536 31
 X: STBUX 0 247 31
 X: STBX 0 215 31
+X: STFDUX 0 759 31
+X: STFDX 0 727 31
+X: STFSUX 0 695 31
+X: STFSX 0 663 31
 X: STHUX 0 439 31
 X: STHX 0 407 31
 X: STWUX 0 183 31
index 5fb303409e1a2e15a39d1549e356e49c046b5aea..68ebbf9f4f6d5e1dce357a15528dcb98a0227f38 100644 (file)
@@ -4,7 +4,7 @@ USING: bootstrap.image.private kernel kernel.private namespaces
 system cpu.ppc.assembler compiler.units compiler.constants math\r
 math.private math.ranges layouts words vocabs slots.private\r
 locals locals.backend generic.single.private fry sequences\r
-threads.private ;\r
+threads.private strings.private ;\r
 FROM: cpu.ppc.assembler => B ;\r
 IN: bootstrap.ppc\r
 \r
@@ -502,7 +502,7 @@ CONSTANT: nv-reg 17
     3 3 4 LBZX\r
     3 3 tag-bits get SLWI\r
     ! store character to stack\r
-    ds-reg ds-reg 4 SUB\r
+    ds-reg ds-reg 4 SUBI\r
     3 ds-reg 0 STW\r
 ] \ string-nth-fast define-sub-primitive\r
 \r
index e07ee9d4904378f891bbf8e6f4f7ddf3e8ae078e..d0571337c2ae969ed522f6ac8c0e865058d7e826 100644 (file)
@@ -46,6 +46,10 @@ M: ppc machine-registers
 CONSTANT: scratch-reg 30
 CONSTANT: fp-scratch-reg 30
 
+M: ppc complex-addressing? f ;
+
+M: ppc fused-unboxing? f ;
+
 M: ppc %load-immediate ( reg n -- ) swap LOAD ;
 
 M: ppc %load-reference ( reg obj -- )
@@ -139,9 +143,12 @@ M:: ppc %dispatch ( src temp -- )
     temp MTCTR
     BCTR ;
 
-M: ppc %slot ( dst obj slot -- ) swapd LWZX ;
+: (%slot) ( dst obj slot scale tag -- obj dst slot )
+    [ 0 assert= ] bi@ swapd ;
+
+M: ppc %slot ( dst obj slot scale tag -- ) (%slot) LWZX ;
 M: ppc %slot-imm ( dst obj slot tag -- ) slot-offset LWZ ;
-M: ppc %set-slot ( src obj slot -- ) swapd STWX ;
+M: ppc %set-slot ( src obj slot scale tag -- ) (%slot) STWX ;
 M: ppc %set-slot-imm ( src obj slot tag -- ) slot-offset STW ;
 
 M: ppc %add     ADD ;
@@ -357,7 +364,7 @@ M:: ppc %box-displaced-alien ( dst displacement base temp base-class -- )
 
         dst displacement base temp
         {
-            { [ base-class \ f class<= ] [ 2drop %box-displaced-alien/f ] }
+            { [ base-class \ f class<= ] [ drop %box-displaced-alien/f ] }
             { [ base-class \ alien class<= ] [ %box-displaced-alien/alien ] }
             { [ base-class \ byte-array class<= ] [ %box-displaced-alien/byte-array ] }
             [ %box-displaced-alien/dynamic ]
@@ -366,7 +373,7 @@ M:: ppc %box-displaced-alien ( dst displacement base temp base-class -- )
         "end" resolve-label
     ] with-scope ;
 
-M:: ppc %load-memory-imm ( dst base offset rep c-type -- )
+M: ppc %load-memory-imm ( dst base offset rep c-type -- )
     [
         {
             { c:char   [ [ dup ] 2dip LBZ dup EXTSB ] }
@@ -382,7 +389,26 @@ M:: ppc %load-memory-imm ( dst base offset rep c-type -- )
         } case
     ] ?if ;
 
-M:: ppc %store-memory-imm ( src base offset rep c-type -- )
+: (%memory) ( val base displacement scale offset rep c-type -- base val displacement rep c-type )
+    [ [ 0 assert= ] bi@ swapd ] 2dip ; inline
+
+M: ppc %load-memory ( dst base displacement scale offset rep c-type -- )
+    (%memory) [
+        {
+            { c:char   [ [ LBZX ] [ drop dup EXTSB ] 2bi ] }
+            { c:uchar  [ LBZX ] }
+            { c:short  [ LHAX ] }
+            { c:ushort [ LHZX ] }
+        } case
+    ] [
+        {
+            { int-rep [ LWZX ] }
+            { float-rep [ LFSX ] }
+            { double-rep [ LFDX ] }
+        } case
+    ] ?if ;
+
+M: ppc %store-memory-imm ( src base offset rep c-type -- )
     [
         {
             { c:char   [ STB ] }
@@ -398,6 +424,22 @@ M:: ppc %store-memory-imm ( src base offset rep c-type -- )
         } case
     ] ?if ;
 
+M: ppc %store-memory ( src base displacement scale offset rep c-type -- )
+    (%memory) [
+        {
+            { c:char   [ STBX ] }
+            { c:uchar  [ STBX ] }
+            { c:short  [ STHX ] }
+            { c:ushort [ STHX ] }
+        } case
+    ] [
+        {
+            { int-rep [ STWX ] }
+            { float-rep [ STFSX ] }
+            { double-rep [ STFDX ] }
+        } case
+    ] ?if ;
+
 : load-zone-ptr ( reg -- )
     vm-reg "nursery" vm-field-offset ADDI ;
 
@@ -440,18 +482,18 @@ M:: ppc %allot ( dst size class nursery-ptr -- )
     temp2 load-decks-offset
     temp1 scratch-reg temp2 STBX ;
 
-M:: ppc %write-barrier ( src slot temp1 temp2 -- )
+M:: ppc %write-barrier ( src slot scale tag temp1 temp2 -- )
+    scale 0 assert= tag 0 assert=
     temp1 src slot ADD
     temp1 temp2 (%write-barrier) ;
 
-M:: ppc %write-barrier-imm ( src slot temp1 temp2 -- )
-    temp1 src slot ADDI
+M:: ppc %write-barrier-imm ( src slot tag temp1 temp2 -- )
+    temp1 src slot tag slot-offset ADDI
     temp1 temp2 (%write-barrier) ;
 
 M:: ppc %check-nursery-branch ( label size cc temp1 temp2 -- )
-    temp2 load-zone-ptr
-    temp1 temp2 0 LWZ
-    temp2 temp2 2 cells LWZ
+    temp1 vm-reg "nursery" vm-field-offset LWZ
+    temp2 vm-reg "nursery" vm-field-offset 2 cells + LWZ
     temp1 temp1 size ADDI
     ! is here >= end?
     temp1 0 temp2 CMP
@@ -460,8 +502,11 @@ M:: ppc %check-nursery-branch ( label size cc temp1 temp2 -- )
         { cc/<= [ label BGT ] }
     } case ;
 
+: gc-root-offsets ( seq -- seq' )
+    [ n>> spill@ ] map f like ;
+
 M: ppc %call-gc ( gc-roots -- )
-    3 swap %load-reference
+    3 swap gc-root-offsets %load-reference
     4 %load-vm-addr
     "inline_gc" f %alien-invoke ;
 
@@ -586,6 +631,7 @@ M:: ppc %compare-float-unordered-branch ( label src1 src2 cc -- )
 : load-from-frame ( dst n rep -- )
     {
         { int-rep [ [ 1 ] dip LWZ ] }
+        { tagged-rep [ [ 1 ] dip LWZ ] }
         { float-rep [ [ 1 ] dip LFS ] }
         { double-rep [ [ 1 ] dip LFD ] }
         { stack-params [ [ 0 1 ] dip LWZ [ 0 1 ] dip param@ STW ] }
@@ -597,6 +643,7 @@ M:: ppc %compare-float-unordered-branch ( label src1 src2 cc -- )
 : store-to-frame ( src n rep -- )
     {
         { int-rep [ [ 1 ] dip STW ] }
+        { tagged-rep [ [ 1 ] dip STW ] }
         { float-rep [ [ 1 ] dip STFS ] }
         { double-rep [ [ 1 ] dip STFD ] }
         { stack-params [ [ [ 0 ] dip next-param@ LWZ 0 1 ] dip STW ] }
index 7312a16f833ddad764b5c53f17556bfc14379890..2959910f0e62af5fe109cc1eaf09d242dacb1619 100644 (file)
@@ -3,7 +3,12 @@ kernel tools.test namespaces make layouts ;
 IN: cpu.x86.assembler.tests
 
 ! immediate operands
-[ { HEX: b9 HEX: 01 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 1 MOV ] { } make ] unit-test
+cell 4 = [
+    [ { HEX: b9 HEX: 01 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 1 MOV ] { } make ] unit-test
+] [
+    [ { HEX: b9 HEX: 01 HEX: 00 HEX: 00 HEX: 00 HEX: 00 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 1 MOV ] { } make ] unit-test
+] if
+
 [ { HEX: 83 HEX: c1 HEX: 01 } ] [ [ ECX 1 ADD ] { } make ] unit-test
 [ { HEX: 81 HEX: c1 HEX: 96 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 150 ADD ] { } make ] unit-test
 [ { HEX: f7 HEX: c1 HEX: d2 HEX: 04 HEX: 00 HEX: 00 } ] [ [ ECX 1234 TEST ] { } make ] unit-test
index b0d4f05a0e6a1d274ad77a4e5aee059f04a98c4f..aa802c76fc5e3fd0be41d46f897c22d501d06ba4 100644 (file)
@@ -45,7 +45,7 @@ HOOK: extra-stack-space cpu ( stack-frame -- n )
 : param@ ( n -- op ) reserved-stack-space + stack@ ;
 
 : gc-root-offsets ( seq -- seq' )
-    [ n>> special-offset ] map f like ;
+    [ n>> spill-offset special-offset cell + ] map f like ;
 
 : decr-stack-reg ( n -- )
     dup 0 = [ drop ] [ stack-reg swap SUB ] if ;
@@ -70,9 +70,9 @@ HOOK: pic-tail-reg cpu ( -- reg )
 
 M: x86 complex-addressing? t ;
 
-M: x86 fused-unboxing? ( -- ? ) t ;
+M: x86 fused-unboxing? t ;
 
-M: x86 immediate-store? ( obj -- ? ) immediate-comparand? ;
+M: x86 immediate-store? immediate-comparand? ;
 
 M: x86 %load-immediate dup 0 = [ drop dup XOR ] [ MOV ] if ;
 
old mode 100644 (file)
new mode 100755 (executable)
index d50d517..9610189
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors ascii combinators images images.loader io
 io.encodings.ascii io.encodings.string kernel locals make math
-math.parser prettyprint sequences ;
+math.parser sequences ;
 IN: images.ppm
 
 SINGLETON: ppm-image
old mode 100644 (file)
new mode 100755 (executable)
index 4a82545..a1880a3
@@ -4,7 +4,7 @@ USING: accessors arrays assocs byte-arrays classes combinators
 compression.lzw endian fry grouping images io
 io.binary io.encodings.ascii io.encodings.binary
 io.encodings.string io.encodings.utf8 io.files kernel math
-math.bitwise math.order math.parser pack prettyprint sequences
+math.bitwise math.order math.parser pack sequences
 strings math.vectors specialized-arrays locals
 images.loader ;
 FROM: alien.c-types => float ;
index aba92899da7f8a4c178b5b56cf672a588bf5ee59..897746a9c963d7c8c66d9753100345cdf273e231 100644 (file)
@@ -528,3 +528,17 @@ Tok                = Spaces (Number | Special )
 ] [
     error>> [ redefined-rule? ] [ name>> "lol" = ] bi and
 ] must-fail-with
+
+[
+    { "a" "a" }
+] [
+    EBNF: foo   Bar = "a":a1 "a":a2 => [[ a1 a2 2array ]] ;EBNF
+    "aa" foo
+] unit-test
+
+[
+    { "a" "a" }
+] [
+    EBNF: foo2   Bar = "a":a-1 "a":a-2 => [[ a-1 a-2 2array ]] ;EBNF
+    "aa" foo2
+] unit-test
index ffc4cb91ad78aa462b4abbf529ac615225179e80..b682f582add9e8420bd959a2a7b72a23aea1b913 100644 (file)
@@ -230,7 +230,11 @@ DEFER: 'action'
 \r
 : 'element' ( -- parser )\r
   [\r
-    [ ('element') , ":" syntax , "a-zA-Z" range-pattern repeat1 [ >string ] action , ] seq* [ first2 <ebnf-var> ] action ,\r
+    [\r
+      ('element') , ":" syntax ,\r
+      "a-zA-Z_" range-pattern\r
+      "a-zA-Z0-9_-" range-pattern repeat1 2seq [ first2 swap prefix >string ] action ,\r
+    ] seq* [ first2 <ebnf-var> ] action ,\r
     ('element') ,\r
   ] choice* ;\r
 \r
index 485f0f5fa7f2144ed5da1118edb112c0d47f41c3..44291a96cc5b5193bce15435631fad31f58b39d1 100755 (executable)
@@ -1,13 +1,15 @@
 ! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays alien.libraries accessors io.backend io.encodings.utf8 io.files
-io.streams.c init fry namespaces math make assocs kernel parser
-parser.notes lexer strings.parser vocabs sequences sequences.deep
-sequences.private words memory kernel.private continuations io
-vocabs.loader system strings sets vectors quotations byte-arrays
-sorting compiler.units definitions generic generic.standard
-generic.single tools.deploy.config combinators classes vocabs.loader.private
-classes.builtin slots.private grouping command-line io.pathnames ;
+USING: arrays alien.libraries accessors io.backend
+io.encodings.utf8 io.files io.streams.c init fry namespaces math
+make assocs kernel parser parser.notes lexer strings.parser
+vocabs sequences sequences.deep sequences.private words memory
+kernel.private continuations io vocabs.loader system strings
+sets vectors quotations byte-arrays sorting compiler.units
+definitions generic generic.standard generic.single
+tools.deploy.config combinators combinators.private classes
+vocabs.loader.private classes.builtin slots.private grouping
+command-line io.pathnames ;
 QUALIFIED: bootstrap.stage2
 QUALIFIED: classes.private
 QUALIFIED: compiler.crossref
@@ -548,10 +550,18 @@ SYMBOL: deploy-vocab
     strip-words
     clear-megamorphic-caches ;
 
+: die-with ( error original-error -- * )
+    #! We don't want DCE to drop the error before the die call!
+    [ die 1 exit ] (( a -- * )) call-effect-unsafe ;
+
+: die-with2 ( error original-error -- * )
+    #! We don't want DCE to drop the error before the die call!
+    [ die 1 exit ] (( a b -- * )) call-effect-unsafe ;
+
 : deploy-error-handler ( quot -- )
     [
         strip-debugger?
-        [ error-continuation get call>> callstack>array die 1 exit ]
+        [ original-error get die-with2 ]
         ! Don't reference these words literally, if we're stripping the
         ! debugger out we don't want to load the prettyprinter at all
         [ [:c] execute( -- ) nl [print-error] execute( error -- ) flush ] if
index b7565e7d9e7407985e2eeb5c45413bc545f4de5d..121891b5636b450a37756a6b74ff0b1a4a284a01 100644 (file)
@@ -1,17 +1,14 @@
-USING: compiler.units words vocabs kernel threads.private ;
+USING: compiler.units continuations kernel namespaces
+threads.private words vocabs tools.deploy.shaker ;
 IN: debugger
 
-: consume ( error -- )
-    #! We don't want DCE to drop the error before the die call!
-    drop ;
+: error. ( error -- ) original-error get die-with2 ;
 
-: print-error ( error -- ) die consume ;
-
-: error. ( error -- ) die consume ;
+: print-error ( error -- ) error. ;
 
 "threads" vocab [
     [
         "error-in-thread" "threads" lookup
-        [ [ die 2drop ] define ] [ f "combination" set-word-prop ] bi
+        [ [ drop error. ] define ] [ f "combination" set-word-prop ] bi
     ] with-compilation-unit
 ] when
index 057c8320acad497d758e3b095b5eb84c3a203352..45f948e14ada974c687836e23dd3c8bed7951a7a 100644 (file)
@@ -25,13 +25,11 @@ ARTICLE: "ui.gadgets.tables.selection" "Table row selection"
   { { $slot "selection" } { " - if set to a model, the values of the currently selected row or rows, as determined by a " { $link row-value } " call to the renderer, is stored in this model. See " { $link "models" } "." } }
   { { $slot "selection-index" } { " - if set to a model, the indices of the currently selected rows." } }
   { { $slot "selection-required?" } { " - if set to a true value, the table ensures that some row is always selected, if the model is non-empty. If set to " { $link f } ", a state where nothing is selected is permitted to occur. The default is " { $link f } "." } }
-  { { $slot "multiple-selection?" } { " - if set to a true value, users are allowed to select more than one value." } }
 }
 "Some words for row selection:"
 { $subsections
-    selected-rows
-    (selected-rows)
-    selected
+    selected-row
+    (selected-row)
 } ;
 
 ARTICLE: "ui.gadgets.tables.actions" "Table row actions"
index c907e90673fa58af3e6c44035a64e38baea1eae7..77b9ec99edb76bb365d420002cacf86dbe493b50 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs hashtables arrays colors colors.constants fry
 kernel math math.functions math.ranges math.rectangles math.order
@@ -18,6 +18,7 @@ GENERIC: column-titles ( renderer -- strings )
 GENERIC: row-columns ( row renderer -- columns )
 GENERIC: row-value ( row renderer -- object )
 GENERIC: row-color ( row renderer -- color )
+GENERIC: row-value? ( value row renderer -- ? )
 
 SINGLETON: trivial-renderer
 
@@ -29,6 +30,7 @@ M: object column-titles drop f ;
 M: trivial-renderer row-columns drop ;
 M: object row-value drop ;
 M: object row-color 2drop f ;
+M: object row-value? drop eq? ;
 
 TUPLE: table < line-gadget
 { renderer initial: trivial-renderer }
@@ -41,33 +43,11 @@ focus-border-color
 { mouse-color initial: COLOR: black }
 column-line-color
 selection-required?
-selection
 selection-index
-selected-indices
+selection
 mouse-index
 { takes-focus? initial: t }
-focused?
-multiple-selection? ;
-
-<PRIVATE
-
-: add-selected-index ( table n -- table )
-    over selected-indices>> conjoin ;
-
-: multiple>single ( values -- value/f ? )
-    dup assoc-empty? [ drop f f ] [ values first t ] if ;
-
-: selected-index ( table -- n )
-    selected-indices>> multiple>single drop ;
-
-: set-selected-index ( table n -- table )
-    dup associate >>selected-indices ;
-
-PRIVATE>
-
-: selected ( table -- index/indices )
-    [ selected-indices>> ] [ multiple-selection?>> ] bi
-    [ multiple>single drop ] unless ;
+focused? ;
 
 : new-table ( rows renderer class -- table )
     new-line-gadget
@@ -77,8 +57,7 @@ PRIVATE>
         focus-border-color >>focus-border-color
         transparent >>column-line-color
         f <model> >>selection-index
-        f <model> >>selection
-        H{ } clone >>selected-indices ;
+        f <model> >>selection ;
 
 : <table> ( rows renderer -- table ) table new-table ;
 
@@ -156,30 +135,23 @@ M: table layout*
 : row-bounds ( table row -- loc dim )
     row-rect rect-bounds ; inline
 
-: draw-selected-rows ( table -- )
-    {
-        { [ dup selected-indices>> assoc-empty? ] [ drop ] }
-        [
-            [ selected-indices>> keys ] [ selection-color>> gl-color ] [ ] tri
-            [ swap row-bounds gl-fill-rect ] curry each
-        ]
-    } cond ;
+: draw-selected-row ( table -- )
+    dup selection-index>> value>> [
+        dup selection-color>> gl-color
+        dup selection-index>> value>> row-bounds gl-fill-rect
+    ] [ drop ] if ;
 
 : draw-focused-row ( table -- )
-    {
-        { [ dup focused?>> not ] [ drop ] }
-        { [ dup selected-index not ] [ drop ] }
-        [
-            [ ] [ selected-index ] [ focus-border-color>> gl-color ] tri
-            row-bounds gl-rect
-        ]
-    } cond ;
+    dup { [ focused?>> ] [ selection-index>> value>> ] } 1&& [
+        dup focus-border-color>> gl-color
+        dup selection-index>> value>> row-bounds gl-rect
+    ] [ drop ] if ;
 
 : draw-moused-row ( table -- )
-    dup mouse-index>> dup [
-        over mouse-color>> gl-color
-        row-bounds gl-rect
-    ] [ 2drop ] if ;
+    dup mouse-index>> [
+        dup mouse-color>> gl-color
+        dup mouse-index>> row-bounds gl-rect
+    ] [ drop ] if ;
 
 : column-line-offsets ( table -- xs )
     [ column-widths>> ] [ gap>> ] bi
@@ -217,7 +189,7 @@ M: table layout*
 :: row-font ( row ind table -- font )
     table font>> clone
     row table renderer>> row-color [ >>foreground ] when*
-    ind table selected-indices>> key?
+    ind table selection-index>> value>> =
     [ table selection-color>> >>background ] when ;
 
 : draw-columns ( columns widths alignment font gap -- )
@@ -239,7 +211,7 @@ M: table draw-gadget*
     dup control-value empty? [ drop ] [
         dup line-height \ line-height [
             {
-                [ draw-selected-rows ]
+                [ draw-selected-row ]
                 [ draw-lines ]
                 [ draw-column-lines ]
                 [ draw-focused-row ]
@@ -262,37 +234,15 @@ M: table pref-dim*
 
 PRIVATE>
 
-: (selected-rows) ( table -- assoc )
-    [ selected-indices>> ] keep
-    '[ _ nth-row drop ] assoc-map ;
-
-: selected-rows ( table -- assoc )
-    [ selected-indices>> ] [ ] [ renderer>> ] tri
-    '[ _ nth-row drop _ row-value ] assoc-map ;
-
-: (selected-row) ( table -- value/f ? ) (selected-rows) multiple>single ;
+: (selected-row) ( table -- value/f ? )
+    [ selection-index>> value>> ] keep nth-row ;
 
-: selected-row ( table -- value/f ? ) selected-rows multiple>single ;
+: selected-row ( table -- value/f ? )
+    [ (selected-row) ] [ renderer>> ] bi
+    swap [ row-value t ] [ 2drop f f ] if ;
 
 <PRIVATE
 
-: set-table-model ( model value multiple? -- )
-    [ values ] [ multiple>single drop ] if swap set-model ;
-
-: update-selected ( table -- )
-    [
-        [ selection>> ]
-        [ selected-rows ]
-        [ multiple-selection?>> ] tri
-        set-table-model
-    ]
-    [
-        [ selection-index>> ]
-        [ selected-indices>> ]
-        [ multiple-selection?>> ] tri
-        set-table-model
-    ] bi ;
-
 : show-row-summary ( table n -- )
     over nth-row
     [ swap [ renderer>> row-value ] keep show-summary ]
@@ -302,34 +252,45 @@ PRIVATE>
 : hide-mouse-help ( table -- )
     f >>mouse-index [ hide-status ] [ relayout-1 ] bi ;
 
-: find-row-index ( value table -- n/f )
-    [ model>> value>> ] [ renderer>> ] bi
-    '[ _ row-value eq? ] with find drop ;
+: ((select-row)) ( n table -- )
+    [ selection-index>> set-model ]
+    [ [ selected-row drop ] keep selection>> set-model ]
+    bi ;
 
-: (update-selected-indices) ( table -- set )
-    [ selection>> value>> dup { [ array? not ] [ ] } 1&& [ 1array ] when ] keep
-    '[ _ find-row-index ] map sift unique f assoc-like ;
+: update-mouse-index ( table -- )
+    dup [ model>> value>> ] [ mouse-index>> ] bi
+    dup [ swap length [ drop f ] [ 1 - min ] if-zero ] [ 2drop f ] if
+    >>mouse-index drop ;
 
-: initial-selected-indices ( table -- set )
+: initial-selection-index ( table -- n/f )
     {
         [ model>> value>> empty? not ]
         [ selection-required?>> ]
-        [ drop { 0 } unique ]
+        [ drop 0 ]
     } 1&& ;
 
-: update-selected-indices ( table -- set )
-    {
-        [ (update-selected-indices) ]
-        [ initial-selected-indices ]
-    } 1|| ;
+: find-row-index ( value table -- n/f )
+    [ model>> value>> ] [ renderer>> ] bi
+    '[ _ row-value? ] with find drop ;
+
+: update-selection ( table -- )
+    [
+        {
+            [ [ selection>> value>> ] keep find-row-index ]
+            [ initial-selection-index ]
+        } 1||
+    ] keep
+    over [ ((select-row)) ] [
+        [ selection-index>> set-model ]
+        [ selection>> set-model ]
+        2bi
+    ] if ;
 
 M: table model-changed
-    nip dup update-selected-indices {
-        [ >>selected-indices f >>mouse-index drop ]
-        [ multiple>single drop show-row-summary ]
-        [ drop update-selected ]
-        [ drop relayout ]
-    } 2cleave ;
+    nip
+        dup update-selection
+        dup update-mouse-index
+    [ dup mouse-index>> show-row-summary ] [ relayout ] bi ;
 
 : thin-row-rect ( table row -- rect )
     row-rect [ { 0 1 } v* ] change-dim ;
@@ -337,14 +298,11 @@ M: table model-changed
 : scroll-to-row ( table n -- )
     dup [ [ thin-row-rect ] [ drop ] 2bi scroll>rect ] [ 2drop ] if ;
 
-: add-selected-row ( table n -- )
-    [ scroll-to-row ]
-    [ add-selected-index relayout-1 ] 2bi ;
-
 : (select-row) ( table n -- )
     [ scroll-to-row ]
-    [ set-selected-index relayout-1 ]
-    2bi ;
+    [ swap ((select-row)) ]
+    [ drop relayout-1 ]
+    2tri ;
 
 : mouse-row ( table -- n )
     [ hand-rel second ] keep y>line ;
@@ -353,23 +311,9 @@ M: table model-changed
     [ [ mouse-row ] keep 2dup valid-line? ]
     [ ] [ '[ nip @ ] ] tri* if ; inline
 
-: (table-button-down) ( quot table -- )
-    dup takes-focus?>> [ dup request-focus ] when swap
-   '[ swap [ >>mouse-index ] _ bi ] [ drop ] if-mouse-row ; inline
-
 : table-button-down ( table -- )
-    [ (select-row) ] swap (table-button-down) ;
-
-: continued-button-down ( table -- )
-    dup multiple-selection?>>
-    [ [ add-selected-row ] swap (table-button-down) ] [ table-button-down ] if ;
-
-: thru-button-down ( table -- )
-    dup multiple-selection?>> [
-      [ 2dup over selected-index (a,b) swap
-      [ swap add-selected-index drop ] curry each add-selected-row ]
-      swap (table-button-down)
-    ] [ table-button-down ] if ;
+    dup takes-focus?>> [ dup request-focus ] when
+    [ swap [ >>mouse-index ] [ (select-row) ] bi ] [ drop ] if-mouse-row ; inline
 
 PRIVATE>
 
@@ -386,22 +330,20 @@ PRIVATE>
 
 : table-button-up ( table -- )
     dup [ mouse-row ] keep valid-line? [
-        dup row-action? [ row-action ] [ update-selected ] if
+        dup row-action? [ row-action ] [ drop ] if
     ] [ drop ] if ;
 
 PRIVATE>
 
 : select-row ( table n -- )
     over validate-line
-    [ (select-row) ]
-    [ drop update-selected ]
-    [ show-row-summary ]
-    2tri ;
+    [ (select-row) ] [ show-row-summary ] 2bi ;
 
 <PRIVATE
 
 : prev/next-row ( table n -- )
-    [ dup selected-index ] dip '[ _ + ] [ 0 ] if* select-row ;
+    [ dup selection-index>> value>> ] dip
+    '[ _ + ] [ 0 ] if* select-row ;
     
 : previous-row ( table -- )
     -1 prev/next-row ;
@@ -453,8 +395,6 @@ table "sundry" f {
     { mouse-enter show-mouse-help }
     { mouse-leave hide-mouse-help }
     { motion show-mouse-help }
-    { T{ button-down f { S+ } 1 } thru-button-down }
-    { T{ button-down f { A+ } 1 } continued-button-down }
     { T{ button-up } table-button-up }
     { T{ button-up f { S+ } } table-button-up }
     { T{ button-down } table-button-down }
index eaa947b2d6f31299d54c5c146edabe327b5218b4..8cc8781b192247a0936776f1b92c42fce29934af 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays sequences sorting assocs colors.constants fry
 combinators combinators.smart combinators.short-circuit editors make
@@ -49,6 +49,8 @@ M: source-file-renderer prototype-row
 M: source-file-renderer row-value
     drop dup [ first [ <pathname> ] [ f ] if* ] when ;
 
+M: source-file-renderer row-value? row-value = ;
+
 M: source-file-renderer column-titles
     drop { "" "File" "Errors" } ;
 
@@ -152,7 +154,7 @@ error-display "toolbar" f {
     [ swap '[ error-type _ at ] filter ] <smart-arrow> ;
 
 :: <error-list-gadget> ( model -- gadget )
-    vertical error-list-gadget new-track
+    vertical error-list-gadget new-track
         <error-toggle> [ >>error-toggle ] [ >>visible-errors ] bi*
         dup visible-errors>> model <error-model> >>model 
         f <model> >>source-file
@@ -176,16 +178,16 @@ M: error-list-gadget focusable-child*
 
 \ error-list-help H{ { +nullary+ t } } define-command
 
-error-list-gadget "toolbar" f {
+error-list-gadget "toolbar" f {
     { T{ key-down f f "F1" } error-list-help }
 } define-command-map
 
-: error-list-window ( -- )
-    error-list-model get [ drop all-errors ] <arrow>
-    <error-list-gadget> "Errors" open-status-window ;
+MEMO: error-list-gadget ( -- gadget )
+    error-list-model get-global [ drop all-errors ] <arrow>
+    <error-list-gadget> ;
 
 : show-error-list ( -- )
-    [ error-list-gadget? ] find-window
-    [ raise-window ] [ error-list-window ] if* ;
+    [ error-list-gadget eq? ] find-window
+    [ raise-window ] [ error-list-gadget "Errors" open-status-window ] if* ;
 
 \ show-error-list H{ { +nullary+ t } } define-command
old mode 100644 (file)
new mode 100755 (executable)
index 6a2d9b1..c77364c
@@ -1,8 +1,8 @@
-USING: windows.directx.dinput windows.kernel32 windows.ole32 windows.com
-windows.com.syntax alien alien.c-types alien.data alien.syntax
-kernel system namespaces combinators sequences fry math accessors
-macros words quotations libc continuations generalizations
-splitting locals assocs init specialized-arrays memoize
+USING: windows.directx.dinput windows.kernel32 windows.ole32
+windows.com windows.com.syntax alien alien.c-types alien.data
+alien.syntax kernel system namespaces combinators sequences fry
+math accessors macros words quotations libc continuations
+generalizations splitting locals assocs init specialized-arrays
 classes.struct strings arrays literals ;
 SPECIALIZED-ARRAY: DIOBJECTDATAFORMAT
 IN: windows.directx.dinput.constants
@@ -20,21 +20,21 @@ SYMBOLS:
 
 <PRIVATE
 
-<<
+: initialize ( variable quot -- )
+    call swap set-global ; inline
 
-MEMO: c-type* ( name -- c-type ) c-type ;
-MEMO: heap-size* ( c-type -- n ) heap-size ;
+<<
 
 GENERIC: array-base-type ( c-type -- c-type' )
 M: object array-base-type ;
 M: array array-base-type first ;
 
 : (field-spec-of) ( field struct -- field-spec )
-    c-type* fields>> [ name>> = ] with find nip ;
+    c-type fields>> [ name>> = ] with find nip ;
 : (offsetof) ( field struct -- offset )
     [ (field-spec-of) offset>> ] [ drop 0 ] if* ;
 : (sizeof) ( field struct -- size )
-    [ (field-spec-of) type>> array-base-type heap-size* ] [ drop 1 ] if* ;
+    [ (field-spec-of) type>> array-base-type heap-size ] [ drop 1 ] if* ;
 
 : (flag) ( thing -- integer )
     {
@@ -56,14 +56,17 @@ M: array array-base-type first ;
         [ first dup word? [ '[ _ get ] ] [ drop [ f ] ] if ]
     } cleave
     [ DIOBJECTDATAFORMAT <struct-boa> ] dip
-    '[ _ clone @ >>pguid ] ;
+    curry ;
+
+: set-DIOBJECTDATAFORMAT ( array struct pguid n -- array )
+    [ [ clone ] dip >>pguid ] dip pick set-nth ;
 
 :: make-DIOBJECTDATAFORMAT-array-quot ( struct array -- quot )
     array length '[ _ malloc-DIOBJECTDATAFORMAT-array ]
     array [| args i |
         struct args <DIOBJECTDATAFORMAT>-quot
-        i '[ _ pick set-nth ] compose compose
-    ] each-index ;
+        i '[ @ _ set-DIOBJECTDATAFORMAT ]
+    ] map-index [ ] join compose ;
 
 >>
 
@@ -832,8 +835,7 @@ MACRO: <DIDATAFORMAT> ( dwFlags dwDataSize struct rgodf-array -- alien )
 [ define-constants ] "windows.directx.dinput.constants" add-startup-hook
 
 : uninitialize ( variable quot -- )
-    [ '[ _ when* f ] change-global ]
-    [ drop global delete-at ] 2bi ; inline
+    [ [ get-global ] dip when* ] [ drop global delete-at ] 2bi ; inline
 
 : free-dinput-constants ( -- )
     {
index 06cb09a4ddf8b645f7f304ffc0f327e5174d2b07..b52a942eb109f9cf4b1d95132048a36f76bb91f7 100644 (file)
@@ -8,3 +8,9 @@ Nmakefile
 unmaintained
 build-support
 images
+factor.dll.exp
+factor.dll.lib
+factor.exp
+factor.lib
+libfactor-ffi-test.exp
+libfactor-ffi-test.lib
index 257a2a556ce71b320846eaeb6916be0c9a280b5d..ed36aff563d727c33e84669d1dc98f79722d5f09 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -217,7 +217,7 @@ void factor_vm::primitive_compact_gc()
 
 void factor_vm::inline_gc(cell gc_roots_)
 {
-       cell stack_pointer = (cell)ctx->callstack_top + sizeof(cell);
+       cell stack_pointer = (cell)ctx->callstack_top;
 
        if(to_boolean(gc_roots_))
        {