summaryrefslogtreecommitdiff
path: root/modules/visual_script/visual_script.h
diff options
context:
space:
mode:
Diffstat (limited to 'modules/visual_script/visual_script.h')
-rw-r--r--modules/visual_script/visual_script.h82
1 files changed, 78 insertions, 4 deletions
diff --git a/modules/visual_script/visual_script.h b/modules/visual_script/visual_script.h
index c606604649..ddd215fb9c 100644
--- a/modules/visual_script/visual_script.h
+++ b/modules/visual_script/visual_script.h
@@ -2,7 +2,7 @@
#define VSCRIPT_H
#include "script_language.h"
-
+#include "os/thread.h"
class VisualScriptInstance;
class VisualScriptNodeInstance;
@@ -16,6 +16,7 @@ friend class VisualScript;
Set<VisualScript*> scripts_used;
Array default_input_values;
+ bool breakpoint;
void _set_default_input_values(Array p_values);
Array _get_default_input_values() const;
@@ -47,14 +48,19 @@ public:
virtual String get_text() const=0;
virtual String get_category() const=0;
+ //used by editor, this is not really saved
+ void set_breakpoint(bool p_breakpoint);
+ bool is_breakpoint() const;
+
virtual VisualScriptNodeInstance* instance(VisualScriptInstance* p_instance)=0;
+ VisualScriptNode();
};
class VisualScriptNodeInstance {
friend class VisualScriptInstance;
-
+friend class VisualScriptLanguage; //for debugger
enum { //input argument addressing
@@ -181,6 +187,8 @@ friend class VisualScriptInstance;
int function_id;
+ Vector2 scroll;
+
Function() { function_id=-1; }
@@ -225,12 +233,15 @@ public:
bool has_function(const StringName& p_name) const;
void remove_function(const StringName& p_name);
void rename_function(const StringName& p_name,const StringName& p_new_name);
+ void set_function_scroll(const StringName& p_name, const Vector2& p_scroll);
+ Vector2 get_function_scroll(const StringName& p_name) const;
void get_function_list(List<StringName> *r_functions) const;
int get_function_node_id(const StringName& p_name) const;
void add_node(const StringName& p_func,int p_id,const Ref<VisualScriptNode>& p_node,const Point2& p_pos=Point2());
void remove_node(const StringName& p_func,int p_id);
+ bool has_node(const StringName& p_func,int p_id) const;
Ref<VisualScriptNode> get_node(const StringName& p_func,int p_id) const;
void set_node_pos(const StringName& p_func,int p_id,const Point2& p_pos);
Point2 get_node_pos(const StringName& p_func,int p_id) const;
@@ -308,7 +319,6 @@ public:
class VisualScriptInstance : public ScriptInstance {
-
Object *owner;
Ref<VisualScript> script;
@@ -340,9 +350,10 @@ class VisualScriptInstance : public ScriptInstance {
Vector<Variant> default_values;
int max_input_args,max_output_args;
+ StringName source;
//Map<StringName,Function> functions;
-
+friend class VisualScriptLanguage; //for debugger
public:
virtual bool set(const StringName& p_name, const Variant& p_value);
virtual bool get(const StringName& p_name, Variant &r_ret) const;
@@ -396,6 +407,23 @@ class VisualScriptLanguage : public ScriptLanguage {
Map<String,VisualScriptNodeRegisterFunc> register_funcs;
+ struct CallLevel {
+
+ Variant *stack;
+ Variant **work_mem;
+ const StringName *function;
+ VisualScriptInstance *instance;
+ int *current_id;
+
+ };
+
+
+ int _debug_parse_err_node;
+ String _debug_parse_err_file;
+ String _debug_error;
+ int _debug_call_stack_pos;
+ int _debug_max_call_stack;
+ CallLevel *_call_stack;
public:
StringName notification;
@@ -404,6 +432,52 @@ public:
Mutex *lock;
+ bool debug_break(const String& p_error,bool p_allow_continue=true);
+ bool debug_break_parse(const String& p_file, int p_node,const String& p_error);
+
+ _FORCE_INLINE_ void enter_function(VisualScriptInstance *p_instance,const StringName* p_function, Variant *p_stack, Variant **p_work_mem,int *current_id) {
+
+ if (Thread::get_main_ID()!=Thread::get_caller_ID())
+ return; //no support for other threads than main for now
+
+ if (ScriptDebugger::get_singleton()->get_lines_left()>0 && ScriptDebugger::get_singleton()->get_depth()>=0)
+ ScriptDebugger::get_singleton()->set_depth( ScriptDebugger::get_singleton()->get_depth() +1 );
+
+ if (_debug_call_stack_pos >= _debug_max_call_stack) {
+ //stack overflow
+ _debug_error="Stack Overflow (Stack Size: "+itos(_debug_max_call_stack)+")";
+ ScriptDebugger::get_singleton()->debug(this);
+ return;
+ }
+
+ _call_stack[_debug_call_stack_pos].stack=p_stack;
+ _call_stack[_debug_call_stack_pos].instance=p_instance;
+ _call_stack[_debug_call_stack_pos].function=p_function;
+ _call_stack[_debug_call_stack_pos].work_mem=p_work_mem;
+ _call_stack[_debug_call_stack_pos].current_id=current_id;
+ _debug_call_stack_pos++;
+ }
+
+ _FORCE_INLINE_ void exit_function() {
+
+ if (Thread::get_main_ID()!=Thread::get_caller_ID())
+ return; //no support for other threads than main for now
+
+ if (ScriptDebugger::get_singleton()->get_lines_left()>0 && ScriptDebugger::get_singleton()->get_depth()>=0)
+ ScriptDebugger::get_singleton()->set_depth( ScriptDebugger::get_singleton()->get_depth() -1 );
+
+ if (_debug_call_stack_pos==0) {
+
+ _debug_error="Stack Underflow (Engine Bug)";
+ ScriptDebugger::get_singleton()->debug(this);
+ return;
+ }
+
+ _debug_call_stack_pos--;
+ }
+
+ //////////////////////////////////////
+
virtual String get_name() const;
/* LANGUAGE FUNCTIONS */