diff --git a/basis/bootstrap/stage2.factor b/basis/bootstrap/stage2.factor index 3b6c04329c..d25394e978 100644 --- a/basis/bootstrap/stage2.factor +++ b/basis/bootstrap/stage2.factor @@ -8,6 +8,8 @@ definitions assocs compiler.errors compiler.units math.parser generic sets debugger command-line ; IN: bootstrap.stage2 +SYMBOL: core-bootstrap-time + SYMBOL: bootstrap-time : default-image-name ( -- string ) @@ -30,11 +32,15 @@ SYMBOL: bootstrap-time : count-words ( pred -- ) all-words swap count number>string write ; -: print-report ( time -- ) +: print-time ( time -- ) 1000 /i 60 /mod swap - "Bootstrap completed in " write number>string write - " minutes and " write number>string write " seconds." print + number>string write + " minutes and " write number>string write " seconds." print ; + +: print-report ( -- ) + "Core bootstrap completed in " write core-bootstrap-time get print-time + "Bootstrap completed in " write bootstrap-time get print-time [ compiled>> ] count-words " compiled words" print [ symbol? ] count-words " symbol words" print @@ -46,7 +52,7 @@ SYMBOL: bootstrap-time [ ! We time bootstrap - millis >r + millis default-image-name "output-image" set-global @@ -71,6 +77,8 @@ SYMBOL: bootstrap-time [ load-components + millis over - core-bootstrap-time set-global + run-bootstrap-init ] with-compiler-errors :errors @@ -92,7 +100,7 @@ SYMBOL: bootstrap-time ] [ print-error 1 exit ] recover ] set-boot-quot - millis r> - dup bootstrap-time set-global + millis swap - bootstrap-time set-global print-report "output-image" get save-image-and-exit diff --git a/basis/compiler/cfg/builder/builder.factor b/basis/compiler/cfg/builder/builder.factor index 93daa601fe..17a5942af2 100755 --- a/basis/compiler/cfg/builder/builder.factor +++ b/basis/compiler/cfg/builder/builder.factor @@ -171,6 +171,7 @@ M: #if emit-node [ V{ } clone node-stack set ##prologue + begin-basic-block emit-nodes basic-block get [ ##epilogue diff --git a/basis/compiler/tests/templates.factor b/basis/compiler/tests/templates.factor index de87ad8c00..0a109a15eb 100644 --- a/basis/compiler/tests/templates.factor +++ b/basis/compiler/tests/templates.factor @@ -219,3 +219,14 @@ TUPLE: my-tuple ; : bad-value-bug ( a -- b ) [ 3 ] [ 3 ] if f ; [ { f f f } ] [ t bad-value-bug ] unit-test + +! PowerPC regression +TUPLE: id obj ; + +: (gc-check-bug) ( a b -- c ) + { [ id boa ] [ id boa ] } dispatch ; + +: gc-check-bug ( -- ) + 10000000 [ "hi" 0 (gc-check-bug) drop ] times ; + +[ ] [ gc-check-bug ] unit-test diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index 2be46d15ee..49caae4bb8 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -4,7 +4,8 @@ USING: accessors assocs sequences kernel combinators make math math.order math.ranges system namespaces locals layouts words alien alien.c-types cpu.architecture cpu.ppc.assembler compiler.cfg.registers compiler.cfg.instructions -compiler.constants compiler.codegen compiler.codegen.fixup ; +compiler.constants compiler.codegen compiler.codegen.fixup +compiler.cfg.intrinsics compiler.cfg.stack-frame ; IN: cpu.ppc ! PowerPC register assignments: @@ -15,15 +16,19 @@ IN: cpu.ppc ! f0-f29: float vregs ! f30, f31: float scratch +enable-float-intrinsics + +<< \ ##integer>float t frame-required? set-word-prop +\ ##float>integer t frame-required? set-word-prop >> + M: ppc machine-registers { { int-regs T{ range f 2 26 1 } } - { double-float-regs T{ range f 0 28 1 } } + { double-float-regs T{ range f 0 29 1 } } } ; : scratch-reg 28 ; inline -: fp-scratch-reg-1 29 ; inline -: fp-scratch-reg-2 30 ; inline +: fp-scratch-reg 30 ; inline M: ppc two-operand? f ; @@ -54,8 +59,16 @@ M: ppc %inc-d ( n -- ) ds-reg (%inc) ; M: ppc %inc-r ( n -- ) rs-reg (%inc) ; HOOK: reserved-area-size os ( -- n ) -HOOK: lr-save os ( -- n ) +! The start of the stack frame contains the size of this frame +! as well as the currently executing XT +: factor-area-size ( -- n ) 2 cells ; foldable +: next-save ( n -- i ) cell - ; +: xt-save ( n -- i ) 2 cells - ; + +! Next, we have the spill area as well as the FFI parameter area. +! They overlap, since basic blocks with FFI calls will never +! spill. : param@ ( n -- x ) reserved-area-size + ; inline : param-save-size ( -- n ) 8 cells ; foldable @@ -63,19 +76,34 @@ HOOK: lr-save os ( -- n ) : local@ ( n -- x ) reserved-area-size param-save-size + + ; inline -: factor-area-size ( -- n ) 2 cells ; foldable +: spill-integer-base ( -- n ) + stack-frame get spill-counts>> double-float-regs swap at + double-float-regs reg-size * ; -: next-save ( n -- i ) cell - ; +: spill-integer@ ( n -- offset ) + cells spill-integer-base + param@ ; -: xt-save ( n -- i ) 2 cells - ; +: spill-float@ ( n -- offset ) + double-float-regs reg-size * param@ ; + +! Some FP intrinsics need a temporary scratch area in the stack +! frame, 8 bytes in size +: scratch@ ( n -- offset ) + stack-frame get total-size>> + factor-area-size - + param-save-size - + + ; + +! Finally we have the linkage area +HOOK: lr-save os ( -- n ) M: ppc stack-frame-size ( stack-frame -- i ) [ spill-counts>> [ swap reg-size * ] { } assoc>map sum ] [ params>> ] [ return>> ] tri + + - reserved-area-size + param-save-size + + reserved-area-size + factor-area-size + 4 cells align ; @@ -198,19 +226,19 @@ M: ppc %div-float FDIV ; M:: ppc %integer>float ( dst src -- ) HEX: 4330 scratch-reg LIS - scratch-reg 1 0 param@ STW + scratch-reg 1 0 scratch@ STW scratch-reg src MR scratch-reg dup HEX: 8000 XORIS - scratch-reg 1 cell param@ STW - fp-scratch-reg-2 1 0 param@ LFD + scratch-reg 1 4 scratch@ STW + dst 1 0 scratch@ LFD scratch-reg 4503601774854144.0 %load-indirect - fp-scratch-reg-2 scratch-reg float-offset LFD - fp-scratch-reg-2 fp-scratch-reg-2 fp-scratch-reg-2 FSUB ; + fp-scratch-reg scratch-reg float-offset LFD + dst dst fp-scratch-reg FSUB ; M:: ppc %float>integer ( dst src -- ) - fp-scratch-reg-1 src FCTIWZ - fp-scratch-reg-2 1 0 param@ STFD - dst 1 4 param@ LWZ ; + fp-scratch-reg src FCTIWZ + fp-scratch-reg 1 0 scratch@ STFD + dst 1 4 scratch@ LWZ ; M: ppc %copy ( dst src -- ) MR ; @@ -218,6 +246,10 @@ M: ppc %copy-float ( dst src -- ) FMR ; 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 ; + M:: ppc %unbox-any-c-ptr ( dst src temp -- ) [ { "is-byte-array" "end" "start" } [ define-label ] each @@ -349,11 +381,6 @@ M: ppc %gc "end" resolve-label ; M: ppc %prologue ( n -- ) - #! We use a volatile register (r11) here for scratch. Because - #! callback bodies have a prologue too, we cannot assume - #! that c_to_factor saved all non-volatile registers, so - #! we have to respect the C calling convention. Also, we - #! cannot touch any param-regs either. 0 11 LOAD32 rc-absolute-ppc-2/2 rel-this 0 MFLR 1 1 pick neg ADDI @@ -410,32 +437,11 @@ M: ppc %compare-branch (%compare) %branch ; M: ppc %compare-imm-branch (%compare-imm) %branch ; M: ppc %compare-float-branch (%compare-float) %branch ; -: spill-integer-base ( stack-frame -- n ) - [ params>> ] [ return>> ] bi + ; +M: ppc %spill-integer ( src n -- ) spill-integer@ 1 swap STW ; +M: ppc %reload-integer ( dst n -- ) spill-integer@ 1 swap LWZ ; -: stack@ 1 swap ; inline - -: spill-integer@ ( n -- reg offset ) - cells - stack-frame get spill-integer-base - + stack@ ; - -: spill-float-base ( stack-frame -- n ) - [ spill-counts>> int-regs swap at int-regs reg-size * ] - [ params>> ] - [ return>> ] - tri + + ; - -: spill-float@ ( n -- reg offset ) - double-float-regs reg-size * - stack-frame get spill-float-base - + stack@ ; - -M: ppc %spill-integer ( src n -- ) spill-integer@ STW ; -M: ppc %reload-integer ( dst n -- ) spill-integer@ LWZ ; - -M: ppc %spill-float ( src n -- ) spill-float@ STFD ; -M: ppc %reload-float ( dst n -- ) spill-float@ LFD ; +M: ppc %spill-float ( src n -- ) spill-float@ 1 swap STFD ; +M: ppc %reload-float ( dst n -- ) spill-float@ 1 swap LFD ; M: ppc %loop-entry ; diff --git a/basis/io/unix/launcher/parser/parser.factor b/basis/io/unix/launcher/parser/parser.factor index e5e83ab4e9..276ed45f27 100644 --- a/basis/io/unix/launcher/parser/parser.factor +++ b/basis/io/unix/launcher/parser/parser.factor @@ -29,5 +29,5 @@ IN: io.unix.launcher.parser PEG: tokenize-command ( command -- ast/f ) 'argument' " " token repeat1 list-of - " " token repeat0 swap over pack + " " token repeat0 tuck pack just ; diff --git a/basis/io/windows/files/files.factor b/basis/io/windows/files/files.factor old mode 100644 new mode 100755 index 3fb8029ee7..3952299543 --- a/basis/io/windows/files/files.factor +++ b/basis/io/windows/files/files.factor @@ -276,7 +276,7 @@ M: winnt file-system-info ( path -- file-system-info ) swap >>type swap >>mount-point ; -: find-first-volume ( word -- string handle ) +: find-first-volume ( -- string handle ) MAX_PATH 1+ dup length dupd FindFirstVolume dup win32-error=0/f diff --git a/basis/peg/ebnf/ebnf.factor b/basis/peg/ebnf/ebnf.factor index 776450ccd9..ccae0fec93 100644 --- a/basis/peg/ebnf/ebnf.factor +++ b/basis/peg/ebnf/ebnf.factor @@ -487,7 +487,7 @@ M: ebnf-terminal (transform) ( ast -- parser ) M: ebnf-foreign (transform) ( ast -- parser ) dup word>> search [ "Foreign word '" swap word>> append "' not found" append throw ] unless* - swap rule>> [ main ] unless* dupd swap rule [ + swap rule>> [ main ] unless* over rule [ nip ] [ execute diff --git a/basis/tools/deploy/windows/windows.factor b/basis/tools/deploy/windows/windows.factor index ad1b3cbd84..ec1259c777 100755 --- a/basis/tools/deploy/windows/windows.factor +++ b/basis/tools/deploy/windows/windows.factor @@ -9,16 +9,14 @@ IN: tools.deploy.windows "resource:factor.dll" swap copy-file-into ; : copy-freetype ( bundle-name -- ) - deploy-ui? get [ - { - "resource:freetype6.dll" - "resource:zlib1.dll" - } swap copy-files-into - ] [ drop ] if ; + { + "resource:freetype6.dll" + "resource:zlib1.dll" + } swap copy-files-into ; : create-exe-dir ( vocab bundle-name -- vm ) + dup copy-dll deploy-ui? get [ - dup copy-dll dup copy-freetype dup "" copy-fonts ] when @@ -26,14 +24,14 @@ IN: tools.deploy.windows M: winnt deploy* "resource:" [ - deploy-name over deploy-config at - [ - { + dup deploy-config [ + deploy-name get + [ [ create-exe-dir ] [ image-name ] [ drop ] - [ drop deploy-config ] - } 2cleave make-deploy-image - ] - [ nip open-in-explorer ] 2bi + 2tri namespace make-deploy-image + ] + [ nip open-in-explorer ] 2bi + ] bind ] with-directory ; diff --git a/basis/tools/test/test-docs.factor b/basis/tools/test/test-docs.factor index 4b2521d19c..02c0ad126d 100644 --- a/basis/tools/test/test-docs.factor +++ b/basis/tools/test/test-docs.factor @@ -17,7 +17,7 @@ ARTICLE: "tools.test.run" "Running unit tests" { $subsection test-all } ; ARTICLE: "tools.test.failure" "Handling test failures" -"Most of the time the words documented in " { $link "tools.test.run" } " are used because they print all test failures in human-readable form. Sometimes, you want to develop a tool which inspects the test failures and takes some kind of action instead; one example is " { $vocab-link "builder" } "." +"Most of the time the words documented in " { $link "tools.test.run" } " are used because they print all test failures in human-readable form. Some tools inspect the test failures and takes some kind of action instead, for example, " { $vocab-link "mason" } "." $nl "The following words output an association list mapping vocabulary names to sequences of failures; a failure is an array having the shape " { $snippet "{ error test continuation }" } ", and the elements are as follows:" { $list diff --git a/basis/ui/gadgets/labelled/labelled.factor b/basis/ui/gadgets/labelled/labelled.factor index 8cf13c8367..37b1d251e8 100644 --- a/basis/ui/gadgets/labelled/labelled.factor +++ b/basis/ui/gadgets/labelled/labelled.factor @@ -39,7 +39,7 @@ M: labelled-gadget focusable-child* content>> ; : ( title quot -- gadget ) - swap dup [ @left grid-add ] [ drop ] if + swap [ @left grid-add ] when* swap @center grid-add ; TUPLE: closable-gadget < frame content ; diff --git a/basis/ui/gadgets/scrollers/scrollers.factor b/basis/ui/gadgets/scrollers/scrollers.factor index 633e3ad4a8..d1429c4006 100644 --- a/basis/ui/gadgets/scrollers/scrollers.factor +++ b/basis/ui/gadgets/scrollers/scrollers.factor @@ -4,7 +4,8 @@ USING: accessors arrays ui.gadgets ui.gadgets.viewports ui.gadgets.frames ui.gadgets.grids ui.gadgets.theme ui.gadgets.sliders ui.gestures kernel math namespaces sequences models models.range models.compose -combinators math.vectors classes.tuple math.geometry.rect ; +combinators math.vectors classes.tuple math.geometry.rect +combinators.short-circuit ; IN: ui.gadgets.scrollers TUPLE: scroller < frame viewport x y follows ; @@ -70,13 +71,10 @@ scroller H{ : relative-scroll-rect ( rect gadget scroller -- newrect ) viewport>> gadget-child relative-loc offset-rect ; -: find-scroller* ( gadget -- scroller ) - dup find-scroller dup [ - 2dup viewport>> gadget-child - swap child? [ nip ] [ 2drop f ] if - ] [ - 2drop f - ] if ; +: find-scroller* ( gadget -- scroller/f ) + dup find-scroller + { [ nip ] [ viewport>> gadget-child swap child? ] [ nip ] } + 2&& ; : scroll>rect ( rect gadget -- ) dup find-scroller* dup [ diff --git a/core/generic/standard/standard-docs.factor b/core/generic/standard/standard-docs.factor index 1d98dec87c..15913b46be 100644 --- a/core/generic/standard/standard-docs.factor +++ b/core/generic/standard/standard-docs.factor @@ -16,7 +16,7 @@ HELP: standard-combination { $examples "A generic word for append strings and characters to a sequence, dispatching on the object underneath the top of the stack:" { $code - "G: build-string 1 standard-combination ;" + "GENERIC# build-string 1 ( elt str -- )" "M: string build-string swap push-all ;" "M: integer build-string push ;" } diff --git a/extra/builder/build/build.factor b/extra/builder/build/build.factor deleted file mode 100644 index e9f58980ea..0000000000 --- a/extra/builder/build/build.factor +++ /dev/null @@ -1,46 +0,0 @@ - -USING: io.files io.launcher io.encodings.utf8 prettyprint - builder.util builder.common builder.child builder.release - builder.report builder.email builder.cleanup ; - -IN: builder.build - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: create-build-dir ( -- ) - datestamp >stamp - build-dir make-directory ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: enter-build-dir ( -- ) build-dir set-current-directory ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: clone-builds-factor ( -- ) - { "git" "clone" builds/factor } to-strings try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: record-id ( -- ) - "factor" - [ git-id "../git-id" utf8 [ . ] with-file-writer ] - with-directory ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: build ( -- ) - reset-status - create-build-dir - enter-build-dir - clone-builds-factor - record-id - build-child - release - report - email-report - cleanup ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -MAIN: build \ No newline at end of file diff --git a/extra/builder/builder.factor b/extra/builder/builder.factor deleted file mode 100644 index 29daa8160b..0000000000 --- a/extra/builder/builder.factor +++ /dev/null @@ -1,21 +0,0 @@ - -USING: kernel debugger io.files threads calendar - builder.common - builder.updates - builder.build ; - -IN: builder - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: build-loop ( -- ) - builds-check - [ - builds/factor set-current-directory - new-code-available? [ build ] when - ] - try - 5 minutes sleep - build-loop ; - -MAIN: build-loop \ No newline at end of file diff --git a/extra/builder/child/child.factor b/extra/builder/child/child.factor deleted file mode 100644 index 0f701dfdd7..0000000000 --- a/extra/builder/child/child.factor +++ /dev/null @@ -1,68 +0,0 @@ - -USING: namespaces debugger io.files io.launcher accessors bootstrap.image - calendar builder.util builder.common ; - -IN: builder.child - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: make-clean ( -- ) { gnu-make "clean" } to-strings try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: make-vm ( -- ) - - gnu-make >>command - "../compile-log" >>stdout - +stdout+ >>stderr - try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: builds-factor-image ( -- img ) builds/factor my-boot-image-name append-path ; - -: copy-image ( -- ) - builds-factor-image ".." copy-file-into - builds-factor-image "." copy-file-into ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: boot-cmd ( -- cmd ) - { "./factor" { "-i=" my-boot-image-name } "-no-user-init" } to-strings ; - -: boot ( -- ) - - boot-cmd >>command - +closed+ >>stdin - "../boot-log" >>stdout - +stdout+ >>stderr - 60 minutes >>timeout - try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: test-cmd ( -- cmd ) { "./factor" "-run=builder.test" } ; - -: test ( -- ) - - test-cmd >>command - +closed+ >>stdin - "../test-log" >>stdout - +stdout+ >>stderr - 240 minutes >>timeout - try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: (build-child) ( -- ) - make-clean - make-vm status-vm on - copy-image - boot status-boot on - test status-test on - status on ; - -: build-child ( -- ) - "factor" set-current-directory - [ (build-child) ] try - ".." set-current-directory ; \ No newline at end of file diff --git a/extra/builder/cleanup/cleanup.factor b/extra/builder/cleanup/cleanup.factor deleted file mode 100644 index e601506fb4..0000000000 --- a/extra/builder/cleanup/cleanup.factor +++ /dev/null @@ -1,26 +0,0 @@ - -USING: kernel namespaces io.files io.launcher bootstrap.image - builder.util builder.common ; - -IN: builder.cleanup - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: builder-debug - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: compress-image ( -- ) { "bzip2" my-boot-image-name } to-strings try-process ; - -: delete-child-factor ( -- ) - build-dir [ { "rm" "-rf" "factor" } try-process ] with-directory ; - -: cleanup ( -- ) - builder-debug get f = - [ - "test-log" delete-file - delete-child-factor - compress-image - ] - when ; - diff --git a/extra/builder/common/common.factor b/extra/builder/common/common.factor deleted file mode 100644 index 474606e451..0000000000 --- a/extra/builder/common/common.factor +++ /dev/null @@ -1,54 +0,0 @@ - -USING: kernel namespaces sequences splitting - io io.files io.launcher io.encodings.utf8 prettyprint - vars builder.util ; - -IN: builder.common - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: upload-to-factorcode - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: builds-dir - -: builds ( -- path ) - builds-dir get - home "/builds" append - or ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -VAR: stamp - -: builds/factor ( -- path ) builds "factor" append-path ; -: build-dir ( -- path ) builds stamp> append-path ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: prepare-build-machine ( -- ) - builds make-directory - builds - [ { "git" "clone" "git://factorcode.org/git/factor.git" } try-process ] - with-directory ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: builds-check ( -- ) builds exists? not [ prepare-build-machine ] when ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: status-vm -SYMBOL: status-boot -SYMBOL: status-test -SYMBOL: status-build -SYMBOL: status-release -SYMBOL: status - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: reset-status ( -- ) - { status-vm status-boot status-test status-build status-release status } - [ off ] - each ; diff --git a/extra/builder/email/email.factor b/extra/builder/email/email.factor deleted file mode 100644 index ecde47f8f7..0000000000 --- a/extra/builder/email/email.factor +++ /dev/null @@ -1,24 +0,0 @@ - -USING: kernel namespaces accessors smtp builder.util builder.common ; - -IN: builder.email - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: builder-from -SYMBOL: builder-recipients - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: subject-status ( -- str ) status get [ "report" ] [ "error" ] if ; - -: subject ( -- str ) { "builder@" host-name* ": " subject-status } to-string ; - -: email-report ( -- ) - - builder-from get >>from - builder-recipients get >>to - subject >>subject - "report" file>string >>body - send-email ; - diff --git a/extra/builder/release/archive/archive.factor b/extra/builder/release/archive/archive.factor deleted file mode 100644 index 25153436e6..0000000000 --- a/extra/builder/release/archive/archive.factor +++ /dev/null @@ -1,69 +0,0 @@ - -USING: kernel combinators system sequences io.files io.launcher prettyprint - builder.util - builder.common ; - -IN: builder.release.archive - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: base-name ( -- string ) - { "factor" [ os unparse ] cpu- stamp> } to-strings "-" join ; - -: extension ( -- extension ) - { - { [ os winnt? ] [ ".zip" ] } - { [ os macosx? ] [ ".dmg" ] } - { [ os unix? ] [ ".tar.gz" ] } - } - cond ; - -: archive-name ( -- string ) base-name extension append ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: windows-archive-cmd ( -- cmd ) { "zip" "-r" archive-name "factor" } ; - -! : macosx-archive-cmd ( -- cmd ) -! { "hdiutil" "create" -! "-srcfolder" "factor" -! "-fs" "HFS+" -! "-volname" "factor" -! archive-name } ; - -: macosx-archive-cmd ( -- cmd ) - { "mkdir" "dmg-root" } try-process - { "cp" "-r" "factor" "dmg-root" } try-process - { "hdiutil" "create" - "-srcfolder" "dmg-root" - "-fs" "HFS+" - "-volname" "factor" - archive-name } to-strings try-process - { "rm" "-rf" "dmg-root" } try-process - { "true" } ; - -: unix-archive-cmd ( -- cmd ) { "tar" "-cvzf" archive-name "factor" } ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: archive-cmd ( -- cmd ) - { - { [ os windows? ] [ windows-archive-cmd ] } - { [ os macosx? ] [ macosx-archive-cmd ] } - { [ os unix? ] [ unix-archive-cmd ] } - } - cond ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: make-archive ( -- ) archive-cmd to-strings try-process ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: releases ( -- path ) - builds "releases" append-path - dup exists? not - [ dup make-directory ] - when ; - -: save-archive ( -- ) archive-name releases move-file-into ; \ No newline at end of file diff --git a/extra/builder/release/branch/branch.factor b/extra/builder/release/branch/branch.factor deleted file mode 100644 index 6b1266bb45..0000000000 --- a/extra/builder/release/branch/branch.factor +++ /dev/null @@ -1,40 +0,0 @@ - -USING: kernel system namespaces sequences prettyprint io.files io.launcher - bootstrap.image - builder.util - builder.common ; - -IN: builder.release.branch - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: branch-name ( -- string ) "clean-" platform append ; - -: refspec ( -- string ) "master:" branch-name append ; - -: push-to-clean-branch ( -- ) - { "git" "push" "factorcode.org:/git/factor.git" refspec } - to-strings - try-process ; - -: upload-clean-image ( -- ) - { - "scp" - my-boot-image-name - { "factorcode.org:/var/www/factorcode.org/newsite/images/clean/" platform } - } - to-strings - try-process ; - -: (update-clean-branch) ( -- ) - "factor" - [ - push-to-clean-branch - upload-clean-image - ] - with-directory ; - -: update-clean-branch ( -- ) - upload-to-factorcode get - [ (update-clean-branch) ] - when ; diff --git a/extra/builder/release/release.factor b/extra/builder/release/release.factor deleted file mode 100644 index 28ce3e8b35..0000000000 --- a/extra/builder/release/release.factor +++ /dev/null @@ -1,27 +0,0 @@ - -USING: kernel debugger system namespaces sequences splitting combinators - io io.files io.launcher prettyprint bootstrap.image - combinators.cleave - builder.util - builder.common - builder.release.branch - builder.release.tidy - builder.release.archive - builder.release.upload ; - -IN: builder.release - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: (release) ( -- ) - update-clean-branch - tidy - make-archive - upload - save-archive - status-release on ; - -: clean-build? ( -- ? ) - { "load-everything-vocabs" "test-all-vocabs" } [ eval-file empty? ] all? ; - -: release ( -- ) [ clean-build? [ (release) ] when ] try ; \ No newline at end of file diff --git a/extra/builder/release/tidy/tidy.factor b/extra/builder/release/tidy/tidy.factor deleted file mode 100644 index f8f27e75f2..0000000000 --- a/extra/builder/release/tidy/tidy.factor +++ /dev/null @@ -1,29 +0,0 @@ - -USING: kernel system io.files io.launcher builder.util ; - -IN: builder.release.tidy - -: common-files ( -- seq ) - { - "boot.x86.32.image" - "boot.x86.64.image" - "boot.macosx-ppc.image" - "boot.linux-ppc.image" - "vm" - "temp" - "logs" - ".git" - ".gitignore" - "Makefile" - "unmaintained" - "build-support" - } ; - -: remove-common-files ( -- ) - { "rm" "-rf" common-files } to-strings try-process ; - -: remove-factor-app ( -- ) - os macosx? not [ { "rm" "-rf" "Factor.app" } try-process ] when ; - -: tidy ( -- ) - "factor" [ remove-factor-app remove-common-files ] with-directory ; diff --git a/extra/builder/release/upload/upload.factor b/extra/builder/release/upload/upload.factor deleted file mode 100644 index 19d3936fd9..0000000000 --- a/extra/builder/release/upload/upload.factor +++ /dev/null @@ -1,54 +0,0 @@ - -USING: kernel namespaces make sequences arrays io io.files - builder.util - builder.common - builder.release.archive ; - -IN: builder.release.upload - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SYMBOL: upload-host - -SYMBOL: upload-username - -SYMBOL: upload-directory - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: remote-location ( -- dest ) - upload-directory get platform append ; - -: remote-archive-name ( -- dest ) - remote-location "/" archive-name 3append ; - -: temp-archive-name ( -- dest ) - remote-archive-name ".incomplete" append ; - -: upload-command ( -- args ) - "scp" - archive-name - [ upload-username get % "@" % upload-host get % ":" % temp-archive-name % ] "" make - 3array ; - -: rename-command ( -- args ) - [ - "ssh" , - upload-host get , - "-l" , - upload-username get , - "mv" , - temp-archive-name , - remote-archive-name , - ] { } make ; - -: upload-temp-file ( -- ) - upload-command [ "Error uploading binary to factorcode" print ] run-or-bail ; - -: rename-temp-file ( -- ) - rename-command [ "Error renaming binary on factorcode" print ] run-or-bail ; - -: upload ( -- ) - upload-to-factorcode get - [ upload-temp-file rename-temp-file ] - when ; diff --git a/extra/builder/report/report.factor b/extra/builder/report/report.factor deleted file mode 100644 index 2ac8482a76..0000000000 --- a/extra/builder/report/report.factor +++ /dev/null @@ -1,35 +0,0 @@ - -USING: kernel namespaces debugger system io io.files io.sockets - io.encodings.utf8 prettyprint benchmark - builder.util builder.common ; - -IN: builder.report - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: (report) ( -- ) - - "Build machine: " write host-name print - "CPU: " write cpu . - "OS: " write os . - "Build directory: " write build-dir print - "git id: " write "git-id" eval-file print nl - - status-vm get f = [ "compile-log" cat "vm compile error" throw ] when - status-boot get f = [ "boot-log" 100 cat-n "Boot error" throw ] when - status-test get f = [ "test-log" 100 cat-n "Test error" throw ] when - - "Boot time: " write "boot-time" eval-file milli-seconds>time print - "Load time: " write "load-time" eval-file milli-seconds>time print - "Test time: " write "test-time" eval-file milli-seconds>time print nl - - "Did not pass load-everything: " print "load-everything-vocabs" cat - - "Did not pass test-all: " print "test-all-vocabs" cat - "test-failures" cat - - "help-lint results:" print "help-lint" cat - - "Benchmarks: " print "benchmarks" eval-file benchmarks. ; - -: report ( -- ) "report" utf8 [ [ (report) ] try ] with-file-writer ; \ No newline at end of file diff --git a/extra/builder/test/test.factor b/extra/builder/test/test.factor deleted file mode 100644 index 2a0769f278..0000000000 --- a/extra/builder/test/test.factor +++ /dev/null @@ -1,35 +0,0 @@ - -USING: kernel namespaces assocs - io.files io.encodings.utf8 prettyprint - help.lint - benchmark - tools.time - bootstrap.stage2 - tools.test tools.vocabs - builder.util ; - -IN: builder.test - -: do-load ( -- ) - try-everything keys "../load-everything-vocabs" utf8 [ . ] with-file-writer ; - -: do-tests ( -- ) - run-all-tests - [ keys "../test-all-vocabs" utf8 [ . ] with-file-writer ] - [ "../test-failures" utf8 [ test-failures. ] with-file-writer ] - bi ; - -: do-help-lint ( -- ) - "" run-help-lint "../help-lint" utf8 [ typos. ] with-file-writer ; - -: do-benchmarks ( -- ) - run-benchmarks "../benchmarks" utf8 [ . ] with-file-writer ; - -: do-all ( -- ) - bootstrap-time get "../boot-time" utf8 [ . ] with-file-writer - [ do-load ] benchmark "../load-time" utf8 [ . ] with-file-writer - [ do-tests ] benchmark "../test-time" utf8 [ . ] with-file-writer - do-help-lint - do-benchmarks ; - -MAIN: do-all \ No newline at end of file diff --git a/extra/builder/updates/updates.factor b/extra/builder/updates/updates.factor deleted file mode 100644 index a8184550e0..0000000000 --- a/extra/builder/updates/updates.factor +++ /dev/null @@ -1,31 +0,0 @@ - -USING: kernel io.launcher bootstrap.image bootstrap.image.download - builder.util builder.common ; - -IN: builder.updates - -: git-pull-cmd ( -- cmd ) - { - "git" - "pull" - "--no-summary" - "git://factorcode.org/git/factor.git" - "master" - } ; - -: updates-available? ( -- ? ) - git-id - git-pull-cmd try-process - git-id - = not ; - -: new-image-available? ( -- ? ) - my-boot-image-name need-new-image? - [ download-my-image t ] - [ f ] - if ; - -: new-code-available? ( -- ? ) - updates-available? - new-image-available? - or ; \ No newline at end of file diff --git a/extra/builder/util/util.factor b/extra/builder/util/util.factor deleted file mode 100644 index 32d1e45066..0000000000 --- a/extra/builder/util/util.factor +++ /dev/null @@ -1,106 +0,0 @@ - -USING: kernel words namespaces classes parser continuations - io io.files io.launcher io.sockets - math math.parser - system - combinators sequences splitting quotations arrays strings tools.time - sequences.deep accessors assocs.lib - io.encodings.utf8 - combinators.cleave calendar calendar.format eval ; - -IN: builder.util - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: minutes>ms ( min -- ms ) 60 * 1000 * ; - -: file>string ( file -- string ) utf8 file-contents ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -DEFER: to-strings - -: to-string ( obj -- str ) - dup class - { - { \ string [ ] } - { \ quotation [ call ] } - { \ word [ execute ] } - { \ fixnum [ number>string ] } - { \ array [ to-strings concat ] } - } - case ; - -: to-strings ( seq -- str ) - dup [ string? ] all? - [ ] - [ [ to-string ] map flatten ] - if ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: host-name* ( -- name ) host-name "." split first ; - -: datestamp ( -- string ) - now - { year>> month>> day>> hour>> minute>> } - [ pad-00 ] map "-" join ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: milli-seconds>time ( n -- string ) - 1000 /i 60 /mod >r 60 /mod r> 3array [ pad-00 ] map ":" join ; - -: eval-file ( file -- obj ) utf8 file-contents eval ; - -: cat ( file -- ) utf8 file-contents print ; - -: run-or-bail ( desc quot -- ) - [ [ try-process ] curry ] - [ [ throw ] compose ] - bi* - recover ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -USING: bootstrap.image bootstrap.image.download io.streams.null ; - -: retrieve-image ( -- ) [ my-arch download-image ] with-null-stream ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: longer? ( seq seq -- ? ) [ length ] bi@ > ; - -: maybe-tail* ( seq n -- seq ) - 2dup longer? - [ tail* ] - [ drop ] - if ; - -: cat-n ( file n -- ) - [ utf8 file-lines ] [ ] bi* - maybe-tail* - [ print ] each ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -USE: prettyprint - -: to-file ( object file -- ) utf8 [ . ] with-file-writer ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: cpu- ( -- cpu ) cpu unparse "." split "-" join ; - -: platform ( -- string ) { [ os unparse ] cpu- } to-strings "-" join ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: gnu-make ( -- string ) - os { freebsd openbsd netbsd } member? [ "gmake" ] [ "make" ] if ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -: git-id ( -- id ) - { "git" "show" } utf8 [ readln ] with-input-stream - " " split second ; diff --git a/extra/project-euler/215/215-tests.factor b/extra/project-euler/215/215-tests.factor new file mode 100644 index 0000000000..ddd87cc2ff --- /dev/null +++ b/extra/project-euler/215/215-tests.factor @@ -0,0 +1,5 @@ +USING: project-euler.215 tools.test ; +IN: project-euler.215.tests + +[ 8 ] [ 9 3 solve ] unit-test +[ 806844323190414 ] [ euler215 ] unit-test diff --git a/extra/project-euler/215/215.factor b/extra/project-euler/215/215.factor new file mode 100644 index 0000000000..056de72e50 --- /dev/null +++ b/extra/project-euler/215/215.factor @@ -0,0 +1,56 @@ +USING: accessors kernel locals math ; +IN: project-euler.215 + +TUPLE: block two three ; +TUPLE: end { ways integer } ; + +C: block +C: end +: 0 ; inline +: 1 ; inline + +: failure? ( t -- ? ) ways>> 0 = ; inline + +: choice ( t p q -- t t ) [ [ two>> ] [ three>> ] bi ] 2dip bi* ; inline + +GENERIC: merge ( t t -- t ) +GENERIC# block-merge 1 ( t t -- t ) +GENERIC# end-merge 1 ( t t -- t ) +M: block merge block-merge ; +M: end merge end-merge ; +M: block block-merge [ [ two>> ] bi@ merge ] + [ [ three>> ] bi@ merge ] 2bi ; +M: end block-merge nip ; +M: block end-merge drop ; +M: end end-merge [ ways>> ] bi@ + ; + +GENERIC: h-1 ( t -- t ) +GENERIC: h0 ( t -- t ) +GENERIC: h1 ( t -- t ) +GENERIC: h2 ( t -- t ) + +M: block h-1 [ h1 ] [ h2 ] choice merge ; +M: block h0 drop ; +M: block h1 [ [ h1 ] [ h2 ] choice merge ] + [ [ h0 ] [ h1 ] choice merge ] bi ; +M: block h2 [ h1 ] [ h2 ] choice merge swap ; + +M: end h-1 drop ; +M: end h0 ; +M: end h1 drop ; +M: end h2 dup failure? [ ] unless ; + +: next-row ( t -- t ) [ h-1 ] [ h1 ] choice swap ; + +: first-row ( n -- t ) + [ ] dip + 1- [| a b c | b c a b ] times 2drop ; + +GENERIC: total ( t -- n ) +M: block total [ total ] dup choice + ; +M: end total ways>> ; + +: solve ( width height -- ways ) + [ first-row ] dip 1- [ next-row ] times total ; + +: euler215 ( -- ways ) 32 10 solve ; diff --git a/extra/update/backup/backup.factor b/extra/update/backup/backup.factor index 0dcf853b98..0c7b442ffa 100644 --- a/extra/update/backup/backup.factor +++ b/extra/update/backup/backup.factor @@ -1,5 +1,5 @@ -USING: namespaces debugger io.files bootstrap.image builder.util ; +USING: namespaces debugger io.files bootstrap.image update.util ; IN: update.backup diff --git a/extra/update/latest/latest.factor b/extra/update/latest/latest.factor index df057422f9..7cc2fac853 100644 --- a/extra/update/latest/latest.factor +++ b/extra/update/latest/latest.factor @@ -1,6 +1,6 @@ USING: kernel namespaces system io.files bootstrap.image http.client - builder.util update update.backup ; + update update.backup update.util ; IN: update.latest diff --git a/extra/update/update.factor b/extra/update/update.factor index 1d25a9792e..c6a5671345 100644 --- a/extra/update/update.factor +++ b/extra/update/update.factor @@ -1,7 +1,9 @@ USING: kernel system sequences io.files io.launcher bootstrap.image http.client - builder.util builder.release.branch ; + update.util ; + + ! builder.util builder.release.branch ; IN: update diff --git a/extra/update/util/util.factor b/extra/update/util/util.factor new file mode 100644 index 0000000000..b638b61528 --- /dev/null +++ b/extra/update/util/util.factor @@ -0,0 +1,62 @@ + +USING: kernel classes strings quotations words math math.parser arrays + combinators.cleave + accessors + system prettyprint splitting + sequences combinators sequences.deep + io + io.launcher + io.encodings.utf8 + calendar + calendar.format ; + +IN: update.util + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +DEFER: to-strings + +: to-string ( obj -- str ) + dup class + { + { \ string [ ] } + { \ quotation [ call ] } + { \ word [ execute ] } + { \ fixnum [ number>string ] } + { \ array [ to-strings concat ] } + } + case ; + +: to-strings ( seq -- str ) + dup [ string? ] all? + [ ] + [ [ to-string ] map flatten ] + if ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: cpu- ( -- cpu ) cpu unparse "." split "-" join ; + +: platform ( -- string ) { [ os unparse ] cpu- } to-strings "-" join ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: branch-name ( -- string ) "clean-" platform append ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: gnu-make ( -- string ) + os { freebsd openbsd netbsd } member? [ "gmake" ] [ "make" ] if ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: git-id ( -- id ) + { "git" "show" } utf8 [ readln ] with-input-stream + " " split second ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: datestamp ( -- string ) + now + { year>> month>> day>> hour>> minute>> } + [ pad-00 ] map "-" join ; diff --git a/extra/size-of/size-of.factor b/unmaintained/size-of/size-of.factor similarity index 100% rename from extra/size-of/size-of.factor rename to unmaintained/size-of/size-of.factor