fixed a bug in handling method body of an interface

This commit is contained in:
hyunghwan.chung 2019-10-08 15:49:48 +00:00
parent 042edde349
commit 0e75970f13

View File

@ -2492,28 +2492,6 @@ static int end_include (moo_t* moo)
static MOO_INLINE int add_literal (moo_t* moo, moo_oop_t lit, moo_oow_t* index) static MOO_INLINE int add_literal (moo_t* moo, moo_oop_t lit, moo_oow_t* index)
{ {
#if 0
moo_method_data_t* md = get_cunit_method_data(moo);
moo_oow_t i;
for (i = 0; i < md->literals.count; i++)
{
/*
* this removes redundancy of symbols, characters, and small integers.
* more complex redundacy check may be done somewhere else like
* in add_string_literal().
*/
if (md->literals.ptr[i] == lit)
{
*index = i;
return 0;
}
}
if (add_oop_to_oopbuf(moo, &md->literals, lit) <= -1) return -1;
*index = md->literals.count - 1;
return 0;
#else
/* /*
* this removes redundancy of symbols, characters, and small integers. * this removes redundancy of symbols, characters, and small integers.
* more complex redundacy check may be done somewhere else like * more complex redundacy check may be done somewhere else like
@ -2521,7 +2499,6 @@ static MOO_INLINE int add_literal (moo_t* moo, moo_oop_t lit, moo_oow_t* index)
*/ */
moo_method_data_t* md = get_cunit_method_data(moo); moo_method_data_t* md = get_cunit_method_data(moo);
return add_oop_to_oopbuf_nodup(moo, &md->literals, lit, index); return add_oop_to_oopbuf_nodup(moo, &md->literals, lit, index);
#endif
} }
static int add_string_literal (moo_t* moo, const moo_oocs_t* str, moo_oow_t* index) static int add_string_literal (moo_t* moo, const moo_oocs_t* str, moo_oow_t* index)
@ -4892,7 +4869,7 @@ static MOO_INLINE int find_undotted_ident (moo_t* moo, const moo_oocs_t* name, c
if (ifce->self_oop) if (ifce->self_oop)
{ {
/* the current class being compiled has been instantiated. /* the current interface being compiled has been instantiated.
* look up in the temporary variable list if compiling in a method */ * look up in the temporary variable list if compiling in a method */
if (ifce->mth.active && find_temporary_variable(moo, name, &index) >= 0) if (ifce->mth.active && find_temporary_variable(moo, name, &index) >= 0)
{ {
@ -7635,7 +7612,6 @@ static void add_method_info_to_dbgi (moo_t* moo, moo_method_data_t* md, moo_oow_
} }
static int add_compiled_method_to_class (moo_t* moo) static int add_compiled_method_to_class (moo_t* moo)
{ {
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit; moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
@ -7658,7 +7634,7 @@ static int add_compiled_method_to_class (moo_t* moo)
for (i = 0; i < cc->mth.literals.count; i++) for (i = 0; i < cc->mth.literals.count; i++)
{ {
/* let's do the variadic data initialization here */ /* let's do the variadic data initialization here - fill the literal frame */
MOO_STORE_OOP (moo, &mth->literal_frame[i], cc->mth.literals.ptr[i]); MOO_STORE_OOP (moo, &mth->literal_frame[i], cc->mth.literals.ptr[i]);
} }
moo_pushvolat (moo, (moo_oop_t*)&mth); tmp_count++; moo_pushvolat (moo, (moo_oop_t*)&mth); tmp_count++;
@ -7715,9 +7691,10 @@ static int add_compiled_method_to_interface (moo_t* moo)
{ {
moo_cunit_interface_t* ifce = (moo_cunit_interface_t*)moo->c->cunit; moo_cunit_interface_t* ifce = (moo_cunit_interface_t*)moo->c->cunit;
moo_oop_char_t name; /* selector */ moo_oop_char_t name; /* selector */
moo_oop_method_t mth; /* method signature */ moo_oop_method_t mth; /* method signature with body */
moo_ooi_t preamble_flags = 0; moo_ooi_t preamble_flags = 0;
moo_oow_t tmp_count = 0; moo_oow_t tmp_count = 0;
moo_oow_t i;
MOO_ASSERT (moo, moo->c->cunit->cunit_type == MOO_CUNIT_INTERFACE); MOO_ASSERT (moo, moo->c->cunit->cunit_type == MOO_CUNIT_INTERFACE);
@ -7730,6 +7707,13 @@ static int add_compiled_method_to_interface (moo_t* moo)
mth = (moo_oop_method_t)moo_instantiatewithtrailer(moo, moo->_method, ifce->mth.literals.count, ifce->mth.code.ptr, ifce->mth.code.len); mth = (moo_oop_method_t)moo_instantiatewithtrailer(moo, moo->_method, ifce->mth.literals.count, ifce->mth.code.ptr, ifce->mth.code.len);
if (!mth) goto oops; if (!mth) goto oops;
for (i = 0; i < ifce->mth.literals.count; i++)
{
/* let's do the variadic data initialization here - fill the literal frame */
MOO_STORE_OOP (moo, &mth->literal_frame[i], ifce->mth.literals.ptr[i]);
}
moo_pushvolat (moo, (moo_oop_t*)&mth); tmp_count++;
MOO_STORE_OOP (moo, (moo_oop_t*)&mth->owner, (moo_oop_t)ifce->self_oop); MOO_STORE_OOP (moo, (moo_oop_t*)&mth->owner, (moo_oop_t)ifce->self_oop);
MOO_STORE_OOP (moo, (moo_oop_t*)&mth->name, (moo_oop_t)name); MOO_STORE_OOP (moo, (moo_oop_t*)&mth->name, (moo_oop_t)name);
@ -8228,18 +8212,19 @@ static int __compile_method_definition (moo_t* moo)
static int compile_method_definition (moo_t* moo) static int compile_method_definition (moo_t* moo)
{ {
moo_method_data_t* md = get_cunit_method_data(moo); moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
int n; int n;
MOO_ASSERT (moo, moo->c->cunit->cunit_type == MOO_CUNIT_CLASS);
MOO_ASSERT (moo, moo->c->balit.count == 0); MOO_ASSERT (moo, moo->c->balit.count == 0);
MOO_ASSERT (moo, moo->c->arlit.count == 0); MOO_ASSERT (moo, moo->c->arlit.count == 0);
/* clear data required to compile a method */ /* clear data required to compile a method */
md->active = 1; cc->mth.active = 1;
reset_method_data (moo, md); reset_method_data (moo, &cc->mth);
md->start_loc = *TOKEN_LOC(moo); cc->mth.start_loc = *TOKEN_LOC(moo);
n = __compile_method_definition(moo); n = __compile_method_definition(moo);
md->active = 0; cc->mth.active = 0;
return n; return n;
} }
@ -10462,6 +10447,7 @@ static void gc_cunit_chain (moo_t* moo)
ifce->ns_oop = (moo_oop_nsdic_t)x; ifce->ns_oop = (moo_oop_nsdic_t)x;
} }
gc_oopbuf (moo, &ifce->mth.literals);
break; break;
} }