simplified the CLASS_LOAD instruction by chaining it with a PUSH instruction. now the class name part of the out-of-class method defintion refers to a normal variable
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
hyung-hwan 2024-04-13 17:17:15 +09:00
parent 7001476e6d
commit 897042f7f7
5 changed files with 36 additions and 82 deletions

View File

@ -679,7 +679,6 @@ static int emit_single_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1
case HCL_CODE_STORE_INTO_CVAR_M_X: case HCL_CODE_STORE_INTO_CVAR_M_X:
case HCL_CODE_POP_INTO_CVAR_M_X: case HCL_CODE_POP_INTO_CVAR_M_X:
case HCL_CODE_CLASS_LOAD_X:
case HCL_CODE_CLASS_CMSTORE: case HCL_CODE_CLASS_CMSTORE:
case HCL_CODE_CLASS_CIMSTORE: case HCL_CODE_CLASS_CIMSTORE:
case HCL_CODE_CLASS_IMSTORE: case HCL_CODE_CLASS_IMSTORE:
@ -5674,40 +5673,13 @@ static HCL_INLINE int post_lambda (hcl_t* hcl)
hcl_oow_t index; hcl_oow_t index;
hcl_oop_t lit, cons; hcl_oop_t lit, cons;
/* TODO: CLASS_LOAD_X must be emited before the defun method code instruction is emitted ? */ /* treat the class name part as a normal variable.
/* treat this like a global variable for now */ * it can be a global variable like 'String' or a local variable declared */
lit = hcl_makesymbol(hcl, HCL_CNODE_GET_TOKPTR(class_name), HCL_CNODE_GET_TOKLEN(class_name)); if (compile_symbol(hcl, class_name) <= -1) return -1;
if (HCL_UNLIKELY(!lit)) return -1;
cons = (hcl_oop_t)hcl_getatsysdic(hcl, lit);
if (!cons)
{
cons = (hcl_oop_t)hcl_putatsysdic(hcl, lit, hcl->_undef);
if (HCL_UNLIKELY(!cons)) return -1;
}
/*
2024-04-01 23:39:21 +0900 0000000041 make_lambda 0 0 0 0 0
2024-04-01 23:39:21 +0900 0000000046 jump_forward 6
2024-04-01 23:39:21 +0900 0000000055 store_into_object @4
2024-04-01 23:39:21 +0900 0000000058 return_from_block
if (emit_byte_instruction(hcl, HCL_CODE_CLASS_LOAD, HCL_CNODE_GET_LOC(class_name)) <= -1) return -1;
2024-04-01 23:40:11 +0900 0000000041 make_lambda 0 0 0 0 0 /* the function name is always named */
2024-04-01 23:40:11 +0900 0000000046 jump_forward 6
2024-04-01 23:40:11 +0900 0000000055 class_load @2
2024-04-01 23:40:11 +0900 0000000058 class_imstore 4
2024-04-01 23:40:11 +0900 0000000061 class_exit
2024-04-01 23:40:11 +0900 0000000062 return_from_block
*/
if (add_literal(hcl, cons, &index) <= -1) return -1;
if (emit_single_param_instruction(hcl, HCL_CODE_PUSH_OBJECT_0, index, HCL_CNODE_GET_LOC(class_name)) <= -1) return -1;
/* TODO: for class_name part is a local variable or something...
if emit_variable_access(hcl, VAR_ACCESS_PUSH, &vi, HCL_CNODE_GET_LOC(obj)) <= -1) return -1;
*/
if (emit_single_param_instruction(hcl, HCL_CODE_CLASS_LOAD_X, index, HCL_CNODE_GET_LOC(class_name)) <= -1) return -1;
lit = hcl_makesymbol(hcl, HCL_CNODE_GET_TOKPTR(defun_name), HCL_CNODE_GET_TOKLEN(defun_name)); lit = hcl_makesymbol(hcl, HCL_CNODE_GET_TOKPTR(defun_name), HCL_CNODE_GET_TOKLEN(defun_name));
if (HCL_UNLIKELY(!lit)) return -1; if (HCL_UNLIKELY(!lit)) return -1;
if (add_literal(hcl, lit, &index) <= -1) return -1; if (add_literal(hcl, lit, &index) <= -1) return -1;

View File

@ -373,16 +373,8 @@ int hcl_decode (hcl_t* hcl, const hcl_code_t* code, hcl_oow_t start, hcl_oow_t e
LOG_INST_0 (hcl, "throw"); LOG_INST_0 (hcl, "throw");
break; break;
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
case HCL_CODE_CLASS_LOAD_X2: case HCL_CODE_CLASS_LOAD:
FETCH_PARAM_CODE_TO (hcl, b1); LOG_INST_0 (hcl, "class_load");
FETCH_PARAM_CODE_TO (hcl, b2);
b1 = (b1 << (8 * HCL_CODE_LONG_PARAM_SIZE)) | b2;
goto class_load;
case HCL_CODE_CLASS_LOAD_X:
FETCH_PARAM_CODE_TO (hcl, b1);
class_load:
LOG_INST_1 (hcl, "class_load @%zu", b1);
break; break;
case HCL_CODE_CLASS_ENTER: case HCL_CODE_CLASS_ENTER:

View File

@ -3542,7 +3542,7 @@ static int execute (hcl_t* hcl)
LOG_INST_1 (hcl, "push_object @%zu", b1); LOG_INST_1 (hcl, "push_object @%zu", b1);
if (HCL_IS_UNDEF(hcl, ass->cdr)) if (HCL_IS_UNDEF(hcl, ass->cdr))
{ {
hcl_seterrbfmt (hcl, HCL_EUNDEFVAR, "%.*js accessed without initization", HCL_OBJ_GET_SIZE(ass->car), HCL_OBJ_GET_CHAR_SLOT(ass->car)); hcl_seterrbfmt (hcl, HCL_EUNDEFVAR, "%.*js accessed without initialization", HCL_OBJ_GET_SIZE(ass->car), HCL_OBJ_GET_CHAR_SLOT(ass->car));
if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break; if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break;
goto oops_with_errmsg_supplement; goto oops_with_errmsg_supplement;
} }
@ -3805,49 +3805,22 @@ static int execute (hcl_t* hcl)
break; break;
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
case HCL_CODE_CLASS_LOAD_X2: case HCL_CODE_CLASS_LOAD:
FETCH_PARAM_CODE_TO (hcl, b1); {
FETCH_PARAM_CODE_TO (hcl, b2); hcl_oop_t t;
b1 = (b1 << (8 * HCL_CODE_LONG_PARAM_SIZE)) | b2;
goto class_load;
case HCL_CODE_CLASS_LOAD_X: /* push the class off the stack top on the class stack */
{ LOG_INST_0 (hcl, "class_load");
hcl_oop_cons_t t;
FETCH_PARAM_CODE_TO (hcl, b1);
class_load:
/* push the class indiciated by the literal at the given literal frame index
* to the class stack */
LOG_INST_1 (hcl, "class_load @%zu", b1);
#if 0 HCL_STACK_POP_TO (hcl, t);
t = (hcl_oop_cons_t)hcl->active_function->literal_frame[b1]; if (!HCL_IS_CLASS(hcl, t))
if (!HCL_IS_CONS(hcl,t))
{ {
/* this is an uncatchable internal error that must not happen - is the bytecode compromised? */ /*hcl_seterrbfmt(hcl, HCL_EUNDEFVAR, "%.*js is not class", HCL_OBJ_GET_SIZE(t->car), HCL_OBJ_GET_CHAR_SLOT(t->car));*/
hcl_seterrbfmt(hcl, HCL_EINTERN, "internal error - invalid operand to CLASS_LOAD");
goto oops_with_errmsg_supplement;
}
if (!HCL_IS_CLASS(hcl, t->cdr))
{
hcl_seterrbfmt(hcl, HCL_EUNDEFVAR, "%.*js is not class", HCL_OBJ_GET_SIZE(t->car), HCL_OBJ_GET_CHAR_SLOT(t->car));
if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break;
goto oops_with_errmsg_supplement;
}
HCL_CLSTACK_PUSH (hcl, t->cdr);
#else
hcl_oop_t c;
HCL_STACK_POP_TO (hcl, c);
if (!HCL_IS_CLASS(hcl, c))
{
//hcl_seterrbfmt(hcl, HCL_EUNDEFVAR, "%.*js is not class", HCL_OBJ_GET_SIZE(t->car), HCL_OBJ_GET_CHAR_SLOT(t->car));
hcl_seterrbfmt(hcl, HCL_EUNDEFVAR, "not class"); /* TODO: change error code */ hcl_seterrbfmt(hcl, HCL_EUNDEFVAR, "not class"); /* TODO: change error code */
if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break; if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break;
goto oops_with_errmsg_supplement; goto oops_with_errmsg_supplement;
} }
HCL_CLSTACK_PUSH (hcl, c); HCL_CLSTACK_PUSH (hcl, t);
#endif
break; break;
} }

View File

@ -1325,10 +1325,9 @@ enum hcl_bcode_t
HCL_CODE_THROW = 0xDB, /* 219 */ HCL_CODE_THROW = 0xDB, /* 219 */
HCL_CODE_POP_INTO_CTXTEMPVAR_X = 0xDC, /* 220 ## */ HCL_CODE_POP_INTO_CTXTEMPVAR_X = 0xDC, /* 220 ## */
HCL_CODE_CLASS_LOAD_X = 0xDD, /* 221 ## */ HCL_CODE_CLASS_LOAD = 0xDD, /* 221 ## */
HCL_CODE_CLASS_LOAD_X2 = 0xDE, /* 222 ## */
/* UNUSED - 0xDF - 0xDF */ /* UNUSED - 0xDE - 0xDF */
HCL_CODE_PUSH_CTXTEMPVAR_X = 0xE0, /* 224 ## */ HCL_CODE_PUSH_CTXTEMPVAR_X = 0xE0, /* 224 ## */
HCL_CODE_CLASS_ENTER = 0xE1, /* 225 ## */ HCL_CODE_CLASS_ENTER = 0xE1, /* 225 ## */

View File

@ -66,3 +66,21 @@ try { throw "1111"; } catch (e) ##ERROR: syntax error - block expression expecte
try { throw "1111"; } catch (e) { try { throw "1111"; } catch (e) {
printf "EXCEPTION - %s\n" e printf "EXCEPTION - %s\n" e
} 20 ##ERROR: syntax error - redundant expression prohibited after } 20 ##ERROR: syntax error - redundant expression prohibited after
---
{
| a |
a := 30
fun a:get_999() { ##ERROR: exception not handled - "not class"
return 999;
}
}
---
fun a:get_999() { ##ERROR: exception not handled - "a accessed without initialization"
return 999;
}