GDScript: Don't use pool for reference types
Since they need to be properly initialized and finalized to adjust the reference counter.
This commit is contained in:
parent
4ab0b38940
commit
59b8c70007
1 changed files with 47 additions and 51 deletions
|
@ -69,56 +69,52 @@ uint32_t GDScriptByteCodeGenerator::add_or_get_name(const StringName &p_name) {
|
|||
|
||||
uint32_t GDScriptByteCodeGenerator::add_temporary(const GDScriptDataType &p_type) {
|
||||
Variant::Type temp_type = Variant::NIL;
|
||||
if (p_type.has_type) {
|
||||
if (p_type.kind == GDScriptDataType::BUILTIN) {
|
||||
switch (p_type.builtin_type) {
|
||||
case Variant::NIL:
|
||||
case Variant::BOOL:
|
||||
case Variant::INT:
|
||||
case Variant::FLOAT:
|
||||
case Variant::STRING:
|
||||
case Variant::VECTOR2:
|
||||
case Variant::VECTOR2I:
|
||||
case Variant::RECT2:
|
||||
case Variant::RECT2I:
|
||||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR3I:
|
||||
case Variant::TRANSFORM2D:
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I:
|
||||
case Variant::PLANE:
|
||||
case Variant::QUATERNION:
|
||||
case Variant::AABB:
|
||||
case Variant::BASIS:
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
case Variant::COLOR:
|
||||
case Variant::STRING_NAME:
|
||||
case Variant::NODE_PATH:
|
||||
case Variant::RID:
|
||||
case Variant::OBJECT:
|
||||
case Variant::CALLABLE:
|
||||
case Variant::SIGNAL:
|
||||
case Variant::DICTIONARY:
|
||||
case Variant::ARRAY:
|
||||
temp_type = p_type.builtin_type;
|
||||
break;
|
||||
case Variant::PACKED_BYTE_ARRAY:
|
||||
case Variant::PACKED_INT32_ARRAY:
|
||||
case Variant::PACKED_INT64_ARRAY:
|
||||
case Variant::PACKED_FLOAT32_ARRAY:
|
||||
case Variant::PACKED_FLOAT64_ARRAY:
|
||||
case Variant::PACKED_STRING_ARRAY:
|
||||
case Variant::PACKED_VECTOR2_ARRAY:
|
||||
case Variant::PACKED_VECTOR3_ARRAY:
|
||||
case Variant::PACKED_COLOR_ARRAY:
|
||||
case Variant::VARIANT_MAX:
|
||||
// Packed arrays are reference counted, so we don't use the pool for them.
|
||||
temp_type = Variant::NIL;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
temp_type = Variant::OBJECT;
|
||||
if (p_type.has_type && p_type.kind == GDScriptDataType::BUILTIN) {
|
||||
switch (p_type.builtin_type) {
|
||||
case Variant::NIL:
|
||||
case Variant::BOOL:
|
||||
case Variant::INT:
|
||||
case Variant::FLOAT:
|
||||
case Variant::STRING:
|
||||
case Variant::VECTOR2:
|
||||
case Variant::VECTOR2I:
|
||||
case Variant::RECT2:
|
||||
case Variant::RECT2I:
|
||||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR3I:
|
||||
case Variant::TRANSFORM2D:
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I:
|
||||
case Variant::PLANE:
|
||||
case Variant::QUATERNION:
|
||||
case Variant::AABB:
|
||||
case Variant::BASIS:
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
case Variant::COLOR:
|
||||
case Variant::STRING_NAME:
|
||||
case Variant::NODE_PATH:
|
||||
case Variant::RID:
|
||||
case Variant::CALLABLE:
|
||||
case Variant::SIGNAL:
|
||||
temp_type = p_type.builtin_type;
|
||||
break;
|
||||
case Variant::OBJECT:
|
||||
case Variant::DICTIONARY:
|
||||
case Variant::ARRAY:
|
||||
case Variant::PACKED_BYTE_ARRAY:
|
||||
case Variant::PACKED_INT32_ARRAY:
|
||||
case Variant::PACKED_INT64_ARRAY:
|
||||
case Variant::PACKED_FLOAT32_ARRAY:
|
||||
case Variant::PACKED_FLOAT64_ARRAY:
|
||||
case Variant::PACKED_STRING_ARRAY:
|
||||
case Variant::PACKED_VECTOR2_ARRAY:
|
||||
case Variant::PACKED_VECTOR3_ARRAY:
|
||||
case Variant::PACKED_COLOR_ARRAY:
|
||||
case Variant::VARIANT_MAX:
|
||||
// Arrays, dictionaries, and objects are reference counted, so we don't use the pool for them.
|
||||
temp_type = Variant::NIL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,7 +139,7 @@ void GDScriptByteCodeGenerator::pop_temporary() {
|
|||
ERR_FAIL_COND(used_temporaries.is_empty());
|
||||
int slot_idx = used_temporaries.back()->get();
|
||||
const StackSlot &slot = temporaries[slot_idx];
|
||||
if (slot.type == Variant::OBJECT) {
|
||||
if (slot.type == Variant::NIL) {
|
||||
// Avoid keeping in the stack long-lived references to objects,
|
||||
// which may prevent RefCounted objects from being freed.
|
||||
write_assign_false(Address(Address::TEMPORARY, slot_idx));
|
||||
|
|
Loading…
Reference in a new issue