Merge pull request #43049 from RandomShaper/fix_gone_script_3.2
Fix script used as type gone too early (3.2)
This commit is contained in:
commit
82bc682082
@ -2338,12 +2338,20 @@ Variant::Variant(const RID &p_rid) {
|
|||||||
Variant::Variant(const Object *p_object) {
|
Variant::Variant(const Object *p_object) {
|
||||||
|
|
||||||
type = OBJECT;
|
type = OBJECT;
|
||||||
|
Object *obj = const_cast<Object *>(p_object);
|
||||||
|
|
||||||
memnew_placement(_data._mem, ObjData);
|
memnew_placement(_data._mem, ObjData);
|
||||||
|
Reference *ref = Object::cast_to<Reference>(obj);
|
||||||
|
if (unlikely(ref)) {
|
||||||
|
*reinterpret_cast<Ref<Reference> *>(_get_obj().ref.get_data()) = Ref<Reference>(ref);
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
_get_obj().rc = p_object ? const_cast<Object *>(p_object)->_use_rc() : NULL;
|
_get_obj().rc = NULL;
|
||||||
#else
|
} else {
|
||||||
_get_obj().obj = const_cast<Object *>(p_object);
|
_get_obj().rc = likely(obj) ? obj->_use_rc() : NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if !defined(DEBUG_ENABLED)
|
||||||
|
_get_obj().obj = obj;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -914,7 +914,6 @@ void GDScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
|
|||||||
GDScript::GDScript() :
|
GDScript::GDScript() :
|
||||||
script_list(this) {
|
script_list(this) {
|
||||||
|
|
||||||
_static_ref = this;
|
|
||||||
valid = false;
|
valid = false;
|
||||||
subclass_count = 0;
|
subclass_count = 0;
|
||||||
initializer = NULL;
|
initializer = NULL;
|
||||||
|
@ -73,7 +73,6 @@ class GDScript : public Script {
|
|||||||
friend class GDScriptFunctions;
|
friend class GDScriptFunctions;
|
||||||
friend class GDScriptLanguage;
|
friend class GDScriptLanguage;
|
||||||
|
|
||||||
Variant _static_ref; //used for static call
|
|
||||||
Ref<GDScriptNativeClass> native;
|
Ref<GDScriptNativeClass> native;
|
||||||
Ref<GDScript> base;
|
Ref<GDScript> base;
|
||||||
GDScript *_base; //fast pointer access
|
GDScript *_base; //fast pointer access
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
#include "gdscript.h"
|
#include "gdscript.h"
|
||||||
#include "gdscript_functions.h"
|
#include "gdscript_functions.h"
|
||||||
|
|
||||||
Variant *GDScriptFunction::_get_variant(int p_address, GDScriptInstance *p_instance, GDScript *p_script, Variant &self, Variant *p_stack, String &r_error) const {
|
Variant *GDScriptFunction::_get_variant(int p_address, GDScriptInstance *p_instance, GDScript *p_script, Variant &self, Variant &static_ref, Variant *p_stack, String &r_error) const {
|
||||||
|
|
||||||
int address = p_address & ADDR_MASK;
|
int address = p_address & ADDR_MASK;
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ Variant *GDScriptFunction::_get_variant(int p_address, GDScriptInstance *p_insta
|
|||||||
} break;
|
} break;
|
||||||
case ADDR_TYPE_CLASS: {
|
case ADDR_TYPE_CLASS: {
|
||||||
|
|
||||||
return &p_script->_static_ref;
|
return &static_ref;
|
||||||
} break;
|
} break;
|
||||||
case ADDR_TYPE_MEMBER: {
|
case ADDR_TYPE_MEMBER: {
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
@ -269,6 +269,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||||||
r_err.error = Variant::CallError::CALL_OK;
|
r_err.error = Variant::CallError::CALL_OK;
|
||||||
|
|
||||||
Variant self;
|
Variant self;
|
||||||
|
Variant static_ref;
|
||||||
Variant retvalue;
|
Variant retvalue;
|
||||||
Variant *stack = NULL;
|
Variant *stack = NULL;
|
||||||
Variant **call_args;
|
Variant **call_args;
|
||||||
@ -385,6 +386,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static_ref = script;
|
||||||
|
|
||||||
String err_text;
|
String err_text;
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
@ -403,10 +406,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||||||
#define CHECK_SPACE(m_space) \
|
#define CHECK_SPACE(m_space) \
|
||||||
GD_ERR_BREAK((ip + m_space) > _code_size)
|
GD_ERR_BREAK((ip + m_space) > _code_size)
|
||||||
|
|
||||||
#define GET_VARIANT_PTR(m_v, m_code_ofs) \
|
#define GET_VARIANT_PTR(m_v, m_code_ofs) \
|
||||||
Variant *m_v; \
|
Variant *m_v; \
|
||||||
m_v = _get_variant(_code_ptr[ip + m_code_ofs], p_instance, script, self, stack, err_text); \
|
m_v = _get_variant(_code_ptr[ip + m_code_ofs], p_instance, script, self, static_ref, stack, err_text); \
|
||||||
if (unlikely(!m_v)) \
|
if (unlikely(!m_v)) \
|
||||||
OPCODE_BREAK;
|
OPCODE_BREAK;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -414,7 +417,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||||||
#define CHECK_SPACE(m_space)
|
#define CHECK_SPACE(m_space)
|
||||||
#define GET_VARIANT_PTR(m_v, m_code_ofs) \
|
#define GET_VARIANT_PTR(m_v, m_code_ofs) \
|
||||||
Variant *m_v; \
|
Variant *m_v; \
|
||||||
m_v = _get_variant(_code_ptr[ip + m_code_ofs], p_instance, script, self, stack, err_text);
|
m_v = _get_variant(_code_ptr[ip + m_code_ofs], p_instance, script, self, static_ref, stack, err_text);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ private:
|
|||||||
|
|
||||||
List<StackDebug> stack_debug;
|
List<StackDebug> stack_debug;
|
||||||
|
|
||||||
_FORCE_INLINE_ Variant *_get_variant(int p_address, GDScriptInstance *p_instance, GDScript *p_script, Variant &self, Variant *p_stack, String &r_error) const;
|
_FORCE_INLINE_ Variant *_get_variant(int p_address, GDScriptInstance *p_instance, GDScript *p_script, Variant &self, Variant &static_ref, 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;
|
_FORCE_INLINE_ String _get_call_error(const Variant::CallError &p_err, const String &p_where, const Variant **argptrs) const;
|
||||||
|
|
||||||
friend class GDScriptLanguage;
|
friend class GDScriptLanguage;
|
||||||
|
Loading…
Reference in New Issue
Block a user