]> gitweb.factorcode.org Git - factor.git/commitdiff
locals.parser: fix for #1340, write locals directly to the manifest
authorBjörn Lindqvist <bjourne@gmail.com>
Tue, 9 Jun 2015 09:39:55 +0000 (11:39 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Tue, 9 Jun 2015 11:02:03 +0000 (13:02 +0200)
The locals parser used to parse and store locals in the 'locals'
variable which was an alias to 'manifest get qualified-vocabs>> last
words>>'. For some reason, after a restart they become distinct
objects. An easy fix is to not alias the hash in the first place.

basis/locals/locals.factor
basis/locals/parser/parser.factor

index 4cb346666788c30bf6a75ad8729245a0ba8b6266..a95de5ffeae86552f0a48e82b2eaf0c19a53ce1b 100644 (file)
@@ -6,8 +6,8 @@ locals.errors ;
 IN: locals
 
 SYNTAX: :>
-    scan-token locals get [ :>-outside-lambda-error ] unless*
-    parse-def suffix! ;
+    in-lambda? get [ :>-outside-lambda-error ] unless
+    scan-token parse-def suffix! ;
 
 SYNTAX: [| parse-lambda append! ;
 
index ae096404b619c6eb4f16f548a0dbc86b97c87af4..7ffc45062476e3dfabbdb11400966135c285789c 100644 (file)
@@ -31,15 +31,11 @@ ERROR: invalid-local-name name ;
 
 SINGLETON: lambda-parser
 
-SYMBOL: locals
-
-: ((parse-lambda)) ( assoc reader-quot -- quot )
+: ((parse-lambda)) ( assoc reader-quot: ( -- quot ) -- quot )
     '[
         in-lambda? on
         lambda-parser quotation-parser set
-        [ locals set ]
-        [ use-words @ ]
-        [ unuse-words ] tri
+        [ use-words @ ] [ unuse-words ] bi
     ] with-scope ; inline
 
 : (parse-lambda) ( assoc -- quot )
@@ -50,14 +46,17 @@ SYMBOL: locals
     (parse-lambda) <lambda>
     ?rewrite-closures ;
 
-: parse-multi-def ( locals -- multi-def )
-    ")" parse-tokens make-locals swapd assoc-union! drop <multi-def> ;
+: parse-multi-def ( -- multi-def assoc )
+    ")" parse-tokens make-locals [ <multi-def> ] dip ;
+
+: parse-single-def ( name -- def assoc )
+    [ make-local <def> ] H{ } make ;
 
-: parse-single-def ( name locals -- def )
-    swap [ make-local ] H{ } make swapd assoc-union! drop <def> ;
+: update-locals ( assoc -- )
+    manifest get qualified-vocabs>> last words>> swap assoc-union! drop ;
 
-: parse-def ( name/paren locals -- def )
-    over "(" = [ nip parse-multi-def ] [ parse-single-def ] if ;
+: parse-def ( name/paren -- def )
+    dup "(" = [ drop parse-multi-def ] [ parse-single-def ] if update-locals ;
 
 M: lambda-parser parse-quotation ( -- quotation )
     H{ } clone (parse-lambda) ;