vm: disable silly nano-count workaround on Win64, fix some indentation issues
parent
d5a25f99bf
commit
c08fa9cb6e
37
vm/io.cpp
37
vm/io.cpp
|
@ -154,7 +154,7 @@ void factor_vm::primitive_fopen()
|
||||||
|
|
||||||
FILE *file;
|
FILE *file;
|
||||||
file = safe_fopen((char *)(path.untagged() + 1),
|
file = safe_fopen((char *)(path.untagged() + 1),
|
||||||
(char *)(mode.untagged() + 1));
|
(char *)(mode.untagged() + 1));
|
||||||
ctx->push(allot_alien(file));
|
ctx->push(allot_alien(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,31 +187,24 @@ void factor_vm::primitive_fread()
|
||||||
|
|
||||||
data_root<byte_array> buf(allot_uninitialized_array<byte_array>(size),this);
|
data_root<byte_array> buf(allot_uninitialized_array<byte_array>(size),this);
|
||||||
|
|
||||||
for(;;)
|
int c = safe_fread(buf.untagged() + 1,1,size,file);
|
||||||
|
if(c == 0)
|
||||||
{
|
{
|
||||||
int c = safe_fread(buf.untagged() + 1,1,size,file);
|
if(feof(file))
|
||||||
if(c == 0)
|
ctx->push(false_object);
|
||||||
{
|
|
||||||
if(feof(file))
|
|
||||||
{
|
|
||||||
ctx->push(false_object);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
io_error();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
|
io_error();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(feof(file))
|
||||||
{
|
{
|
||||||
if(feof(file))
|
byte_array *new_buf = allot_byte_array(c);
|
||||||
{
|
memcpy(new_buf + 1, buf.untagged() + 1,c);
|
||||||
byte_array *new_buf = allot_byte_array(c);
|
buf = new_buf;
|
||||||
memcpy(new_buf + 1, buf.untagged() + 1,c);
|
|
||||||
buf = new_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->push(buf.value());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx->push(buf.value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,6 @@ u64 system_micros()
|
||||||
- EPOCH_OFFSET) / 10;
|
- EPOCH_OFFSET) / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* On VirtualBox, QueryPerformanceCounter does not increment
|
|
||||||
the high part every time the low part overflows. Workaround. */
|
|
||||||
u64 nano_count()
|
u64 nano_count()
|
||||||
{
|
{
|
||||||
LARGE_INTEGER count;
|
LARGE_INTEGER count;
|
||||||
|
@ -53,8 +51,14 @@ u64 nano_count()
|
||||||
if(ret == 0)
|
if(ret == 0)
|
||||||
fatal_error("QueryPerformanceFrequency", 0);
|
fatal_error("QueryPerformanceFrequency", 0);
|
||||||
|
|
||||||
if(count.LowPart < lo)
|
#ifdef FACTOR_64
|
||||||
hi += 1;
|
hi = count.HighPart;
|
||||||
|
#else
|
||||||
|
/* On VirtualBox, QueryPerformanceCounter does not increment
|
||||||
|
the high part every time the low part overflows. Workaround. */
|
||||||
|
if(lo > count.LowPart)
|
||||||
|
hi++;
|
||||||
|
#endif
|
||||||
lo = count.LowPart;
|
lo = count.LowPart;
|
||||||
|
|
||||||
return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart));
|
return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart));
|
||||||
|
@ -91,7 +95,7 @@ LONG factor_vm::exception_handler(PEXCEPTION_POINTERS pe)
|
||||||
case STATUS_FLOAT_UNDERFLOW:
|
case STATUS_FLOAT_UNDERFLOW:
|
||||||
case STATUS_FLOAT_MULTIPLE_FAULTS:
|
case STATUS_FLOAT_MULTIPLE_FAULTS:
|
||||||
case STATUS_FLOAT_MULTIPLE_TRAPS:
|
case STATUS_FLOAT_MULTIPLE_TRAPS:
|
||||||
#ifdef FACTOR_AMD64
|
#ifdef FACTOR_64
|
||||||
signal_fpu_status = fpu_status(MXCSR(c));
|
signal_fpu_status = fpu_status(MXCSR(c));
|
||||||
#else
|
#else
|
||||||
signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
|
signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
|
||||||
|
|
|
@ -128,7 +128,7 @@ segment::~segment()
|
||||||
long getpagesize()
|
long getpagesize()
|
||||||
{
|
{
|
||||||
static long g_pagesize = 0;
|
static long g_pagesize = 0;
|
||||||
if (! g_pagesize)
|
if(!g_pagesize)
|
||||||
{
|
{
|
||||||
SYSTEM_INFO system_info;
|
SYSTEM_INFO system_info;
|
||||||
GetSystemInfo (&system_info);
|
GetSystemInfo (&system_info);
|
||||||
|
@ -139,7 +139,7 @@ long getpagesize()
|
||||||
|
|
||||||
void factor_vm::move_file(const vm_char *path1, const vm_char *path2)
|
void factor_vm::move_file(const vm_char *path1, const vm_char *path2)
|
||||||
{
|
{
|
||||||
if(MoveFileEx((path1),(path2),MOVEFILE_REPLACE_EXISTING) == false)
|
if(MoveFileEx((path1),(path2),MOVEFILE_REPLACE_EXISTING) == false)
|
||||||
general_error(ERROR_IO,tag_fixnum(GetLastError()),false_object,NULL);
|
general_error(ERROR_IO,tag_fixnum(GetLastError()),false_object,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue