vm: more use of ctx->replace().
parent
49a7d37dcd
commit
5be15d7e3f
24
vm/alien.cpp
24
vm/alien.cpp
|
@ -84,7 +84,7 @@ void factor_vm::primitive_displaced_alien()
|
|||
if the object is a byte array, as a sanity check. */
|
||||
void factor_vm::primitive_alien_address()
|
||||
{
|
||||
ctx->push(from_unsigned_cell((cell)pinned_alien_offset(ctx->pop())));
|
||||
ctx->replace(from_unsigned_cell((cell)pinned_alien_offset(ctx->peek())));
|
||||
}
|
||||
|
||||
/* pop ( alien n ) from datastack, return alien's address plus n */
|
||||
|
@ -125,7 +125,7 @@ void factor_vm::primitive_dlopen()
|
|||
void factor_vm::primitive_dlsym()
|
||||
{
|
||||
data_root<object> library(ctx->pop(),this);
|
||||
data_root<byte_array> name(ctx->pop(),this);
|
||||
data_root<byte_array> name(ctx->peek(),this);
|
||||
name.untag_check(this);
|
||||
|
||||
symbol_char *sym = name->data<symbol_char>();
|
||||
|
@ -135,12 +135,12 @@ void factor_vm::primitive_dlsym()
|
|||
dll *d = untag_check<dll>(library.value());
|
||||
|
||||
if(d->handle == NULL)
|
||||
ctx->push(false_object);
|
||||
ctx->replace(false_object);
|
||||
else
|
||||
ctx->push(allot_alien(ffi_dlsym(d,sym)));
|
||||
ctx->replace(allot_alien(ffi_dlsym(d,sym)));
|
||||
}
|
||||
else
|
||||
ctx->push(allot_alien(ffi_dlsym(NULL,sym)));
|
||||
ctx->replace(allot_alien(ffi_dlsym(NULL,sym)));
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
|
@ -148,7 +148,7 @@ void factor_vm::primitive_dlsym()
|
|||
void factor_vm::primitive_dlsym_raw()
|
||||
{
|
||||
data_root<object> library(ctx->pop(),this);
|
||||
data_root<byte_array> name(ctx->pop(),this);
|
||||
data_root<byte_array> name(ctx->peek(),this);
|
||||
name.untag_check(this);
|
||||
|
||||
symbol_char *sym = name->data<symbol_char>();
|
||||
|
@ -158,12 +158,12 @@ void factor_vm::primitive_dlsym_raw()
|
|||
dll *d = untag_check<dll>(library.value());
|
||||
|
||||
if(d->handle == NULL)
|
||||
ctx->push(false_object);
|
||||
ctx->replace(false_object);
|
||||
else
|
||||
ctx->push(allot_alien(ffi_dlsym_raw(d,sym)));
|
||||
ctx->replace(allot_alien(ffi_dlsym_raw(d,sym)));
|
||||
}
|
||||
else
|
||||
ctx->push(allot_alien(ffi_dlsym_raw(NULL,sym)));
|
||||
ctx->replace(allot_alien(ffi_dlsym_raw(NULL,sym)));
|
||||
}
|
||||
|
||||
/* close a native library handle */
|
||||
|
@ -176,11 +176,11 @@ void factor_vm::primitive_dlclose()
|
|||
|
||||
void factor_vm::primitive_dll_validp()
|
||||
{
|
||||
cell library = ctx->pop();
|
||||
cell library = ctx->peek();
|
||||
if(to_boolean(library))
|
||||
ctx->push(tag_boolean(untag_check<dll>(library)->handle != NULL));
|
||||
ctx->replace(tag_boolean(untag_check<dll>(library)->handle != NULL));
|
||||
else
|
||||
ctx->push(true_object);
|
||||
ctx->replace(true_object);
|
||||
}
|
||||
|
||||
/* gets the address of an object representing a C pointer */
|
||||
|
|
|
@ -50,8 +50,8 @@ void factor_vm::primitive_callstack()
|
|||
|
||||
void factor_vm::primitive_callstack_for()
|
||||
{
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->pop());
|
||||
ctx->push(capture_callstack(other_ctx));
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->peek());
|
||||
ctx->replace(capture_callstack(other_ctx));
|
||||
}
|
||||
|
||||
void *factor_vm::frame_predecessor(void *frame_top)
|
||||
|
@ -86,7 +86,7 @@ struct stack_frame_in_array { cell cells[3]; };
|
|||
|
||||
void factor_vm::primitive_callstack_to_array()
|
||||
{
|
||||
data_root<callstack> callstack(ctx->pop(),this);
|
||||
data_root<callstack> callstack(ctx->peek(),this);
|
||||
|
||||
stack_frame_accumulator accum(this);
|
||||
iterate_callstack_object(callstack.untagged(),accum);
|
||||
|
@ -98,7 +98,7 @@ void factor_vm::primitive_callstack_to_array()
|
|||
|
||||
accum.frames.trim();
|
||||
|
||||
ctx->push(accum.frames.elements.value());
|
||||
ctx->replace(accum.frames.elements.value());
|
||||
|
||||
}
|
||||
|
||||
|
@ -106,18 +106,18 @@ void factor_vm::primitive_callstack_to_array()
|
|||
Used by the single stepper. */
|
||||
void factor_vm::primitive_innermost_stack_frame_executing()
|
||||
{
|
||||
callstack *stack = untag_check<callstack>(ctx->pop());
|
||||
callstack *stack = untag_check<callstack>(ctx->peek());
|
||||
void *frame = stack->top();
|
||||
void *addr = frame_return_address(frame);
|
||||
ctx->push(code->code_block_for_address((cell)addr)->owner_quot());
|
||||
ctx->replace(code->code_block_for_address((cell)addr)->owner_quot());
|
||||
}
|
||||
|
||||
void factor_vm::primitive_innermost_stack_frame_scan()
|
||||
{
|
||||
callstack *stack = untag_check<callstack>(ctx->pop());
|
||||
callstack *stack = untag_check<callstack>(ctx->peek());
|
||||
void *frame = stack->top();
|
||||
void *addr = frame_return_address(frame);
|
||||
ctx->push(code->code_block_for_address((cell)addr)->scan(this,addr));
|
||||
ctx->replace(code->code_block_for_address((cell)addr)->scan(this,addr));
|
||||
}
|
||||
|
||||
void factor_vm::primitive_set_innermost_stack_frame_quot()
|
||||
|
|
|
@ -233,8 +233,8 @@ void factor_vm::primitive_set_context_object()
|
|||
void factor_vm::primitive_context_object_for()
|
||||
{
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->pop());
|
||||
fixnum n = untag_fixnum(ctx->pop());
|
||||
ctx->push(other_ctx->context_objects[n]);
|
||||
fixnum n = untag_fixnum(ctx->peek());
|
||||
ctx->replace(other_ctx->context_objects[n]);
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
|
@ -271,8 +271,8 @@ void factor_vm::primitive_datastack()
|
|||
|
||||
void factor_vm::primitive_datastack_for()
|
||||
{
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->pop());
|
||||
ctx->push(datastack_to_array(other_ctx));
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->peek());
|
||||
ctx->replace(datastack_to_array(other_ctx));
|
||||
}
|
||||
|
||||
cell factor_vm::retainstack_to_array(context *ctx)
|
||||
|
@ -294,8 +294,8 @@ void factor_vm::primitive_retainstack()
|
|||
|
||||
void factor_vm::primitive_retainstack_for()
|
||||
{
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->pop());
|
||||
ctx->push(retainstack_to_array(other_ctx));
|
||||
context *other_ctx = (context *)pinned_alien_offset(ctx->peek());
|
||||
ctx->replace(retainstack_to_array(other_ctx));
|
||||
}
|
||||
|
||||
/* returns pointer to top of stack */
|
||||
|
|
21
vm/io.cpp
21
vm/io.cpp
|
@ -182,37 +182,42 @@ FILE *factor_vm::pop_file_handle()
|
|||
return (FILE *)alien_offset(ctx->pop());
|
||||
}
|
||||
|
||||
FILE *factor_vm::peek_file_handle()
|
||||
{
|
||||
return (FILE *)alien_offset(ctx->peek());
|
||||
}
|
||||
|
||||
void factor_vm::primitive_fgetc()
|
||||
{
|
||||
FILE *file = pop_file_handle();
|
||||
FILE *file = peek_file_handle();
|
||||
|
||||
int c = safe_fgetc(file);
|
||||
if(c == EOF && feof(file))
|
||||
{
|
||||
clearerr(file);
|
||||
ctx->push(false_object);
|
||||
ctx->replace(false_object);
|
||||
}
|
||||
else
|
||||
ctx->push(tag_fixnum(c));
|
||||
ctx->replace(tag_fixnum(c));
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
void factor_vm::primitive_fread()
|
||||
{
|
||||
FILE *file = pop_file_handle();
|
||||
void *buf = (void*)alien_offset(ctx->pop());
|
||||
void *buf = (void*)alien_offset(ctx->peek());
|
||||
fixnum size = unbox_array_size();
|
||||
|
||||
if(size == 0)
|
||||
{
|
||||
ctx->push(from_unsigned_cell(0));
|
||||
ctx->replace(from_unsigned_cell(0));
|
||||
return;
|
||||
}
|
||||
|
||||
size_t c = safe_fread(buf,1,size,file);
|
||||
if(c == 0 || feof(file))
|
||||
clearerr(file);
|
||||
ctx->push(from_unsigned_cell(c));
|
||||
ctx->replace(from_unsigned_cell(c));
|
||||
}
|
||||
|
||||
void factor_vm::primitive_fputc()
|
||||
|
@ -238,8 +243,8 @@ void factor_vm::primitive_fwrite()
|
|||
|
||||
void factor_vm::primitive_ftell()
|
||||
{
|
||||
FILE *file = pop_file_handle();
|
||||
ctx->push(from_signed_8(safe_ftell(file)));
|
||||
FILE *file = peek_file_handle();
|
||||
ctx->replace(from_signed_8(safe_ftell(file)));
|
||||
}
|
||||
|
||||
void factor_vm::primitive_fseek()
|
||||
|
|
|
@ -219,8 +219,8 @@ void factor_vm::primitive_bignum_not()
|
|||
void factor_vm::primitive_bignum_bitp()
|
||||
{
|
||||
int bit = (int)to_fixnum(ctx->pop());
|
||||
bignum *x = untag<bignum>(ctx->pop());
|
||||
ctx->push(tag_boolean(bignum_logbitp(bit,x)));
|
||||
bignum *x = untag<bignum>(ctx->peek());
|
||||
ctx->replace(tag_boolean(bignum_logbitp(bit,x)));
|
||||
}
|
||||
|
||||
void factor_vm::primitive_bignum_log2()
|
||||
|
@ -258,9 +258,9 @@ void factor_vm::primitive_format_float()
|
|||
{
|
||||
byte_array *array = allot_byte_array(100);
|
||||
char *format = alien_offset(ctx->pop());
|
||||
double value = untag_float_check(ctx->pop());
|
||||
double value = untag_float_check(ctx->peek());
|
||||
SNPRINTF(array->data<char>(),99,format,value);
|
||||
ctx->push(tag<byte_array>(array));
|
||||
ctx->replace(tag<byte_array>(array));
|
||||
}
|
||||
|
||||
#define POP_FLOATS(x,y) \
|
||||
|
|
Loading…
Reference in New Issue