Skip to content

Commit 46fc45d

Browse files
author
José Valim
committed
Revert "Expand macros and quoted variables inside << >>, closes #1063"
It broke the build. Reopens #1063. This reverts commit 93f71c8.
1 parent 93f71c8 commit 46fc45d

File tree

2 files changed

+44
-66
lines changed

2 files changed

+44
-66
lines changed

lib/elixir/src/elixir_literal.erl

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ translate({ '<<>>', Meta, Args } = Original, S) when is_list(Args) ->
1010
error ->
1111
case S#elixir_scope.context of
1212
match ->
13-
build_bitstr(fun elixir_translator:translate_each/2, Args, Meta, nil, S);
13+
build_bitstr(fun elixir_translator:translate_each/2, Args, Meta, S);
1414
_ ->
15-
{ TArgs, { SC, SV } } = build_bitstr(fun elixir_translator:translate_arg/2, Args, Meta, nil, { S, S }),
15+
{ TArgs, { SC, SV } } = build_bitstr(fun elixir_translator:translate_arg/2, Args, Meta, { S, S }),
1616
{ TArgs, umergec(SV, SC) }
1717
end;
1818
Else -> Else
@@ -75,72 +75,58 @@ translate(Bitstring, S) when is_bitstring(Bitstring) ->
7575
% * If '::' is given, extract the bitstring information
7676
% * All the other types are simply translated and handled with Erlang's default
7777
%
78-
build_bitstr(Fun, Exprs, Meta, Env, S) ->
79-
{ Final, FinalS } = build_bitstr_each(Fun, Exprs, Meta, Env, S, []),
78+
build_bitstr(Fun, Exprs, Meta, S) ->
79+
{ Final, FinalS } = build_bitstr_each(Fun, Exprs, Meta, S, []),
8080
{ { bin, ?line(Meta), lists:reverse(Final) }, FinalS }.
8181

82-
build_bitstr_each(_Fun, [], _Meta, _Env, S, Acc) ->
82+
build_bitstr_each(_Fun, [], _Meta, S, Acc) ->
8383
{ Acc, S };
8484

85-
build_bitstr_each(Fun, [{'::',_,[H,V]}|T], Meta, Env, S, Acc) ->
85+
build_bitstr_each(Fun, [{'::',_,[H,V]}|T], Meta, S, Acc) ->
8686
%% Variables defined outside the binary can be accounted
8787
%% on subparts, however we can't assign new variables.
8888
case S of
8989
{ ES, _ } -> []; %% translate_arg, no assigns
9090
_ -> ES = S#elixir_scope{context=nil} %% translate_each, revert assigns
9191
end,
9292

93-
{ ExpandedH, ExpandedEnv } = expand(Meta, H, Env, S),
94-
{ Size, Types } = extract_bit_values(Meta, V, ExpandedEnv, ES),
95-
build_bitstr_each(Fun, T, Meta, ExpandedEnv, S, Acc, ExpandedH, Size, Types);
93+
{ Size, Types } = extract_bit_values(Meta, V, ES),
94+
build_bitstr_each(Fun, T, Meta, S, Acc, H, Size, Types);
9695

97-
build_bitstr_each(Fun, [H|T], Meta, Env, S, Acc) ->
98-
{ ExpandedH, ExpandedEnv } = expand(Meta, H, Env, S),
99-
build_bitstr_each(Fun, T, Meta, ExpandedEnv, S, Acc, ExpandedH, default, default).
96+
build_bitstr_each(Fun, [H|T], Meta, S, Acc) ->
97+
build_bitstr_each(Fun, T, Meta, S, Acc, H, default, default).
10098

101-
expand(_Meta, H, Env, _S) when is_integer(H); is_float(H); is_atom(H); is_atom(H); is_bitstring(H) ->
102-
{ H, Env };
103-
104-
expand(Meta, H, nil, { S, _ }) ->
105-
expand(Meta, H, elixir_scope:to_ex_env({ ?line(Meta), S }), S);
106-
107-
expand(Meta, H, nil, S) ->
108-
expand(Meta, H, elixir_scope:to_ex_env({ ?line(Meta), S }), S);
109-
110-
expand(_Meta, H, Env, _S) ->
111-
{ 'Elixir.Macro':expand(H, Env), Env }.
112-
113-
build_bitstr_each(Fun, T, Meta, Env, S, Acc, H, Size, Types) when is_list(H) ->
99+
build_bitstr_each(Fun, T, Meta, S, Acc, H, Size, Types) when is_list(H) ->
114100
case is_default_or_utf(Types) of
115101
true ->
116102
{ NewAcc, NewS } = lists:foldl(fun(L, { LA, LS }) ->
117103
{ FL, FS } = Fun(L, LS),
118104
{ [{ bin_element, ?line(Meta), FL, Size, Types }|LA], FS }
119105
end, { Acc, S }, H),
120-
build_bitstr_each(Fun, T, Meta, Env, NewS, NewAcc);
106+
build_bitstr_each(Fun, T, Meta, NewS, NewAcc);
121107
false ->
122-
build_bitstr_default(Fun, T, Meta, Env, S, Acc, H, Size, Types)
108+
build_bitstr_default(Fun, T, Meta, S, Acc, H, Size, Types)
123109
end;
124110

125-
build_bitstr_each(Fun, T, Meta, Env, S, Acc, H, Size, Types) when is_bitstring(H) ->
111+
build_bitstr_each(Fun, T, Meta, S, Acc, H, Size, Types) when is_bitstring(H) ->
126112
case is_default_or_utf(Types) of
127113
true ->
128114
Line = ?line(Meta),
129115
{ bin, _, Elements } = elixir_tree_helpers:elixir_to_erl(H),
130116
NewAcc = lists:foldl(fun({ bin_element, _, Expr, _, _ }, FinalAcc) ->
131117
[{ bin_element, Line, Expr, Size, Types }|FinalAcc]
132118
end, Acc, Elements),
133-
build_bitstr_each(Fun, T, Meta, Env, S, NewAcc);
119+
build_bitstr_each(Fun, T, Meta, S, NewAcc);
134120
false ->
135-
build_bitstr_default(Fun, T, Meta, Env, S, Acc, H, Size, Types)
121+
build_bitstr_default(Fun, T, Meta, S, Acc, H, Size, Types)
136122
end;
137123

138-
build_bitstr_each(Fun, T, Meta, Env, S, Acc, H, Size, Types) ->
139-
build_bitstr_default(Fun, T, Meta, Env, S, Acc, H, Size, Types).
124+
build_bitstr_each(Fun, T, Meta, S, Acc, H, Size, Types) ->
125+
build_bitstr_default(Fun, T, Meta, S, Acc, H, Size, Types).
140126

141-
build_bitstr_default(Fun, T, Meta, Env, S, Acc, H, Size, Types) ->
127+
build_bitstr_default(Fun, T, Meta, S, Acc, H, Size, Types) ->
142128
{ Expr, NS } = Fun(H, S),
143-
build_bitstr_each(Fun, T, Meta, Env, NS, [{ bin_element, ?line(Meta), Expr, Size, Types }|Acc]).
129+
build_bitstr_each(Fun, T, Meta, NS, [{ bin_element, ?line(Meta), Expr, Size, Types }|Acc]).
144130

145131
is_default_or_utf(default) -> true;
146132
is_default_or_utf([UTF|_]) when UTF == utf8; UTF == utf16; UTF == utf32 -> true;
@@ -149,46 +135,46 @@ is_default_or_utf([]) -> false.
149135

150136
%% Extra bitstring specifiers
151137

152-
extract_bit_values(Meta, V, Env, S) when is_list(V) ->
153-
extract_bit_values(Meta, V, default, [], Env, S);
138+
extract_bit_values(Meta, V, S) when is_list(V) ->
139+
extract_bit_values(Meta, V, default, [], S);
154140

155-
extract_bit_values(Meta, V, Env, S) ->
156-
extract_bit_values(Meta, [V], Env, S).
141+
extract_bit_values(Meta, V, S) ->
142+
extract_bit_values(Meta, [V], S).
157143

158-
extract_bit_values(Meta, [{ Value, _Meta, Atom }|T] = All, Size, Types, Env, S)
144+
extract_bit_values(Meta, [{ Value, _Meta, Atom }|T] = All, Size, Types, S)
159145
when is_atom(Value) andalso (is_atom(Atom) orelse Atom == []) ->
160146
case extract_bit_type(Value, Types) of
161147
{ error, unknown } ->
162-
handle_unknown_specifier(Meta, All, Size, Types, Env, S);
148+
handle_unknown_specifier(Meta, All, Size, Types, S);
163149
NewTypes when is_list(NewTypes) ->
164-
extract_bit_values(Meta, T, Size, NewTypes, Env, S)
150+
extract_bit_values(Meta, T, Size, NewTypes, S)
165151
end;
166152

167-
extract_bit_values(Meta, [{ Value, CallMeta, [_] = Args }|T] = All, Size, Types, Env, S) when is_atom(Value) ->
153+
extract_bit_values(Meta, [{ Value, CallMeta, [_] = Args }|T] = All, Size, Types, S) when is_atom(Value) ->
168154
{ TArgs, _ } = elixir_translator:translate_args(Args, S),
169155
case extract_bit_type_or_size(Value, TArgs, Size, Types) of
170156
{ error, unknown } ->
171-
handle_unknown_specifier(Meta, All, Size, Types, Env, S);
157+
handle_unknown_specifier(Meta, All, Size, Types, S);
172158
{ error, Msg } ->
173159
elixir_errors:syntax_error(CallMeta, S#elixir_scope.file, Msg);
174160
{ NewSize, NewTypes } ->
175-
extract_bit_values(Meta, T, NewSize, NewTypes, Env, S)
161+
extract_bit_values(Meta, T, NewSize, NewTypes, S)
176162
end;
177163

178-
extract_bit_values(Meta, [Size|T], default, Types, Env, S) when is_integer(Size) andalso Size >= 0 ->
179-
extract_bit_values(Meta, T, {integer, Meta, Size}, Types, Env, S);
164+
extract_bit_values(Meta, [Size|T], default, Types, S) when is_integer(Size) andalso Size >= 0 ->
165+
extract_bit_values(Meta, T, {integer, Meta, Size}, Types, S);
180166

181-
extract_bit_values(Meta, [{ '|', _, [Left, Right] }], Size, Types, Env, S) ->
182-
{ Expanded, ExpandedEnv } = expand(Meta, Right, Env, S),
183-
extract_bit_values(Meta, [Left|join_expansion(Expanded,[])], Size, Types, ExpandedEnv, S);
167+
extract_bit_values(Meta, [{ '|', _, [Left, Right] }], Size, Types, S) ->
168+
Expanded = 'Elixir.Macro':expand(Right, elixir_scope:to_ex_env({ ?line(Meta), S })),
169+
extract_bit_values(Meta, [Left|join_expansion(Expanded,[])], Size, Types, S);
184170

185-
extract_bit_values(Meta, [_|_] = All, Size, Types, Env, S) ->
186-
handle_unknown_specifier(Meta, All, Size, Types, Env, S);
171+
extract_bit_values(Meta, [_|_] = All, Size, Types, S) ->
172+
handle_unknown_specifier(Meta, All, Size, Types, S);
187173

188-
extract_bit_values(_Meta, [], Size, [], _Env, _S) ->
174+
extract_bit_values(_Meta, [], Size, [], _S) ->
189175
{ Size, default };
190176

191-
extract_bit_values(_Meta, [], Size, Types, _Env, _S) ->
177+
extract_bit_values(_Meta, [], Size, Types, _S) ->
192178
{ Size, lists:reverse(Types) }.
193179

194180
extract_bit_type(Value, Types) when
@@ -220,12 +206,12 @@ extract_bit_type_or_size(unit, _Args, _Other, _Types) ->
220206
extract_bit_type_or_size(_Value, _Args, _Other, _Types) ->
221207
{ error, unknown }.
222208

223-
handle_unknown_specifier(Meta, [H|T], Size, Types, Env, S) ->
224-
case expand(Meta, H, Env, S) of
225-
{ H, _ } ->
209+
handle_unknown_specifier(Meta, [H|T], Size, Types, S) ->
210+
case 'Elixir.Macro':expand(H, elixir_scope:to_ex_env({ ?line(Meta), S })) of
211+
H ->
226212
elixir_errors:syntax_error(Meta, S#elixir_scope.file, "unknown bitstring specifier ~ts", ['Elixir.Macro':to_binary(H)]);
227-
{ E, ExpandedEnv } ->
228-
extract_bit_values(Meta, join_expansion(E,T), Size, Types, ExpandedEnv, S)
213+
E ->
214+
extract_bit_values(Meta, join_expansion(E,T), Size, Types, S)
229215
end.
230216

231217
join_expansion({ '__block__', _, [Expanded] }, Tail) -> join_expansion(Expanded, Tail);

lib/elixir/test/elixir/binary_test.exs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,6 @@ bar
9898
assert <<0,0,0,106,0,0,0,111,0,0,0,115,0,0,0,101>> == << 'jose' :: utf32 >>
9999
end
100100

101-
@binary "new "
102-
@charlist 'old '
103-
104-
test :bitsyntax_with_expansion do
105-
assert <<@binary, "world">> == "new world"
106-
assert <<@charlist, "world">> == "old world"
107-
end
108-
109101
test :bitsyntax_translation do
110102
refb = "sample"
111103
sec_data = "another"

0 commit comments

Comments
 (0)