Skip to content

Commit 0b624ff

Browse files
author
José Valim
committed
Allow IEx to take over itself
1 parent 5c4b8fb commit 0b624ff

File tree

1 file changed

+6
-13
lines changed

1 file changed

+6
-13
lines changed

lib/iex/lib/iex/server.ex

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,11 @@ defmodule IEx.Server do
3434
current process.
3535
"""
3636
@spec take_over(binary, Keyword.t, pos_integer) ::
37-
:ok | { :error, :self } | { :error, :no_iex } | { :error, :refused }
37+
:ok | { :error, :no_iex } | { :error, :refused }
3838
def take_over(identifier, opts, timeout // 1000, server // whereis()) do
3939
cond do
4040
nil?(server) ->
4141
{ :error, :no_iex }
42-
whereis_evaluator(server) == self ->
43-
{ :error, :self }
4442
true ->
4543
ref = make_ref()
4644
server <- { :take?, self, ref }
@@ -63,13 +61,6 @@ defmodule IEx.Server do
6361
end
6462
end
6563

66-
defp whereis_evaluator(server) do
67-
case server && Process.info(server, :dictionary) do
68-
{ :dictionary, dict } -> dict[:evaluator]
69-
_ -> nil
70-
end
71-
end
72-
7364
@doc """
7465
Starts IEx by executing a given callback and spawning
7566
the server only after the callback is done.
@@ -126,15 +117,17 @@ defmodule IEx.Server do
126117
end
127118

128119
defp reset_loop(opts, evaluator, evaluator_ref) do
129-
exit_loop(evaluator, evaluator_ref)
120+
exit_loop(evaluator, evaluator_ref, opts[:evaluator] != evaluator)
130121
IO.write [IO.ANSI.home, IO.ANSI.clear]
131122
run(opts)
132123
end
133124

134-
defp exit_loop(evaluator, evaluator_ref) do
125+
defp exit_loop(evaluator, evaluator_ref, done? // true) do
135126
Process.delete(:evaluator)
136127
Process.demonitor(evaluator_ref)
137-
evaluator <- { :done, self }
128+
if done? do
129+
evaluator <- { :done, self }
130+
end
138131
:ok
139132
end
140133

0 commit comments

Comments
 (0)