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 */
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>();
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 */
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>();
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 */
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 */
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)
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);
accum.frames.trim();
- ctx->push(accum.frames.elements.value());
+ ctx->replace(accum.frames.elements.value());
}
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()
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 */
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)
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 */
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()
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()
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()
{
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) \
void safe_fclose(FILE *stream);
void primitive_fopen();
FILE *pop_file_handle();
+ FILE *peek_file_handle();
void primitive_fgetc();
void primitive_fread();
void primitive_fputc();