namespace GL {
namespace SL {
-Module *create_builtins_module()
+Module *get_builtins_module()
{
- Parser parser;
- Module *module = new Module(parser.parse(builtins_src, "<builtin>"));
- for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ static RefPtr<Module> builtins_module;
+ static bool initialized = false;
+ if(!initialized)
{
- VariableResolver resolver;
- i->content.visit(resolver);
- for(map<string, VariableDeclaration *>::iterator j=i->content.variables.begin(); j!=i->content.variables.end(); ++j)
- j->second->linked_declaration = j->second;
+ initialized = true;
+
+ Parser parser;
+ Module *module = new Module(parser.parse(builtins_src, "<builtin>"));
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ {
+ VariableResolver().apply(*i);
+ for(map<string, VariableDeclaration *>::iterator j=i->content.variables.begin(); j!=i->content.variables.end(); ++j)
+ j->second->linked_declaration = j->second;
+ }
+
+ builtins_module = module;
}
- return module;
+ return builtins_module.get();
}
-Module &get_builtins_module()
+Stage *get_builtins(Stage::Type type)
{
- static RefPtr<Module> builtins_module = create_builtins_module();
- return *builtins_module;
-}
+ Module *module = get_builtins_module();
+ if(!module)
+ return 0;
-Stage *get_builtins(StageType type)
-{
- Module &module = get_builtins_module();
- for(list<Stage>::iterator i=module.stages.begin(); i!=module.stages.end(); ++i)
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
if(i->type==type)
return &*i;
return 0;