From b96077beb78d712420e99742a86ccd6d636c54e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Sat, 28 May 2016 17:22:45 +0200 Subject: [PATCH] alien.parser: better fix for #1535 These changes ensure that reset-generic is called when parsing alien words. Otherwise problems occur when you redefine generics as callbacks or typedefs. --- basis/alien/c-types/c-types-tests.factor | 46 ++++++++++++++++++++++++ basis/alien/parser/parser-tests.factor | 7 +++- basis/alien/parser/parser.factor | 5 +-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/basis/alien/c-types/c-types-tests.factor b/basis/alien/c-types/c-types-tests.factor index 09a31fa73c..04a18dbb70 100644 --- a/basis/alien/c-types/c-types-tests.factor +++ b/basis/alien/c-types/c-types-tests.factor @@ -103,3 +103,49 @@ DEFER: struct-redefined ] [ error>> error>> redefine-error? ] must-fail-with + +[ + "IN: alien.c-types.tests + USE: alien.syntax + USE: alien.c-types + CALLBACK: void cb987 ( ) + CALLBACK: void cb987 ( )" eval( -- ) +] +[ error>> error>> redefine-error? ] +must-fail-with + +[ + "IN: alien.c-types.tests + USE: alien.syntax + USE: alien.c-types + FUNCTION: void func987 ( ) + FUNCTION: void func987 ( )" eval( -- ) +] +[ error>> error>> redefine-error? ] +must-fail-with + +! generic -> callback +"IN: alien.c-types.tests +USE: alien.syntax +USE: alien.c-types +GENERIC: foo-func ( x -- ) +" eval( -- ) + +"IN: alien.c-types.tests +USE: alien.syntax +USE: alien.c-types +CALLBACK: void foo-func ( ) +" eval( -- ) + +! generic -> typedef +"IN: alien.c-types.tests +USE: alien.syntax +USE: alien.c-types +GENERIC: foo-func ( x -- ) +" eval( -- ) + +"IN: alien.c-types.tests +USE: alien.syntax +USE: alien.c-types +TYPEDEF: void* foo-func +" eval( -- ) diff --git a/basis/alien/parser/parser-tests.factor b/basis/alien/parser/parser-tests.factor index de2d3bc303..4f37365611 100644 --- a/basis/alien/parser/parser-tests.factor +++ b/basis/alien/parser/parser-tests.factor @@ -30,7 +30,7 @@ IN: alien.parser.tests ] with-parsing ] unit-test -{ 0 } [ +{ 1 } [ { } [ "hello" current-vocab create-word old-definitions get first adjoin @@ -110,3 +110,8 @@ TYPEDEF: int alien-parser-test-int ! reasonably unique name... "OK!" ] [ :1 ] recover ] unit-test + +! Redefinitions +{ } [ + [ C-TYPE: hi TYPEDEF: void* hi ] with-compilation-unit +] unit-test diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor index 2ada0714d8..610d1fabca 100755 --- a/basis/alien/parser/parser.factor +++ b/basis/alien/parser/parser.factor @@ -63,6 +63,7 @@ ERROR: *-in-c-type-name name ; validate-c-type-name current-vocab create-word { [ fake-definition ] [ set-last-word ] + [ reset-generic ] [ reset-c-type ] [ ] } cleave ; @@ -85,7 +86,7 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ; [ define-enum-value ] [ [ 2array suffix! ] [ enum>number 1 + ] bi ] 2bi ; -: parse-enum-name ( -- name ) +: parse-enum-name ( -- word ) CREATE-C-TYPE dup save-location ; : parse-enum-base-type ( -- base-type token ) @@ -146,7 +147,7 @@ PRIVATE> '[ [ _ _ _ ] dip alien-callback ] ; :: make-callback-type ( return function library types names -- word quot effect ) - function (CREATE-C-TYPE) :> type-word + function create-function :> type-word void* type-word typedef type-word names return function-effect "callback-effect" set-word-prop type-word library "callback-library" set-word-prop