]> gitweb.factorcode.org Git - factor.git/commitdiff
alien.parser: better fix for #1535
authorBjörn Lindqvist <bjourne@gmail.com>
Sat, 28 May 2016 15:22:45 +0000 (17:22 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Sat, 28 May 2016 15:22:45 +0000 (17:22 +0200)
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
basis/alien/parser/parser-tests.factor
basis/alien/parser/parser.factor

index 09a31fa73c67ecc3b46fa19e020e87c9c252c5ac..04a18dbb70e8141d998e33da3e4d23f10c89925d 100644 (file)
@@ -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( -- )
index de2d3bc303d170f9c34dca7f505e873bd26c4c25..4f37365611d3351223746cc0ff610e4f55470be3 100644 (file)
@@ -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
index 2ada0714d80fc64e7c61fd08d1e4e17f42ffce71..610d1fabcadaf09537185e62497b8563f3b7fa59 100755 (executable)
@@ -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