diff --git a/src/builtins.c b/src/builtins.c index 3b871bb..092a008 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -44,8 +44,8 @@ {.name="block!", .calltype=call, .argc=1, .args={block}, .returns=true, .rettype=block}, {.name="boolean!", .calltype=call, .argc=1, .args={boolean},.returns=true, .rettype=boolean}, -{.name="first", .calltype=call, .argc=1, .args={any}, .returns=true, .rettype=any, .overload=true, .overloads={list,string,NIL}}, -{.name="rest", .calltype=call, .argc=1, .args={any}, .returns=true, .rettype=any, .overload=true, .overloads={list,string,NIL}, .overload_to_return=true}, +{.name="first", .calltype=call, .argc=1, .args={any}, .returns=true, .rettype=any, .overload=true, .overloads={list,string,NIL}, .overload_returns={any, string, NIL}}, +{.name="rest", .calltype=call, .argc=1, .args={any}, .returns=true, .rettype=any, .overload=true, .overloads={list,string,NIL}, .overload_returns={list, string, NIL}}, {.name="push", .calltype=call, .argc=2, .args={any, list}, .returns=true, .rettype=list}, {.name="empty?", .calltype=call, .argc=1, .args={list}, .returns=true, .rettype=boolean}, {.name="join", .calltype=call, .argc=2, .args={string, string}, .returns=true, .rettype=string}, diff --git a/src/cognac.c b/src/cognac.c index bff9f2b..62b45f9 100755 --- a/src/cognac.c +++ b/src/cognac.c @@ -291,7 +291,7 @@ func_t* make_func(ast_list_t* tree, char* name) func->has_regs = false; func->overload = false; func->overloaded_to = any; - func->overload_to_return = false; + func->overload_returns[0] = NIL; func->builtin = false; func->name = name; func->locals = NULL; @@ -1931,8 +1931,8 @@ bool add_var_types_forwards(module_t* mod) for ( val_list_t* vv = new_fn->args ; vv ; vv = vv->next ) if (vv->val == v->val) vv->val = make_value(t, v->val->source); new_fn->overloaded_to = t; - if (fn->overload_to_return && new_fn->returns) - new_fn->rettype = t; + if (fn->overload_returns[0] != NIL && new_fn->returns) + new_fn->rettype = fn->overload_returns[i]; op->op->func = new_fn; goto end; } @@ -3467,8 +3467,8 @@ word_list_t* builtins(void) fn->overloaded_to = any; fn->unmangled_name = b[i].name; fn->overload = b[i].overload; - fn->overload_to_return = b[i].overload_to_return; if (b[i].overload) memcpy(&fn->overloads, &b[i].overloads, sizeof(b[i].overloads)); + if (b[i].overload) memcpy(&fn->overload_returns, &b[i].overload_returns, sizeof(b[i].overload_returns)); type_t calltype = b[i].calltype; for (int ii = b[i].argc-1 ; ii >= 0 ; --ii) fn->args = push_val(make_value(b[i].args[ii], NULL), fn->args); diff --git a/src/cognac.h b/src/cognac.h index b57139b..eb752df 100644 --- a/src/cognac.h +++ b/src/cognac.h @@ -121,8 +121,8 @@ struct _builtin_t val_type_t storagetype; val_type_t rettype; val_type_t overloads[10]; + val_type_t overload_returns[10]; bool overload; - bool overload_to_return; //val_type_t checks; }; @@ -197,8 +197,8 @@ struct _func_t size_t argc; char* name; val_type_t overloads[10]; + val_type_t overload_returns[10]; val_type_t overloaded_to; - bool overload_to_return; bool overload; bool returns; bool stack; diff --git a/src/runtime.h b/src/runtime.h index b6eb74b..704f233 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -292,7 +292,7 @@ static BOOLEAN ___ioQ(ANY); static BOOLEAN ___zeroQ(ANY); static ANY ___first(ANY); static ANY ___rest(ANY); -static ANY ___first_STRING(STRING); +static STRING ___first_STRING(STRING); static STRING ___rest_STRING(STRING); static ANY ___first_LIST(LIST); static LIST ___rest_LIST(LIST); @@ -1493,10 +1493,10 @@ static LIST ___rest_LIST(LIST lst) return lst->next; } -static ANY ___first_STRING(STRING str) +static STRING ___first_STRING(STRING str) { if unlikely(!*str) throw_error("empty string is invalid"); - return box_STRING(gc_strndup((char*)str, mblen(str, MB_CUR_MAX))); + return gc_strndup((char*)str, mblen(str, MB_CUR_MAX)); } static STRING ___rest_STRING(STRING str) @@ -1510,7 +1510,7 @@ static ANY ___first(ANY a) switch(a.type) { case list: return ___first_LIST(a.list); - case string: return ___first_STRING(a.string); + case string: return box_STRING(___first_STRING(a.string)); default: type_error("string or list", a); } }