summaryrefslogtreecommitdiff
path: root/modules/gdscript/gd_script.h
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/gd_script.h')
-rw-r--r--modules/gdscript/gd_script.h68
1 files changed, 56 insertions, 12 deletions
diff --git a/modules/gdscript/gd_script.h b/modules/gdscript/gd_script.h
index 55bc547e8d..62787cf6f8 100644
--- a/modules/gdscript/gd_script.h
+++ b/modules/gdscript/gd_script.h
@@ -37,6 +37,8 @@
class GDInstance;
class GDScript;
+
+
class GDFunction {
public:
@@ -58,6 +60,9 @@ public:
OPCODE_CALL_BUILT_IN,
OPCODE_CALL_SELF,
OPCODE_CALL_SELF_BASE,
+ OPCODE_YIELD,
+ OPCODE_YIELD_SIGNAL,
+ OPCODE_YIELD_RESUME,
OPCODE_JUMP,
OPCODE_JUMP_IF,
OPCODE_JUMP_IF_NOT,
@@ -75,13 +80,14 @@ public:
ADDR_MASK=((1<<ADDR_BITS)-1),
ADDR_TYPE_MASK=~ADDR_MASK,
ADDR_TYPE_SELF=0,
- ADDR_TYPE_MEMBER=1,
- ADDR_TYPE_CLASS_CONSTANT=2,
- ADDR_TYPE_LOCAL_CONSTANT=3,
- ADDR_TYPE_STACK=4,
- ADDR_TYPE_STACK_VARIABLE=5,
- ADDR_TYPE_GLOBAL=6,
- ADDR_TYPE_NIL=7
+ ADDR_TYPE_CLASS=1,
+ ADDR_TYPE_MEMBER=2,
+ ADDR_TYPE_CLASS_CONSTANT=3,
+ ADDR_TYPE_LOCAL_CONSTANT=4,
+ ADDR_TYPE_STACK=5,
+ ADDR_TYPE_STACK_VARIABLE=6,
+ ADDR_TYPE_GLOBAL=7,
+ ADDR_TYPE_NIL=8
};
struct StackDebug {
@@ -117,10 +123,13 @@ friend class GDCompiler;
Vector<Variant> constants;
Vector<StringName> global_names;
Vector<int> default_arguments;
-
Vector<int> code;
+#ifdef DEBUG_ENABLED
+ CharString func_cname;
+ const char*_func_cname;
+#endif
- List<StackDebug> stack_debug;
+ List<StackDebug> stack_debug;
_FORCE_INLINE_ Variant *_get_variant(int p_address,GDInstance *p_instance,GDScript *p_script,Variant &self,Variant *p_stack,String& r_error) const;
_FORCE_INLINE_ String _get_call_error(const Variant::CallError& p_err, const String& p_where,const Variant**argptrs) const;
@@ -128,6 +137,20 @@ friend class GDCompiler;
public:
+ struct CallState {
+
+ GDInstance *instance;
+ Vector<uint8_t> stack;
+ int stack_size;
+ Variant self;
+ uint32_t alloca_size;
+ GDScript *_class;
+ int ip;
+ int line;
+ int defarg;
+ Variant result;
+
+ };
_FORCE_INLINE_ bool is_static() const { return _static; }
@@ -139,19 +162,37 @@ public:
int get_max_stack_size() const;
int get_default_argument_count() const;
int get_default_argument_addr(int p_idx) const;
- GDScript *get_script() const { return _script; }
+ GDScript *get_script() const { return _script; }
- void debug_get_stack_member_state(int p_line,List<Pair<StringName,int> > *r_stackvars) const;
+ void debug_get_stack_member_state(int p_line,List<Pair<StringName,int> > *r_stackvars) const;
_FORCE_INLINE_ bool is_empty() const { return _code_size==0; }
int get_argument_count() const { return _argument_count; }
- Variant call(GDInstance *p_instance,const Variant **p_args, int p_argcount,Variant::CallError& r_err);
+ Variant call(GDInstance *p_instance,const Variant **p_args, int p_argcount,Variant::CallError& r_err,CallState *p_state=NULL);
GDFunction();
};
+class GDFunctionState : public Reference {
+
+ OBJ_TYPE(GDFunctionState,Reference);
+friend class GDFunction;
+ GDFunction *function;
+ GDFunction::CallState state;
+ Variant _signal_callback(const Variant** p_args, int p_argcount, Variant::CallError& r_error);
+protected:
+ static void _bind_methods();
+public:
+
+ bool is_valid() const;
+ Variant resume(const Variant& p_arg=Variant());
+ GDFunctionState();
+ ~GDFunctionState();
+};
+
+
class GDNativeClass : public Reference {
OBJ_TYPE(GDNativeClass,Reference);
@@ -179,10 +220,12 @@ class GDScript : public Script {
bool valid;
+
friend class GDInstance;
friend class GDFunction;
friend class GDCompiler;
friend class GDFunctions;
+ Variant _static_ref; //used for static call
Ref<GDNativeClass> native;
Ref<GDScript> base;
GDScript *_base; //fast pointer access
@@ -425,6 +468,7 @@ public:
virtual int find_function(const String& p_function,const String& p_code) const;
virtual String make_function(const String& p_class,const String& p_name,const StringArray& p_args) const;
virtual Error complete_keyword(const String& p_code, int p_line, const String& p_base_path,const String& p_keyword, List<String>* r_options);
+ virtual void auto_indent_code(String& p_code,int p_from_line,int p_to_line) const;
/* DEBUGGER FUNCTIONS */