]> gitweb.factorcode.org Git - factor.git/commitdiff
hints: prevent specialization on inline-recursive words.
authorJohn Benediktsson <mrjbq7@gmail.com>
Tue, 5 Mar 2013 01:34:20 +0000 (17:34 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Tue, 5 Mar 2013 01:34:20 +0000 (17:34 -0800)
basis/hints/hints.factor
basis/tr/tr.factor

index b5886ca6732e3fad8d99b2b303ea58ac73e1fa3f..682b0102d8c7c22462a077de45ced60bfc5ecb8d 100644 (file)
@@ -67,69 +67,79 @@ M: object specializer-declaration class-of ;
 : specialized-length ( specializer -- n )
     dup [ array? ] all? [ first ] when length ;
 
+ERROR: cannot-specialize word specializer ;
+
+: set-specializer ( word specializer -- )
+    over inline-recursive? [ cannot-specialize ] when
+    "specializer" set-word-prop ;
+
 SYNTAX: HINTS:
     scan-object dup wrapper? [ wrapped>> ] when
     [ changed-definition ]
     [ subwords [ changed-definition ] each ]
-    [ parse-definition { } like "specializer" set-word-prop ] tri ;
+    [ parse-definition { } like set-specializer ] tri ;
 
 ! Default specializers
-{ pop* pop } [
-    { vector } "specializer" set-word-prop
+{ pop* pop push last } [
+    { vector } set-specializer
 ] each
 
-\ push { { vector } { sbuf } } "specializer" set-word-prop
-
-\ last { { vector } } "specializer" set-word-prop
-
-\ set-last { { object vector } } "specializer" set-word-prop
+\ set-last { { object vector } } set-specializer
 
 \ push-all
 { { string sbuf } { array vector } { byte-array byte-vector } }
-"specializer" set-word-prop
+set-specializer
 
 { append prepend } [
     { { string string } { array array } }
-    "specializer" set-word-prop
+    set-specializer
 ] each
 
 \ subseq
 { { fixnum fixnum string } { fixnum fixnum array } }
-"specializer" set-word-prop
+set-specializer
 
 \ reverse!
 { { string } { array } }
-"specializer" set-word-prop
+set-specializer
 
 \ mismatch
 { string string }
-"specializer" set-word-prop
+set-specializer
 
-\ >string { sbuf } "specializer" set-word-prop
+\ >string { sbuf } set-specializer
 
-\ >array { { vector } } "specializer" set-word-prop
+\ >array { { vector } } set-specializer
 
-\ >vector { { array } { vector } } "specializer" set-word-prop
+\ >vector { { array } { vector } } set-specializer
 
-\ >sbuf { string } "specializer" set-word-prop
+\ >sbuf { string } set-specializer
 
-\ split, { string string } "specializer" set-word-prop
+\ split, { string string } set-specializer
 
 { member? member-eq? } [
-    { array } "specializer" set-word-prop
+    { array } set-specializer
 ] each
 
-\ assoc-stack { vector } "specializer" set-word-prop
+\ assoc-stack { vector } set-specializer
 
 { >le >be } [
     { { fixnum fixnum } { bignum fixnum } }
-    "specializer" set-word-prop
+    set-specializer
 ] each
 
-\ base> { string fixnum } "specializer" set-word-prop
+\ base> { string fixnum } set-specializer
+
+M\ hashtable at*
+{ { fixnum object } { word object } }
+set-specializer
 
-M\ hashtable at* { { fixnum object } { word object } } "specializer" set-word-prop
+M\ hashtable set-at
+{ { object fixnum object } { object word object } }
+set-specializer
 
-M\ hashtable set-at { { object fixnum object } { object word object } } "specializer" set-word-prop
+\ encode-string { string object object } set-specializer
 
-\ encode-string { string object object } "specializer" set-word-prop
+{ each-integer find-integer all-integers? } [
+    { { fixnum object } } set-specializer
+] each
index 7c3cc9e054b0f365cf6d1953018a6358686e02b7..a76bf80dc2df0de4696a9ba7542aecff9ef7221b 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: byte-arrays strings sequences sequences.private ascii
-fry kernel words parser lexer assocs math math.order summary ;
+USING: ascii assocs byte-arrays fry hints kernel lexer math
+math.order parser sequences sequences.private strings summary
+words ;
 IN: tr
 
 ERROR: bad-tr ;
@@ -21,7 +22,7 @@ M: bad-tr summary
     '[ [ _ call( x -- y ) _ at ] keep or ] B{ } map-as ; inline
 
 : tr-hints ( word -- )
-    { { byte-array } { string } } "specializer" set-word-prop ;
+    { { byte-array } { string } } set-specializer ;
 
 : create-tr ( token -- word )
     create-in dup tr-hints ;