summaryrefslogtreecommitdiff
path: root/modules/gdscript
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/gd_compiler.cpp21
-rw-r--r--modules/gdscript/gd_script.cpp47
-rw-r--r--modules/gdscript/gd_script.h2
3 files changed, 65 insertions, 5 deletions
diff --git a/modules/gdscript/gd_compiler.cpp b/modules/gdscript/gd_compiler.cpp
index e6dd9d9ae1..45eac23450 100644
--- a/modules/gdscript/gd_compiler.cpp
+++ b/modules/gdscript/gd_compiler.cpp
@@ -724,6 +724,8 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
return prev_pos;
int retval=prev_pos;
+ //print_line("retval: "+itos(retval));
+
if (retval&GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS) {
slevel++;
codegen.alloc_stack(slevel);
@@ -732,6 +734,8 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
Vector<int> setchain;
+ int prev_key_idx=-1;
+
for(List<GDParser::OperatorNode*>::Element *E=chain.back();E;E=E->prev()) {
@@ -743,16 +747,23 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
if (named) {
- key_idx = codegen.get_name_map_pos(static_cast<const GDParser::IdentifierNode*>(E->get()->arguments[1])->name);
+ key_idx = codegen.get_name_map_pos(static_cast<const GDParser::IdentifierNode*>(E->get()->arguments[1])->name);
+ //printf("named key %x\n",key_idx);
+
} else {
- GDParser::Node *key = E->get()->arguments[1];
- key_idx = _parse_expression(codegen,key,slevel);
- if (retval&GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS) {
+ if (prev_pos&(GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS)) {
slevel++;
codegen.alloc_stack(slevel);
}
+ GDParser::Node *key = E->get()->arguments[1];
+ key_idx = _parse_expression(codegen,key,slevel);
+ //printf("expr key %x\n",key_idx);
+
+
+ //stack was raised here if retval was stack but..
+
}
if (key_idx<0)
@@ -764,6 +775,7 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
slevel++;
codegen.alloc_stack(slevel);
int dst_pos = (GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS)|slevel;
+
codegen.opcodes.push_back(dst_pos);
//add in reverse order, since it will be reverted
@@ -773,6 +785,7 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
setchain.push_back(named ? GDFunction::OPCODE_SET_NAMED : GDFunction::OPCODE_SET);
prev_pos=dst_pos;
+ prev_key_idx=key_idx;
}
diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp
index 10053d4260..49d92e0746 100644
--- a/modules/gdscript/gd_script.cpp
+++ b/modules/gdscript/gd_script.cpp
@@ -1492,7 +1492,9 @@ Variant GDScript::_new(const Variant** p_args,int p_argcount,Variant::CallError&
bool GDScript::can_instance() const {
- return valid; //any script in GDscript can instance
+ //return valid; //any script in GDscript can instance
+ return valid || (!tool && !ScriptServer::is_scripting_enabled());
+
}
StringName GDScript::get_instance_base_type() const {
@@ -1565,8 +1567,10 @@ void GDScript::_update_placeholder(PlaceHolderScriptInstance *p_placeholder) {
#endif
ScriptInstance* GDScript::instance_create(Object *p_this) {
+
if (!tool && !ScriptServer::is_scripting_enabled()) {
+
#ifdef TOOLS_ENABLED
//instance a fake script for editing the values
@@ -1620,7 +1624,48 @@ String GDScript::get_source_code() const {
void GDScript::set_source_code(const String& p_code) {
source=p_code;
+}
+
+void GDScript::update_exports() {
+
+#ifdef TOOLS_ENABLED
+ String basedir=path;
+
+ if (basedir=="")
+ basedir=get_path();
+
+ if (basedir!="")
+ basedir=basedir.get_base_dir();
+
+ GDParser parser;
+ Error err = parser.parse(source,basedir,true);
+ if (err)
+ return; //do none
+ const GDParser::Node* root = parser.get_parse_tree();
+ ERR_FAIL_COND(root->type!=GDParser::Node::TYPE_CLASS);
+
+ const GDParser::ClassNode *c = static_cast<const GDParser::ClassNode*>(root);
+
+ List<PropertyInfo> plist;
+
+ Map<StringName,Variant> default_values;
+
+ for(int i=0;i<c->variables.size();i++) {
+ if (c->variables[i]._export.type==Variant::NIL)
+ continue;
+
+ plist.push_back(c->variables[i]._export);
+ default_values[c->variables[i].identifier]=c->variables[i].default_value;
+ }
+
+
+ for (Set<PlaceHolderScriptInstance*>::Element *E=placeholders.front();E;E=E->next()) {
+
+ E->get()->update(plist,default_values);
+ }
+
+#endif
}
void GDScript::_set_subclass_path(Ref<GDScript>& p_sc,const String& p_path) {
diff --git a/modules/gdscript/gd_script.h b/modules/gdscript/gd_script.h
index 62787cf6f8..2088606271 100644
--- a/modules/gdscript/gd_script.h
+++ b/modules/gdscript/gd_script.h
@@ -299,6 +299,8 @@ public:
virtual bool has_source_code() const;
virtual String get_source_code() const;
virtual void set_source_code(const String& p_code);
+ virtual void update_exports();
+
virtual Error reload();
virtual String get_node_type() const;