aboutsummaryrefslogtreecommitdiff
path: root/modules/gdscript
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/gd_functions.cpp5
-rw-r--r--modules/gdscript/gd_parser.cpp27
-rw-r--r--modules/gdscript/gd_parser.h1
-rw-r--r--modules/gdscript/gd_script.cpp86
4 files changed, 76 insertions, 43 deletions
diff --git a/modules/gdscript/gd_functions.cpp b/modules/gdscript/gd_functions.cpp
index e015ddb65..9b7d8eeac 100644
--- a/modules/gdscript/gd_functions.cpp
+++ b/modules/gdscript/gd_functions.cpp
@@ -1355,9 +1355,12 @@ MethodInfo GDFunctions::get_info(Function p_func) {
return mi;
} break;
case TYPE_OF: {
+
MethodInfo mi("typeof",PropertyInfo(Variant::NIL,"what"));
mi.return_val.type=Variant::INT;
- };
+ return mi;
+
+ } break;
case TEXT_STR: {
MethodInfo mi("str",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp
index c4175e048..b6e847884 100644
--- a/modules/gdscript/gd_parser.cpp
+++ b/modules/gdscript/gd_parser.cpp
@@ -283,13 +283,23 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_
return NULL;
}
tokenizer->advance();
- if (tokenizer->get_token()!=GDTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type()!=Variant::STRING) {
- _set_error("Expected string constant as 'preload' argument.");
+
+ String path;
+ bool valid = false;
+ Node *subexpr = _parse_and_reduce_expression(p_parent, p_static);
+ if (subexpr) {
+ if (subexpr->type == Node::TYPE_CONSTANT) {
+ ConstantNode *cn = static_cast<ConstantNode*>(subexpr);
+ if (cn->value.get_type() == Variant::STRING) {
+ valid = true;
+ path = (String) cn->value;
+ }
+ }
+ }
+ if (!valid) {
+ _set_error("expected string constant as 'preload' argument.");
return NULL;
}
-
-
- String path = tokenizer->get_token_constant();
if (!path.is_abs_path() && base_path!="")
path=base_path+"/"+path;
path = path.replace("///","//").simplify_path();
@@ -322,8 +332,6 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_
}
}
- tokenizer->advance();
-
if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_CLOSE) {
_set_error("Expected ')' after 'preload' path");
return NULL;
@@ -3145,6 +3153,11 @@ Error GDParser::parse(const String& p_code, const String& p_base_path, bool p_ju
return ret;
}
+bool GDParser::is_tool_script() const {
+
+ return (head && head->type==Node::TYPE_CLASS && static_cast<const ClassNode*>(head)->tool);
+}
+
const GDParser::Node *GDParser::get_parse_tree() const {
return head;
diff --git a/modules/gdscript/gd_parser.h b/modules/gdscript/gd_parser.h
index 9ad863396..6c49c1df5 100644
--- a/modules/gdscript/gd_parser.h
+++ b/modules/gdscript/gd_parser.h
@@ -454,6 +454,7 @@ public:
Error parse(const String& p_code, const String& p_base_path="", bool p_just_validate=false,const String& p_self_path="",bool p_for_completion=false);
Error parse_bytecode(const Vector<uint8_t> &p_bytecode,const String& p_base_path="",const String& p_self_path="");
+ bool is_tool_script() const;
const Node *get_parse_tree() const;
//completion info
diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp
index 9a3f50d3b..1b2ed670a 100644
--- a/modules/gdscript/gd_script.cpp
+++ b/modules/gdscript/gd_script.cpp
@@ -1874,19 +1874,27 @@ Error GDScript::reload() {
if (ScriptDebugger::get_singleton()) {
GDScriptLanguage::get_singleton()->debug_break_parse(get_path(),parser.get_error_line(),"Parser Error: "+parser.get_error());
}
- _err_print_error("GDScript::reload",path.empty()?"built-in":(const char*)path.utf8().get_data(),parser.get_error_line(),("Parse Error: "+parser.get_error()).utf8().get_data());
+ _err_print_error("GDScript::reload",path.empty()?"built-in":(const char*)path.utf8().get_data(),parser.get_error_line(),("Parse Error: "+parser.get_error()).utf8().get_data(),ERR_HANDLER_SCRIPT);
ERR_FAIL_V(ERR_PARSE_ERROR);
}
+
+ bool can_run = ScriptServer::is_scripting_enabled() || parser.is_tool_script();
+
GDCompiler compiler;
err = compiler.compile(&parser,this);
if (err) {
- if (ScriptDebugger::get_singleton()) {
- GDScriptLanguage::get_singleton()->debug_break_parse(get_path(),compiler.get_error_line(),"Parser Error: "+compiler.get_error());
+
+ if (can_run) {
+ if (ScriptDebugger::get_singleton()) {
+ GDScriptLanguage::get_singleton()->debug_break_parse(get_path(),compiler.get_error_line(),"Parser Error: "+compiler.get_error());
+ }
+ _err_print_error("GDScript::reload",path.empty()?"built-in":(const char*)path.utf8().get_data(),compiler.get_error_line(),("Compile Error: "+compiler.get_error()).utf8().get_data(),ERR_HANDLER_SCRIPT);
+ ERR_FAIL_V(ERR_COMPILATION_FAILED);
+ } else {
+ return err;
}
- _err_print_error("GDScript::reload",path.empty()?"built-in":(const char*)path.utf8().get_data(),compiler.get_error_line(),("Compile Error: "+compiler.get_error()).utf8().get_data());
- ERR_FAIL_V(ERR_COMPILATION_FAILED);
}
valid=true;
@@ -2053,7 +2061,7 @@ Error GDScript::load_byte_code(const String& p_path) {
GDParser parser;
Error err = parser.parse_bytecode(bytecode,basedir,get_path());
if (err) {
- _err_print_error("GDScript::load_byte_code",path.empty()?"built-in":(const char*)path.utf8().get_data(),parser.get_error_line(),("Parse Error: "+parser.get_error()).utf8().get_data());
+ _err_print_error("GDScript::load_byte_code",path.empty()?"built-in":(const char*)path.utf8().get_data(),parser.get_error_line(),("Parse Error: "+parser.get_error()).utf8().get_data(),ERR_HANDLER_SCRIPT);
ERR_FAIL_V(ERR_PARSE_ERROR);
}
@@ -2061,7 +2069,7 @@ Error GDScript::load_byte_code(const String& p_path) {
err = compiler.compile(&parser,this);
if (err) {
- _err_print_error("GDScript::load_byte_code",path.empty()?"built-in":(const char*)path.utf8().get_data(),compiler.get_error_line(),("Compile Error: "+compiler.get_error()).utf8().get_data());
+ _err_print_error("GDScript::load_byte_code",path.empty()?"built-in":(const char*)path.utf8().get_data(),compiler.get_error_line(),("Compile Error: "+compiler.get_error()).utf8().get_data(),ERR_HANDLER_SCRIPT);
ERR_FAIL_V(ERR_COMPILATION_FAILED);
}
@@ -2448,6 +2456,7 @@ void GDInstance::get_method_list(List<MethodInfo> *p_list) const {
MethodInfo mi;
mi.name=E->key();
+ mi.flags|=METHOD_FLAG_FROM_SCRIPT;
for(int i=0;i<E->get().get_argument_count();i++)
mi.arguments.push_back(PropertyInfo(Variant::NIL,"arg"+itos(i)));
p_list->push_back(mi);
@@ -2669,40 +2678,47 @@ void GDScriptLanguage::frame() {
void GDScriptLanguage::get_reserved_words(List<String> *p_words) const {
static const char *_reserved_words[]={
- "break",
- "class",
- "continue",
- "const",
- "else",
- "elif",
- "enum",
- "extends" ,
- "onready",
- "for" ,
- "func" ,
- "if" ,
- "in" ,
- "null" ,
- "not" ,
- "return" ,
- "self" ,
- "while" ,
- "true" ,
- "false" ,
- "tool",
- "var",
- "setget",
- "pass",
+ // operators
"and",
+ "in",
+ "not",
"or",
- "export",
+ // types and values
+ "false",
+ "float",
+ "int",
+ "null",
+ "PI",
+ "self",
+ "true",
+ // functions
"assert",
"breakpoint",
+ "class",
+ "extends",
+ "func",
+ "preload",
+ "setget",
+ "signal",
+ "tool",
"yield",
+ // var
+ "const",
+ "enum",
+ "export",
+ "onready",
"static",
- "float",
- "int",
- "signal",
+ "var",
+ // control flow
+ "break",
+ "continue",
+ "if",
+ "elif",
+ "else",
+ "for",
+ "pass",
+ "return",
+ "while",
0};