File 2371-Add-erts_debug-interpreter_size-0.patch of Package erlang

From 9dca10bd14a3ee5b2e491e8249f3d5de7b5a116c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 8 Apr 2019 15:00:06 +0200
Subject: [PATCH 1/2] Add erts_debug:interpreter_size/0

Add erts_debug:interpreter_size/0 for retrieving the approximate
size of the BEAM interpreter (process_main()).
---
 erts/emulator/beam/beam_debug.c | 16 ++++++++++++++++
 erts/emulator/beam/bif.tab      |  1 +
 lib/kernel/src/erts_debug.erl   |  6 ++++++
 3 files changed, 23 insertions(+)

diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c
index 762c5da9be..4d52435139 100644
--- a/erts/emulator/beam/beam_debug.c
+++ b/erts/emulator/beam/beam_debug.c
@@ -353,6 +353,22 @@ erts_debug_disassemble_1(BIF_ALIST_1)
     return TUPLE3(hp, addr, bin, mfa);
 }
 
+BIF_RETTYPE
+erts_debug_interpreter_size_0(BIF_ALIST_0)
+{
+    int i;
+    BeamInstr low, high;
+
+    low = high = (BeamInstr) process_main;
+    for (i = 0; i < NUM_SPECIFIC_OPS; i++) {
+        BeamInstr a = BeamOpCodeAddr(i);
+        if (a > high) {
+            high = a;
+        }
+    }
+    return erts_make_integer(high - low, BIF_P);
+}
+
 void
 dbg_bt(Process* p, Eterm* sp)
 {
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index 34a0be4f2d..db9c258cb7 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -437,6 +437,7 @@ bif erts_debug:set_internal_state/2
 bif erts_debug:display/1
 bif erts_debug:dist_ext_to_term/2
 bif erts_debug:instructions/0
+bif erts_debug:interpreter_size/0
 bif erts_debug:dirty_cpu/2
 bif erts_debug:dirty_io/2
 bif erts_debug:dirty/3
diff --git a/lib/kernel/src/erts_debug.erl b/lib/kernel/src/erts_debug.erl
index c4d276f9e8..e6a30d0b92 100644
--- a/lib/kernel/src/erts_debug.erl
+++ b/lib/kernel/src/erts_debug.erl
@@ -33,6 +33,7 @@
 
 -export([breakpoint/2, disassemble/1, display/1, dist_ext_to_term/2,
          flat_size/1, get_internal_state/1, instructions/0,
+         interpreter_size/0,
          map_info/1, same/2, set_internal_state/2,
          size_shared/1, copy_shared/1, dirty_cpu/2, dirty_io/2, dirty/3,
          lcnt_control/1, lcnt_control/2, lcnt_collect/0, lcnt_clear/0,
@@ -118,6 +119,11 @@ get_internal_state(_) ->
 instructions() ->
     erlang:nif_error(undef).
 
+-spec interpreter_size() -> pos_integer().
+
+interpreter_size() ->
+    erlang:nif_error(undef).
+
 -spec ic(F) -> Result when
       F :: function(),
       Result :: term().
-- 
2.16.4

openSUSE Build Service is sponsored by