diff options
| -rw-r--r-- | modules/gdscript/gd_compiler.cpp | 62 | ||||
| -rw-r--r-- | modules/gdscript/gd_script.cpp | 17 | 
2 files changed, 47 insertions, 32 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);  	} diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp index 299a7d3e54..65b10399f8 100644 --- a/modules/gdscript/gd_script.cpp +++ b/modules/gdscript/gd_script.cpp @@ -76,16 +76,21 @@ Variant *GDFunction::_get_variant(int p_address,GDInstance *p_instance,GDScript  		case ADDR_TYPE_CLASS_CONSTANT: {  			//todo change to index! -			GDScript *s=p_script; +			GDScript *o=p_script;  			ERR_FAIL_INDEX_V(address,_global_names_count,NULL);  			const StringName *sn = &_global_names_ptr[address]; -			while(s) { -				Map<StringName,Variant>::Element *E=s->constants.find(*sn); -				if (E) { -					return &E->get(); +			while(o) { +				GDScript *s=o; +				while(s) { + +					Map<StringName,Variant>::Element *E=s->constants.find(*sn); +					if (E) { +						return &E->get(); +					} +					s=s->_base;  				} -				s=s->_base; +				o=o->_owner;  			}  |