summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjonyrock <ilms@live.ru>2014-05-02 22:01:13 +0400
committerjonyrock <ilms@live.ru>2014-05-02 22:01:13 +0400
commit53b2879e1703062f1f87b6cfc3ba140aa019fde4 (patch)
treeecb0bf454825649076db1b99d614f353cff0e4a0
parent209eaf6fa06eba8a05e5222bdab418cd0f20c91c (diff)
parentf1d3b30a45f31c217929ec86b010736feed1714c (diff)
Merge remote-tracking branch 'upstream/master' into pair_symbols_tool
-rw-r--r--modules/gdscript/gd_compiler.cpp62
-rw-r--r--modules/gdscript/gd_script.cpp17
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;
}