From 84402ccf7e57e30c8e96f308076e5d51c61cc6e3 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 24 Aug 2012 15:53:00 -0700 Subject: [PATCH] core: Don't allow nested defintions in :, ::, M:, M::. Fixes #469. --- basis/locals/parser/parser.factor | 18 +++++++++++------- core/effects/parser/parser.factor | 22 +++++++++++++++++----- core/generic/parser/parser.factor | 4 +++- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/basis/locals/parser/parser.factor b/basis/locals/parser/parser.factor index 0bb47586c2..4b212f098e 100644 --- a/basis/locals/parser/parser.factor +++ b/basis/locals/parser/parser.factor @@ -86,13 +86,17 @@ M: lambda-parser parse-quotation ( -- quotation ) (parse-locals-definition) ; inline : (::) ( -- word def effect ) - scan-new-word - [ parse-definition ] - parse-locals-definition ; + [ + scan-new-word + [ parse-definition ] + parse-locals-definition + ] in-word-definition ; : (M::) ( -- word def ) - scan-new-method [ - [ parse-definition ] - parse-locals-method-definition drop - ] with-method-definition ; + scan-new-method + [ + [ parse-definition ] + parse-locals-method-definition drop + ] with-method-definition + ] in-word-definition ; diff --git a/core/effects/parser/parser.factor b/core/effects/parser/parser.factor index ea378b68c7..f14877a565 100644 --- a/core/effects/parser/parser.factor +++ b/core/effects/parser/parser.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: lexer sets sequences kernel splitting effects -combinators arrays make vocabs.parser classes parser ; +USING: arrays combinators effects kernel lexer make namespaces +parser sequences splitting words ; IN: effects.parser DEFER: parse-effect @@ -13,6 +13,8 @@ ERROR: stack-effect-omits-dashes ; SYMBOL: effect-var +SYMBOL: in-definition + : parse-call( ( accum word -- accum ) [ ")" parse-effect ] dip 2array append! ; +ERROR: can't-nest-definitions word ; + +: check-in-definition ( -- ) + in-definition get [ word can't-nest-definitions ] when ; + +: in-word-definition ( quot -- ) + [ check-in-definition t in-definition ] dip with-variable ; inline + : (:) ( -- word def effect ) - scan-new-word - scan-effect - parse-definition swap ; + [ + scan-new-word + scan-effect + parse-definition swap + ] in-word-definition ; diff --git a/core/generic/parser/parser.factor b/core/generic/parser/parser.factor index dcb0f665db..90f7b91f83 100644 --- a/core/generic/parser/parser.factor +++ b/core/generic/parser/parser.factor @@ -54,4 +54,6 @@ ERROR: bad-method-effect ; PRIVATE> : (M:) ( -- method def ) - scan-new-method [ parse-method-definition ] with-method-definition ; + [ + scan-new-method [ parse-method-definition ] with-method-definition + ] in-word-definition ;