enhancing the compiler and hcl_execute() for better interactive use
This commit is contained in:
parent
9d5e580387
commit
a69434a96f
27
bin/main.c
27
bin/main.c
@ -1160,15 +1160,10 @@ hcl_logufmt (hcl, HCL_LOG_WARN, fmt, ustr, 0x6789);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
if (xtn->reader_istty)
|
// TODO: change the option name
|
||||||
{
|
// in the INTERACTIVE mode, the compiler generates MAKE_FUNCTION for lambda functions.
|
||||||
hcl_bitmask_t trait;
|
// in the non-INTERACTIVE mode, the compiler generates MAKE_CONTEXT for lambda functions.
|
||||||
hcl_getoption (hcl, HCL_TRAIT, &trait);
|
|
||||||
trait |= HCL_TRAIT_INTERACTIVE;
|
|
||||||
hcl_setoption (hcl, HCL_TRAIT, &trait);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
hcl_bitmask_t trait;
|
hcl_bitmask_t trait;
|
||||||
hcl_getoption (hcl, HCL_TRAIT, &trait);
|
hcl_getoption (hcl, HCL_TRAIT, &trait);
|
||||||
@ -1215,11 +1210,15 @@ count++;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hcl_oow_t code_offset;
|
if (xtn->reader_istty)
|
||||||
|
{
|
||||||
code_offset = hcl_getbclen(hcl);
|
/* TODO: create a proper function for this and call it */
|
||||||
|
hcl->code.bc.len = 0;
|
||||||
|
hcl->code.lit.len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (verbose) hcl_prbfmt (hcl, "\n"); /* flush the output buffer by hcl_print above */
|
if (verbose) hcl_prbfmt (hcl, "\n"); /* flush the output buffer by hcl_print above */
|
||||||
|
|
||||||
if (hcl_compile(hcl, obj) <= -1)
|
if (hcl_compile(hcl, obj) <= -1)
|
||||||
{
|
{
|
||||||
if (hcl->errnum == HCL_ESYNERR)
|
if (hcl->errnum == HCL_ESYNERR)
|
||||||
@ -1239,12 +1238,12 @@ count++;
|
|||||||
/* interactive mode */
|
/* interactive mode */
|
||||||
hcl_oop_t retv;
|
hcl_oop_t retv;
|
||||||
|
|
||||||
hcl_decode (hcl, code_offset, hcl_getbclen(hcl));
|
hcl_decode (hcl, 0, hcl_getbclen(hcl));
|
||||||
HCL_LOG0 (hcl, HCL_LOG_MNEMONIC, "------------------------------------------\n");
|
HCL_LOG0 (hcl, HCL_LOG_MNEMONIC, "------------------------------------------\n");
|
||||||
g_hcl = hcl;
|
g_hcl = hcl;
|
||||||
//setup_tick ();
|
//setup_tick ();
|
||||||
|
|
||||||
retv = hcl_executefromip(hcl, code_offset);
|
retv = hcl_execute(hcl);
|
||||||
|
|
||||||
/* flush pending output data in the interactive mode(e.g. printf without a newline) */
|
/* flush pending output data in the interactive mode(e.g. printf without a newline) */
|
||||||
hcl_flushio (hcl);
|
hcl_flushio (hcl);
|
||||||
|
32
lib/comp.c
32
lib/comp.c
@ -190,13 +190,11 @@ static int store_temporary_variable_count_for_block (hcl_t* hcl, hcl_oow_t tmpr_
|
|||||||
static HCL_INLINE void patch_instruction (hcl_t* hcl, hcl_oow_t index, hcl_oob_t bc)
|
static HCL_INLINE void patch_instruction (hcl_t* hcl, hcl_oow_t index, hcl_oob_t bc)
|
||||||
{
|
{
|
||||||
HCL_ASSERT (hcl, index < hcl->code.bc.len);
|
HCL_ASSERT (hcl, index < hcl->code.bc.len);
|
||||||
hcl->code.bc.arr->slot[index] = bc;
|
hcl->code.bc.ptr[index] = bc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int emit_byte_instruction (hcl_t* hcl, hcl_oob_t bc)
|
static int emit_byte_instruction (hcl_t* hcl, hcl_oob_t bc)
|
||||||
{
|
{
|
||||||
hcl_oow_t capa;
|
|
||||||
|
|
||||||
/* the context object has the ip field. it should be representable
|
/* the context object has the ip field. it should be representable
|
||||||
* in a small integer. for simplicity, limit the total byte code length
|
* in a small integer. for simplicity, limit the total byte code length
|
||||||
* to fit in a small integer. because 'ip' points to the next instruction
|
* to fit in a small integer. because 'ip' points to the next instruction
|
||||||
@ -208,23 +206,27 @@ static int emit_byte_instruction (hcl_t* hcl, hcl_oob_t bc)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
capa = HCL_OBJ_GET_SIZE(hcl->code.bc.arr);
|
if (hcl->code.bc.len >= hcl->code.bc.capa)
|
||||||
if (hcl->code.bc.len >= capa)
|
|
||||||
{
|
{
|
||||||
hcl_oop_t tmp;
|
hcl_oob_t* tmp;
|
||||||
hcl_oow_t newcapa;
|
hcl_oow_t newcapa;
|
||||||
|
|
||||||
newcapa = HCL_ALIGN(capa + 1, HCL_BC_BUFFER_ALIGN);
|
newcapa = HCL_ALIGN(hcl->code.bc.capa + 1, HCL_BC_BUFFER_ALIGN);
|
||||||
tmp = hcl_remakengcbytearray(hcl, (hcl_oop_t)hcl->code.bc.arr, newcapa);
|
tmp = hcl_reallocmem(hcl, hcl->code.bc.ptr, HCL_SIZEOF(*tmp) * newcapa);
|
||||||
if (!tmp) return -1;
|
if (!tmp) return -1;
|
||||||
|
|
||||||
hcl->code.bc.arr = (hcl_oop_byte_t)tmp;
|
hcl->code.bc.ptr = tmp;
|
||||||
|
hcl->code.bc.capa = newcapa;
|
||||||
}
|
}
|
||||||
|
|
||||||
hcl->code.bc.arr->slot[hcl->code.bc.len++] = bc;
|
hcl->code.bc.ptr[hcl->code.bc.len++] = bc;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int hcl_emitbyteinstruction (hcl_t* hcl, hcl_oob_t bc)
|
||||||
|
{
|
||||||
|
return emit_byte_instruction(hcl, bc);
|
||||||
|
}
|
||||||
|
|
||||||
static int emit_single_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1)
|
static int emit_single_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1)
|
||||||
{
|
{
|
||||||
@ -486,13 +488,13 @@ static HCL_INLINE void patch_long_jump (hcl_t* hcl, hcl_ooi_t jip, hcl_ooi_t jum
|
|||||||
|
|
||||||
HCL_ASSERT (hcl, jump_offset <= MAX_CODE_JUMP * 2);
|
HCL_ASSERT (hcl, jump_offset <= MAX_CODE_JUMP * 2);
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.arr->slot[jip] == HCL_CODE_JUMP_FORWARD_X ||
|
HCL_ASSERT (hcl, hcl->code.bc.ptr[jip] == HCL_CODE_JUMP_FORWARD_X ||
|
||||||
hcl->code.bc.arr->slot[jip] == HCL_CODE_JUMP_BACKWARD_X ||
|
hcl->code.bc.ptr[jip] == HCL_CODE_JUMP_BACKWARD_X ||
|
||||||
hcl->code.bc.arr->slot[jip] == HCL_CODE_JUMP_FORWARD_IF_TRUE ||
|
hcl->code.bc.ptr[jip] == HCL_CODE_JUMP_FORWARD_IF_TRUE ||
|
||||||
hcl->code.bc.arr->slot[jip] == HCL_CODE_JUMP_FORWARD_IF_FALSE);
|
hcl->code.bc.ptr[jip] == HCL_CODE_JUMP_FORWARD_IF_FALSE);
|
||||||
|
|
||||||
/* JUMP2 instructions are chosen to be greater than its JUMP counterpart by 1 */
|
/* JUMP2 instructions are chosen to be greater than its JUMP counterpart by 1 */
|
||||||
patch_instruction (hcl, jip, hcl->code.bc.arr->slot[jip] + 1);
|
patch_instruction (hcl, jip, hcl->code.bc.ptr[jip] + 1);
|
||||||
jump_offset -= MAX_CODE_JUMP;
|
jump_offset -= MAX_CODE_JUMP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ int hcl_decode (hcl_t* hcl, hcl_oow_t start, hcl_oow_t end)
|
|||||||
if (end > hcl->code.bc.len) end = hcl->code.bc.len;
|
if (end > hcl->code.bc.len) end = hcl->code.bc.len;
|
||||||
|
|
||||||
ip = start;
|
ip = start;
|
||||||
cdptr = ((hcl_oop_byte_t)hcl->code.bc.arr)->slot;
|
cdptr = hcl->code.bc.ptr;
|
||||||
|
|
||||||
/* TODO: check if ip increases beyond bcode when fetching parameters too */
|
/* TODO: check if ip increases beyond bcode when fetching parameters too */
|
||||||
while (ip < end)
|
while (ip < end)
|
||||||
|
67
lib/exec.c
67
lib/exec.c
@ -1483,9 +1483,9 @@ static int execute (hcl_t* hcl)
|
|||||||
hcl->proc_switched = 0;
|
hcl->proc_switched = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (HCL_UNLIKELY(hcl->ip >= hcl->code.bc.len))
|
if (HCL_UNLIKELY(hcl->ip >= HCL_FUNCTION_GET_CODE_SIZE(hcl->active_function)))
|
||||||
{
|
{
|
||||||
HCL_DEBUG1 (hcl, "Stopping executeion as IP reached the end of bytecode(%zu)\n", hcl->code.bc.len);
|
HCL_DEBUG1 (hcl, "Stopping execution as IP reached the end of bytecode(%zu)\n", hcl->code.bc.len);
|
||||||
return_value = hcl->_nil;
|
return_value = hcl->_nil;
|
||||||
goto handle_return;
|
goto handle_return;
|
||||||
}
|
}
|
||||||
@ -2186,7 +2186,7 @@ static int execute (hcl_t* hcl)
|
|||||||
HCL_ASSERT (hcl, !HCL_STACK_ISEMPTY(hcl));
|
HCL_ASSERT (hcl, !HCL_STACK_ISEMPTY(hcl));
|
||||||
|
|
||||||
/* at the top level, the value is just popped off the stack
|
/* at the top level, the value is just popped off the stack
|
||||||
* after evaluation of an expressio. so it's likely the
|
* after evaluation of an expression. so it's likely the
|
||||||
* return value of the last expression unless explicit
|
* return value of the last expression unless explicit
|
||||||
* returning is performed */
|
* returning is performed */
|
||||||
hcl->last_retv = HCL_STACK_GETTOP(hcl);
|
hcl->last_retv = HCL_STACK_GETTOP(hcl);
|
||||||
@ -2204,12 +2204,9 @@ static int execute (hcl_t* hcl)
|
|||||||
return_value = hcl->active_context->origin->receiver_or_base;
|
return_value = hcl->active_context->origin->receiver_or_base;
|
||||||
|
|
||||||
handle_return:
|
handle_return:
|
||||||
|
hcl->last_retv = return_value;
|
||||||
if (hcl->active_context->origin == hcl->processor->active->initial_context->origin)
|
if (hcl->active_context->origin == hcl->processor->active->initial_context->origin)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
// HCL_ASSERT (hcl, HCL_CLASSOF(hcl, hcl->active_context) == hcl->_block_context);
|
|
||||||
// HCL_ASSERT (hcl, HCL_CLASSOF(hcl, hcl->processor->active->initial_context) == hcl->_block_context);
|
|
||||||
*/
|
|
||||||
/* decrement the instruction pointer back to the return instruction.
|
/* decrement the instruction pointer back to the return instruction.
|
||||||
* even if the context is reentered, it will just return.
|
* even if the context is reentered, it will just return.
|
||||||
*hcl->ip--;*/
|
*hcl->ip--;*/
|
||||||
@ -2222,7 +2219,6 @@ static int execute (hcl_t* hcl)
|
|||||||
* before context switching and marks a dead context */
|
* before context switching and marks a dead context */
|
||||||
if (hcl->active_context->origin == hcl->active_context)
|
if (hcl->active_context->origin == hcl->active_context)
|
||||||
{
|
{
|
||||||
/* returning from a method */
|
|
||||||
/*
|
/*
|
||||||
// HCL_ASSERT (hcl, HCL_CLASSOF(hcl, hcl->active_context) == hcl->_method_context);
|
// HCL_ASSERT (hcl, HCL_CLASSOF(hcl, hcl->active_context) == hcl->_method_context);
|
||||||
*/
|
*/
|
||||||
@ -2258,9 +2254,6 @@ static int execute (hcl_t* hcl)
|
|||||||
hcl->active_context->origin->ip = HCL_SMOOI_TO_OOP(-1);
|
hcl->active_context->origin->ip = HCL_SMOOI_TO_OOP(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// HCL_ASSERT (hcl, HCL_IS_FUNCTION(hcl, hcl->active_context->origin) == hcl->_method_context);
|
|
||||||
*/
|
|
||||||
/* restore the stack pointer */
|
/* restore the stack pointer */
|
||||||
hcl->sp = HCL_OOP_TO_SMOOI(hcl->active_context->origin->sp);
|
hcl->sp = HCL_OOP_TO_SMOOI(hcl->active_context->origin->sp);
|
||||||
SWITCH_ACTIVE_CONTEXT (hcl, hcl->active_context->origin->sender);
|
SWITCH_ACTIVE_CONTEXT (hcl, hcl->active_context->origin->sender);
|
||||||
@ -2442,17 +2435,14 @@ oops:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hcl_oop_t hcl_executefromip (hcl_t* hcl, hcl_oow_t initial_ip)
|
hcl_oop_t hcl_execute (hcl_t* hcl)
|
||||||
{
|
{
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
hcl_oop_function_t func;
|
||||||
int n;
|
int n;
|
||||||
hcl_bitmask_t log_default_type_mask;
|
hcl_bitmask_t log_default_type_mask;
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX); /* asserted by the compiler */
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX); /* asserted by the compiler */
|
||||||
if (initial_ip >= hcl->code.bc.len)
|
|
||||||
{
|
|
||||||
hcl_seterrnum (hcl, HCL_EINVAL);
|
|
||||||
return HCL_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
log_default_type_mask = hcl->log.default_type_mask;
|
log_default_type_mask = hcl->log.default_type_mask;
|
||||||
hcl->log.default_type_mask |= HCL_LOG_VM;
|
hcl->log.default_type_mask |= HCL_LOG_VM;
|
||||||
@ -2460,9 +2450,31 @@ hcl_oop_t hcl_executefromip (hcl_t* hcl, hcl_oow_t initial_ip)
|
|||||||
HCL_ASSERT (hcl, hcl->initial_context == HCL_NULL);
|
HCL_ASSERT (hcl, hcl->initial_context == HCL_NULL);
|
||||||
HCL_ASSERT (hcl, hcl->active_context == HCL_NULL);
|
HCL_ASSERT (hcl, hcl->active_context == HCL_NULL);
|
||||||
|
|
||||||
hcl->last_retv = hcl->_nil;
|
|
||||||
|
|
||||||
n = start_initial_process_and_context(hcl, initial_ip);
|
/* the code generated doesn't cater for its use as an initial funtion.
|
||||||
|
* mutate the generated code so that the intiail function can break
|
||||||
|
* out of the execution loop in execute() smoothly */
|
||||||
|
#if 0
|
||||||
|
/* append RETURN_FROM_BLOCK */
|
||||||
|
if (hcl_emitbyteinstruction(hcl, HCL_CODE_RETURN_FROM_BLOCK) <= -1) return -1;
|
||||||
|
#else
|
||||||
|
/* substitute RETURN_STACKTOP for POP_STACKTOP) */
|
||||||
|
HCL_ASSERT (hcl, hcl->code.bc.ptr[hcl->code.bc.len - 1] == HCL_CODE_POP_STACKTOP);
|
||||||
|
hcl->code.bc.ptr[hcl->code.bc.len - 1] = HCL_CODE_RETURN_STACKTOP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
func = (hcl_oop_function_t)make_function(hcl, hcl->code.lit.len, hcl->code.bc.ptr, hcl->code.bc.len);
|
||||||
|
if (HCL_UNLIKELY(!func)) return HCL_NULL;
|
||||||
|
|
||||||
|
/* pass nil for the home context of the initial function */
|
||||||
|
fill_function_data (hcl, func, 0, 0, (hcl_oop_context_t)hcl->_nil, hcl->code.lit.arr->slot, hcl->code.lit.len);
|
||||||
|
|
||||||
|
hcl->initial_function = func;
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
hcl->last_retv = hcl->_nil;
|
||||||
|
n = start_initial_process_and_context(hcl, 0);
|
||||||
if (n >= 0)
|
if (n >= 0)
|
||||||
{
|
{
|
||||||
n = execute(hcl);
|
n = execute(hcl);
|
||||||
@ -2477,23 +2489,6 @@ hcl_oop_t hcl_executefromip (hcl_t* hcl, hcl_oow_t initial_ip)
|
|||||||
return (n <= -1)? HCL_NULL: hcl->last_retv;
|
return (n <= -1)? HCL_NULL: hcl->last_retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
hcl_oop_t hcl_execute (hcl_t* hcl)
|
|
||||||
{
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
hcl_oop_function_t func;
|
|
||||||
|
|
||||||
func = (hcl_oop_function_t)make_function(hcl, hcl->code.lit.len, hcl->code.bc.arr->slot, hcl->code.bc.len);
|
|
||||||
if (HCL_UNLIKELY(!func)) return HCL_NULL;
|
|
||||||
|
|
||||||
/* pass nil for the home context of the initial function */
|
|
||||||
fill_function_data (hcl, func, 0, 0, (hcl_oop_context_t)hcl->_nil, hcl->code.lit.arr->slot, hcl->code.lit.len);
|
|
||||||
|
|
||||||
hcl->initial_function = func;
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
return hcl_executefromip (hcl, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hcl_abort (hcl_t* hcl)
|
void hcl_abort (hcl_t* hcl)
|
||||||
{
|
{
|
||||||
hcl->abort_req = 1;
|
hcl->abort_req = 1;
|
||||||
|
@ -2145,7 +2145,7 @@ static HCL_INLINE int format_stack_args (hcl_fmtout_t* fmtout, hcl_ooi_t nargs,
|
|||||||
|
|
||||||
if (!hcl_inttostr(hcl, arg, 10 | HCL_INTTOSTR_NONEWOBJ))
|
if (!hcl_inttostr(hcl, arg, 10 | HCL_INTTOSTR_NONEWOBJ))
|
||||||
{
|
{
|
||||||
HCL_LOG1 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert %O to string \n", arg);
|
HCL_LOG2 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert %O for float output\n", arg, hcl_geterrmsg(hcl));
|
||||||
goto invalid_format;
|
goto invalid_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2489,7 +2489,6 @@ static HCL_INLINE int format_stack_args (hcl_fmtout_t* fmtout, hcl_ooi_t nargs,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
print_integer:
|
print_integer:
|
||||||
{
|
{
|
||||||
const hcl_ooch_t* nsptr;
|
const hcl_ooch_t* nsptr;
|
||||||
@ -2523,7 +2522,7 @@ static HCL_INLINE int format_stack_args (hcl_fmtout_t* fmtout, hcl_ooi_t nargs,
|
|||||||
{
|
{
|
||||||
/*hcl_seterrbfmt (hcl, HCL_EINVAL, "not a valid number - %O", arg);
|
/*hcl_seterrbfmt (hcl, HCL_EINVAL, "not a valid number - %O", arg);
|
||||||
goto oops;*/
|
goto oops;*/
|
||||||
HCL_LOG1 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert integer %O to string \n", arg);
|
HCL_LOG2 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert %O for integer output - %js\n", arg, hcl_geterrmsg(hcl));
|
||||||
goto invalid_format;
|
goto invalid_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
39
lib/gc.c
39
lib/gc.c
@ -451,32 +451,32 @@ int hcl_ignite (hcl_t* hcl)
|
|||||||
|
|
||||||
if (!hcl->_nil)
|
if (!hcl->_nil)
|
||||||
{
|
{
|
||||||
hcl->_nil = hcl_makenil (hcl);
|
hcl->_nil = hcl_makenil(hcl);
|
||||||
if (!hcl->_nil) return -1;
|
if (HCL_UNLIKELY(!hcl->_nil)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hcl->_true)
|
if (!hcl->_true)
|
||||||
{
|
{
|
||||||
hcl->_true = hcl_maketrue (hcl);
|
hcl->_true = hcl_maketrue(hcl);
|
||||||
if (!hcl->_true) return -1;
|
if (HCL_UNLIKELY(!hcl->_true)) return -1;
|
||||||
}
|
}
|
||||||
if (!hcl->_false)
|
if (!hcl->_false)
|
||||||
{
|
{
|
||||||
hcl->_false = hcl_makefalse (hcl);
|
hcl->_false = hcl_makefalse(hcl);
|
||||||
if (!hcl->_false) return -1;
|
if (HCL_UNLIKELY(!hcl->_false)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!hcl->symtab)
|
if (!hcl->symtab)
|
||||||
{
|
{
|
||||||
hcl->symtab = (hcl_oop_dic_t)hcl_makedic (hcl, hcl->option.dfl_symtab_size);
|
hcl->symtab = (hcl_oop_dic_t)hcl_makedic(hcl, hcl->option.dfl_symtab_size);
|
||||||
if (!hcl->symtab) return -1;
|
if (HCL_UNLIKELY(!hcl->symtab)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hcl->sysdic)
|
if (!hcl->sysdic)
|
||||||
{
|
{
|
||||||
hcl->sysdic = (hcl_oop_dic_t)hcl_makedic (hcl, hcl->option.dfl_sysdic_size);
|
hcl->sysdic = (hcl_oop_dic_t)hcl_makedic(hcl, hcl->option.dfl_sysdic_size);
|
||||||
if (!hcl->sysdic) return -1;
|
if (HCL_UNLIKELY(!hcl->sysdic)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* symbol table available now. symbols can be created */
|
/* symbol table available now. symbols can be created */
|
||||||
@ -484,8 +484,8 @@ int hcl_ignite (hcl_t* hcl)
|
|||||||
{
|
{
|
||||||
hcl_oop_t tmp;
|
hcl_oop_t tmp;
|
||||||
|
|
||||||
tmp = hcl_makesymbol (hcl, syminfo[i].ptr, syminfo[i].len);
|
tmp = hcl_makesymbol(hcl, syminfo[i].ptr, syminfo[i].len);
|
||||||
if (!tmp) return -1;
|
if (HCL_UNLIKELY(!tmp)) return -1;
|
||||||
|
|
||||||
HCL_OBJ_SET_FLAGS_SYNCODE (tmp, syminfo[i].syncode);
|
HCL_OBJ_SET_FLAGS_SYNCODE (tmp, syminfo[i].syncode);
|
||||||
*(hcl_oop_t*)((hcl_uint8_t*)hcl + syminfo[i].offset) = tmp;
|
*(hcl_oop_t*)((hcl_uint8_t*)hcl + syminfo[i].offset) = tmp;
|
||||||
@ -496,29 +496,32 @@ int hcl_ignite (hcl_t* hcl)
|
|||||||
/* Create a nil process used to simplify nil check in GC.
|
/* Create a nil process used to simplify nil check in GC.
|
||||||
* only accessible by VM. not exported via the global dictionary. */
|
* only accessible by VM. not exported via the global dictionary. */
|
||||||
hcl->nil_process = (hcl_oop_process_t)hcl_allocoopobj(hcl, HCL_BRAND_PROCESS, HCL_PROCESS_NAMED_INSTVARS);
|
hcl->nil_process = (hcl_oop_process_t)hcl_allocoopobj(hcl, HCL_BRAND_PROCESS, HCL_PROCESS_NAMED_INSTVARS);
|
||||||
if (!hcl->nil_process) return -1;
|
if (HCL_UNLIKELY(!hcl->nil_process)) return -1;
|
||||||
hcl->nil_process->sp = HCL_SMOOI_TO_OOP(-1);
|
hcl->nil_process->sp = HCL_SMOOI_TO_OOP(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hcl->processor)
|
if (!hcl->processor)
|
||||||
{
|
{
|
||||||
hcl->processor = (hcl_oop_process_scheduler_t)hcl_allocoopobj(hcl, HCL_BRAND_PROCESS_SCHEDULER, HCL_PROCESS_SCHEDULER_NAMED_INSTVARS);
|
hcl->processor = (hcl_oop_process_scheduler_t)hcl_allocoopobj(hcl, HCL_BRAND_PROCESS_SCHEDULER, HCL_PROCESS_SCHEDULER_NAMED_INSTVARS);
|
||||||
if (!hcl->processor) return -1;
|
if (HCL_UNLIKELY(!hcl->processor)) return -1;
|
||||||
hcl->processor->tally = HCL_SMOOI_TO_OOP(0);
|
hcl->processor->tally = HCL_SMOOI_TO_OOP(0);
|
||||||
hcl->processor->active = hcl->nil_process;
|
hcl->processor->active = hcl->nil_process;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hcl->code.bc.arr)
|
/* TODO: move code.bc.ptr creation to hcl_init? */
|
||||||
|
if (!hcl->code.bc.ptr)
|
||||||
{
|
{
|
||||||
hcl->code.bc.arr = (hcl_oop_byte_t)hcl_makengcbytearray(hcl, HCL_NULL, HCL_BC_BUFFER_INIT); /* TODO: set a proper intial size */
|
hcl->code.bc.ptr = (hcl_oop_byte_t)hcl_allocmem(hcl, HCL_SIZEOF(*hcl->code.bc.ptr) * HCL_BC_BUFFER_INIT); /* TODO: set a proper intial size */
|
||||||
if (!hcl->code.bc.arr) return -1;
|
if (HCL_UNLIKELY(!hcl->code.bc.ptr)) return -1;
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len == 0);
|
HCL_ASSERT (hcl, hcl->code.bc.len == 0);
|
||||||
|
hcl->code.bc.capa = HCL_BC_BUFFER_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: move code.lit.arr creation to hcl_init() after swithching to hcl_allocmem? */
|
||||||
if (!hcl->code.lit.arr)
|
if (!hcl->code.lit.arr)
|
||||||
{
|
{
|
||||||
hcl->code.lit.arr = (hcl_oop_oop_t)hcl_makengcarray(hcl, HCL_LIT_BUFFER_INIT); /* TOOD: set a proper initial size */
|
hcl->code.lit.arr = (hcl_oop_oop_t)hcl_makengcarray(hcl, HCL_LIT_BUFFER_INIT); /* TOOD: set a proper initial size */
|
||||||
if (!hcl->code.lit.arr) return -1;
|
if (HCL_UNLIKELY(!hcl->code.lit.arr)) return -1;
|
||||||
HCL_ASSERT (hcl, hcl->code.lit.len == 0);
|
HCL_ASSERT (hcl, hcl->code.lit.len == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1093,7 +1093,7 @@ hcl_pfbase_t* hcl_querymod (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
/* fmt.c */
|
/* fmt.c */
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int hcl_fmt_object_ (
|
int hcl_fmt_object_ (
|
||||||
hcl_fmtout_t* fmtout,
|
hcl_fmtout_t* fmtout,
|
||||||
@ -1115,6 +1115,14 @@ int hcl_strfmtcallstack (
|
|||||||
hcl_ooi_t nargs
|
hcl_ooi_t nargs
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* comp.c */
|
||||||
|
/* ========================================================================= */
|
||||||
|
int hcl_emitbyteinstruction (
|
||||||
|
hcl_t* hcl,
|
||||||
|
hcl_oob_t bc
|
||||||
|
);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -241,10 +241,10 @@ void hcl_fini (hcl_t* hcl)
|
|||||||
hcl->proc_map_free_last = -1;
|
hcl->proc_map_free_last = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hcl->code.bc.arr)
|
if (hcl->code.bc.ptr)
|
||||||
{
|
{
|
||||||
hcl_freengcobj (hcl, (hcl_oop_t)hcl->code.bc.arr);
|
hcl_freemem (hcl, hcl->code.bc.ptr);
|
||||||
hcl->code.bc.arr = HCL_NULL;
|
hcl->code.bc.ptr = HCL_NULL;
|
||||||
hcl->code.bc.len = 0;
|
hcl->code.bc.len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1285,8 +1285,9 @@ struct hcl_t
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
hcl_oop_byte_t arr; /* byte code array - not part of object memory */
|
hcl_oob_t* ptr; /* byte code array */
|
||||||
hcl_oow_t len;
|
hcl_oow_t len;
|
||||||
|
hcl_oow_t capa;
|
||||||
} bc;
|
} bc;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
@ -1650,11 +1651,6 @@ HCL_EXPORT hcl_oop_t hcl_execute (
|
|||||||
hcl_t* hcl
|
hcl_t* hcl
|
||||||
);
|
);
|
||||||
|
|
||||||
HCL_EXPORT hcl_oop_t hcl_executefromip (
|
|
||||||
hcl_t* hcl,
|
|
||||||
hcl_oow_t initial_ip
|
|
||||||
);
|
|
||||||
|
|
||||||
HCL_EXPORT void hcl_abort (
|
HCL_EXPORT void hcl_abort (
|
||||||
hcl_t* hcl
|
hcl_t* hcl
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user