LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 0323-stdlib-Add-a-few-uses-of-erl_anno.patch of Package erlang (Project home:Ledest:erlang:20)

From 9015e696e61abbc9088dfa4cd333c56985d05e61 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Tue, 12 Jun 2018 15:25:45 +0200
Subject: [PATCH] stdlib: Add a few uses of erl_anno

With DEBUG=true in erl_anno, erl_parse, and erl_pp a few (harmless)
non-opaque accesses of annotations were found.
---
 lib/stdlib/src/beam_lib.erl | 23 +++++++++++++++++------
 lib/stdlib/src/erl_eval.erl | 15 ++++++++++++---
 lib/stdlib/src/erl_pp.erl   |  4 ++--
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl
index ef4c7d255c..01181b1097 100644
--- a/lib/stdlib/src/beam_lib.erl
+++ b/lib/stdlib/src/beam_lib.erl
@@ -690,30 +690,31 @@ chunk_to_data(debug_info=Id, Chunk, File, _Cs, AtomTable, Mod) ->
 	<<0:8,N:8,Mode0:N/binary,Rest/binary>> ->
 	    Mode = binary_to_atom(Mode0, utf8),
 	    Term = decrypt_chunk(Mode, Mod, File, Id, Rest),
-	    {AtomTable, {Id, Term}};
+	    {AtomTable, {Id, anno_from_term(Term)}};
 	_ ->
 	    case catch binary_to_term(Chunk) of
 		{'EXIT', _} ->
 		    error({invalid_chunk, File, chunk_name_to_id(Id, File)});
 		Term ->
-                    {AtomTable, {Id, Term}}
+                    {AtomTable, {Id, anno_from_term(Term)}}
 	    end
     end;
 chunk_to_data(abstract_code=Id, Chunk, File, _Cs, AtomTable, Mod) ->
+    %% Before Erlang/OTP 20.0.
     case Chunk of
 	<<>> ->
 	    {AtomTable, {Id, no_abstract_code}};
 	<<0:8,N:8,Mode0:N/binary,Rest/binary>> ->
 	    Mode = binary_to_atom(Mode0, utf8),
 	    Term = decrypt_chunk(Mode, Mod, File, Id, Rest),
-	    {AtomTable, {Id, anno_from_term(Term)}};
+	    {AtomTable, {Id, old_anno_from_term(Term)}};
 	_ ->
 	    case catch binary_to_term(Chunk) of
 		{'EXIT', _} ->
 		    error({invalid_chunk, File, chunk_name_to_id(Id, File)});
 		Term ->
                     try
-                        {AtomTable, {Id, anno_from_term(Term)}}
+                        {AtomTable, {Id, old_anno_from_term(Term)}}
                     catch
                         _:_ ->
                             error({invalid_chunk, File,
@@ -947,14 +948,24 @@ decrypt_chunk(Type, Module, File, Id, Bin) ->
 	    error({key_missing_or_invalid, File, Id})
     end.
 
-anno_from_term({raw_abstract_v1, Forms}) ->
+old_anno_from_term({raw_abstract_v1, Forms}) ->
     {raw_abstract_v1, anno_from_forms(Forms)};
-anno_from_term({Tag, Forms}) when Tag =:= abstract_v1; Tag =:= abstract_v2 ->
+old_anno_from_term({Tag, Forms}) when Tag =:= abstract_v1;
+                                      Tag =:= abstract_v2 ->
     try {Tag, anno_from_forms(Forms)}
     catch
         _:_ ->
             {Tag, Forms}
     end;
+old_anno_from_term(T) ->
+    T.
+
+anno_from_term({debug_info_v1=Tag1, erl_abstract_code=Tag2, {Forms, Opts}}) ->
+    try {Tag1, Tag2, {anno_from_forms(Forms), Opts}}
+    catch
+        _:_ ->
+            {Tag1, Tag2, {Forms, Opts}}
+    end;
 anno_from_term(T) ->
     T.
 
diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl
index 31c0e60fe1..2066b2f60f 100644
--- a/lib/stdlib/src/erl_eval.erl
+++ b/lib/stdlib/src/erl_eval.erl
@@ -325,7 +325,8 @@ expr({'fun',Line,{clauses,Cs}} = Ex, Bs, Lf, Ef, RBs) ->
         20 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) ->
            eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T], Info) end;
 	_Other ->
-	    erlang:raise(error, {'argument_limit',{'fun',Line,Cs}},
+            L = erl_anno:location(Line),
+	    erlang:raise(error, {'argument_limit',{'fun',L,to_terms(Cs)}},
 			 stacktrace())
     end,
     ret_expr(F, Bs, RBs);
@@ -377,7 +378,9 @@ expr({named_fun,Line,Name,Cs} = Ex, Bs, Lf, Ef, RBs) ->
            eval_named_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T],
                           RF, Info) end;
         _Other ->
-            erlang:raise(error, {'argument_limit',{named_fun,Line,Name,Cs}},
+            L = erl_anno:location(Line),
+            erlang:raise(error, {'argument_limit',
+                                 {named_fun,L,Name,to_terms(Cs)}},
                          stacktrace())
     end,
     ret_expr(F, Bs, RBs);
@@ -1073,7 +1076,7 @@ match(Pat, Term, Bs) ->
 match(Pat, Term, Bs, BBs) ->
     case catch match1(Pat, Term, Bs, BBs) of
 	invalid ->
-	    erlang:raise(error, {illegal_pattern,Pat}, stacktrace());
+	    erlang:raise(error, {illegal_pattern,to_term(Pat)}, stacktrace());
 	Other ->
 	    Other
     end.
@@ -1268,6 +1271,13 @@ merge_bindings(Bs1, Bs2) ->
 %% 		  error -> Bs
 %% 	      end
 %%       end, Bs2, Bs1).
+
+to_terms(Abstrs) ->
+    [to_term(Abstr) || Abstr <- Abstrs].
+
+to_term(Abstr) ->
+    erl_parse:anno_to_term(Abstr).
+
 %%----------------------------------------------------------------------------
 %%
 %% Evaluate expressions:
diff --git a/lib/stdlib/src/erl_pp.erl b/lib/stdlib/src/erl_pp.erl
index 367dbefb82..dd302a2880 100644
--- a/lib/stdlib/src/erl_pp.erl
+++ b/lib/stdlib/src/erl_pp.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 1996-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
 %%
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@
                 _ -> ?TEST(T)
             end).
 -define(EXPRS_TEST(L),
-        [?TEST(E) || E <- L]).
+        _ = [?TEST(E) || E <- L]).
 -define(TEST(T),
         %% Assumes that erl_anno has been compiled with DEBUG=true.
         %% erl_pp does not use the annoations, but test it anyway.
-- 
2.16.4