diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c
index b970acd85c8e5..08c09e8ff1773 100644
--- a/Zend/zend_observer.c
+++ b/Zend/zend_observer.c
@@ -229,6 +229,7 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end(
zend_execute_data *ex = execute_data->prev_execute_data;
while (ex && (!ex->func || ex->func->type == ZEND_INTERNAL_FUNCTION
|| !ZEND_OBSERVABLE_FN(ex->func->common.fn_flags)
+ || !&RUN_TIME_CACHE(&ex->func->op_array)
|| !ZEND_OBSERVER_DATA(&ex->func->op_array)
|| ZEND_OBSERVER_DATA(&ex->func->op_array) == ZEND_OBSERVER_NOT_OBSERVED)) {
ex = ex->prev_execute_data;
diff --git a/ext/zend_test/tests/observer_bug81430_1.phpt b/ext/zend_test/tests/observer_bug81430_1.phpt
new file mode 100644
index 0000000000000..830112b1b5370
--- /dev/null
+++ b/ext/zend_test/tests/observer_bug81430_1.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #81430 (Attribute instantiation frame has no run time cache)
+--INI--
+memory_limit=20M
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+getAttributes(A::class)[0], 'newInstance']);
+?>
+--EXPECTF--
+
+
+
+
+
+
diff --git a/ext/zend_test/tests/observer_bug81430_2.phpt b/ext/zend_test/tests/observer_bug81430_2.phpt
new file mode 100644
index 0000000000000..d0f23c371c4d7
--- /dev/null
+++ b/ext/zend_test/tests/observer_bug81430_2.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Bug #81430 (Attribute instantiation leaves dangling execute_data pointer)
+--INI--
+memory_limit=20M
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--XFAIL--
+The stack allocated execute_data is invalid in zend_observer_fcall_end_all
+--FILE--
+getAttributes(A::class)[0], 'newInstance']);
+?>
+--EXPECTF--
+
+
+
+
+
+Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d
+
+