mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
GDScript: Fix crash caused by uninitialized temp stack slots
This adds initialization to every typed temporary stack slot at the beginning of the function call instead of emitting instructions, since those might be in a conditional branch and not be called.
This commit is contained in:
parent
c3002c0955
commit
10a1f64968
3 changed files with 49 additions and 7 deletions
|
@ -152,6 +152,44 @@ String GDScriptFunction::_get_call_error(const Callable::CallError &p_err, const
|
|||
return err_text;
|
||||
}
|
||||
|
||||
void (*type_init_function_table[])(Variant *) = {
|
||||
nullptr, // NIL (shouldn't be called).
|
||||
&VariantInitializer<bool>::init, // BOOL.
|
||||
&VariantInitializer<int64_t>::init, // INT.
|
||||
&VariantInitializer<double>::init, // FLOAT.
|
||||
&VariantInitializer<String>::init, // STRING.
|
||||
&VariantInitializer<Vector2>::init, // VECTOR2.
|
||||
&VariantInitializer<Vector2i>::init, // VECTOR2I.
|
||||
&VariantInitializer<Rect2>::init, // RECT2.
|
||||
&VariantInitializer<Rect2i>::init, // RECT2I.
|
||||
&VariantInitializer<Vector3>::init, // VECTOR3.
|
||||
&VariantInitializer<Vector3i>::init, // VECTOR3I.
|
||||
&VariantInitializer<Transform2D>::init, // TRANSFORM2D.
|
||||
&VariantInitializer<Plane>::init, // PLANE.
|
||||
&VariantInitializer<Quat>::init, // QUAT.
|
||||
&VariantInitializer<AABB>::init, // AABB.
|
||||
&VariantInitializer<Basis>::init, // BASIS.
|
||||
&VariantInitializer<Transform>::init, // TRANSFORM.
|
||||
&VariantInitializer<Color>::init, // COLOR.
|
||||
&VariantInitializer<StringName>::init, // STRING_NAME.
|
||||
&VariantInitializer<NodePath>::init, // NODE_PATH.
|
||||
&VariantInitializer<RID>::init, // RID.
|
||||
&VariantTypeAdjust<Object *>::adjust, // OBJECT.
|
||||
&VariantInitializer<Callable>::init, // CALLABLE.
|
||||
&VariantInitializer<Signal>::init, // SIGNAL.
|
||||
&VariantInitializer<Dictionary>::init, // DICTIONARY.
|
||||
&VariantInitializer<Array>::init, // ARRAY.
|
||||
&VariantInitializer<PackedByteArray>::init, // PACKED_BYTE_ARRAY.
|
||||
&VariantInitializer<PackedInt32Array>::init, // PACKED_INT32_ARRAY.
|
||||
&VariantInitializer<PackedInt64Array>::init, // PACKED_INT64_ARRAY.
|
||||
&VariantInitializer<PackedFloat32Array>::init, // PACKED_FLOAT32_ARRAY.
|
||||
&VariantInitializer<PackedFloat64Array>::init, // PACKED_FLOAT64_ARRAY.
|
||||
&VariantInitializer<PackedStringArray>::init, // PACKED_STRING_ARRAY.
|
||||
&VariantInitializer<PackedVector2Array>::init, // PACKED_VECTOR2_ARRAY.
|
||||
&VariantInitializer<PackedVector3Array>::init, // PACKED_VECTOR3_ARRAY.
|
||||
&VariantInitializer<PackedColorArray>::init, // PACKED_COLOR_ARRAY.
|
||||
};
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define OPCODES_TABLE \
|
||||
static const void *switch_table_ops[] = { \
|
||||
|
@ -491,6 +529,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
|
||||
memnew_placement(&stack[ADDR_STACK_CLASS], Variant(script));
|
||||
|
||||
for (const Map<int, Variant::Type>::Element *E = temporary_slots.front(); E; E = E->next()) {
|
||||
type_init_function_table[E->get()](&stack[E->key()]);
|
||||
}
|
||||
|
||||
String err_text;
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue