From 92868fe778cba9f976cbe7e148c3637ee7c9dc3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Tue, 9 Jun 2015 11:39:55 +0200 Subject: [PATCH] locals.parser: fix for #1340, write locals directly to the manifest 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 | 4 ++-- basis/locals/parser/parser.factor | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/basis/locals/locals.factor b/basis/locals/locals.factor index 4cb3466667..a95de5ffea 100644 --- a/basis/locals/locals.factor +++ b/basis/locals/locals.factor @@ -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! ; diff --git a/basis/locals/parser/parser.factor b/basis/locals/parser/parser.factor index ae096404b6..7ffc450624 100644 --- a/basis/locals/parser/parser.factor +++ b/basis/locals/parser/parser.factor @@ -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) ?rewrite-closures ; -: parse-multi-def ( locals -- multi-def ) - ")" parse-tokens make-locals swapd assoc-union! drop ; +: parse-multi-def ( -- multi-def assoc ) + ")" parse-tokens make-locals [ ] dip ; -: parse-single-def ( name locals -- def ) - swap [ make-local ] H{ } make swapd assoc-union! drop ; +: parse-single-def ( name -- def assoc ) + [ make-local ] H{ } make ; -: parse-def ( name/paren locals -- def ) - over "(" = [ nip parse-multi-def ] [ parse-single-def ] if ; +: update-locals ( assoc -- ) + manifest get qualified-vocabs>> last words>> swap assoc-union! drop ; + +: 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) ;