From e8152e90985b800e30670e42eebe605b21123354 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 15 Aug 2010 01:51:55 -0700 Subject: [PATCH] alien.parser: array types where the base type was a pointer didn't parse (reported by Dmitry Shubin) --- basis/alien/parser/parser-tests.factor | 3 +++ basis/alien/parser/parser.factor | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/basis/alien/parser/parser-tests.factor b/basis/alien/parser/parser-tests.factor index 9101acad50..c553a9e399 100644 --- a/basis/alien/parser/parser-tests.factor +++ b/basis/alien/parser/parser-tests.factor @@ -23,6 +23,9 @@ CONSTANT: eleven 11 [ pointer: int* ] [ "int**" parse-c-type ] unit-test [ pointer: int** ] [ "int***" parse-c-type ] unit-test [ pointer: int*** ] [ "int****" parse-c-type ] unit-test + [ { pointer: int 3 } ] [ "int*[3]" parse-c-type ] unit-test + [ "void[3]" parse-c-type ] must-fail + [ { pointer: void 3 } ] [ "void*[3]" parse-c-type ] unit-test [ c-string ] [ "c-string" parse-c-type ] unit-test [ char2 ] [ "char2" parse-c-type ] unit-test [ pointer: char2 ] [ "char2*" parse-c-type ] unit-test diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor index 7d72442819..74b8d50280 100755 --- a/basis/alien/parser/parser.factor +++ b/basis/alien/parser/parser.factor @@ -12,21 +12,26 @@ SYMBOL: current-library : parse-c-type-name ( name -- word ) dup search [ ] [ no-word ] ?if ; -: parse-array-type ( name -- dims c-type ) +DEFER: (parse-c-type) + +: parse-array-type ( name -- c-type ) "[" split unclip - [ [ "]" ?tail drop parse-word ] map ] dip ; + [ [ "]" ?tail drop parse-word ] map ] [ (parse-c-type) ] bi* + prefix ; : (parse-c-type) ( string -- type ) { - { [ dup "void" = ] [ drop void ] } - { [ CHAR: ] over member? ] [ parse-array-type parse-c-type-name prefix ] } - { [ "*" ?tail ] [ (parse-c-type) ] } - { [ dup search ] [ parse-c-type-name ] } + { [ CHAR: ] over member? ] [ parse-array-type ] } + { [ "*" ?tail ] [ (parse-c-type) ] } + { [ dup search ] [ parse-c-type-name ] } [ dup search [ ] [ no-word ] ?if ] } cond ; +: c-array? ( c-type -- ? ) + { [ array? ] [ first { [ c-type-word? ] [ pointer? ] } 1|| ] } 1&& ; + : valid-c-type? ( c-type -- ? ) - { [ array? ] [ c-type-word? ] [ pointer? ] [ void? ] } 1|| ; + { [ c-array? ] [ c-type-word? ] [ pointer? ] [ void? ] } 1|| ; : parse-c-type ( string -- type ) (parse-c-type) dup valid-c-type? [ no-c-type ] unless ;