alien.parser: throw error if enum values don't fit c-type.
parent
3cc16ccd9e
commit
2e326498a4
|
@ -124,3 +124,10 @@ TYPEDEF: int alien-parser-test-int ! reasonably unique name...
|
||||||
{ } [
|
{ } [
|
||||||
[ C-TYPE: hi TYPEDEF: void* hi ] with-compilation-unit
|
[ C-TYPE: hi TYPEDEF: void* hi ] with-compilation-unit
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
"IN: alien.parser.tests
|
||||||
|
USING: alien.c-types alien.syntax ;
|
||||||
|
ENUM: tv_peripherals_4 < uchar
|
||||||
|
{ appletv 1 } { chromecast 2 } { roku 444 } ;" eval( -- )
|
||||||
|
] [ error>> enum-values-outside-c-type-interval? ] must-fail-with
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman, Joe Groff.
|
! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman, Joe Groff.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
|
||||||
USING: accessors alien alien.c-types alien.enums alien.libraries
|
USING: accessors alien alien.c-types alien.enums alien.libraries
|
||||||
arrays classes classes.parser combinators combinators.short-circuit
|
arrays classes classes.parser combinators
|
||||||
compiler.units effects fry kernel lexer locals math namespaces parser
|
combinators.short-circuit compiler.units effects fry kernel
|
||||||
sequences splitting summary vocabs.parser words ;
|
lexer locals math math.order namespaces parser sequences
|
||||||
|
splitting summary vocabs.parser words ;
|
||||||
|
|
||||||
IN: alien.parser
|
IN: alien.parser
|
||||||
|
|
||||||
SYMBOL: current-library
|
SYMBOL: current-library
|
||||||
|
@ -102,12 +105,19 @@ M: *-in-c-type-name summary
|
||||||
dup ";" = not
|
dup ";" = not
|
||||||
[ swap parse-enum-member scan-token parse-enum-members ] [ 2drop ] if ;
|
[ swap parse-enum-member scan-token parse-enum-members ] [ 2drop ] if ;
|
||||||
|
|
||||||
|
ERROR: enum-values-outside-c-type-interval name base-type values ;
|
||||||
|
|
||||||
|
: check-enum-members ( name base-type members -- name base-type members )
|
||||||
|
over c-type-interval '[ second _ _ between? ] dupd reject
|
||||||
|
[ nip enum-values-outside-c-type-interval ] unless-empty ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: parse-enum ( -- name base-type members )
|
: parse-enum ( -- name base-type members )
|
||||||
parse-enum-name
|
parse-enum-name
|
||||||
parse-enum-base-type
|
parse-enum-base-type
|
||||||
[ V{ } clone 0 ] dip parse-enum-members ;
|
[ V{ } clone 0 ] dip parse-enum-members
|
||||||
|
check-enum-members ;
|
||||||
|
|
||||||
: scan-function-name ( -- return function )
|
: scan-function-name ( -- return function )
|
||||||
scan-c-type scan-token parse-pointers ;
|
scan-c-type scan-token parse-pointers ;
|
||||||
|
|
Loading…
Reference in New Issue