diff --git a/src/c/compiler.d b/src/c/compiler.d index da1326abf..c4c47bd6d 100644 --- a/src/c/compiler.d +++ b/src/c/compiler.d @@ -535,9 +535,11 @@ c_tag_ref(cl_object the_tag, cl_object the_type) type = CAR(record); name = CADR(record); if (type == @':tag') { - if (type == the_type && !Null(ecl_assql(the_tag, name))) { - return CONS(MAKE_FIXNUM(n), - CDR(ecl_assql(the_tag, name))); + if (type == the_type) { + cl_object label = ecl_assql(the_tag, name); + if (!Null(label)) { + return CONS(MAKE_FIXNUM(n), ECL_CONS_CDR(label)); + } } n++; } else if (type == @':block' || type == @':function') { @@ -1279,7 +1281,7 @@ c_go(cl_object args, int flags) { if (!Null(args)) FEprogram_error("GO: Too many arguments.",0); asm_op2(OP_GO, fix(CAR(info))); - asm_c(CDR(info)); + asm_arg(fix(CDR(info))); return flags; } diff --git a/src/c/interpreter.d b/src/c/interpreter.d index 5f35f7837..8b36bb8e8 100644 --- a/src/c/interpreter.d +++ b/src/c/interpreter.d @@ -875,17 +875,18 @@ ecl_interpret(cl_object frame, cl_object env, cl_object bytecodes, cl_index offs reg0 = close_around(reg0, lex_env); THREAD_NEXT; } - /* OP_GO n{arg}, tag-name{symbol} - Jumps to the tag which is defined at the n-th position in - the lexical environment. TAG-NAME is kept for debugging - purposes. + /* OP_GO n{arg}, tag-ndx{arg} + Jumps to the tag which is defined for the tagbody + frame registered at the n-th position in the lexical + environment. TAG-NDX is the number of tag in the list. */ CASE(OP_GO); { cl_index lex_env_index; - cl_object tag_name; + cl_fixnum tag_ndx; GET_OPARG(lex_env_index, vector); - GET_DATA(tag_name, vector, data); - cl_go(ecl_lex_env_get_tag(lex_env, lex_env_index), tag_name); + GET_OPARG(tag_ndx, vector); + cl_go(ecl_lex_env_get_tag(lex_env, lex_env_index), + MAKE_FIXNUM(tag_ndx)); THREAD_NEXT; } /* OP_RETURN n{arg}