factor/library/compiler/inference/known-words.factor

418 lines
16 KiB
Factor
Raw Normal View History

2006-11-12 22:14:04 -05:00
! Copyright (C) 2004, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2005-08-07 00:00:57 -04:00
IN: inference
USING: arrays alien assembler errors generic hashtables
2006-08-24 02:09:54 -04:00
hashtables-internals io io-internals kernel
2006-05-17 14:55:46 -04:00
kernel-internals math math-internals memory parser
2006-11-12 22:14:04 -05:00
sequences strings vectors words prettyprint namespaces ;
2005-08-07 00:00:57 -04:00
\ declare [
pop-literal nip
2006-11-12 22:14:04 -05:00
dup ensure-values
2006-09-13 02:17:46 -04:00
dup length d-tail
swap #declare
[ 2dup set-node-in-d set-node-out-d ] keep
node,
] "infer" set-word-prop
2006-11-12 22:14:04 -05:00
\ declare { object } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum< { fixnum fixnum } { object } <effect> "inferred-effect" set-word-prop
\ fixnum< t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum<= { fixnum fixnum } { object } <effect> "inferred-effect" set-word-prop
\ fixnum<= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum> { fixnum fixnum } { object } <effect> "inferred-effect" set-word-prop
\ fixnum> t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum>= { fixnum fixnum } { object } <effect> "inferred-effect" set-word-prop
\ fixnum>= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ eq? { object object } { object } <effect> "inferred-effect" set-word-prop
\ eq? t "foldable" set-word-prop
2005-08-07 00:00:57 -04:00
! Primitive combinators
2006-11-12 22:14:04 -05:00
\ call { object } { } <effect> "inferred-effect" set-word-prop
2005-11-27 17:45:48 -05:00
\ call [ pop-literal infer-quot-value ] "infer" set-word-prop
2005-08-07 00:00:57 -04:00
2006-11-12 22:14:04 -05:00
\ execute { word } { } <effect> "inferred-effect" set-word-prop
2005-08-07 00:00:57 -04:00
\ execute [
pop-literal unit infer-quot-value
] "infer" set-word-prop
2006-11-12 22:14:04 -05:00
\ if { object object object } { } <effect> "inferred-effect" set-word-prop
2005-09-24 15:21:17 -04:00
\ if [
2 #drop node, pop-d pop-d swap 2array
2005-09-24 15:21:17 -04:00
#if pop-d drop infer-branches
2005-08-07 00:00:57 -04:00
] "infer" set-word-prop
2006-11-12 22:14:04 -05:00
\ cond { object } { } <effect> "inferred-effect" set-word-prop
\ cond [
2006-05-14 23:25:34 -04:00
pop-literal <reversed>
[ no-cond ] swap alist>quot infer-quot-value
] "infer" set-word-prop
2006-11-12 22:14:04 -05:00
\ dispatch { fixnum array } { } <effect> "inferred-effect" set-word-prop
2005-08-07 00:00:57 -04:00
\ dispatch [
pop-literal nip [ <value> ] map
2005-08-07 00:00:57 -04:00
#dispatch pop-d drop infer-branches
] "infer" set-word-prop
! Non-standard control flow
\ throw { object } { } <effect>
t over set-effect-terminated?
2006-11-12 22:14:04 -05:00
"inferred-effect" set-word-prop
! Stack effects for all primitives
2006-11-12 22:14:04 -05:00
\ rehash-string { string } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ string>sbuf { string } { sbuf } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum>fixnum { bignum } { fixnum } <effect> "inferred-effect" set-word-prop
\ bignum>fixnum t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float>fixnum { float } { fixnum } <effect> "inferred-effect" set-word-prop
\ bignum>fixnum t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum>bignum { fixnum } { bignum } <effect> "inferred-effect" set-word-prop
\ fixnum>bignum t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float>bignum { float } { bignum } <effect> "inferred-effect" set-word-prop
\ float>bignum t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum>float { fixnum } { float } <effect> "inferred-effect" set-word-prop
\ fixnum>float t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum>float { bignum } { float } <effect> "inferred-effect" set-word-prop
\ bignum>float t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ (fraction>) { integer integer } { rational } <effect> "inferred-effect" set-word-prop
\ (fraction>) t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ string>float { string } { float } <effect> "inferred-effect" set-word-prop
\ string>float t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float>string { float } { string } <effect> "inferred-effect" set-word-prop
\ float>string t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float>bits { real } { integer } <effect> "inferred-effect" set-word-prop
\ float>bits t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ double>bits { real } { integer } <effect> "inferred-effect" set-word-prop
\ double>bits t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bits>float { integer } { float } <effect> "inferred-effect" set-word-prop
\ bits>float t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bits>double { integer } { float } <effect> "inferred-effect" set-word-prop
\ bits>double t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ <complex> { real real } { number } <effect> "inferred-effect" set-word-prop
\ <complex> t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum+ { fixnum fixnum } { integer } <effect> "inferred-effect" set-word-prop
\ fixnum+ t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum+fast { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum+fast t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum- { fixnum fixnum } { integer } <effect> "inferred-effect" set-word-prop
\ fixnum- t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-fast { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-fast t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum* { fixnum fixnum } { integer } <effect> "inferred-effect" set-word-prop
\ fixnum* t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum/i { fixnum fixnum } { integer } <effect> "inferred-effect" set-word-prop
\ fixnum/i t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-mod { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-mod t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum/mod { fixnum fixnum } { integer fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum/mod t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-bitand { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-bitand t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-bitor { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-bitor t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-bitxor { fixnum fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-bitxor t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-bitnot { fixnum } { fixnum } <effect> "inferred-effect" set-word-prop
\ fixnum-bitnot t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ fixnum-shift { fixnum fixnum } { integer } <effect> "inferred-effect" set-word-prop
\ fixnum-shift t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum= { bignum bignum } { object } <effect> "inferred-effect" set-word-prop
\ bignum= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum+ { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum+ t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum- { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum- t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum* { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum* t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum/i { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum/i t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-mod { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-mod t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum/mod { bignum bignum } { bignum bignum } <effect> "inferred-effect" set-word-prop
\ bignum/mod t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-bitand { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-bitand t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-bitor { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-bitor t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-bitxor { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-bitxor t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-bitnot { bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-bitnot t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum-shift { bignum bignum } { bignum } <effect> "inferred-effect" set-word-prop
\ bignum-shift t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum< { bignum bignum } { object } <effect> "inferred-effect" set-word-prop
\ bignum< t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum<= { bignum bignum } { object } <effect> "inferred-effect" set-word-prop
\ bignum<= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum> { bignum bignum } { object } <effect> "inferred-effect" set-word-prop
\ bignum> t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ bignum>= { bignum bignum } { object } <effect> "inferred-effect" set-word-prop
\ bignum>= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float+ { float float } { float } <effect> "inferred-effect" set-word-prop
\ float+ t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float- { float float } { float } <effect> "inferred-effect" set-word-prop
\ float- t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float* { float float } { float } <effect> "inferred-effect" set-word-prop
\ float* t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float/f { float float } { float } <effect> "inferred-effect" set-word-prop
\ float/f t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float< { float float } { object } <effect> "inferred-effect" set-word-prop
\ float< t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float-mod { float float } { float } <effect> "inferred-effect" set-word-prop
\ float-mod t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float<= { float float } { object } <effect> "inferred-effect" set-word-prop
\ float<= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float> { float float } { object } <effect> "inferred-effect" set-word-prop
\ float> t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ float>= { float float } { object } <effect> "inferred-effect" set-word-prop
\ float>= t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ (word) { object object } { word } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ update-xt { word } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ word-xt { word } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ getenv { fixnum } { object } <effect> "inferred-effect" set-word-prop
\ setenv { object fixnum } { } <effect> "inferred-effect" set-word-prop
\ stat { string } { object object object object } <effect> "inferred-effect" set-word-prop
\ (directory) { string } { array } <effect> "inferred-effect" set-word-prop
\ data-gc { integer } { } <effect> "inferred-effect" set-word-prop
2006-09-26 19:00:41 -04:00
! code-gc does not declare a stack effect since it might be
! called from a compiled word which becomes unreachable during
! the course of its execution, resulting in a crash
2006-11-12 22:14:04 -05:00
\ gc-time { } { integer } <effect> "inferred-effect" set-word-prop
\ save-image { string } { } <effect> "inferred-effect" set-word-prop
\ exit { integer } { } <effect> "inferred-effect" set-word-prop
\ data-room { } { integer integer array } <effect> "inferred-effect" set-word-prop
\ code-room { } { integer integer } <effect> "inferred-effect" set-word-prop
\ os-env { string } { object } <effect> "inferred-effect" set-word-prop
\ millis { } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ type { object } { fixnum } <effect> "inferred-effect" set-word-prop
\ type t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ tag { object } { fixnum } <effect> "inferred-effect" set-word-prop
\ tag t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ cwd { } { string } <effect> "inferred-effect" set-word-prop
\ cd { string } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ dlopen { string } { dll } <effect> "inferred-effect" set-word-prop
\ dlsym { string object } { integer } <effect> "inferred-effect" set-word-prop
\ dlclose { dll } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ <byte-array> { integer } { byte-array } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ <displaced-alien> { integer c-ptr } { c-ptr } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ alien-signed-cell { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-signed-cell { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-unsigned-cell { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-unsigned-cell { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-signed-8 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-signed-8 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-unsigned-8 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-unsigned-8 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-signed-4 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-signed-4 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-unsigned-4 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-unsigned-4 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-signed-2 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-signed-2 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-unsigned-2 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-unsigned-2 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-signed-1 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-signed-1 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-unsigned-1 { c-ptr integer } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-unsigned-1 { integer c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-float { c-ptr integer } { float } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-alien-float { float c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-float { c-ptr integer } { float } <effect> "inferred-effect" set-word-prop
2006-01-23 21:03:22 -05:00
2006-11-12 22:14:04 -05:00
\ set-alien-double { float c-ptr integer } { } <effect> "inferred-effect" set-word-prop
\ alien-double { c-ptr integer } { float } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ alien>char-string { c-ptr } { string } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ string>char-alien { string } { byte-array } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ alien>u16-string { c-ptr } { string } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ string>u16-alien { string } { byte-array } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ string>memory { string integer } { } <effect> "inferred-effect" set-word-prop
\ memory>string { integer integer } { string } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ alien-address { alien } { integer } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ slot { object fixnum } { object } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-slot { object object fixnum } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ char-slot { fixnum object } { fixnum } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ set-char-slot { fixnum fixnum object } { } <effect> "inferred-effect" set-word-prop
\ resize-array { integer array } { array } <effect> "inferred-effect" set-word-prop
\ resize-string { integer string } { string } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ (hashtable) { } { hashtable } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ <array> { integer object } { array } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ begin-scan { } { } <effect> "inferred-effect" set-word-prop
\ next-object { } { object } <effect> "inferred-effect" set-word-prop
\ end-scan { } { } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ size { object } { fixnum } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ die { } { } <effect> "inferred-effect" set-word-prop
\ fopen { string string } { alien } <effect> "inferred-effect" set-word-prop
\ fgetc { alien } { object } <effect> "inferred-effect" set-word-prop
\ fwrite { string alien } { } <effect> "inferred-effect" set-word-prop
\ fflush { alien } { } <effect> "inferred-effect" set-word-prop
\ fclose { alien } { } <effect> "inferred-effect" set-word-prop
\ expired? { object } { object } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ <wrapper> { object } { wrapper } <effect> "inferred-effect" set-word-prop
\ <wrapper> t "foldable" set-word-prop
2006-11-12 22:14:04 -05:00
\ (clone) { object } { object } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ become { object fixnum } { object } <effect> "inferred-effect" set-word-prop
2006-11-12 22:14:04 -05:00
\ array>vector { array } { vector } <effect> "inferred-effect" set-word-prop
2005-09-18 23:22:58 -04:00
2006-11-12 22:14:04 -05:00
\ finalize-compile { array } { } <effect> "inferred-effect" set-word-prop
2005-12-24 18:29:31 -05:00
2006-11-12 22:14:04 -05:00
\ <string> { integer integer } { string } <effect> "inferred-effect" set-word-prop
2006-05-16 16:50:51 -04:00
2006-11-12 22:14:04 -05:00
\ <quotation> { integer } { quotation } <effect> "inferred-effect" set-word-prop
! Dynamic scope inference
: if-tos-literal ( quot -- )
peek-d dup value? [ value-literal swap call ] [ 2drop ] if ;
inline
\ >n [ H{ } clone push-n ] "infer-vars" set-word-prop
\ >n { object } { } <effect> "inferred-effect" set-word-prop
TUPLE: too-many-n> ;
: apply-n> ( -- )
meta-n get empty? [
<too-many-n>> inference-error
] [
pop-n drop
] if ;
\ n> [ apply-n> ] "infer-vars" set-word-prop
\ n> { } { object } <effect> "inferred-effect" set-word-prop
\ ndrop [ apply-n> ] "infer-vars" set-word-prop
\ ndrop { } { } <effect> "inferred-effect" set-word-prop
\ get [
[ apply-var-read ] if-tos-literal
] "infer-vars" set-word-prop
\ get { object } { object } <effect> "inferred-effect" set-word-prop
\ set [
[ apply-var-write ] if-tos-literal
] "infer-vars" set-word-prop
\ set { object object } { } <effect> "inferred-effect" set-word-prop
\ get-global [
[ apply-global-read ]
if-tos-literal
] "infer-vars" set-word-prop
\ get-global { object } { object } <effect> "inferred-effect" set-word-prop
\ set-global [
[ apply-global-write ]
if-tos-literal
] "infer-vars" set-word-prop
\ set-global { object object } { } <effect> "inferred-effect" set-word-prop