Support multiple init functions in a single file.
From-SVN: r170756
This commit is contained in:
parent
b4ed59860a
commit
c7e529d3bc
@ -839,19 +839,6 @@ Named_object::get_id(Gogo* gogo)
|
||||
// types.
|
||||
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
|
||||
{
|
||||
std::string package_name;
|
||||
|
@ -211,12 +211,6 @@ Gogo::Gogo(int int_type_size, int pointer_size)
|
||||
this->globals_->add_function_declaration("imag", NULL, imag_type, loc);
|
||||
|
||||
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.
|
||||
@ -660,7 +654,24 @@ Gogo::start_function(const std::string& name, Function_type* type,
|
||||
|
||||
const std::string* pname;
|
||||
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;
|
||||
else
|
||||
{
|
||||
@ -753,7 +764,7 @@ Gogo::start_function(const std::string& name, Function_type* type,
|
||||
of.function = ret;
|
||||
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->need_init_fn_ = true;
|
||||
|
Loading…
Reference in New Issue
Block a user