Merge git://factorcode.org/git/factor

release
Doug Coleman 2007-09-27 10:25:04 -05:00
commit c3a35c8941
68 changed files with 563 additions and 2073 deletions

View File

@ -22,7 +22,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>factor</string> <string>factor</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>FRaptorMix.icns</string> <string>Factor.icns</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.factorcode.Factor</string> <string>org.factorcode.Factor</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>

Binary file not shown.

View File

@ -36,7 +36,7 @@ IN: bootstrap.image
: wrapper@ bootstrap-cell object tag-number - ; : wrapper@ bootstrap-cell object tag-number - ;
: word-xt@ 8 bootstrap-cells object tag-number - ; : word-xt@ 8 bootstrap-cells object tag-number - ;
: quot-array@ bootstrap-cell object tag-number - ; : quot-array@ bootstrap-cell object tag-number - ;
: quot-xt@ 2 bootstrap-cells object tag-number - ; : quot-xt@ 3 bootstrap-cells object tag-number - ;
! The image being constructed; a vector of word-size integers ! The image being constructed; a vector of word-size integers
SYMBOL: image SYMBOL: image
@ -312,6 +312,7 @@ M: quotation '
quotation-array ' quotation-array '
quotation type-number object tag-number [ quotation type-number object tag-number [
emit ! array emit ! array
f ' emit ! compiled?
0 emit ! XT 0 emit ! XT
] emit-object ] emit-object
] cache ; ] cache ;

View File

@ -452,6 +452,13 @@ num-types get f <array> builtins set
{ "quotation-array" "quotations.private" } { "quotation-array" "quotations.private" }
f f
} }
{
{ "object" "kernel" }
"compiled?"
2
{ "quotation-compiled?" "quotations" }
f
}
} define-builtin } define-builtin
"dll" "alien" create "dll?" "alien" create "dll" "alien" create "dll?" "alien" create

View File

@ -3,7 +3,7 @@
USING: classes inference inference.dataflow io kernel USING: classes inference inference.dataflow io kernel
kernel.private math.parser namespaces optimizer prettyprint kernel.private math.parser namespaces optimizer prettyprint
prettyprint.backend sequences words arrays match macros prettyprint.backend sequences words arrays match macros
assocs ; assocs combinators.private ;
IN: optimizer.debugger IN: optimizer.debugger
! A simple tool for turning dataflow IR into quotations, for ! A simple tool for turning dataflow IR into quotations, for

View File

@ -191,14 +191,14 @@ TUPLE: slice from to seq ;
TUPLE: slice-error reason ; TUPLE: slice-error reason ;
: slice-error ( str -- * ) \ slice-error construct-boa throw ; : slice-error ( str -- * ) \ slice-error construct-boa throw ;
: check-slice ( from to seq -- ) : check-slice ( from to seq -- from to seq )
pick 0 < [ "start < 0" slice-error ] when pick 0 < [ "start < 0" slice-error ] when
length over < [ "end > sequence" slice-error ] when dup length pick < [ "end > sequence" slice-error ] when
> [ "start > end" slice-error ] when ; pick pick > [ "start > end" slice-error ] when ;
: <slice> ( from to seq -- slice ) : <slice> ( from to seq -- slice )
dup slice? [ collapse-slice ] when dup slice? [ collapse-slice ] when
3dup check-slice check-slice
slice construct-boa ; slice construct-boa ;
M: slice virtual-seq slice-seq ; M: slice virtual-seq slice-seq ;
@ -259,7 +259,7 @@ INSTANCE: repetition immutable-sequence
PRIVATE> PRIVATE>
: subseq ( from to seq -- subseq ) : subseq ( from to seq -- subseq )
[ 3dup check-slice prepare-subseq (copy) ] keep like ; [ check-slice prepare-subseq (copy) ] keep like ;
: head ( seq n -- headseq ) (head) subseq ; : head ( seq n -- headseq ) (head) subseq ;
@ -525,7 +525,7 @@ M: sequence <=>
] if ; ] if ;
: delete-slice ( from to seq -- ) : delete-slice ( from to seq -- )
3dup check-slice >r over >r - r> r> open-slice ; check-slice >r over >r - r> r> open-slice ;
: delete-nth ( n seq -- ) : delete-nth ( n seq -- )
>r dup 1+ r> delete-slice ; >r dup 1+ r> delete-slice ;

View File

@ -1,4 +1,5 @@
USING: kernel.private kernel sequences math combinators ; USING: kernel.private kernel sequences math combinators
combinators.private ;
IN: benchmark.dispatch4 IN: benchmark.dispatch4
: foobar-1 : foobar-1

View File

@ -56,7 +56,7 @@ VAR: separation-radius
! random-boid and random-boids ! random-boid and random-boids
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: random-range ( a b -- n ) 1 + dupd swap - random + ; : random-range ( a b -- n ) 1+ over - random + ;
: random-pos ( -- pos ) world-size> [ random ] map ; : random-pos ( -- pos ) world-size> [ random ] map ;
@ -68,7 +68,7 @@ VAR: separation-radius
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: distance ( boid boid -- n ) boid-pos swap boid-pos v- norm ; : distance ( boid boid -- n ) [ boid-pos ] [ boid-pos ] bi* v- norm ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -79,7 +79,7 @@ VAR: separation-radius
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: relative-position ( self other -- v ) boid-pos swap boid-pos v- ; : relative-position ( self other -- v ) swap [ boid-pos ] 2apply v- ;
: relative-angle ( self other -- angle ) : relative-angle ( self other -- angle )
over boid-vel -rot relative-position angle-between ; over boid-vel -rot relative-position angle-between ;
@ -88,7 +88,7 @@ over boid-vel -rot relative-position angle-between ;
: vsum ( vector-of-vectors -- vec ) { 0 0 } [ v+ ] reduce ; : vsum ( vector-of-vectors -- vec ) { 0 0 } [ v+ ] reduce ;
: vaverage ( seq-of-vectors -- seq ) dup vsum swap length v/n ; : vaverage ( seq-of-vectors -- seq ) [ vsum ] [ length ] bi v/n ;
: average-position ( boids -- pos ) [ boid-pos ] map vaverage ; : average-position ( boids -- pos ) [ boid-pos ] map vaverage ;
@ -204,14 +204,14 @@ cond ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: new-pos ( boid -- pos ) dup boid-vel time-slice> v*n swap boid-pos v+ ; : new-pos ( boid -- pos ) [ boid-pos ] [ boid-vel time-slice> v*n ] bi v+ ;
: new-vel ( boid -- vel ) : new-vel ( boid -- vel )
dup acceleration time-slice> v*n swap boid-vel v+ normalize* ; [ boid-vel ] [ acceleration time-slice> v*n ] bi v+ normalize* ;
: wrap-pos ( pos -- pos ) { [ wrap-x ] [ wrap-y ] } parallel-call ; : wrap-pos ( pos -- pos ) { [ wrap-x ] [ wrap-y ] } parallel-call ;
: iterate-boid ( self -- self ) dup >r new-pos wrap-pos r> new-vel <boid> ; : iterate-boid ( self -- self ) [ new-pos wrap-pos ] [ new-vel ] bi <boid> ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

View File

@ -18,7 +18,7 @@ USING: kernel namespaces
ui.gadgets.packs ui.gadgets.packs
ui.gadgets.grids ui.gadgets.grids
ui.gestures ui.gestures
hashtables.lib vars rewrite-closures boids ; combinators.lib hashtables.lib vars rewrite-closures boids ;
IN: boids.ui IN: boids.ui
@ -26,16 +26,13 @@ IN: boids.ui
! draw-boid ! draw-boid
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: boid-point-a ( boid -- a ) boid-pos ; : point-a ( boid -- a ) boid-pos ;
: boid-point-b ( boid -- b ) dup boid-pos swap boid-vel normalize* 20 v*n v+ ; : point-b ( boid -- b ) [ boid-pos ] [ boid-vel normalize* 20 v*n ] bi v+ ;
: boid-points ( boid -- point-a point-b ) dup boid-point-a swap boid-point-b ; : boid-points ( boid -- point-a point-b ) [ point-a ] [ point-b ] bi ;
: draw-line ( a b -- ) : draw-boid ( boid -- ) boid-points gl-line ;
GL_LINES glBegin first2 glVertex2d first2 glVertex2d glEnd ;
: draw-boid ( boid -- ) boid-points draw-line ;
: draw-boids ( -- ) boids> [ draw-boid ] each ; : draw-boids ( -- ) boids> [ draw-boid ] each ;

View File

@ -0,0 +1,72 @@
! Cairo "Hello World" demo
! Copyright (c) 2007 Sampo Vuori
! License: http://factorcode.org/license.txt
!
! This example is an adaptation of the following cairo sample code:
! http://cairographics.org/samples/text/
USING: cairo math math.constants byte-arrays kernel ui ui.render
ui.gadgets opengl.gl ;
IN: cairo-demo
: make-image-array ( -- array )
384 256 4 * * <byte-array> ;
: convert-array-to-surface ( array -- cairo_surface_t )
CAIRO_FORMAT_ARGB32 384 256 over 4 *
cairo_image_surface_create_for_data ;
TUPLE: cairo-gadget image-array cairo-t ;
M: cairo-gadget draw-gadget* ( gadget -- )
0 0 glRasterPos2i
1.0 -1.0 glPixelZoom
>r 384 256 GL_RGBA GL_UNSIGNED_BYTE r>
cairo-gadget-image-array glDrawPixels ;
: create-surface ( gadget -- cairo_surface_t )
make-image-array dup >r swap set-cairo-gadget-image-array r> convert-array-to-surface ;
: init-cairo ( gadget -- cairo_t )
create-surface cairo_create ;
M: cairo-gadget pref-dim* drop { 384 256 0 } ;
: draw-hello-world ( gadget -- )
cairo-gadget-cairo-t
dup "Sans" CAIRO_FONT_SLANT_NORMAL CAIRO_FONT_WEIGHT_BOLD cairo_select_font_face
dup 90.0 cairo_set_font_size
dup 10.0 135.0 cairo_move_to
dup "Hello" cairo_show_text
dup 70.0 165.0 cairo_move_to
dup "World" cairo_text_path
dup 0.5 0.5 1 cairo_set_source_rgb
dup cairo_fill_preserve
dup 0 0 0 cairo_set_source_rgb
dup 2.56 cairo_set_line_width
dup cairo_stroke
dup 1 0.2 0.2 0.6 cairo_set_source_rgba
dup 10.0 135.0 5.12 0 pi 2 * cairo_arc
dup cairo_close_path
dup 70.0 165.0 5.12 0 pi 2 * cairo_arc
cairo_fill ;
M: cairo-gadget graft* ( gadget -- )
dup dup init-cairo swap set-cairo-gadget-cairo-t draw-hello-world ;
M: cairo-gadget ungraft* ( gadget -- )
cairo-gadget-cairo-t cairo_destroy ;
: <cairo-gadget> ( -- gadget )
cairo-gadget construct-gadget ;
: run ( -- )
[
<cairo-gadget> "Hello World from Factor!" open-window
] with-ui ;
MAIN: run

View File

@ -1,6 +1,25 @@
! Cairo binding ! Bindings for Cairo library
! Copyright (c) 2007 Sampo Vuori
! License: http://factorcode.org/license.txt
! Unimplemented:
! - most of the font stuff
! - most of the matrix stuff
! - most of the query functions
USING: alien alien.syntax combinators system ;
IN: cairo IN: cairo
USING: alien alien.syntax ;
: load-cairo-library ( -- )
"cairo" {
{ [ win32? ] [ "cairo.dll" ] }
{ [ macosx? ] [ "libcairo.dylib" ] }
{ [ unix? ] [ "libcairo.so.2" ] }
} cond "cdecl" add-library ; parsing
load-cairo-library
! cairo_status_t ! cairo_status_t
C-ENUM: C-ENUM:
@ -10,24 +29,43 @@ C-ENUM:
CAIRO_STATUS_INVALID_POP_GROUP CAIRO_STATUS_INVALID_POP_GROUP
CAIRO_STATUS_NO_CURRENT_POINT CAIRO_STATUS_NO_CURRENT_POINT
CAIRO_STATUS_INVALID_MATRIX CAIRO_STATUS_INVALID_MATRIX
CAIRO_STATUS_NO_TARGET_SURFACE CAIRO_STATUS_INVALID_STATUS
CAIRO_STATUS_NULL_POINTER CAIRO_STATUS_NULL_POINTER
CAIRO_STATUS_INVALID_STRING CAIRO_STATUS_INVALID_STRING
CAIRO_STATUS_INVALID_PATH_DATA
CAIRO_STATUS_READ_ERROR
CAIRO_STATUS_WRITE_ERROR
CAIRO_STATUS_SURFACE_FINISHED
CAIRO_STATUS_SURFACE_TYPE_MISMATCH
CAIRO_STATUS_PATTERN_TYPE_MISMATCH
CAIRO_STATUS_INVALID_CONTENT
CAIRO_STATUS_INVALID_FORMAT
CAIRO_STATUS_INVALID_VISUAL
CAIRO_STATUS_FILE_NOT_FOUND
CAIRO_STATUS_INVALID_DASH
CAIRO_STATUS_INVALID_DSC_COMMENT
CAIRO_STATUS_INVALID_INDEX
CAIRO_STATUS_CLIP_NOT_REPRESENTABLE
; ;
! cairo_content_t
: CAIRO_CONTENT_COLOR HEX: 1000 ;
: CAIRO_CONTENT_ALPHA HEX: 2000 ;
: CAIRO_CONTENT_COLOR_ALPHA HEX: 3000 ;
! cairo_operator_t ! cairo_operator_t
C-ENUM: C-ENUM:
CAIRO_OPERATOR_CLEAR CAIRO_OPERATOR_CLEAR
CAIRO_OPERATOR_SRC CAIRO_OPERATOR_SOURCE
CAIRO_OPERATOR_DST
CAIRO_OPERATOR_OVER CAIRO_OPERATOR_OVER
CAIRO_OPERATOR_OVER_REVERSE
CAIRO_OPERATOR_IN CAIRO_OPERATOR_IN
CAIRO_OPERATOR_IN_REVERSE
CAIRO_OPERATOR_OUT CAIRO_OPERATOR_OUT
CAIRO_OPERATOR_OUT_REVERSE
CAIRO_OPERATOR_ATOP CAIRO_OPERATOR_ATOP
CAIRO_OPERATOR_ATOP_REVERSE CAIRO_OPERATOR_DEST
CAIRO_OPERATOR_DEST_OVER
CAIRO_OPERATOR_DEST_IN
CAIRO_OPERATOR_DEST_OUT
CAIRO_OPERATOR_DEST_ATOP
CAIRO_OPERATOR_XOR CAIRO_OPERATOR_XOR
CAIRO_OPERATOR_ADD CAIRO_OPERATOR_ADD
CAIRO_OPERATOR_SATURATE CAIRO_OPERATOR_SATURATE
@ -116,6 +154,14 @@ C-STRUCT: cairo_t
{ "cairo_gstate_t*" "gstate" } { "cairo_gstate_t*" "gstate" }
{ "uint" "status ! cairo_status_t" } ; { "uint" "status ! cairo_status_t" } ;
C-STRUCT: cairo_matrix_t
{ "double" "xx" }
{ "double" "yx" }
{ "double" "xy" }
{ "double" "yy" }
{ "double" "x0" }
{ "double" "y0" } ;
! cairo_format_t ! cairo_format_t
C-ENUM: C-ENUM:
CAIRO_FORMAT_ARGB32 CAIRO_FORMAT_ARGB32
@ -160,15 +206,24 @@ C-ENUM:
: cairo_create ( cairo_surface_t -- cairo_t ) : cairo_create ( cairo_surface_t -- cairo_t )
"cairo_t*" "cairo" "cairo_create" [ "void*" ] alien-invoke ; "cairo_t*" "cairo" "cairo_create" [ "void*" ] alien-invoke ;
: cairo_reference ( cairo_t -- cairo_t )
"cairo_t*" "cairo" "cairo_reference" [ "cairo_t*" ] alien-invoke ;
: cairo_destroy ( cairo_t -- ) : cairo_destroy ( cairo_t -- )
"void" "cairo" "cairo_destroy" [ "cairo_t*" ] alien-invoke ; "void" "cairo" "cairo_destroy" [ "cairo_t*" ] alien-invoke ;
: cairo_save ( cairo_t -- )
"void" "cairo" "cairo_save" [ "cairo_t*" ] alien-invoke ;
: cairo_restore ( cairo_t -- )
"void" "cairo" "cairo_restore" [ "cairo_t*" ] alien-invoke ;
: cairo_set_operator ( cairo_t cairo_operator_t -- ) : cairo_set_operator ( cairo_t cairo_operator_t -- )
"void" "cairo" "cairo_set_operator" [ "cairo_t*" "int" ] alien-invoke ; "void" "cairo" "cairo_set_operator" [ "cairo_t*" "int" ] alien-invoke ;
: cairo_image_surface_create_for_data ( data format width height stride -- cairo_surface_t ) : cairo_set_source ( cairo_t cairo_pattern_t -- )
"void*" "cairo" "cairo_image_surface_create_for_data" [ "void*" "uint" "int" "int" "int" ] alien-invoke ; "void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ;
: cairo_set_source_rgb ( cairo_t red green blue -- ) : cairo_set_source_rgb ( cairo_t red green blue -- )
"void" "cairo" "cairo_set_source_rgb" [ "cairo_t*" "double" "double" "double" ] alien-invoke ; "void" "cairo" "cairo_set_source_rgb" [ "cairo_t*" "double" "double" "double" ] alien-invoke ;
@ -181,6 +236,10 @@ C-ENUM:
: cairo_set_tolerance ( cairo_t tolerance -- ) : cairo_set_tolerance ( cairo_t tolerance -- )
"void" "cairo" "cairo_set_tolerance" [ "cairo_t*" "double" ] alien-invoke ; "void" "cairo" "cairo_set_tolerance" [ "cairo_t*" "double" ] alien-invoke ;
: cairo_image_surface_create_for_data ( data format width height stride -- cairo_surface_t )
"void*" "cairo" "cairo_image_surface_create_for_data" [ "void*" "uint" "int" "int" "int" ] alien-invoke ;
: cairo_set_antialias ( cairo_t cairo_antialias_t -- ) : cairo_set_antialias ( cairo_t cairo_antialias_t -- )
"void" "cairo" "cairo_set_antialias" [ "cairo_t*" "int" ] alien-invoke ; "void" "cairo" "cairo_set_antialias" [ "cairo_t*" "int" ] alien-invoke ;
@ -211,6 +270,14 @@ C-ENUM:
: cairo_rotate ( cairo_t angle -- ) : cairo_rotate ( cairo_t angle -- )
"void" "cairo" "cairo_rotate" [ "cairo_t*" "double" ] alien-invoke ; "void" "cairo" "cairo_rotate" [ "cairo_t*" "double" ] alien-invoke ;
: cairo_transform ( cairo_t cairo_matrix_t -- )
"void" "cairo" "cairo_transform" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ;
: cairo_set_matrix ( cairo_t cairo_matrix_t -- )
"void" "cairo" "cairo_set_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ;
: cairo_identity_matrix ( cairo_t -- )
"void" "cairo" "cairo_identity_matrix" [ "cairo_t*" ] alien-invoke ;
! cairo path creating functions ! cairo path creating functions
@ -219,6 +286,9 @@ C-ENUM:
: cairo_move_to ( cairo_t x y -- ) : cairo_move_to ( cairo_t x y -- )
"void" "cairo" "cairo_move_to" [ "cairo_t*" "double" "double" ] alien-invoke ; "void" "cairo" "cairo_move_to" [ "cairo_t*" "double" "double" ] alien-invoke ;
: cairo_new_sub_path ( cairo_t -- )
"void" "cairo" "cairo_new_sub_path" [ "cairo_t*" ] alien-invoke ;
: cairo_line_to ( cairo_t x y -- ) : cairo_line_to ( cairo_t x y -- )
"void" "cairo" "cairo_line_to" [ "cairo_t*" "double" "double" ] alien-invoke ; "void" "cairo" "cairo_line_to" [ "cairo_t*" "double" "double" ] alien-invoke ;
@ -247,6 +317,29 @@ C-ENUM:
: cairo_close_path ( cairo_t -- ) : cairo_close_path ( cairo_t -- )
"void" "cairo" "cairo_close_path" [ "cairo_t*" ] alien-invoke ; "void" "cairo" "cairo_close_path" [ "cairo_t*" ] alien-invoke ;
! Surface manipulation
: cairo_surface_create_similar ( cairo_surface_t cairo_content_t width height -- cairo_surface_t )
"cairo_surface_t*" "cairo" "cairo_surface_create_similar" [ "cairo_surface_t*" "uint" "int" "int" ] alien-invoke ;
: cairo_surface_reference ( cairo_surface_t -- cairo_surface_t )
"cairo_surface_t*" "cairo" "cairo_surface_reference" [ "cairo_surface_t*" ] alien-invoke ;
: cairo_surface_finish ( cairo_surface_t -- )
"void" "cairo" "cairo_surface_finish" [ "cairo_surface_t*" ] alien-invoke ;
: cairo_surface_destroy ( cairo_surface_t -- )
"void" "cairo" "cairo_surface_destroy" [ "cairo_surface_t*" ] alien-invoke ;
: cairo_surface_get_reference_count ( cairo_surface_t -- count )
"uint" "cairo" "cairo_surface_get_reference_count" [ "cairo_surface_t*" ] alien-invoke ;
: cairo_surface_status ( cairo_surface_t -- cairo_status_t )
"uint" "cairo" "cairo_surface_status" [ "cairo_surface_t*" ] alien-invoke ;
: cairo_surface_flush ( cairo_surface_t -- )
"void" "cairo" "cairo_surface_flush" [ "cairo_surface_t*" ] alien-invoke ;
! painting functions ! painting functions
: cairo_paint ( cairo_t -- ) : cairo_paint ( cairo_t -- )
"void" "cairo" "cairo_paint" [ "cairo_t*" ] alien-invoke ; "void" "cairo" "cairo_paint" [ "cairo_t*" ] alien-invoke ;
@ -302,8 +395,6 @@ C-ENUM:
: cairo_clip_preserve ( cairo_t -- ) : cairo_clip_preserve ( cairo_t -- )
"void" "cairo" "cairo_clip_preserve" [ "cairo_t*" ] alien-invoke ; "void" "cairo" "cairo_clip_preserve" [ "cairo_t*" ] alien-invoke ;
: cairo_set_source ( cairo_t cairo_pattern_t -- )
"void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ;
: cairo_pattern_create_linear ( x0 y0 x1 y1 -- cairo_pattern_t ) : cairo_pattern_create_linear ( x0 y0 x1 y1 -- cairo_pattern_t )
"void*" "cairo" "cairo_pattern_create_linear" [ "double" "double" "double" "double" ] alien-invoke ; "void*" "cairo" "cairo_pattern_create_linear" [ "double" "double" "double" "double" ] alien-invoke ;
@ -326,5 +417,26 @@ C-ENUM:
: cairo_set_font_size ( cairo_t scale -- ) : cairo_set_font_size ( cairo_t scale -- )
"void" "cairo" "cairo_set_font_size" [ "cairo_t*" "double" ] alien-invoke ; "void" "cairo" "cairo_set_font_size" [ "cairo_t*" "double" ] alien-invoke ;
: cairo_identity_matrix ( cairo_t -- ) : cairo_set_font_matrix ( cairo_t cairo_matrix_t -- )
"void" "cairo" "cairo_identity_matrix" [ "cairo_t*" ] alien-invoke ; "void" "cairo" "cairo_set_font_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ;
: cairo_get_font_matrix ( cairo_t cairo_matrix_t -- )
"void" "cairo" "cairo_get_font_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ;
! Cairo pdf
: cairo_pdf_surface_create ( filename width height -- surface )
"void*" "cairo" "cairo_pdf_surface_create" [ "char*" "double" "double" ] alien-invoke ;
! Missing:
! cairo_public cairo_surface_t *
! cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func,
! void *closure,
! double width_in_points,
! double height_in_points);
: cairo_pdf_surface_set_size ( surface width height -- )
"void" "cairo" "cairo_pdf_surface_set_size" [ "void*" "double" "double" ] alien-invoke ;

View File

@ -1,5 +1,5 @@
USING: kernel combinators arrays sequences math ; USING: kernel combinators arrays sequences math combinators.lib ;
IN: cfdg.hsv IN: cfdg.hsv
@ -15,13 +15,13 @@ IN: cfdg.hsv
: Hi ( hsv -- Hi ) H 60 / floor 6 mod ; : Hi ( hsv -- Hi ) H 60 / floor 6 mod ;
: f ( hsv -- f ) dup H 60 / swap Hi - ; : f ( hsv -- f ) [ H 60 / ] [ Hi ] bi - ;
: p ( hsv -- p ) 1 over S - swap V * ; : p ( hsv -- p ) [ S 1 swap - ] [ V ] bi * ;
: q ( hsv -- q ) dup f over S * 1 swap - swap V * ; : q ( hsv -- q ) [ [ f ] [ S ] bi * 1 swap - ] [ V ] bi * ;
: t ( hsv -- t ) 1 over f - over S * 1 swap - swap V * ; : t ( hsv -- t ) [ [ f 1 swap - ] [ S ] bi * 1 swap - ] [ V ] bi * ;
PRIVATE> PRIVATE>
@ -31,9 +31,9 @@ PRIVATE>
: hsv>rgb ( hsv -- rgb ) : hsv>rgb ( hsv -- rgb )
dup Hi dup Hi
{ { 0 [ dup V swap dup t swap p ] } { { 0 [ [ V ] [ t ] [ p ] tri ] }
{ 1 [ dup q over V rot p ] } { 1 [ [ q ] [ V ] [ p ] tri ] }
{ 2 [ dup p over V rot t ] } { 2 [ [ p ] [ V ] [ t ] tri ] }
{ 3 [ dup p over q rot V ] } { 3 [ [ p ] [ q ] [ V ] tri ] }
{ 4 [ dup t over p rot V ] } { 4 [ [ t ] [ p ] [ V ] tri ] }
{ 5 [ dup V over p rot q ] } } case 3array ; { 5 [ [ V ] [ p ] [ q ] tri ] } } case 3array ;

View File

@ -19,6 +19,7 @@ iterate? [
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: run ( -- ) : run ( -- )
[ ] >background
{ -1 2 -1 2 } viewport set { -1 2 -1 2 } viewport set
0.01 threshold set 0.01 threshold set
[ flower6 ] start-shape set [ flower6 ] start-shape set

View File

@ -97,6 +97,7 @@ iterate? [
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: run ( -- ) : run ( -- )
[ ] >background
{ -5 25 -15 25 } viewport set { -5 25 -15 25 } viewport set
0.03 threshold set 0.03 threshold set
[ toc ] start-shape set [ toc ] start-shape set

View File

@ -26,6 +26,7 @@ spike
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: run ( -- ) : run ( -- )
[ ] >background
{ -40 80 -40 80 } viewport set { -40 80 -40 80 } viewport set
0.1 threshold set 0.1 threshold set
[ snowflake ] start-shape set [ snowflake ] start-shape set

View File

@ -3,7 +3,7 @@
! !
! Wrap a sniffer in a channel ! Wrap a sniffer in a channel
USING: kernel channels channels.sniffer concurrency io USING: kernel channels channels.sniffer concurrency io
io.sniffer io.sniffer.bsd ; io.sniffer io.sniffer.bsd io.unix.backend ;
M: unix-io sniff-channel ( -- channel ) M: unix-io sniff-channel ( -- channel )
"/dev/bpf0" "en1" <sniffer-spec> <sniffer> <channel> [ "/dev/bpf0" "en1" <sniffer-spec> <sniffer> <channel> [

View File

@ -239,7 +239,7 @@ PRIVATE>
"Exiting process: " write self process-pid print "Exiting process: " write self process-pid print
] curry spawn-link ; ] curry spawn-link ;
: server-cc ( -- cc | process ) : server-cc ( -- cc|process )
#! Captures the current continuation and returns the value. #! Captures the current continuation and returns the value.
#! If that CC is called with a process on the stack it will #! If that CC is called with a process on the stack it will
#! set 'self' for the current process to it. Otherwise it will #! set 'self' for the current process to it. Otherwise it will

View File

@ -3,7 +3,8 @@
! !
USING: kernel math sequences words arrays io USING: kernel math sequences words arrays io
io.files namespaces math.parser kernel.private io.files namespaces math.parser kernel.private
assocs quotations parser parser-combinators tools.time ; assocs quotations parser parser-combinators tools.time
combinators.private ;
IN: cpu.8080 IN: cpu.8080
TUPLE: cpu b c d e f h l a pc sp halted? last-interrupt cycles ram ; TUPLE: cpu b c d e f h l a pc sp halted? last-interrupt cycles ram ;

View File

@ -118,18 +118,18 @@ SYMBOL: model
: render-page* ( model body-template head-template -- ) : render-page* ( model body-template head-template -- )
[ [
[ render-template ] [ f rot render-template ] html-document* [ render-template ] [ f rot render-template ] html-document
] serve-html ; ] serve-html ;
: render-titled-page* ( model body-template head-template title -- ) : render-titled-page* ( model body-template head-template title -- )
[ [
[ render-template ] swap [ <title> write </title> f rot render-template ] curry html-document* [ render-template ] swap [ <title> write </title> f rot render-template ] curry html-document
] serve-html ; ] serve-html ;
: render-page ( model template title -- ) : render-page ( model template title -- )
[ [
[ render-template ] html-document [ render-template ] simple-html-document
] serve-html ; ] serve-html ;
: web-app ( name default path -- ) : web-app ( name default path -- )

View File

@ -152,5 +152,5 @@ SYMBOL: html
"size" "href" "class" "border" "rows" "cols" "size" "href" "class" "border" "rows" "cols"
"id" "onclick" "style" "valign" "accesskey" "id" "onclick" "style" "valign" "accesskey"
"src" "language" "colspan" "onchange" "rel" "src" "language" "colspan" "onchange" "rel"
"width" "selected" "onsubmit" "width" "selected" "onsubmit" "xmlns" "lang" "xml:lang"
] [ define-attribute-word ] each ] [ define-attribute-word ] each

View File

@ -1,30 +1,39 @@
USING: html http io io.streams.string io.styles kernel USING: html http io io.streams.string io.styles kernel
namespaces tools.test xml.writer ; namespaces tools.test xml.writer sbufs sequences html.private ;
IN: temporary IN: temporary
[ : make-html-string
"/responder/foo?z=%20" [ with-html-stream ] string-out ;
] [
"/responder/foo" H{ { "z" " " } } build-url [ ] [
512 <sbuf> <html-stream> drop
] unit-test ] unit-test
[ [ "" ] [
"&lt;html&gt;&amp;&apos;sgml&apos;" [ "" write ] make-html-string
] [ "<html>&'sgml'" chars>entities ] unit-test ] unit-test
[ "" ] [ "a" ] [
[ [ CHAR: a write1 ] make-html-string
] unit-test
[ "&lt;" ] [
[ "<" write ] make-html-string
] unit-test
[ "<" ] [
[ "<" H{ } stdio get format-html-span ] make-html-string
] unit-test
TUPLE: funky town ;
M: funky browser-link-href
"http://www.funky-town.com/" swap funky-town append ;
[ "<a href='http://www.funky-town.com/austin'>&lt;</a>" ] [
[ [
H{ } [ drop ] span-tag "<" "austin" funky construct-boa write-object
] string-out ] make-html-string
] unit-test
: html-format ( string style -- string )
[ format ] with-html-stream ;
[ "hello world" ]
[
[ "hello world" H{ } html-format ] string-out
] unit-test ] unit-test
[ "<span style='font-family: monospace; '>car</span>" ] [ "<span style='font-family: monospace; '>car</span>" ]
@ -32,8 +41,8 @@ IN: temporary
[ [
"car" "car"
H{ { font "monospace" } } H{ { font "monospace" } }
html-format format
] string-out ] make-html-string
] unit-test ] unit-test
[ "<span style='color: #ff00ff; '>car</span>" ] [ "<span style='color: #ff00ff; '>car</span>" ]
@ -41,6 +50,14 @@ IN: temporary
[ [
"car" "car"
H{ { foreground { 1 0 1 1 } } } H{ { foreground { 1 0 1 1 } } }
html-format format
] string-out ] make-html-string
] unit-test
[ "<div style='background-color: #ff00ff; '>cdr</div>" ]
[
[
H{ { page-color { 1 0 1 1 } } }
[ "cdr" write ] with-nesting
] make-html-string
] unit-test ] unit-test

View File

@ -1,10 +1,43 @@
! Copyright (C) 2004, 2006 Slava Pestov. ! Copyright (C) 2004, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: generic assocs help http io io.styles io.files io.streams.string USING: generic assocs help http io io.styles io.files
kernel math math.parser namespaces xml.writer quotations io.streams.string kernel math math.parser namespaces
assocs sequences strings words html.elements ; quotations assocs sequences strings words html.elements
xml.writer sbufs ;
IN: html IN: html
GENERIC: browser-link-href ( presented -- href )
M: object browser-link-href drop f ;
TUPLE: html-stream ;
: <html-stream> ( stream -- stream )
html-stream construct-delegate ;
<PRIVATE
TUPLE: html-sub-stream style stream ;
: (html-sub-stream) ( style stream -- stream )
html-sub-stream construct-boa
512 <sbuf> <html-stream> over set-delegate ;
: <html-sub-stream> ( style stream class -- stream )
>r (html-sub-stream) r> construct-delegate ; inline
: end-sub-stream ( substream -- string style stream )
dup delegate >string
over html-sub-stream-style
rot html-sub-stream-stream ;
: delegate-write ( string -- )
stdio get delegate stream-write ;
: object-link-tag ( style quot -- )
presented pick at browser-link-href
[ <a =href a> call </a> ] [ call ] if* ; inline
: hex-color, ( triplet -- ) : hex-color, ( triplet -- )
3 head-slice 3 head-slice
[ 255 * >fixnum >hex 2 CHAR: 0 pad-left % ] each ; [ 255 * >fixnum >hex 2 CHAR: 0 pad-left % ] each ;
@ -28,166 +61,149 @@ IN: html
: font-css, ( font -- ) : font-css, ( font -- )
"font-family: " % % "; " % ; "font-family: " % % "; " % ;
: hash-apply ( value-hash quot-hash -- ) : apply-style ( style key quot -- style gadget )
#! Looks up the key of each pair in the first list in the >r over at r> when* ; inline
#! second list to produce a quotation. The quotation is
#! applied to the value of the pair. If there is no : make-css ( style quot -- str )
#! corresponding quotation, the value is popped off the "" make nip ; inline
#! stack.
[ swapd at dup [ call ] [ 2drop ] if ] curry assoc-each ;
: span-css-style ( style -- str ) : span-css-style ( style -- str )
[ [
H{ foreground [ fg-css, ] apply-style
{ foreground [ fg-css, ] } background [ bg-css, ] apply-style
{ background [ bg-css, ] } font [ font-css, ] apply-style
{ font [ font-css, ] } font-style [ style-css, ] apply-style
{ font-style [ style-css, ] } font-size [ size-css, ] apply-style
{ font-size [ size-css, ] } ] make-css ;
} hash-apply
] "" make ;
: span-tag ( style quot -- ) : span-tag ( style quot -- )
over span-css-style dup empty? [ over span-css-style dup empty? [
drop call drop call
] [ ] [
<span =style span> call </span> <span =style span> call </span>
] if ; ] if ; inline
: format-html-span ( string style stream -- )
[
[ [ drop delegate-write ] span-tag ] object-link-tag
] with-stream* ;
TUPLE: html-span-stream ;
M: html-span-stream stream-close
end-sub-stream format-html-span ;
: border-css, ( border -- ) : border-css, ( border -- )
"border: 1px solid #" % hex-color, "; " % ; "border: 1px solid #" % hex-color, "; " % ;
: padding-css, ( padding -- ) "padding: " % # "px; " % ; : padding-css, ( padding -- ) "padding: " % # "px; " % ;
: pre-css, ( -- ) : pre-css, ( margin -- )
"white-space: pre; font-family: monospace; " % ; [ "white-space: pre; font-family: monospace; " % ] unless ;
: div-css-style ( style -- str ) : div-css-style ( style -- str )
[ [
H{ page-color [ bg-css, ] apply-style
{ page-color [ bg-css, ] } border-color [ border-css, ] apply-style
{ border-color [ border-css, ] } border-width [ padding-css, ] apply-style
{ border-width [ padding-css, ] } wrap-margin [ pre-css, ] apply-style
{ wrap-margin [ [ pre-css, ] unless ] } ] make-css ;
} hash-apply
] "" make ;
: div-tag ( style quot -- ) : div-tag ( style quot -- )
swap div-css-style dup empty? [ swap div-css-style dup empty? [
drop call drop call
] [ ] [
<div =style div> call </div> <div =style div> call </div>
] if ; ] if ; inline
: do-escaping ( string style -- string ) : format-html-div ( string style stream -- )
html swap at [ chars>entities ] unless ;
GENERIC: browser-link-href ( presented -- href )
M: object browser-link-href drop f ;
: object-link-tag ( style quot -- )
presented pick at browser-link-href
[ <a =href a> call </a> ] [ call ] if* ;
TUPLE: nested-stream ;
: <nested-stream> ( stream -- stream )
nested-stream construct-delegate ;
M: nested-stream stream-close drop ;
TUPLE: html-stream ;
: <html-stream> ( stream -- stream )
html-stream construct-delegate ;
M: html-stream stream-write1 ( char stream -- )
>r 1string r> stream-write ;
: delegate-write delegate stream-write ;
M: html-stream stream-write ( str stream -- )
>r chars>entities r> delegate-write ;
: with-html-style ( quot style stream -- )
[ [ swap span-tag ] object-link-tag ] with-stream* ; inline
M: html-stream with-stream-style ( quot style stream -- )
[ drop call ] -rot with-html-style ;
M: html-stream stream-format ( str style stream -- )
[ do-escaping stdio get delegate-write ] -rot
with-html-style ;
: with-html-stream ( quot -- )
stdio get <html-stream> swap with-stream* ;
M: html-stream with-nested-stream ( quot style stream -- )
[ [
[ [ [ delegate-write ] div-tag ] object-link-tag
[
stdio get <nested-stream> swap with-stream*
] div-tag
] object-link-tag
] with-stream* ; ] with-stream* ;
TUPLE: html-block-stream ;
M: html-block-stream stream-close ( quot style stream -- )
end-sub-stream format-html-div ;
: border-spacing-css, : border-spacing-css,
"padding: " % first2 max 2 /i # "px; " % ; "padding: " % first2 max 2 /i # "px; " % ;
: table-style ( style -- str ) : table-style ( style -- str )
[ [
H{ table-border [ border-css, ] apply-style
{ table-border [ border-css, ] } table-gap [ border-spacing-css, ] apply-style
{ table-gap [ border-spacing-css, ] } ] make-css ;
} hash-apply
] "" make ;
: table-attrs ( style -- ) : table-attrs ( style -- )
table-style " border-collapse: collapse;" append =style ; table-style " border-collapse: collapse;" append =style ;
: do-escaping ( string style -- string )
html swap at [ chars>entities ] unless ;
PRIVATE>
! Stream protocol
M: html-stream stream-write1 ( char stream -- )
>r 1string r> stream-write ;
M: html-stream stream-write ( str stream -- )
>r chars>entities r> delegate stream-write ;
M: html-stream make-span-stream ( style stream -- stream' )
html-span-stream <html-sub-stream> ;
M: html-stream stream-format ( str style stream -- )
>r html over at [ >r chars>entities r> ] unless r>
format-html-span ;
M: html-stream make-block-stream ( style stream -- stream' )
html-block-stream <html-sub-stream> ;
M: html-stream stream-write-table ( grid style stream -- ) M: html-stream stream-write-table ( grid style stream -- )
[ [
<table dup table-attrs table> swap [ <table dup table-attrs table> swap [
<tr> [ <tr> [
<td "top" =valign swap table-style =style td> <td "top" =valign swap table-style =style td>
write-html >string write-html
</td> </td>
] curry* each </tr> ] curry* each </tr>
] curry* each </table> ] curry* each </table>
] with-stream* ; ] with-stream* ;
M: html-stream make-table-cell ( quot style stream -- table-cell ) M: html-stream make-cell-stream ( style stream -- stream' )
2drop [ with-html-stream ] string-out ; (html-sub-stream) ;
M: html-stream stream-nl [ <br/> ] with-stream* ; M: html-stream stream-nl ( stream -- )
[ <br/> ] with-stream* ;
: default-css ( -- ) ! Utilities
<link : with-html-stream ( quot -- )
"stylesheet" =rel "text/css" =type stdio get <html-stream> swap with-stream* ;
"/responder/resources/stylesheet.css" =href
link/> ;
: xhtml-preamble : xhtml-preamble
"<?xml version=\"1.0\"?>" write-html "<?xml version=\"1.0\"?>" write-html
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" write-html ; "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" write-html ;
: html-document* ( body-quot head-quot -- ) : html-document ( body-quot head-quot -- )
#! head-quot is called to produce output to go #! head-quot is called to produce output to go
#! in the html head portion of the document. #! in the html head portion of the document.
#! body-quot is called to produce output to go #! body-quot is called to produce output to go
#! in the html body portion of the document. #! in the html body portion of the document.
xhtml-preamble xhtml-preamble
<html " xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"" write-html html> <html "http://www.w3.org/1999/xhtml" =xmlns "en" =xml:lang "en" =lang html>
<head> call </head> <head> call </head>
<body> call </body> <body> call </body>
</html> ; </html> ;
: html-document ( title quot -- ) : default-css ( -- )
<link
"stylesheet" =rel "text/css" =type
"/responder/resources/extra/html/stylesheet.css" =href
link/> ;
: simple-html-document ( title quot -- )
swap [ swap [
<title> write </title> <title> write </title>
default-css default-css
] html-document* ; ] html-document ;
: simple-html-document ( title quot -- )
swap [ <pre> with-html-stream </pre> ] html-document ;

View File

@ -7,7 +7,7 @@ IN: http
: header-line ( line -- ) : header-line ( line -- )
": " split1 dup [ swap set ] [ 2drop ] if ; ": " split1 dup [ swap set ] [ 2drop ] if ;
: (read-header) ( hash -- hash ) : (read-header) ( -- )
readln dup readln dup
empty? [ drop ] [ header-line (read-header) ] if ; empty? [ drop ] [ header-line (read-header) ] if ;

File diff suppressed because it is too large Load Diff

View File

@ -34,7 +34,7 @@ IN: http.server.responders.continuation.examples
<h1> over write </h1> <h1> over write </h1>
swap [ swap [
<a =href a> "Next" write </a> <a =href a> "Next" write </a>
] html-document ] simple-html-document
] show 2drop ; ] show 2drop ;
: display-get-name-page ( -- name ) : display-get-name-page ( -- name )
@ -47,7 +47,7 @@ IN: http.server.responders.continuation.examples
<input "text" =type "name" =name "20" =size input/> <input "text" =type "name" =name "20" =size input/>
<input "submit" =type "Ok" =value input/> <input "submit" =type "Ok" =value input/>
</form> </form>
] html-document ] simple-html-document
] show "name" swap at ; ] show "name" swap at ;
: test-cont-responder ( -- ) : test-cont-responder ( -- )
@ -71,7 +71,7 @@ IN: http.server.responders.continuation.examples
<li> "Test responder1" [ test-cont-responder ] quot-href </li> <li> "Test responder1" [ test-cont-responder ] quot-href </li>
<li> "Test responder2" [ test-cont-responder2 ] quot-href </li> <li> "Test responder2" [ test-cont-responder2 ] quot-href </li>
</ol> </ol>
] html-document ] simple-html-document
] show-final ; ] show-final ;
: counter-example ( count -- ) : counter-example ( count -- )
@ -87,7 +87,7 @@ IN: http.server.responders.continuation.examples
"++" over 1quotation [ f ] swap append [ 1 + counter-example ] append quot-href "++" over 1quotation [ f ] swap append [ 1 + counter-example ] append quot-href
"--" over 1quotation [ f ] swap append [ 1 - counter-example ] append quot-href "--" over 1quotation [ f ] swap append [ 1 - counter-example ] append quot-href
drop drop
] html-document ] simple-html-document
] show drop ; ] show drop ;
: counter-example2 ( -- ) : counter-example2 ( -- )
@ -102,7 +102,7 @@ IN: http.server.responders.continuation.examples
<h2> "counter" get unparse write </h2> <h2> "counter" get unparse write </h2>
"++" [ "counter" get 1 + "counter" set ] quot-href "++" [ "counter" get 1 + "counter" set ] quot-href
"--" [ "counter" get 1 - "counter" set ] quot-href "--" [ "counter" get 1 - "counter" set ] quot-href
] html-document ] simple-html-document
] show ] show
drop ; drop ;

View File

@ -1,8 +1,9 @@
! Copyright (C) 2004, 2006 Slava Pestov. ! Copyright (C) 2004, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: calendar html io io.files kernel math math.parser http.server.responders USING: calendar html io io.files kernel math math.parser
http.server.templating namespaces parser sequences strings assocs hashtables http.server.responders http.server.templating namespaces parser
debugger http.mime sorting ; sequences strings assocs hashtables debugger http.mime sorting
html.elements ;
IN: http.server.responders.file IN: http.server.responders.file
@ -55,19 +56,25 @@ SYMBOL: page
dup mime-type dup "application/x-factor-server-page" = dup mime-type dup "application/x-factor-server-page" =
[ drop serving-html run-page ] [ serve-static ] if ; [ drop serving-html run-page ] [ serve-static ] if ;
: file. ( path name dirp -- ) : file. ( name dirp -- )
"[DIR] " " " ? write [ "/" append ] when
dup <pathname> write-object nl ; dup <a =href a> write </a> ;
: directory. ( path -- ) : directory. ( path request -- )
directory sort-keys [ first2 file. ] each ; dup [
<h1> write </h1>
<ul>
directory sort-keys
[ <li> file. </li> ] assoc-each
</ul>
] simple-html-document ;
: list-directory ( directory -- ) : list-directory ( directory -- )
serving-html serving-html
"method" get "head" = [ "method" get "head" = [
drop drop
] [ ] [
"request" get [ directory. ] simple-html-document "request" get directory.
] if ; ] if ;
: find-index ( filename -- path ) : find-index ( filename -- path )
@ -98,17 +105,17 @@ SYMBOL: page
] if ; ] if ;
global [ global [
! Javascript source used by ajax libraries ! Serve up our own source code
"resources" [ "resources" [
[ [
"extra/http/server/resources/" resource-path "doc-root" set "" resource-path "doc-root" set
file-responder file-responder
] with-scope ] with-scope
] add-simple-responder ] add-simple-responder
! Serves files from a directory stored in the "doc-root" ! Serves files from a directory stored in the "doc-root"
! variable. You can set the variable in the global namespace, ! variable. You can set the variable in the global
! or inside the responder. ! namespace, or inside the responder.
"file" [ file-responder ] add-simple-responder "file" [ file-responder ] add-simple-responder
! The root directory is served by... ! The root directory is served by...

View File

@ -16,16 +16,16 @@ SYMBOL: responders
: response ( header msg -- ) : response ( header msg -- )
"HTTP/1.0 " write print print-header ; "HTTP/1.0 " write print print-header ;
: error-body ( error -- body ) : error-body ( error -- )
<html> <body> <h1> write </h1> </body> </html> ; <html> <body> <h1> write </h1> </body> </html> ;
: error-head ( error -- ) : error-head ( error -- )
dup log-error dup log-error
H{ { "Content-Type" "text/html" } } over response ; H{ { "Content-Type" "text/html" } } swap response ;
: httpd-error ( error -- ) : httpd-error ( error -- )
#! This must be run from handle-request #! This must be run from handle-request
error-head dup error-head
"head" "method" get = [ drop ] [ nl error-body ] if ; "head" "method" get = [ drop ] [ nl error-body ] if ;
: bad-request ( -- ) : bad-request ( -- )
@ -101,7 +101,8 @@ SYMBOL: max-post-request
dup "request" set ; dup "request" set ;
: prepare-header ( -- ) : prepare-header ( -- )
read-header dup "header" set read-header
dup "header" set
dup log-headers dup log-headers
read-post-request "response" set "raw-response" set ; read-post-request "response" set "raw-response" set ;

View File

@ -2,7 +2,8 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel math sequences kernel.private namespaces arrays USING: kernel math sequences kernel.private namespaces arrays
io io.files splitting io.binary math.functions vectors ; io io.files splitting io.binary math.functions vectors
quotations combinators.private ;
IN: universal-machine IN: universal-machine
SYMBOL: regs SYMBOL: regs

View File

@ -1,7 +1,7 @@
USING: alien.c-types hexdump io io.backend io.sockets.headers USING: alien.c-types hexdump io io.backend io.sockets.headers
io.sockets.headers.bsd kernel io.sniffer io.sniffer.bsd io.sockets.headers.bsd kernel io.sniffer io.sniffer.bsd
io.sniffer.filter io.streams.string io.unix.backend math io.sniffer.filter io.streams.string io.unix.backend math
sequences system ; sequences system byte-arrays ;
IN: io.sniffer.filter.bsd IN: io.sniffer.filter.bsd
! http://www.iana.org/assignments/ethernet-numbers ! http://www.iana.org/assignments/ethernet-numbers

View File

@ -16,7 +16,10 @@ M: null-stream stream-write 2drop ;
M: null-stream stream-nl drop ; M: null-stream stream-nl drop ;
M: null-stream stream-flush drop ; M: null-stream stream-flush drop ;
M: null-stream stream-format 3drop ; M: null-stream stream-format 3drop ;
M: null-stream with-nested-stream rot drop with-stream* ; M: null-stream make-span-stream nip ;
M: null-stream make-block-stream nip ;
M: null-stream make-cell-stream nip ;
M: null-stream stream-write-table 3drop ;
: with-null-stream ( quot -- ) : with-null-stream ( quot -- )
T{ null-stream } swap with-stream* ; inline T{ null-stream } swap with-stream* ; inline

View File

@ -4,7 +4,8 @@
USING: kernel namespaces sequences sequences.private assocs USING: kernel namespaces sequences sequences.private assocs
math inference.transforms parser words quotations debugger math inference.transforms parser words quotations debugger
macros arrays macros splitting combinators prettyprint.backend macros arrays macros splitting combinators prettyprint.backend
definitions prettyprint hashtables combinators.lib ; definitions prettyprint hashtables combinators.lib
prettyprint.sections ;
IN: locals IN: locals

View File

@ -2,7 +2,8 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
! !
IN: openal.macosx IN: openal.macosx
USING: openal alien.c-types kernel alien alien.syntax shuffle ; USING: openal alien.c-types kernel alien alien.syntax shuffle
combinators.lib ;
LIBRARY: alut LIBRARY: alut

View File

@ -4,7 +4,8 @@
USING: cpu.8080 openal math alien.c-types sequences kernel USING: cpu.8080 openal math alien.c-types sequences kernel
shuffle arrays io.files combinators kernel.private shuffle arrays io.files combinators kernel.private
ui.gestures ui.gadgets ui.render opengl.gl system ui.gestures ui.gadgets ui.render opengl.gl system
threads concurrency match ui byte-arrays combinators.lib ; threads concurrency match ui byte-arrays combinators.lib
combinators.private ;
IN: space-invaders IN: space-invaders
TUPLE: space-invaders port1 port2i port2o port3o port4lo port4hi port5o bitmap sounds looping? ; TUPLE: space-invaders port1 port2i port2o port3o port4lo port4hi port5o bitmap sounds looping? ;

View File

@ -1,5 +1,5 @@
USING: kernel parser strings math namespaces sequences words io arrays USING: kernel parser strings math namespaces sequences words io
quotations debugger kernel.private ; arrays quotations debugger kernel.private combinators.private ;
IN: state-machine IN: state-machine
: STATES: : STATES:

View File

@ -8,7 +8,9 @@ TUPLE: slate action dim graft ungraft ;
: <slate> ( action -- slate ) : <slate> ( action -- slate )
slate construct-gadget slate construct-gadget
tuck set-slate-action tuck set-slate-action
{ 100 100 } over set-slate-dim ; { 100 100 } over set-slate-dim
[ ] over set-slate-graft
[ ] over set-slate-ungraft ;
M: slate pref-dim* ( slate -- dim ) slate-dim ; M: slate pref-dim* ( slate -- dim ) slate-dim ;

View File

@ -10,7 +10,7 @@ IN: webapps.help
serving-html serving-html
dup article-title [ dup article-title [
[ help ] with-html-stream [ help ] with-html-stream
] html-document ; ] simple-html-document ;
: string>topic ( string -- topic ) : string>topic ( string -- topic )
" " split dup length 1 = [ first ] when ; " " split dup length 1 = [ first ] when ;
@ -73,9 +73,10 @@ M: vocab-author browser-link-href
"help" "show-help" "extra/webapps/help" web-app "help" "show-help" "extra/webapps/help" web-app
! Hard-coding for factorcode.org ! Hard-coding for factorcode.org
M: pathname browser-link-href PREDICATE: pathname resource-pathname
pathname-string "resource:" ?head [ pathname-string "resource:" head? ;
"http://factorcode.org/repos/Factor/" swap append
] [ M: resource-pathname browser-link-href
drop f pathname-string
] if ; "resource:" ?head drop
"/responder/resources/" swap append ;

View File

@ -10,9 +10,9 @@ IN: xml.utilities
TUPLE: process-missing process tag ; TUPLE: process-missing process tag ;
M: process-missing error. M: process-missing error.
"Tag <" write "Tag <" write
process-missing-tag print-name dup process-missing-tag print-name
"> not implemented on process process " write "> not implemented on process process " write
dup process-missing-process word-name print ; process-missing-process word-name print ;
: run-process ( tag word -- ) : run-process ( tag word -- )
2dup "xtable" word-prop 2dup "xtable" word-prop

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

BIN
misc/icons/Factor.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
misc/icons/Factor_16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

BIN
misc/icons/Factor_32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
misc/icons/Factor_48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,4 +1,4 @@
The icons/images/jackets contained in this archive are The icons/images/jackets contained in this archive are
Copyright (C) 2007 Elie CHAFTARI. All Rights Reserved. Copyright (C) 2007 Elie Chaftari. All Rights Reserved.
See http://factorcode.org/license.txt for BSD license. See http://factorcode.org/license.txt for BSD license.

View File

@ -4,7 +4,7 @@ in the public domain. */
/* Note that the XT is passed to the quotation in r11 */ /* Note that the XT is passed to the quotation in r11 */
#define CALL_OR_JUMP_QUOT \ #define CALL_OR_JUMP_QUOT \
lwz r11,5(r3) /* load quotation-xt slot */ XX \ lwz r11,9(r3) /* load quotation-xt slot */ XX \
#define CALL_QUOT \ #define CALL_QUOT \
CALL_OR_JUMP_QUOT XX \ CALL_OR_JUMP_QUOT XX \
@ -40,11 +40,19 @@ in the public domain. */
#define RESTORE(register,offset) lwz register,SAVE_AT(offset)(r1) #define RESTORE(register,offset) lwz register,SAVE_AT(offset)(r1)
DEF(void,c_to_factor,(CELL quot)): #define PROLOGUE \
mflr r0 /* get caller's return address */ mflr r0 XX /* get caller's return address */ \
stwu r1,-FRAME(r1) /* create a stack frame to hold non-volatile registers */ stwu r1,-FRAME(r1) XX /* create a stack frame to hold non-volatile registers */ \
SAVE_LR(r0) SAVE_LR(r0)
#define EPILOGUE \
LOAD_LR(r0) XX \
lwz r1,0(r1) XX /* destroy the stack frame */ \
mtlr r0 /* get ready to return */
DEF(void,c_to_factor,(CELL quot)):
PROLOGUE
SAVE(r13,0) /* save GPRs */ SAVE(r13,0) /* save GPRs */
/* don't save ds pointer */ /* don't save ds pointer */
/* don't save rs pointer */ /* don't save rs pointer */
@ -92,9 +100,7 @@ DEF(void,c_to_factor,(CELL quot)):
/* don't restore ds pointer */ /* don't restore ds pointer */
RESTORE(r13,0) RESTORE(r13,0)
LOAD_LR(r0) EPILOGUE
lwz r1,0(r1) /* destroy the stack frame */
mtlr r0 /* get ready to return */
blr blr
/* The JIT compiles an 'mr r4,r1' in front of every primitive call, since a /* The JIT compiles an 'mr r4,r1' in front of every primitive call, since a
@ -164,6 +170,13 @@ DEF(void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)):
mtlr r0 mtlr r0
JUMP_QUOT /* call the quotation */ JUMP_QUOT /* call the quotation */
DEF(void,lazy_jit_compile,(CELL quot)):
mr r4,r1 /* save stack pointer */
PROLOGUE
bl MANGLE(jit_compile)
EPILOGUE
JUMP_QUOT /* call the quotation */
/* Thanks to Joshua Grams for this code. /* Thanks to Joshua Grams for this code.
On PowerPC processors, we must flush the instruction cache manually On PowerPC processors, we must flush the instruction cache manually

View File

@ -11,6 +11,7 @@ void docol(CELL word);
void undefined(CELL word); void undefined(CELL word);
void set_callstack(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy); void set_callstack(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy);
void throw_impl(CELL quot, F_STACK_FRAME *rewind); void throw_impl(CELL quot, F_STACK_FRAME *rewind);
void lazy_jit_compile(CELL quot);
void flush_icache(CELL start, CELL len); void flush_icache(CELL start, CELL len);
#define FRAME_SUCCESSOR(frame) (frame)->previous #define FRAME_SUCCESSOR(frame) (frame)->previous

View File

@ -9,6 +9,7 @@ and the callstack top is passed in EDX */
#define XT_REG %ecx #define XT_REG %ecx
#define STACK_REG %esp #define STACK_REG %esp
#define DS_REG %esi #define DS_REG %esi
#define RETURN_REG %eax
#define CELL_SIZE 4 #define CELL_SIZE 4
@ -20,7 +21,7 @@ and the callstack top is passed in EDX */
pop %ebp ; \ pop %ebp ; \
pop %ebx pop %ebx
#define QUOT_XT_OFFSET 5 #define QUOT_XT_OFFSET 9
#define PROFILING_OFFSET 25 #define PROFILING_OFFSET 25
#define WORD_DEF_OFFSET 13 #define WORD_DEF_OFFSET 13
#define WORD_XT_OFFSET 29 #define WORD_XT_OFFSET 29

View File

@ -5,6 +5,7 @@
#define XT_REG %rcx #define XT_REG %rcx
#define STACK_REG %rsp #define STACK_REG %rsp
#define DS_REG %r14 #define DS_REG %r14
#define RETURN_REG %rax
#define CELL_SIZE 8 #define CELL_SIZE 8
@ -20,7 +21,7 @@
pop %rbp ; \ pop %rbp ; \
pop %rbx pop %rbx
#define QUOT_XT_OFFSET 13 #define QUOT_XT_OFFSET 21
#define PROFILING_OFFSET 53 #define PROFILING_OFFSET 53
#define WORD_DEF_OFFSET 29 #define WORD_DEF_OFFSET 29
#define WORD_XT_OFFSET 61 #define WORD_XT_OFFSET 61

View File

@ -51,3 +51,15 @@ DEF(FASTCALL void,primitive_execute,(void)):
DEF(FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)): DEF(FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)):
mov ARG1,STACK_REG /* rewind_to */ mov ARG1,STACK_REG /* rewind_to */
JUMP_QUOT JUMP_QUOT
DEF(FASTCALL void,lazy_jit_compile,(CELL quot)):
mov STACK_REG,ARG1 /* Save stack pointer */
push XT_REG /* Alignment */
push XT_REG
push XT_REG
call MANGLE(jit_compile)
mov RETURN_REG,ARG0 /* No-op on 32-bit */
pop XT_REG /* OK to clobber XT_REG here */
pop XT_REG
pop XT_REG
JUMP_QUOT /* Call the quotation */

View File

@ -28,5 +28,6 @@ FASTCALL void undefined(CELL word);
FASTCALL void dosym(CELL word); FASTCALL void dosym(CELL word);
FASTCALL void docol_profiling(CELL word); FASTCALL void docol_profiling(CELL word);
FASTCALL void docol(CELL word); FASTCALL void docol(CELL word);
FASTCALL void lazy_jit_compile(CELL quot);
void set_callstack(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy); void set_callstack(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy);

View File

@ -553,7 +553,7 @@ CELL collect_next(CELL scan)
break; break;
case QUOTATION_TYPE: case QUOTATION_TYPE:
quot = (F_QUOTATION *)scan; quot = (F_QUOTATION *)scan;
if(collecting_code && quot->xt != NULL) if(collecting_code && quot->xt != lazy_jit_compile)
recursive_mark(quot->xt); recursive_mark(quot->xt);
break; break;
case CALLSTACK_TYPE: case CALLSTACK_TYPE:

View File

@ -3,7 +3,12 @@
void print_word(F_WORD* word, CELL nesting) void print_word(F_WORD* word, CELL nesting)
{ {
if(type_of(word->name) == STRING_TYPE) if(type_of(word->name) == STRING_TYPE)
printf("%s",to_char_string(untag_string(word->name),true)); {
F_STRING *string = untag_string(word->name);
CELL i;
for(i = 0; i < string_capacity(string); i++)
putchar(cget(SREF(string,i)));
}
else else
{ {
printf("#<not a string: "); printf("#<not a string: ");
@ -14,7 +19,11 @@ void print_word(F_WORD* word, CELL nesting)
void print_string(F_STRING* str) void print_string(F_STRING* str)
{ {
printf("\"%s\"",to_char_string(str,true)); putchar('"');
CELL i;
for(i = 0; i < string_capacity(str); i++)
putchar(cget(SREF(str,i)));
putchar('"');
} }
void print_array(F_ARRAY* array, CELL nesting) void print_array(F_ARRAY* array, CELL nesting)

View File

@ -126,14 +126,6 @@ void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded
userenv[EXECUTABLE_ENV] = tag_object(from_native_string(executable_path)); userenv[EXECUTABLE_ENV] = tag_object(from_native_string(executable_path));
userenv[EMBEDDED_ENV] = (embedded ? T : F); userenv[EMBEDDED_ENV] = (embedded ? T : F);
if(!untag_quotation(userenv[BOOT_ENV])->xt)
{
/* This can only happen when we're starting a stage2 bootstrap.
The stage1 bootstrapper doesn't attempt to compile quotations,
so we do it here. */
jit_compile_all();
}
nest_stacks(); nest_stacks();
c_to_factor_toplevel(userenv[BOOT_ENV]); c_to_factor_toplevel(userenv[BOOT_ENV]);
unnest_stacks(); unnest_stacks();

View File

@ -1,2 +1,2 @@
fraptor ICON "misc/icons/FRaptorMix.ico" fraptor ICON "misc/icons/Factor.ico"

View File

@ -154,17 +154,17 @@ void fixup_word(F_WORD *word)
{ {
/* If this is a compiled word, relocate the code pointer. Otherwise, /* If this is a compiled word, relocate the code pointer. Otherwise,
reset it based on the primitive number of the word. */ reset it based on the primitive number of the word. */
if(word->compiledp != F) if(word->compiledp == F)
code_fixup(&word->xt); word->xt = default_word_xt(word);
else else
update_xt(word); code_fixup(&word->xt);
} }
void fixup_quotation(F_QUOTATION *quot) void fixup_quotation(F_QUOTATION *quot)
{ {
/* quot->xt is only ever NULL at the start of stage2 bootstrap, if(quot->compiled == F)
in this case the JIT compiles all quotations */ quot->xt = lazy_jit_compile;
if(quot->xt) else
code_fixup(&quot->xt); code_fixup(&quot->xt);
} }

View File

@ -34,8 +34,13 @@ bool jit_stack_frame_p(F_ARRAY *array)
return false; return false;
} }
void jit_compile(F_QUOTATION *quot) FASTCALL CELL jit_compile(CELL tagged, F_STACK_FRAME *stack)
{ {
stack_chain->callstack_top = stack;
REGISTER_ROOT(tagged);
F_QUOTATION *quot = untag_quotation(tagged);
F_ARRAY *array = untag_object(quot->array); F_ARRAY *array = untag_object(quot->array);
REGISTER_UNTAGGED(quot); REGISTER_UNTAGGED(quot);
@ -150,21 +155,10 @@ void jit_compile(F_QUOTATION *quot)
UNREGISTER_UNTAGGED(quot); UNREGISTER_UNTAGGED(quot);
quot->xt = xt; quot->xt = xt;
} quot->compiled = T;
void jit_compile_all(void) UNREGISTER_ROOT(tagged);
{ return tagged;
begin_scan();
CELL obj;
while((obj = next_object()) != F)
{
if(type_of(obj) == QUOTATION_TYPE)
jit_compile(untag_quotation(obj));
}
/* End the scan */
gc_off = false;
} }
XT quot_offset_to_pc(F_QUOTATION *quot, F_FIXNUM offset) XT quot_offset_to_pc(F_QUOTATION *quot, F_FIXNUM offset)

View File

@ -1,3 +1,2 @@
void jit_compile(F_QUOTATION *quot); DLLEXPORT FASTCALL CELL jit_compile(CELL tagged, F_STACK_FRAME *stack);
void jit_compile_all(void);
XT quot_offset_to_pc(F_QUOTATION *quot, F_FIXNUM offset); XT quot_offset_to_pc(F_QUOTATION *quot, F_FIXNUM offset);

View File

@ -194,6 +194,8 @@ typedef struct {
CELL header; CELL header;
/* tagged */ /* tagged */
CELL array; CELL array;
/* tagged */
CELL compiled;
/* untagged */ /* untagged */
XT xt; XT xt;
} F_QUOTATION; } F_QUOTATION;

View File

@ -20,23 +20,21 @@ void uncurry(CELL obj)
} }
} }
void update_xt(F_WORD* word) XT default_word_xt(F_WORD *word)
{ {
word->compiledp = F;
if(word->def == T) if(word->def == T)
word->xt = dosym; return dosym;
else if(type_of(word->def) == QUOTATION_TYPE) else if(type_of(word->def) == QUOTATION_TYPE)
{ {
if(profiling) if(profiling)
word->xt = docol_profiling; return docol_profiling;
else else
word->xt = docol; return docol;
} }
else if(type_of(word->def) == FIXNUM_TYPE) else if(type_of(word->def) == FIXNUM_TYPE)
word->xt = primitives[to_fixnum(word->def)]; return primitives[to_fixnum(word->def)];
else else
word->xt = undefined; return undefined;
} }
DEFINE_PRIMITIVE(uncurry) DEFINE_PRIMITIVE(uncurry)

View File

@ -145,7 +145,7 @@ INLINE CELL type_of(CELL tagged)
DEFPUSHPOP(d,ds) DEFPUSHPOP(d,ds)
DEFPUSHPOP(r,rs) DEFPUSHPOP(r,rs)
void update_xt(F_WORD* word); XT default_word_xt(F_WORD *word);
DECLARE_PRIMITIVE(execute); DECLARE_PRIMITIVE(execute);
DECLARE_PRIMITIVE(call); DECLARE_PRIMITIVE(call);

View File

@ -407,13 +407,12 @@ void stack_frame_to_array(F_STACK_FRAME *frame)
offset = F; offset = F;
#ifdef CALLSTACK_UP_P #ifdef CALLSTACK_UP_P
#define I(n) (n) set_array_nth(array,frame_index++,frame_executing(frame));
set_array_nth(array,frame_index++,offset);
#else #else
#define I(n) (array_capacity(array) - (n) - 1) set_array_nth(array,frame_index--,offset);
set_array_nth(array,frame_index--,frame_executing(frame));
#endif #endif
set_array_nth(array,I(frame_index++),frame_executing(frame));
set_array_nth(array,I(frame_index++),offset);
} }
DEFINE_PRIMITIVE(callstack_to_array) DEFINE_PRIMITIVE(callstack_to_array)
@ -429,7 +428,12 @@ DEFINE_PRIMITIVE(callstack_to_array)
/* frame_count is equal to the total length now */ /* frame_count is equal to the total length now */
#ifdef CALLSTACK_UP_P
frame_index = 0; frame_index = 0;
#else
frame_index = frame_count - 1;
#endif
iterate_callstack_object(stack,stack_frame_to_array); iterate_callstack_object(stack,stack_frame_to_array);
dpush(tag_object(array)); dpush(tag_object(array));

View File

@ -131,12 +131,8 @@ DEFINE_PRIMITIVE(array_to_quotation)
{ {
F_QUOTATION *quot = allot_object(QUOTATION_TYPE,sizeof(F_QUOTATION)); F_QUOTATION *quot = allot_object(QUOTATION_TYPE,sizeof(F_QUOTATION));
quot->array = dpeek(); quot->array = dpeek();
quot->xt = NULL; quot->xt = lazy_jit_compile;
quot->compiled = F;
REGISTER_UNTAGGED(quot);
jit_compile(quot);
UNREGISTER_UNTAGGED(quot);
drepl(tag_object(quot)); drepl(tag_object(quot));
} }
@ -482,7 +478,8 @@ F_WORD *allot_word(CELL vocab, CELL name)
word->def = F; word->def = F;
word->props = F; word->props = F;
word->counter = tag_fixnum(0); word->counter = tag_fixnum(0);
update_xt(word); word->compiledp = F;
word->xt = default_word_xt(word);
return word; return word;
} }
@ -495,7 +492,9 @@ DEFINE_PRIMITIVE(word)
DEFINE_PRIMITIVE(update_xt) DEFINE_PRIMITIVE(update_xt)
{ {
update_xt(untag_word(dpop())); F_WORD *word = untag_word(dpop());
word->compiledp = F;
word->xt = default_word_xt(word);
} }
DEFINE_PRIMITIVE(word_xt) DEFINE_PRIMITIVE(word_xt)