From 63fdbfb8cfdd2de5e3a67f16d2c1f5c207ea3729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 25 Nov 2013 12:59:14 +0100 Subject: [PATCH] Implement Module.eval_quoted in Elixir --- lib/elixir/lib/module.ex | 5 ++++- lib/elixir/src/elixir.erl | 7 ++++++- lib/elixir/src/elixir_module.erl | 19 +------------------ 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/elixir/lib/module.ex b/lib/elixir/lib/module.ex index f8d225f02a..d77b05a83b 100644 --- a/lib/elixir/lib/module.ex +++ b/lib/elixir/lib/module.ex @@ -352,7 +352,10 @@ defmodule Module do def eval_quoted(module, quoted, binding, opts) do assert_not_compiled!(:eval_quoted, module) - :elixir_module.eval_quoted(module, quoted, binding, opts) + :elixir_def.reset_last(module) + { value, binding, _scope } = + :elixir.eval_quoted [quoted], binding, Keyword.put(opts, :module, module) + { value, binding } end @doc """ diff --git a/lib/elixir/src/elixir.erl b/lib/elixir/src/elixir.erl index aa19e8918e..8576d8f67a 100644 --- a/lib/elixir/src/elixir.erl +++ b/lib/elixir/src/elixir.erl @@ -85,8 +85,13 @@ scope_for_eval(Scope, Opts) -> false -> Scope#elixir_scope.macros end, + Module = case lists:keyfind(module, 1, Opts) of + { module, ModuleOpt } when is_atom(ModuleOpt) -> ModuleOpt; + false -> nil + end, + Scope#elixir_scope{ - file=File, local=Local, + file=File, local=Local, module=Module, macros=Macros, functions=Functions, requires=Requires, aliases=Aliases }. diff --git a/lib/elixir/src/elixir_module.erl b/lib/elixir/src/elixir_module.erl index 67b9a8c77d..76848a60cb 100644 --- a/lib/elixir/src/elixir_module.erl +++ b/lib/elixir/src/elixir_module.erl @@ -1,6 +1,6 @@ -module(elixir_module). -export([compile/4, compile/5, data_table/1, docs_table/1, - eval_quoted/4, format_error/1, eval_callbacks/5]). + format_error/1, eval_callbacks/5]). -include("elixir.hrl"). -define(acc_attr, '__acc_attributes'). @@ -9,23 +9,6 @@ -define(persisted_attr, '__persisted_attributes'). -define(overridable_attr, '__overridable'). -eval_quoted(Module, Quoted, Binding, Opts) -> - Scope = scope_for_eval(Module, Opts), - elixir_def:reset_last(Module), - - case lists:keyfind(line, 1, Opts) of - { line, Line } -> Line; - false -> Line = 1 - end, - - { Value, FinalBinding, _Scope } = elixir:eval_quoted([Quoted], Binding, Line, Scope), - { Value, FinalBinding }. - -scope_for_eval(Module, #elixir_scope{} = S) -> - S#elixir_scope{module=Module}; -scope_for_eval(Module, Opts) -> - scope_for_eval(Module, elixir:scope_for_eval(Opts)). - %% TABLE METHODS data_table(Module) ->