瀏覽代碼

Fixes to constants in scope

Juan Linietsky 11 年之前
父節點
當前提交
f1d3b30a45
共有 2 個文件被更改,包括 47 次插入32 次删除
  1. 36 26
      modules/gdscript/gd_compiler.cpp
  2. 11 6
      modules/gdscript/gd_script.cpp

+ 36 - 26
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);
 
 	}

+ 11 - 6
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;
 			}