mirror of
https://github.com/open-goal/jak-project
synced 2026-08-21 23:00:45 -04:00
Support Behaviors (#678)
* temp * working, but type pass got really slow * clean up * changelog and flip order * clean up and add tests * fix zero size array * handle lambdas correctly * another windows fix
This commit is contained in:
@@ -26,12 +26,13 @@ goos::Object get_arg_list_for_function(const Function& func, const Env& env) {
|
||||
namespace {
|
||||
void append_body_to_function_definition(goos::Object* top_form,
|
||||
const std::vector<goos::Object>& inline_body,
|
||||
const FunctionVariableDefinitions& var_dec) {
|
||||
const FunctionVariableDefinitions& var_dec,
|
||||
const TypeSpec& ts) {
|
||||
if (var_dec.local_vars) {
|
||||
pretty_print::append(*top_form, pretty_print::build_list(*var_dec.local_vars));
|
||||
}
|
||||
|
||||
if (var_dec.had_pp) {
|
||||
if (var_dec.had_pp && !ts.try_get_tag("behavior")) {
|
||||
std::vector<goos::Object> body_with_pp;
|
||||
body_with_pp.push_back(pretty_print::to_symbol("with-pp"));
|
||||
body_with_pp.insert(body_with_pp.end(), inline_body.begin(), inline_body.end());
|
||||
@@ -47,9 +48,18 @@ goos::Object final_output_lambda(const Function& func) {
|
||||
std::vector<goos::Object> inline_body;
|
||||
func.ir2.top_form->inline_forms(inline_body, func.ir2.env);
|
||||
auto var_dec = func.ir2.env.local_var_type_list(func.ir2.top_form, func.type.arg_count() - 1);
|
||||
auto result = pretty_print::build_list("lambda", get_arg_list_for_function(func, func.ir2.env));
|
||||
append_body_to_function_definition(&result, inline_body, var_dec);
|
||||
return result;
|
||||
|
||||
auto behavior = func.type.try_get_tag("behavior");
|
||||
if (behavior) {
|
||||
auto result = pretty_print::build_list(fmt::format("lambda :behavior {}", *behavior),
|
||||
get_arg_list_for_function(func, func.ir2.env));
|
||||
append_body_to_function_definition(&result, inline_body, var_dec, func.type);
|
||||
return result;
|
||||
} else {
|
||||
auto result = pretty_print::build_list("lambda", get_arg_list_for_function(func, func.ir2.env));
|
||||
append_body_to_function_definition(&result, inline_body, var_dec, func.type);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
std::string final_defun_out(const Function& func,
|
||||
@@ -75,13 +85,24 @@ std::string final_defun_out(const Function& func,
|
||||
} else {
|
||||
assert(special_mode == FunctionDefSpecials::NONE);
|
||||
}
|
||||
|
||||
auto behavior = func.type.try_get_tag("behavior");
|
||||
if (behavior) {
|
||||
def_name = "defbehavior";
|
||||
}
|
||||
|
||||
std::vector<goos::Object> top;
|
||||
top.push_back(pretty_print::to_symbol(def_name));
|
||||
top.push_back(pretty_print::to_symbol(func.guessed_name.to_string()));
|
||||
|
||||
if (behavior) {
|
||||
top.push_back(pretty_print::to_symbol(func.guessed_name.to_string() + " " + *behavior));
|
||||
} else {
|
||||
top.push_back(pretty_print::to_symbol(func.guessed_name.to_string()));
|
||||
}
|
||||
top.push_back(arguments);
|
||||
auto top_form = pretty_print::build_list(top);
|
||||
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec);
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec, func.type);
|
||||
return pretty_print::to_string(top_form);
|
||||
}
|
||||
|
||||
@@ -96,7 +117,7 @@ std::string final_defun_out(const Function& func,
|
||||
top.push_back(arguments);
|
||||
auto top_form = pretty_print::build_list(top);
|
||||
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec);
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec, method_info.type);
|
||||
return pretty_print::to_string(top_form);
|
||||
}
|
||||
|
||||
@@ -107,7 +128,7 @@ std::string final_defun_out(const Function& func,
|
||||
top.push_back(arguments);
|
||||
auto top_form = pretty_print::build_list(top);
|
||||
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec);
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec, func.type);
|
||||
return pretty_print::to_string(top_form);
|
||||
}
|
||||
|
||||
@@ -120,7 +141,7 @@ std::string final_defun_out(const Function& func,
|
||||
top.push_back(arguments);
|
||||
auto top_form = pretty_print::build_list(top);
|
||||
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec);
|
||||
append_body_to_function_definition(&top_form, inline_body, var_dec, func.type);
|
||||
return pretty_print::to_string(top_form);
|
||||
}
|
||||
return "nyi";
|
||||
|
||||
Reference in New Issue
Block a user