Add a compile time check to set-slots transform
parent
6458d6e946
commit
bca0dce0a5
|
@ -1,5 +1,5 @@
|
||||||
USING: help.syntax help.markup kernel sequences words io
|
USING: help.syntax help.markup kernel sequences words io
|
||||||
effects inference.dataflow inference.backend
|
effects inference.dataflow inference.backend classes
|
||||||
math combinators inference.transforms inference.state ;
|
math combinators inference.transforms inference.state ;
|
||||||
IN: inference
|
IN: inference
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ $nl
|
||||||
ABOUT: "inference"
|
ABOUT: "inference"
|
||||||
|
|
||||||
HELP: inference-error
|
HELP: inference-error
|
||||||
{ $values { "msg" "an object" } }
|
{ $values { "class" class } }
|
||||||
{ $description "Throws an " { $link inference-error } "." }
|
{ $description "Creates an instance of " { $snippet "class" } ", wraps it in an " { $link inference-error } " and throws the result." }
|
||||||
{ $error-description
|
{ $error-description
|
||||||
"Thrown by " { $link infer } " and " { $link dataflow } " when the stack effect of a quotation cannot be inferred."
|
"Thrown by " { $link infer } " and " { $link dataflow } " when the stack effect of a quotation cannot be inferred."
|
||||||
$nl
|
$nl
|
||||||
|
|
|
@ -475,10 +475,6 @@ t over set-effect-terminated?
|
||||||
|
|
||||||
\ string>u16-alien { string } { byte-array } <effect> "inferred-effect" set-word-prop
|
\ string>u16-alien { string } { byte-array } <effect> "inferred-effect" set-word-prop
|
||||||
|
|
||||||
\ string>memory { string c-ptr } { } <effect> "inferred-effect" set-word-prop
|
|
||||||
|
|
||||||
\ memory>string { c-ptr integer } { string } <effect> "inferred-effect" set-word-prop
|
|
||||||
|
|
||||||
\ alien-address { alien } { integer } <effect> "inferred-effect" set-word-prop
|
\ alien-address { alien } { integer } <effect> "inferred-effect" set-word-prop
|
||||||
\ alien-address make-flushable
|
\ alien-address make-flushable
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
USING: help.markup help.syntax inference.transforms
|
IN: inference.transforms
|
||||||
combinators words ;
|
USING: help.markup help.syntax combinators words kernel ;
|
||||||
|
|
||||||
HELP: define-transform
|
HELP: define-transform
|
||||||
{ $values { "word" word } { "quot" "a quotation taking " { $snippet "n" } " inputs from the stack and producing another quotation as output" } { "n" "a non-negative integer" } }
|
{ $values { "word" word } { "quot" "a quotation taking " { $snippet "n" } " inputs from the stack and producing another quotation as output" } { "n" "a non-negative integer" } }
|
||||||
|
@ -12,3 +12,8 @@ HELP: define-transform
|
||||||
$nl
|
$nl
|
||||||
"The " { $link cond } " word compiles to efficient code because it is transformed using " { $link cond>quot } ":"
|
"The " { $link cond } " word compiles to efficient code because it is transformed using " { $link cond>quot } ":"
|
||||||
{ $code "\\ cond [ cond>quot ] 1 define-transform" } } ;
|
{ $code "\\ cond [ cond>quot ] 1 define-transform" } } ;
|
||||||
|
|
||||||
|
HELP: duplicated-slots-error
|
||||||
|
{ $values { "names" "a sequence of setter words" } }
|
||||||
|
{ $description "Throws a " { $link duplicated-slots-error } "." }
|
||||||
|
{ $error-description "Thrown by stack effect inference if a " { $link set-slots } " form is given an array of slot setters that includes duplicates. Since writing to the same slot multiple times has no useful effect, this is a programmer error, so it is caught at compile time." } ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
IN: temporary
|
IN: temporary
|
||||||
USING: sequences inference.transforms tools.test math kernel
|
USING: sequences inference.transforms tools.test math kernel
|
||||||
quotations tools.test.inference ;
|
quotations tools.test.inference inference ;
|
||||||
|
|
||||||
: compose-n-quot <repetition> >quotation ;
|
: compose-n-quot <repetition> >quotation ;
|
||||||
: compose-n compose-n-quot call ;
|
: compose-n compose-n-quot call ;
|
||||||
|
@ -20,3 +20,15 @@ quotations tools.test.inference ;
|
||||||
[ 512 ] [ 1 { { 1+ 8 } } bitfield-quot call ] unit-test
|
[ 512 ] [ 1 { { 1+ 8 } } bitfield-quot call ] unit-test
|
||||||
|
|
||||||
\ construct-empty must-infer
|
\ construct-empty must-infer
|
||||||
|
|
||||||
|
TUPLE: a-tuple x y z ;
|
||||||
|
|
||||||
|
: set-slots-test ( x y z -- )
|
||||||
|
{ set-a-tuple-x set-a-tuple-y } set-slots ;
|
||||||
|
|
||||||
|
\ set-slots-test must-infer
|
||||||
|
|
||||||
|
: set-slots-test-2
|
||||||
|
{ set-a-tuple-x set-a-tuple-x } set-slots ;
|
||||||
|
|
||||||
|
[ [ set-slots-test-2 ] infer ] unit-test-fails
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: arrays kernel words sequences generic math namespaces
|
USING: arrays kernel words sequences generic math namespaces
|
||||||
quotations assocs combinators math.bitfields inference.backend
|
quotations assocs combinators math.bitfields inference.backend
|
||||||
inference.dataflow inference.state tuples.private effects ;
|
inference.dataflow inference.state tuples.private effects
|
||||||
|
inspector hashtables ;
|
||||||
IN: inference.transforms
|
IN: inference.transforms
|
||||||
|
|
||||||
: pop-literals ( n -- rstate seq )
|
: pop-literals ( n -- rstate seq )
|
||||||
|
@ -59,7 +60,18 @@ M: pair (bitfield-quot) ( spec -- quot )
|
||||||
|
|
||||||
\ get-slots [ [get-slots] ] 1 define-transform
|
\ get-slots [ [get-slots] ] 1 define-transform
|
||||||
|
|
||||||
\ set-slots [ <reversed> [get-slots] ] 1 define-transform
|
TUPLE: duplicated-slots-error names ;
|
||||||
|
|
||||||
|
M: duplicated-slots-error summary
|
||||||
|
drop "Calling set-slots with duplicate slot setters" ;
|
||||||
|
|
||||||
|
: duplicated-slots-error ( names -- * )
|
||||||
|
\ duplicated-slots-error construct-boa throw ;
|
||||||
|
|
||||||
|
\ set-slots [
|
||||||
|
dup all-unique?
|
||||||
|
[ <reversed> [get-slots] ] [ duplicated-slots-error ] if
|
||||||
|
] 1 define-transform
|
||||||
|
|
||||||
\ construct-boa [
|
\ construct-boa [
|
||||||
dup +inlined+ depends-on
|
dup +inlined+ depends-on
|
||||||
|
|
Loading…
Reference in New Issue