Commit c7e529d3 by Ian Lance Taylor

Support multiple init functions in a single file.

From-SVN: r170756
parent b4ed5986
...@@ -839,19 +839,6 @@ Named_object::get_id(Gogo* gogo) ...@@ -839,19 +839,6 @@ Named_object::get_id(Gogo* gogo)
// types. // types.
decl_name = Gogo::unpack_hidden_name(this->name_); decl_name = Gogo::unpack_hidden_name(this->name_);
} }
else if (this->is_function()
&& !this->func_value()->is_method()
&& this->package_ == NULL
&& Gogo::unpack_hidden_name(this->name_) == "init")
{
// A single package can have multiple "init" functions, which
// means that we need to give them different names.
static int init_index;
char buf[20];
snprintf(buf, sizeof buf, "%d", init_index);
++init_index;
decl_name = gogo->package_name() + ".init." + buf;
}
else else
{ {
std::string package_name; std::string package_name;
......
...@@ -211,12 +211,6 @@ Gogo::Gogo(int int_type_size, int pointer_size) ...@@ -211,12 +211,6 @@ Gogo::Gogo(int int_type_size, int pointer_size)
this->globals_->add_function_declaration("imag", NULL, imag_type, loc); this->globals_->add_function_declaration("imag", NULL, imag_type, loc);
this->define_builtin_function_trees(); this->define_builtin_function_trees();
// Declare "init", to ensure that it is not defined with parameters
// or return values.
this->declare_function("init",
Type::make_function_type(NULL, NULL, NULL, loc),
loc);
} }
// Munge name for use in an error message. // Munge name for use in an error message.
...@@ -660,7 +654,24 @@ Gogo::start_function(const std::string& name, Function_type* type, ...@@ -660,7 +654,24 @@ Gogo::start_function(const std::string& name, Function_type* type,
const std::string* pname; const std::string* pname;
std::string nested_name; std::string nested_name;
if (!name.empty()) bool is_init = false;
if (Gogo::unpack_hidden_name(name) == "init" && !type->is_method())
{
if ((type->parameters() != NULL && !type->parameters()->empty())
|| (type->results() != NULL && !type->results()->empty()))
error_at(location,
"func init must have no arguments and no return values");
// There can be multiple "init" functions, so give them each a
// different name.
static int init_count;
char buf[30];
snprintf(buf, sizeof buf, ".$init%d", init_count);
++init_count;
nested_name = buf;
pname = &nested_name;
is_init = true;
}
else if (!name.empty())
pname = &name; pname = &name;
else else
{ {
...@@ -753,7 +764,7 @@ Gogo::start_function(const std::string& name, Function_type* type, ...@@ -753,7 +764,7 @@ Gogo::start_function(const std::string& name, Function_type* type,
of.function = ret; of.function = ret;
of.blocks.push_back(block); of.blocks.push_back(block);
if (!type->is_method() && Gogo::unpack_hidden_name(name) == "init") if (is_init)
{ {
this->init_functions_.push_back(ret); this->init_functions_.push_back(ret);
this->need_init_fn_ = true; this->need_init_fn_ = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment