diff --git a/lib/comp.c b/lib/comp.c index 887ae46..abf968d 100644 --- a/lib/comp.c +++ b/lib/comp.c @@ -1326,11 +1326,9 @@ static int compile_break (hcl_t* hcl, hcl_cnode_t* src) if (emit_byte_instruction(hcl, HCL_CODE_TRY_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#if 0 case HCL_CBLK_TYPE_CLASS: - if (emit_byte_instruction(hcl, HCL_CODE_TRY_CLASS, HCL_CNODE_GET_LOC(src)) <= -1) return -1; + if (emit_byte_instruction(hcl, HCL_CODE_CLASS_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#endif } } @@ -1438,11 +1436,9 @@ static int compile_continue (hcl_t* hcl, hcl_cnode_t* src) if (emit_byte_instruction(hcl, HCL_CODE_TRY_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#if 0 case HCL_CBLK_TYPE_CLASS: if (emit_byte_instruction(hcl, HCL_CODE_CLASS_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#endif } } @@ -1801,11 +1797,12 @@ printf ("22222222222\n"); obj = HCL_CNODE_CONS_CDR(obj); } + if (push_clsblk(hcl, HCL_CNODE_GET_LOC(cmd), 0, 0) <= -1) return -1; /* TODO: emit make_class code... */ - + if (emit_byte_instruction(hcl, HCL_CODE_CLASS_ENTER, HCL_CNODE_GET_LOC(cmd)) <= -1) return -1; SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT_LIST, obj); /* 1 */ PUSH_SUBCFRAME (hcl, COP_POST_CLASS, class_name); /* 2*/ @@ -1861,6 +1858,7 @@ static HCL_INLINE int post_class (hcl_t* hcl) } #else /* should i make the assignment in POST? or after variable declarations immediately? */ + if (emit_byte_instruction(hcl, HCL_CODE_CLASS_EXIT, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1; printf ("end of CLASS DEFINITION\n"); POP_CFRAME (hcl); #endif @@ -2190,15 +2188,17 @@ static int compile_return (hcl_t* hcl, hcl_cnode_t* src, int ret_from_home) { switch (hcl->c->cblk.info[i]._type) { + case HCL_CBLK_TYPE_LOOP: + /* do nothing */ + break; + case HCL_CBLK_TYPE_TRY: if (emit_byte_instruction(hcl, HCL_CODE_TRY_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#if 0 case HCL_CBLK_TYPE_CLASS: - if (emit_byte_instruction(hcl, HCL_CODE_TRY_CLASS, HCL_CNODE_GET_LOC(src)) <= -1) return -1; + if (emit_byte_instruction(hcl, HCL_CODE_CLASS_EXIT, HCL_CNODE_GET_LOC(src)) <= -1) return -1; break; -#endif } } diff --git a/lib/decode.c b/lib/decode.c index 9465c57..b742db6 100644 --- a/lib/decode.c +++ b/lib/decode.c @@ -377,6 +377,14 @@ int hcl_decode (hcl_t* hcl, hcl_oow_t start, hcl_oow_t end) LOG_INST_0 (hcl, "throw"); break; /* -------------------------------------------------------- */ + case HCL_CODE_CLASS_ENTER: + LOG_INST_0 (hcl, "class_enter"); + break; + + case HCL_CODE_CLASS_EXIT: + LOG_INST_0 (hcl, "class_exit"); + break; + /* -------------------------------------------------------- */ case HCL_CODE_PUSH_CTXTEMPVAR_X: case HCL_CODE_STORE_INTO_CTXTEMPVAR_X: diff --git a/lib/exec.c b/lib/exec.c index f12fca1..b4a3f8c 100644 --- a/lib/exec.c +++ b/lib/exec.c @@ -3268,6 +3268,23 @@ if (do_throw(hcl, hcl->_nil, fetched_instruction_pointer) <= -1) if (do_throw(hcl, return_value, fetched_instruction_pointer) <= -1) goto oops; break; /* -------------------------------------------------------- */ + case HCL_CODE_CLASS_ENTER: + { + hcl_oop_t c; + + /* the class_enter instruct must follow the class_make instruction... */ + LOG_INST_0 (hcl, "class_enter"); + c = HCL_STACK_GETTOP(hcl); /* the class object */ + //HCL_CLSTACK_PUSH (hcl, c); + break; + } + + case HCL_CODE_CLASS_EXIT: + LOG_INST_0 (hcl, "class_exit"); + /* TODO: stack underflow check? */ + //HCL_CLSTACK_POP (hcl); + break; + /* -------------------------------------------------------- */ case HCL_CODE_PUSH_CTXTEMPVAR_X: case HCL_CODE_STORE_INTO_CTXTEMPVAR_X: diff --git a/lib/hcl-prv.h b/lib/hcl-prv.h index 302011b..0cbf0b3 100644 --- a/lib/hcl-prv.h +++ b/lib/hcl-prv.h @@ -387,7 +387,8 @@ typedef struct hcl_cframe_t hcl_cframe_t; enum hcl_cblk_type_t { HCL_CBLK_TYPE_LOOP, - HCL_CBLK_TYPE_TRY + HCL_CBLK_TYPE_TRY, + HCL_CBLK_TYPE_CLASS }; typedef enum hcl_cblk_type_t hcl_cblk_type_t;