From 59c41bba956bf399a195c2f1c8c1192073853630 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Thu, 7 Jun 2018 13:08:07 +0200
Subject: stdlib: Move eval_str/1 from mod_esi to erl_eval

See also https://bugs.erlang.org/browse/ERL-634.

The utility program `erl_call' in erl_interface used to call
lib:eval_str/1, which is no longer present in Erlang/OTP 21.0.

The lib module was eliminated in OTP-15072, see also
https://github.com/erlang/otp/pull/1786.
---
 .../test/r9c_SUITE_data/src/inets/mod_esi.erl      | 44 +--------------------
 lib/erl_interface/src/prog/erl_call.c              |  4 +-
 lib/inets/src/http_server/mod_esi.erl              | 46 +---------------------
 lib/stdlib/src/erl_eval.erl                        | 46 +++++++++++++++++++++-
 4 files changed, 50 insertions(+), 90 deletions(-)

(limited to 'lib')

diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl
index ce144e061f..52db2d9096 100644
--- a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl
@@ -285,7 +285,7 @@ eval(Info,"GET",CGIBody,Modules) ->
 	    "~n   Modules: ~p",[Modules]),
     case auth(CGIBody,Modules) of
 	true ->
-	    case eval_str(string:concat(CGIBody,". ")) of
+	    case erl_eval:eval_str(string:concat(CGIBody,". ")) of
 		{error,Reason} ->
 		    ?vlog("eval -> error:"
 			  "~n   Reason: ~p",[Reason]),
@@ -318,48 +318,6 @@ auth(CGIBody,Modules) ->
 	    false
     end.
 
-%% eval_str(InStr) -> {ok, OutStr} | {error, ErrStr'}
-%%   InStr must represent a body
-%%   Note: If InStr is a binary it has to be a Latin-1 string.
-%%   If you have a UTF-8 encoded binary you have to call
-%%   unicode:characters_to_list/1 before the call to eval_str().
-
--define(result(F,D), lists:flatten(io_lib:format(F, D))).
-
--spec eval_str(string() | unicode:latin1_binary()) ->
-                      {'ok', string()} | {'error', string()}.
-
-eval_str(Str) when is_list(Str) ->
-    case erl_scan:tokens([], Str, 0) of
-	{more, _} ->
-	    {error, "Incomplete form (missing .<cr>)??"};
-	{done, {ok, Toks, _}, Rest} ->
-	    case all_white(Rest) of
-		true ->
-		    case erl_parse:parse_exprs(Toks) of
-			{ok, Exprs} ->
-			    case catch erl_eval:exprs(Exprs, erl_eval:new_bindings()) of
-				{value, Val, _} ->
-				    {ok, Val};
-				Other ->
-				    {error, ?result("*** eval: ~p", [Other])}
-			    end;
-			{error, {_Line, Mod, Args}} ->
-                            Msg = ?result("*** ~ts",[Mod:format_error(Args)]),
-                            {error, Msg}
-		    end;
-		false ->
-		    {error, ?result("Non-white space found after "
-				    "end-of-form :~ts", [Rest])}
-		end
-    end.
-
-all_white([$\s|T]) -> all_white(T);
-all_white([$\n|T]) -> all_white(T);
-all_white([$\t|T]) -> all_white(T);
-all_white([])      -> true;
-all_white(_)       -> false.
-
 %%----------------------------------------------------------------------
 %%Creates the environment list that will be the first arg to the
 %%Functions that is called through the ErlScript Schema
diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c
index 66265b3e6a..52ad6885e8 100644
--- a/lib/erl_interface/src/prog/erl_call.c
+++ b/lib/erl_interface/src/prog/erl_call.c
@@ -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.
@@ -554,7 +554,7 @@ int erl_call(int argc, char **argv)
 
 	  /* erl_format("[~w]", erl_mk_binary(evalbuf,len))) */
 
-	  if (ei_rpc(&ec, fd, "lib", "eval_str", p, i, &reply) < 0) {
+	  if (ei_rpc(&ec, fd, "erl_eval", "eval_str", p, i, &reply) < 0) {
 	      fprintf(stderr,"erl_call: evaluating input failed: %s\n",
 		      evalbuf);
 	      free(p);
diff --git a/lib/inets/src/http_server/mod_esi.erl b/lib/inets/src/http_server/mod_esi.erl
index b49b3a7093..21aafa7f7b 100644
--- a/lib/inets/src/http_server/mod_esi.erl
+++ b/lib/inets/src/http_server/mod_esi.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-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.
@@ -561,7 +561,7 @@ eval(#mod{method = Method} = ModData, ESIBody, Modules)
     end.
 
 generate_webpage(ESIBody) ->
-    (catch eval_str(string:concat(ESIBody,". "))).
+    (catch erl_eval:eval_str(string:concat(ESIBody,". "))).
 
 is_authorized(_ESIBody, [all]) ->
     true;
@@ -573,45 +573,3 @@ is_authorized(ESIBody, Modules) ->
 	nomatch ->
 	    false
     end.
-
-%% eval_str(InStr) -> {ok, OutStr} | {error, ErrStr'}
-%%   InStr must represent a body
-%%   Note: If InStr is a binary it has to be a Latin-1 string.
-%%   If you have a UTF-8 encoded binary you have to call
-%%   unicode:characters_to_list/1 before the call to eval_str().
-
--define(result(F,D), lists:flatten(io_lib:format(F, D))).
-
--spec eval_str(string()) ->
-                      {'ok', string()} | {'error', string()}.
-
-eval_str(Str) when is_list(Str) ->
-    case erl_scan:tokens([], Str, 0) of
-	{more, _} ->
-	    {error, "Incomplete form (missing .<cr>)??"};
-	{done, {ok, Toks, _}, Rest} ->
-	    case all_white(Rest) of
-		true ->
-		    case erl_parse:parse_exprs(Toks) of
-			{ok, Exprs} ->
-			    case catch erl_eval:exprs(Exprs, erl_eval:new_bindings()) of
-				{value, Val, _} ->
-				    {ok, Val};
-				Other ->
-				    {error, ?result("*** eval: ~p", [Other])}
-			    end;
-			{error, {_Line, Mod, Args}} ->
-                            Msg = ?result("*** ~ts",[Mod:format_error(Args)]),
-                            {error, Msg}
-		    end;
-		false ->
-		    {error, ?result("Non-white space found after "
-				    "end-of-form :~ts", [Rest])}
-		end
-    end.
-
-all_white([$\s|T]) -> all_white(T);
-all_white([$\n|T]) -> all_white(T);
-all_white([$\t|T]) -> all_white(T);
-all_white([])      -> true;
-all_white(_)       -> false.
diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl
index 0f6d48b9a3..31c0e60fe1 100644
--- a/lib/stdlib/src/erl_eval.erl
+++ b/lib/stdlib/src/erl_eval.erl
@@ -29,7 +29,7 @@
 -export([new_bindings/0,bindings/1,binding/2,add_binding/3,del_binding/2]).
 -export([extended_parse_exprs/1, extended_parse_term/1,
          subst_values_for_vars/2]).
--export([is_constant_expr/1, partial_eval/1]).
+-export([is_constant_expr/1, partial_eval/1, eval_str/1]).
 
 %% Is used by standalone Erlang (escript).
 %% Also used by shell.erl.
@@ -1557,6 +1557,50 @@ ev_expr({cons,_,H,T}) -> [ev_expr(H) | ev_expr(T)].
 %%    true = erl_internal:guard_bif(F, length(As)),
 %%    apply(erlang, F, [ev_expr(X) || X <- As]);
 
+%% eval_str(InStr) -> {ok, OutStr} | {error, ErrStr'}
+%%   InStr must represent a body
+%%   Note: If InStr is a binary it has to be a Latin-1 string.
+%%   If you have a UTF-8 encoded binary you have to call
+%%   unicode:characters_to_list/1 before the call to eval_str().
+
+-define(result(F,D), lists:flatten(io_lib:format(F, D))).
+
+-spec eval_str(string() | unicode:latin1_binary()) ->
+                      {'ok', string()} | {'error', string()}.
+
+eval_str(Str) when is_list(Str) ->
+    case erl_scan:tokens([], Str, 0) of
+	{more, _} ->
+	    {error, "Incomplete form (missing .<cr>)??"};
+	{done, {ok, Toks, _}, Rest} ->
+	    case all_white(Rest) of
+		true ->
+		    case erl_parse:parse_exprs(Toks) of
+			{ok, Exprs} ->
+			    case catch erl_eval:exprs(Exprs, erl_eval:new_bindings()) of
+				{value, Val, _} ->
+				    {ok, Val};
+				Other ->
+				    {error, ?result("*** eval: ~p", [Other])}
+			    end;
+			{error, {_Line, Mod, Args}} ->
+                            Msg = ?result("*** ~ts",[Mod:format_error(Args)]),
+                            {error, Msg}
+		    end;
+		false ->
+		    {error, ?result("Non-white space found after "
+				    "end-of-form :~ts", [Rest])}
+		end
+    end;
+eval_str(Bin) when is_binary(Bin) ->
+    eval_str(binary_to_list(Bin)).
+
+all_white([$\s|T]) -> all_white(T);
+all_white([$\n|T]) -> all_white(T);
+all_white([$\t|T]) -> all_white(T);
+all_white([])      -> true;
+all_white(_)       -> false.
+
 ret_expr(_Old, New) ->
     %%    io:format("~w: reduced ~s => ~s~n",
     %%	      [line(Old), erl_pp:expr(Old), erl_pp:expr(New)]),
-- 
cgit v1.2.3