summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/gd_compiler.cpp
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-05-02 12:40:34 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-05-02 12:40:34 -0300
commitf1d3b30a45f31c217929ec86b010736feed1714c (patch)
treefa3c6b5e88ae5d554e6b04d07bfcb6a5e715f0e5 /modules/gdscript/gd_compiler.cpp
parent6572d5128856b2ec55a2c417c92e584899f4906f (diff)
downloadredot-engine-f1d3b30a45f31c217929ec86b010736feed1714c.tar.gz
Fixes to constants in scope
Diffstat (limited to 'modules/gdscript/gd_compiler.cpp')
-rw-r--r--modules/gdscript/gd_compiler.cpp62
1 files changed, 36 insertions, 26 deletions
diff --git a/modules/gdscript/gd_compiler.cpp b/modules/gdscript/gd_compiler.cpp
index 90c83c201b..48f0092827 100644
--- a/modules/gdscript/gd_compiler.cpp
+++ b/modules/gdscript/gd_compiler.cpp
@@ -185,51 +185,59 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
//TRY CLASS CONSTANTS
- GDScript *scr = codegen.script;
- GDNativeClass *nc=NULL;
- while(scr) {
+ GDScript *owner = codegen.script;
+ while (owner) {
- if (scr->constants.has(identifier)) {
+ GDScript *scr = owner;
+ GDNativeClass *nc=NULL;
+ while(scr) {
- //int idx=scr->constants[identifier];
- int idx = codegen.get_name_map_pos(identifier);
- return idx|(GDFunction::ADDR_TYPE_CLASS_CONSTANT<<GDFunction::ADDR_BITS); //argument (stack root)
+ if (scr->constants.has(identifier)) {
+
+ //int idx=scr->constants[identifier];
+ int idx = codegen.get_name_map_pos(identifier);
+ return idx|(GDFunction::ADDR_TYPE_CLASS_CONSTANT<<GDFunction::ADDR_BITS); //argument (stack root)
+ }
+ if (scr->native.is_valid())
+ nc=scr->native.ptr();
+ scr=scr->_base;
}
- if (scr->native.is_valid())
- nc=scr->native.ptr();
- scr=scr->_base;
- }
- // CLASS C++ Integer Constant
+ // CLASS C++ Integer Constant
- if (nc) {
+ if (nc) {
- bool success=false;
- int constant = ObjectTypeDB::get_integer_constant(nc->get_name(),identifier,&success);
- if (success) {
- Variant key=constant;
- int idx;
+ bool success=false;
+ int constant = ObjectTypeDB::get_integer_constant(nc->get_name(),identifier,&success);
+ if (success) {
+ Variant key=constant;
+ int idx;
- if (!codegen.constant_map.has(key)) {
+ if (!codegen.constant_map.has(key)) {
- idx=codegen.constant_map.size();
- codegen.constant_map[key]=idx;
+ idx=codegen.constant_map.size();
+ codegen.constant_map[key]=idx;
- } else {
- idx=codegen.constant_map[key];
+ } else {
+ idx=codegen.constant_map[key];
+ }
+
+ return idx|(GDFunction::ADDR_TYPE_LOCAL_CONSTANT<<GDFunction::ADDR_BITS); //make it a local constant (faster access)
}
- return idx|(GDFunction::ADDR_TYPE_LOCAL_CONSTANT<<GDFunction::ADDR_BITS); //make it a local constant (faster access)
}
+ owner=owner->_owner;
}
- if (codegen.script->subclasses.has(identifier)) {
+ /*
+ handled in constants now
+ if (codegen.script->subclasses.has(identifier)) {
//same with a subclass, make it a local constant.
int idx = codegen.get_constant_pos(codegen.script->subclasses[identifier]);
return idx|(GDFunction::ADDR_TYPE_LOCAL_CONSTANT<<GDFunction::ADDR_BITS); //make it a local constant (faster access)
- }
+ }*/
if (GDScriptLanguage::get_singleton()->get_global_map().has(identifier)) {
@@ -1457,6 +1465,8 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
Error err = _parse_class(subclass.ptr(),p_script,p_class->subclasses[i]);
if (err)
return err;
+
+ p_script->constants.insert(name,subclass); //once parsed, goes to the list of constants
p_script->subclasses.insert(name,subclass);
}