From 7de0c0cb69488d416d7483aaa81d9be0ab35a283 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 24 Aug 2012 15:00:33 -0700 Subject: [PATCH] hashtables: Enforce shape on hashtable literals. Fixes #568. --- core/hashtables/hashtables.factor | 8 ++++++++ core/syntax/syntax.factor | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/hashtables/hashtables.factor b/core/hashtables/hashtables.factor index d6fa375dd2..ee1fcdefa7 100644 --- a/core/hashtables/hashtables.factor +++ b/core/hashtables/hashtables.factor @@ -181,4 +181,12 @@ M: hashtable assoc-like [ hashcode 0x13c6ef37 + ] dip [ 6 shift ] [ -2 shift ] bi + + ; +ERROR: malformed-hashtable-pair seq pair ; + +: check-hashtable ( seq -- seq ) + dup [ dup length 2 = [ drop ] [ malformed-hashtable-pair ] if ] each ; + +: parse-hashtable ( seq -- hashtable ) + check-hashtable H{ } assoc-clone-like ; + INSTANCE: hashtable assoc diff --git a/core/syntax/syntax.factor b/core/syntax/syntax.factor index e356f8d88e..441a4dfb7d 100644 --- a/core/syntax/syntax.factor +++ b/core/syntax/syntax.factor @@ -97,7 +97,7 @@ IN: bootstrap.syntax "V{" [ \ } [ >vector ] parse-literal ] define-core-syntax "B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax "BV{" [ \ } [ >byte-vector ] parse-literal ] define-core-syntax - "H{" [ \ } [ >hashtable ] parse-literal ] define-core-syntax + "H{" [ \ } [ parse-hashtable ] parse-literal ] define-core-syntax "T{" [ parse-tuple-literal suffix! ] define-core-syntax "W{" [ \ } [ first ] parse-literal ] define-core-syntax "HS{" [ \ } [ >hash-set ] parse-literal ] define-core-syntax