]> gitweb.factorcode.org Git - factor.git/commitdiff
better FFI error reporting
authorerg <erg@trifocus.net>
Wed, 18 Oct 2006 21:16:37 +0000 (21:16 +0000)
committererg <erg@trifocus.net>
Wed, 18 Oct 2006 21:16:37 +0000 (21:16 +0000)
TODO.FACTOR.txt
library/compiler/alien/alien-invoke.factor
library/compiler/x86/architecture.factor
library/tools/errors.factor
vm/os-unix.c
vm/os-windows.c

index e3a8aeb901eddd1a60c0993f8040f18c12ec2b4c..1f966c1c3602109a33c4b43937157787e75f1b78 100644 (file)
@@ -1,6 +1,8 @@
 - live search: timer delay would be nice
 - help responder has no way to access { "foo" "bar" }
 - httpd search tools
+- condition rethrow restarts broken
+- menus broken (right click, left click another word)
 
 + ui:
 
index 5e731b80b49dd769d9f8724cd198143bf9e12778..b4ca412989f092542034620009df4220c6d7e3bd 100644 (file)
@@ -24,6 +24,10 @@ M: alien-invoke-error summary
 : alien-invoke ( ... return library function parameters -- ... )
     pick pick <alien-invoke-error> throw ;
 
+: ensure-dlsym ( node -- )
+    [ alien-invoke-dlsym dlsym drop ]
+    [ inference-warning ] recover ;
+
 \ alien-invoke [ string object string object ] [ ] <effect>
 "infer-effect" set-word-prop
 
@@ -33,7 +37,7 @@ M: alien-invoke-error summary
     pop-literal nip over set-alien-invoke-function
     pop-literal nip over set-alien-invoke-library
     pop-literal nip over set-alien-invoke-return
-    dup alien-invoke-dlsym dlsym drop
+    dup ensure-dlsym
     alien-invoke-stack
 ] "infer" set-word-prop
 
index 76e7a8fc049e7acc28f0e145b51aa4cf5d49e7e2..76c27465cb4eb9e29179d3bcbcc449a266a9ee37 100644 (file)
@@ -44,7 +44,7 @@ M: cs-loc v>operand cs-loc-n cs-reg reg-stack ;
     #! so this is mostly a no-op.
     swap slip stack-reg swap ADD ; inline
 
-: compile-c-call* ( symbol dll args -- operands )
+: compile-c-call* ( symbol dll args -- )
     dup length cells [
         <reversed> [ PUSH ] each %alien-invoke
     ] with-aligned-stack ;
index 6af6eaf25b4ce1c87f1f53beb015b86973a1890a..5ad9837cfa79549004895ad814048e2dc4d55ded 100644 (file)
@@ -30,7 +30,9 @@ words definitions ;
     "Cannot convert to C string: " write third . ;
 
 : ffi-error. ( obj -- )
-    "FFI: " write third print ;
+    "FFI: " write
+    dup third [ write ": " write ] when*
+    fourth print ;
 
 : heap-scan-error. ( obj -- )
     "Cannot do next-object outside begin/end-scan" print drop ;
index e78fa0b5e626dcb14e30b4bf5a80384aa73e1db1..1454d2f74a37b3aaa59b5e1a94574051e828588d 100644 (file)
@@ -22,8 +22,8 @@ void ffi_dlopen(DLL *dll, bool error)
        {
                if(error)
                {
-                       general_error(ERROR_FFI,tag_object(
-                               from_char_string(dlerror())),F,true);
+                       general_error(ERROR_FFI,F,
+                               tag_object(from_char_string(dlerror())),true);
                }
                else
                        dll->dll = NULL;
@@ -42,8 +42,8 @@ void *ffi_dlsym(DLL *dll, F_STRING *symbol, bool error)
        {
                if(error)
                {
-                       general_error(ERROR_FFI,tag_object(
-                               from_char_string(dlerror())),F,true);
+                       general_error(ERROR_FFI,tag_object(symbol),
+                               tag_object(from_char_string(dlerror())),true);
                }
 
                return NULL;
index 08faa1e126ae659d343e8e9f346f7190e650382f..7fe4300f9c0fa7e8371140620f066af427524a94 100644 (file)
@@ -58,7 +58,7 @@ void ffi_dlopen (DLL *dll, bool error)
        {
                dll->dll = NULL;
                if(error)
-                       general_error(ERROR_FFI, tag_object(get_error_message()),F,true);
+                       general_error(ERROR_FFI, F, tag_object(get_error_message()),true);
                else
                        return;
        }
@@ -74,7 +74,8 @@ void *ffi_dlsym (DLL *dll, F_STRING *symbol, bool error)
        if (!sym)
        {
                if(error)
-                       general_error(ERROR_FFI, tag_object(get_error_message()),F,true);
+                       general_error(ERROR_FFI, tag_object(symbol),
+                               tag_object(get_error_message()),true);
                else
                        return NULL;
        }