]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/os-windows.cpp
Use ParseCommandLineArgvw() on Windows again, instead of hand-rolled parser. Update...
[factor.git] / vm / os-windows.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 9cde589..df2a57f
@@ -5,30 +5,30 @@ namespace factor
 
 HMODULE hFactorDll;
 
-void factorvm::init_ffi()
+void factor_vm::init_ffi()
 {
        hFactorDll = GetModuleHandle(FACTOR_DLL);
        if(!hFactorDll)
-               fatal_error("GetModuleHandle(\"" FACTOR_DLL_NAME "\") failed", 0);
+               fatal_error("GetModuleHandle() failed", 0);
 }
 
-void factorvm::ffi_dlopen(dll *dll)
+void factor_vm::ffi_dlopen(dll *dll)
 {
-       dll->dll = LoadLibraryEx((WCHAR *)alien_offset(dll->path), NULL, 0);
+       dll->handle = LoadLibraryEx((WCHAR *)alien_offset(dll->path), NULL, 0);
 }
 
-void *factorvm::ffi_dlsym(dll *dll, symbol_char *symbol)
+void *factor_vm::ffi_dlsym(dll *dll, symbol_char *symbol)
 {
-       return (void *)GetProcAddress(dll ? (HMODULE)dll->dll : hFactorDll, symbol);
+       return (void *)GetProcAddress(dll ? (HMODULE)dll->handle : hFactorDll, symbol);
 }
 
-void factorvm::ffi_dlclose(dll *dll)
+void factor_vm::ffi_dlclose(dll *dll)
 {
-       FreeLibrary((HMODULE)dll->dll);
-       dll->dll = NULL;
+       FreeLibrary((HMODULE)dll->handle);
+       dll->handle = NULL;
 }
 
-bool factorvm::windows_stat(vm_char *path)
+BOOL factor_vm::windows_stat(vm_char *path)
 {
        BY_HANDLE_FILE_INFORMATION bhfi;
        HANDLE h = CreateFileW(path,
@@ -50,21 +50,19 @@ bool factorvm::windows_stat(vm_char *path)
                FindClose(h);
                return true;
        }
-       bool ret;
-       ret = GetFileInformationByHandle(h, &bhfi);
+       BOOL ret = GetFileInformationByHandle(h, &bhfi);
        CloseHandle(h);
        return ret;
 }
 
-
-void factorvm::windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length)
+void factor_vm::windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length)
 {
-       snwprintf(temp_path, length-1, L"%s.image", full_path); 
+       SNWPRINTF(temp_path, length-1, L"%s.image", full_path); 
        temp_path[length - 1] = 0;
 }
 
 /* You must free() this yourself. */
-const vm_char *factorvm::default_image_path()
+const vm_char *factor_vm::default_image_path()
 {
        vm_char full_path[MAX_UNICODE_PATH];
        vm_char *ptr;
@@ -76,14 +74,14 @@ const vm_char *factorvm::default_image_path()
        if((ptr = wcsrchr(full_path, '.')))
                *ptr = 0;
 
-       snwprintf(temp_path, MAX_UNICODE_PATH-1, L"%s.image", full_path); 
+       SNWPRINTF(temp_path, MAX_UNICODE_PATH-1, L"%s.image", full_path); 
        temp_path[MAX_UNICODE_PATH - 1] = 0;
 
        return safe_strdup(temp_path);
 }
 
 /* You must free() this yourself. */
-const vm_char *factorvm::vm_executable_path()
+const vm_char *factor_vm::vm_executable_path()
 {
        vm_char full_path[MAX_UNICODE_PATH];
        if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
@@ -91,25 +89,21 @@ const vm_char *factorvm::vm_executable_path()
        return safe_strdup(full_path);
 }
 
-
-inline void factorvm::primitive_existsp()
+void factor_vm::primitive_existsp()
 {
-       vm_char *path = untag_check<byte_array>(dpop())->data<vm_char>();
-       box_boolean(windows_stat(path));
+       vm_char *path = untag_check<byte_array>(ctx->pop())->data<vm_char>();
+       ctx->push(tag_boolean(windows_stat(path)));
 }
 
-PRIMITIVE(existsp)
+segment::segment(cell size_, bool executable_p)
 {
-       PRIMITIVE_GETVM()->primitive_existsp();
-}
+       size = size_;
 
-segment *factorvm::alloc_segment(cell size)
-{
        char *mem;
        DWORD ignore;
 
        if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
-               MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == 0)
+               MEM_COMMIT, executable_p ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE)) == 0)
                out_of_memory();
 
        if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
@@ -119,25 +113,19 @@ segment *factorvm::alloc_segment(cell size)
                getpagesize(), PAGE_NOACCESS, &ignore))
                fatal_error("Cannot allocate high guard page", (cell)mem);
 
-       segment *block = (segment *)safe_malloc(sizeof(segment));
-
-       block->start = (cell)mem + getpagesize();
-       block->size = size;
-       block->end = block->start + size;
-
-       return block;
+       start = (cell)mem + getpagesize();
+       end = start + size;
 }
 
-void factorvm::dealloc_segment(segment *block)
+segment::~segment()
 {
        SYSTEM_INFO si;
        GetSystemInfo(&si);
-       if(!VirtualFree((void*)(block->start - si.dwPageSize), 0, MEM_RELEASE))
-               fatal_error("dealloc_segment failed",0);
-       free(block);
+       if(!VirtualFree((void*)(start - si.dwPageSize), 0, MEM_RELEASE))
+               fatal_error("Segment deallocation failed",0);
 }
 
-long factorvm::getpagesize()
+long getpagesize()
 {
        static long g_pagesize = 0;
        if (! g_pagesize)
@@ -149,9 +137,4 @@ long factorvm::getpagesize()
        return g_pagesize;
 }
 
-void factorvm::sleep_micros(u64 usec)
-{
-       Sleep((DWORD)(usec / 1000));
-}
-
 }