]> gitweb.factorcode.org Git - factor.git/commitdiff
alien tweaks
authorSlava Pestov <slava@factorcode.org>
Sat, 3 Sep 2005 18:48:25 +0000 (18:48 +0000)
committerSlava Pestov <slava@factorcode.org>
Sat, 3 Sep 2005 18:48:25 +0000 (18:48 +0000)
library/alien/aliens.factor
library/unix/io.factor
library/unix/syscalls.factor
library/win32/win32-errors.factor
library/win32/win32-io-internals.factor
library/win32/win32-server.factor
library/win32/win32-stream.factor
native/alien.c
native/alien.h
native/string.c

index 45504bc02be0f967d362369366c66adf7eb6882c..21f63dccdc01dfb487d03c7a47dae29e84c259d1 100644 (file)
@@ -6,10 +6,6 @@ namespaces parser ;
 
 UNION: c-ptr byte-array alien displaced-alien ;
 
-: NULL ( -- null )
-    #! C null value.
-    0 <alien> ;
-
 M: alien hashcode ( obj -- n )
     alien-address >fixnum ;
 
index fd9f500b623e23381626d729617bfc87061b230e..1739f68426f7aeb94f88e92427c2b0f72f79675b 100644 (file)
@@ -140,7 +140,7 @@ GENERIC: task-container ( task -- vector )
 : init-fdsets ( -- read write except )
     read-fdset get [ read-tasks get init-fdset ] keep
     write-fdset get [ write-tasks get init-fdset ] keep
-    NULL ;
+    f ;
 
 : io-multiplex ( timeout -- )
     >r FD_SETSIZE init-fdsets r> make-timeval select drop
index 2b560d537621820083615a0f8d9189f093d58390..18f6e2c424d52d6e9d6de2bf0367c01d75005bdf 100644 (file)
@@ -23,7 +23,7 @@ END-STRUCT
 
 : make-timeval ( ms -- timeval )
     dup -1 = [
-        drop NULL
+        drop f
     ] [
         1000 /mod 1000 *
         <timeval>
index 86c42eb21713d5399f429a4df19fe5dbd71c4df0..18f73a1316c74a791be72464a1e237aa86dff7cc 100644 (file)
@@ -70,8 +70,8 @@ CONSTANT: WAIT_TIMEOUT 258 ;
 
 : win32-error-message ( id -- string )
     4096 <buffer> dup >r >r >r
-    FORMAT_MESSAGE_FROM_SYSTEM NULL r>
-    LANG_NEUTRAL SUBLANG_DEFAULT MAKELANGID r> buffer-ptr <alien> 4096 NULL
+    FORMAT_MESSAGE_FROM_SYSTEM f r>
+    LANG_NEUTRAL SUBLANG_DEFAULT MAKELANGID r> buffer-ptr <alien> 4096 f
     FormatMessage r> 2dup buffer-reset nip dup buffer-contents 
     swap buffer-free ;
 
index c056d464917d6b04dba599e4dd85257d12cd1035..f6bce42f94354c21d07da8985ecd35eccdc9eb9f 100644 (file)
@@ -47,7 +47,7 @@ GENERIC: expire
     GetLastError expected-error? [ drop f ] unless ;
 
 : add-completion ( handle -- )
-    completion-port get NULL 1 CreateIoCompletionPort drop ;
+    completion-port get f 1 CreateIoCompletionPort drop ;
 
 : get-access ( -- file-mode )
     "file-mode" get uncons 
@@ -67,7 +67,7 @@ GENERIC: expire
 : win32-open-file ( file r w -- handle )
     [ 
         cons "file-mode" set
-        get-access get-sharemode NULL get-create FILE_FLAG_OVERLAPPED NULL 
+        get-access get-sharemode f get-create FILE_FLAG_OVERLAPPED f 
         CreateFile dup INVALID_HANDLE_VALUE = [ win32-throw-error ] when
         dup add-completion
     ] with-scope ;
@@ -125,7 +125,7 @@ C: io-callback ( -- callback )
     rot [ queue-error ] unless ;
 
 : win32-init-stdio ( -- )
-    INVALID_HANDLE_VALUE NULL NULL 1 CreateIoCompletionPort
+    INVALID_HANDLE_VALUE f f 1 CreateIoCompletionPort
     completion-port set 
     <io-queue> io-queue set ;
 
index c1fb8b9f1493298913b59c9c6cc3d34eec45e171..8c525c06070e51567f507826553d3af6e0e18b94 100644 (file)
@@ -46,7 +46,7 @@ SYMBOL: socket
     ] unless ;
 
 : new-socket ( -- socket )
-    AF_INET SOCK_STREAM 0 NULL NULL WSA_FLAG_OVERLAPPED WSASocket ;
+    AF_INET SOCK_STREAM 0 f f WSA_FLAG_OVERLAPPED WSASocket ;
 
 : setup-sockaddr ( port -- sockaddr )
     <sockaddr-in> swap
@@ -110,7 +110,7 @@ IN: io
         [
             stream get alloc-io-callback init-overlapped
             >r >r >r socket get r> r> 
-            buffer-ptr <alien> 0 32 32 NULL r> AcceptEx
+            buffer-ptr <alien> 0 32 32 f r> AcceptEx
             [ handle-socket-error ] unless stop
         ] callcc1 pending-error drop
         swap dup add-completion <win32-stream> <line-reader> 
index 7cb058d8d120db3c8218173cb871f4f933e3e023..bc1f22c3133a4b9f7e07aa3f6822519bba1ba205 100644 (file)
@@ -49,7 +49,7 @@ SYMBOL: cutoff
     0 over set-overlapped-ext-internal-high
     fileptr get dup 0 ? over set-overlapped-ext-offset
     0 over set-overlapped-ext-offset-high
-    NULL over set-overlapped-ext-event ;
+    f over set-overlapped-ext-event ;
 
 : update-file-pointer ( whence -- )
     file-size get [ fileptr [ + ] change ] [ drop ] ifte ;
@@ -61,7 +61,7 @@ SYMBOL: cutoff
     update-timeout [
         stream get alloc-io-callback init-overlapped >r
         handle get out-buffer get [ buffer@ ] keep buffer-length
-        NULL r> WriteFile [ handle-io-error ] unless stop
+        f r> WriteFile [ handle-io-error ] unless stop
     ] callcc1 pending-error
 
     dup update-file-pointer
@@ -89,7 +89,7 @@ M: string do-write ( str -- )
         stream get alloc-io-callback init-overlapped >r
         handle get in-buffer get [ buffer@ ] keep 
         buffer-capacity file-size get [ fileptr get - min ] when*
-        NULL r>
+        f r>
         ReadFile [ handle-io-error ] unless stop
     ] callcc1 pending-error
 
@@ -157,7 +157,7 @@ M: win32-stream expire ( stream -- )
 
 C: win32-stream ( handle -- stream )
     swap [
-        dup NULL GetFileSize dup -1 = not [
+        dup f GetFileSize dup -1 = not [
             file-size set
         ] [ drop f file-size set ] ifte
         handle set 
index bacd06733813b487ec1f53266392e75f9ad9dedf..1eaa9249cb4e85b8e884e697b2d33411e0f50392 100644 (file)
@@ -13,7 +13,7 @@ void primitive_expired(void)
                drepl(F);
 }
 
-INLINE void* alien_offset(CELL object)
+void* alien_offset(CELL object)
 {
        ALIEN *alien;
        F_ARRAY *array;
@@ -32,6 +32,8 @@ INLINE void* alien_offset(CELL object)
        case DISPLACED_ALIEN_TYPE:
                d = untag_displaced_alien_fast(object);
                return alien_offset(d->alien) + d->displacement;
+       case F_TYPE:
+               return NULL;
        default:
                type_error(ALIEN_TYPE,object);
                return (void*)-1; /* can't happen */
index 4da239d77b63b4a13218248fc093e0a51c70e0ee..3d608b95e1111ad7cbd4d6e3a9ef66bc8d2c20fb 100644 (file)
@@ -25,6 +25,8 @@ void primitive_alien(void);
 void primitive_displaced_alien(void);
 void primitive_alien_address(void);
 
+void* alien_offset(CELL object);
+
 void fixup_alien(ALIEN* alien);
 void fixup_displaced_alien(DISPLACED_ALIEN* d);
 void collect_displaced_alien(DISPLACED_ALIEN* d);
index 555c81b605609edfccdf89da8c1ce9479aabec8b..8aa2f3c55305aa1571bab130d1061415475a8732 100644 (file)
@@ -150,10 +150,13 @@ char *to_c_string_unchecked(F_STRING *s)
 }
 
 /* FFI calls this */
-char *unbox_c_string(void)
+charunbox_c_string(void)
 {
        CELL str = dpop();
-       return (str ? to_c_string(untag_string(str)) : NULL);
+       if(type_of(str) == STRING_TYPE)
+               return to_c_string(untag_string(str));
+       else
+               return (char*)alien_offset(str);
 }
 
 /* FFI calls this */