File 1081-AArch64-Fix-is_function-2-for-arities-16.patch of Package erlang

From 2ae8f55478e29cd9aecc3f5be8a2cf519c6c1724 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Wed, 7 Jun 2023 08:50:15 +0200
Subject: [PATCH] AArch64: Fix is_function/2 for arities >= 16

---
 erts/emulator/beam/jit/arm/instr_common.cpp |  2 +-
 erts/emulator/test/fun_SUITE.erl            | 70 ++++++++++++++++++---
 2 files changed, 63 insertions(+), 9 deletions(-)

diff --git a/erts/emulator/beam/jit/arm/instr_common.cpp b/erts/emulator/beam/jit/arm/instr_common.cpp
index dc74eb27fe..0596f829c1 100644
--- a/erts/emulator/beam/jit/arm/instr_common.cpp
+++ b/erts/emulator/beam/jit/arm/instr_common.cpp
@@ -1059,7 +1059,7 @@ void BeamModuleAssembler::emit_is_function2(const ArgLabel &Fail,
     arm::Gp boxed_ptr = emit_ptr_val(TMP1, src.reg);
 
     a.ldurh(TMP2.w(), emit_boxed_val(boxed_ptr));
-    a.cmp(TMP2, imm(MAKE_FUN_HEADER(arity, 0, 0) & 0xFFFF));
+    cmp(TMP2, MAKE_FUN_HEADER(arity, 0, 0) & 0xFFFF);
     a.b_ne(resolve_beam_label(Fail, disp1MB));
 }
 
diff --git a/erts/emulator/test/fun_SUITE.erl b/erts/emulator/test/fun_SUITE.erl
index 10cfc53a97..113ceb3690 100644
--- a/erts/emulator/test/fun_SUITE.erl
+++ b/erts/emulator/test/fun_SUITE.erl
@@ -698,20 +698,36 @@ t_arity(Config) when is_list(Config) ->
 t_is_function2(Config) when is_list(Config) ->
     false = is_function(id({a,b}), 0),
     false = is_function(id({a,b}), 234343434333433433),
-    true = is_function(fun() -> ok end, 0),
-    true = is_function(fun(_) -> ok end, 1),
-    false = is_function(fun(_) -> ok end, 0),
+    true = is_function(id(fun() -> ok end), 0),
+    true = is_function(id(fun(_) -> ok end), 1),
+    false = is_function(id(fun(_) -> ok end), 0),
 
-    true = is_function(fun erlang:abs/1, 1),
-    true = is_function(fun erlang:abs/99, 99),
-    false = is_function(fun erlang:abs/1, 0),
-    false = is_function(fun erlang:abs/99, 0),
+    true = is_function(id(fun erlang:abs/1), 1),
+    true = is_function(id(fun erlang:abs/99), 99),
+    false = is_function(id(fun erlang:abs/1), 0),
+    false = is_function(id(fun erlang:abs/99), 0),
 
     false = is_function(id(self()), 0),
     false = is_function(id({a,b,c}), 0),
     false = is_function(id({a}), 0),
     false = is_function(id([a,b,c]), 0),
 
+    %% Larger arities.
+    F16 = id(fun f/16),
+    F255 = id(fun f/255),
+
+    false = is_function(id(self()), 16),
+    true = is_function(F16, 16),
+    ok = id(if is_function(F16, 16) -> ok; true -> error end),
+    false = is_function(F255, 16),
+    error = id(if is_function(F255, 16) -> ok; true -> error end),
+
+    false = is_function(id(self()), 255),
+    true = is_function(F255, 255),
+    false = is_function(F16, 255),
+    error = id(if is_function(F16, 255) -> ok; true -> error end),
+    ok = id(if is_function(F255, 255) -> ok; true -> error end),
+
     %% Bad arity argument.
     bad_arity(a),
     bad_arity(-1),
@@ -723,7 +739,7 @@ t_is_function2(Config) when is_list(Config) ->
     bad_arity(self()),
 
     %% Bad arity argument in guard test.
-    Fun = fun erlang:abs/1,
+    Fun = id(fun erlang:abs/1),
     ok = if
              is_function(Fun, -1) -> error;
              is_function(Fun, 256) -> error;
@@ -733,6 +749,44 @@ t_is_function2(Config) when is_list(Config) ->
          end,
     ok.
 
+f(_A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8,
+  _A9, _A10, _A11, _A12, _A13, _A14, _A15, _A16) ->
+    ok.
+
+f(_A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8,
+  _A9, _A10, _A11, _A12, _A13, _A14, _A15, _A16,
+  _A17, _A18, _A19, _A20, _A21, _A22, _A23, _A24,
+  _A25, _A26, _A27, _A28, _A29, _A30, _A31, _A32,
+  _A33, _A34, _A35, _A36, _A37, _A38, _A39, _A40,
+  _A41, _A42, _A43, _A44, _A45, _A46, _A47, _A48,
+  _A49, _A50, _A51, _A52, _A53, _A54, _A55, _A56,
+  _A57, _A58, _A59, _A60, _A61, _A62, _A63, _A64,
+  _A65, _A66, _A67, _A68, _A69, _A70, _A71, _A72,
+  _A73, _A74, _A75, _A76, _A77, _A78, _A79, _A80,
+  _A81, _A82, _A83, _A84, _A85, _A86, _A87, _A88,
+  _A89, _A90, _A91, _A92, _A93, _A94, _A95, _A96,
+  _A97, _A98, _A99, _A100, _A101, _A102, _A103, _A104,
+  _A105, _A106, _A107, _A108, _A109, _A110, _A111, _A112,
+  _A113, _A114, _A115, _A116, _A117, _A118, _A119, _A120,
+  _A121, _A122, _A123, _A124, _A125, _A126, _A127, _A128,
+  _A129, _A130, _A131, _A132, _A133, _A134, _A135, _A136,
+  _A137, _A138, _A139, _A140, _A141, _A142, _A143, _A144,
+  _A145, _A146, _A147, _A148, _A149, _A150, _A151, _A152,
+  _A153, _A154, _A155, _A156, _A157, _A158, _A159, _A160,
+  _A161, _A162, _A163, _A164, _A165, _A166, _A167, _A168,
+  _A169, _A170, _A171, _A172, _A173, _A174, _A175, _A176,
+  _A177, _A178, _A179, _A180, _A181, _A182, _A183, _A184,
+  _A185, _A186, _A187, _A188, _A189, _A190, _A191, _A192,
+  _A193, _A194, _A195, _A196, _A197, _A198, _A199, _A200,
+  _A201, _A202, _A203, _A204, _A205, _A206, _A207, _A208,
+  _A209, _A210, _A211, _A212, _A213, _A214, _A215, _A216,
+  _A217, _A218, _A219, _A220, _A221, _A222, _A223, _A224,
+  _A225, _A226, _A227, _A228, _A229, _A230, _A231, _A232,
+  _A233, _A234, _A235, _A236, _A237, _A238, _A239, _A240,
+  _A241, _A242, _A243, _A244, _A245, _A246, _A247, _A248,
+  _A249, _A250, _A251, _A252, _A253, _A254, _A255) ->
+    ok.
+
 bad_arity(A) ->
     {'EXIT',_} = (catch is_function(fun() -> ok end, A)),
     {'EXIT',_} = (catch is_function(no_fun, A)),
-- 
2.35.3

openSUSE Build Service is sponsored by