@@ -3839,7 +3839,7 @@ erts_max_heap_size(Eterm arg, Uint *max_heap_size, Uint *max_heap_flags)
38393839 return 1 ;
38403840}
38413841
3842- #ifdef DEBUG
3842+ #if defined( DEBUG ) && defined( ERLANG_FRAME_POINTERS )
38433843void erts_validate_stack (Process * p , Eterm * frame_ptr , Eterm * stack_top ) {
38443844 Eterm * stack_bottom = HEAP_END (p );
38453845 Eterm * next_fp = frame_ptr ;
@@ -3858,18 +3858,19 @@ void erts_validate_stack(Process *p, Eterm *frame_ptr, Eterm *stack_top) {
38583858 However the return trace intructions do update p->i after returning.
38593859 */
38603860 if (BeamIsReturnTrace (p -> i )) {
3861- /* Skip MFA and tracer. */
3862- ASSERT_MFA ((ErtsCodeMFA * )cp_val (scanner [0 ]));
3863- ASSERT (IS_TRACER_VALID (scanner [1 ]));
3861+ assert_return_trace_frame (scanner );
38643862 scanner += BEAM_RETURN_TRACE_FRAME_SZ ;
38653863 } else if (BeamIsReturnCallAccTrace (p -> i )) {
3866- /* Skip prev_info. */
3864+ assert_return_call_acc_trace_frame ( scanner );
38673865 scanner += BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ ;
38683866 } else if (BeamIsReturnToTrace (p -> i )) {
3867+ assert_return_to_trace_frame (scanner );
38693868 scanner += BEAM_RETURN_TO_TRACE_FRAME_SZ ;
38703869 }
38713870
38723871 while (next_fp ) {
3872+ ErtsCodePtr cp ;
3873+
38733874 ASSERT (next_fp >= stack_top && next_fp <= stack_bottom );
38743875
38753876 /* We may not skip any frames. */
@@ -3879,24 +3880,24 @@ void erts_validate_stack(Process *p, Eterm *frame_ptr, Eterm *stack_top) {
38793880 }
38803881
38813882 /* {Next frame, Return address} or vice versa */
3882- ASSERT (is_CP (scanner [0 ]) && is_CP (scanner [1 ]));
38833883 next_fp = (Eterm * )cp_val (scanner [0 ]);
3884+ cp = cp_val (scanner [1 ]);
3885+
3886+ scanner += CP_SIZE ;
38843887
38853888 /* Call tracing may store raw pointers on the stack. This is explicitly
38863889 * handled in all routines that deal with the stack. */
3887- if (BeamIsReturnTrace ((ErtsCodePtr )scanner [1 ])) {
3888- /* Skip MFA and tracer. */
3889- ASSERT_MFA ((ErtsCodeMFA * )cp_val (scanner [2 ]));
3890- ASSERT (IS_TRACER_VALID (scanner [3 ]));
3890+ if (BeamIsReturnTrace (cp )) {
3891+ assert_return_trace_frame (scanner );
38913892 scanner += BEAM_RETURN_TRACE_FRAME_SZ ;
3892- } else if (BeamIsReturnCallAccTrace (( ErtsCodePtr ) scanner [ 1 ] )) {
3893- /* Skip prev_info. */
3893+ } else if (BeamIsReturnCallAccTrace (cp )) {
3894+ assert_return_call_acc_trace_frame ( scanner );
38943895 scanner += BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ ;
3895- } else if (BeamIsReturnToTrace ((ErtsCodePtr )scanner [1 ])) {
3896+ } else if (BeamIsReturnToTrace (cp )) {
3897+ assert_return_to_trace_frame (scanner );
38963898 scanner += BEAM_RETURN_TO_TRACE_FRAME_SZ ;
38973899 }
38983900
3899- scanner += CP_SIZE ;
39003901 }
39013902}
39023903#endif
0 commit comments