[erlang-questions] Erlang/OTP 20.0, atoms and function names with Unicode

Björn Gustavsson bjorn@REDACTED
Sat May 6 08:38:00 CEST 2017


The line numbers in the stacktrace don't make any sense.
For example, line 213 is a comment, not executable code
in commit 9ac8bdb.

Therefore I suspect that you somewhere have an older
version of beam_asm.beam that is somehow found
instead of the correct one.

You can use beam_asm:module_info(md5) to compute
the MD5 and compare it with my output below.
You could also try code:which(beam_asm) and make
sure that the path is correct.

$ bin/erl +pc unicode
Erlang/OTP 20 [RELEASE CANDIDATE 1] [erts-9.0] [source-9ac8bdb19f]
[64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe]
[kernel-poll:false]

Eshell V9.0  (abort with ^G)
1> c(hello).
{ok,hello}
2> hello:main([]).
{'hello_юникод',<<"Hello, 世界; юникод"/utf8>>,"Hello, 世界; юникод"}
{"Hello, 世界, юникод"}
ok
3> beam_asm:module_info(md5).
<<159,89,125,255,14,214,31,228,207,196,247,228,180,227,92,
  181>>

/Björn


On Sat, May 6, 2017 at 3:47 AM, derek <denc716@REDACTED> wrote:
> No; I built this from current `master@REDACTED`, it seems nothing changed,
> either erlc or c() from erlang shell still doesn't compile
> it prompts error in line 213 of beam_asm.erl, but line 213 of this file
> doesn't have call to list_to_binary; as I read, it seems on #L245, the
> list_to_binary doesn't work with this list string
> `[16,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,95,19990,30028,44],`
> because this string has chars (>255), it needs unicode:characters_to_binary
> can work
> https://github.com/erlang/otp/blob/master/lib/compiler/src/beam_asm.erl#L245
>
> Erlang/OTP 20 [RELEASE CANDIDATE 1] [erts-9.0] [source-9ac8bdb] [64-bit]
> [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
>
> Eshell V9.0  (abort with ^G)
> 1> c(hello).
> hello.erl: internal error in beam_asm;
> crash reason: badarg
>
>   in function  list_to_binary/1
>      called as list_to_binary([[5,104,101,108,108,111],
>   [4,109,97,105,110],
>   [2,105,111],
>   [7,115,101,116,111,112,116,115],
>   [6,102,111,114,109,97,116],
>
> [16,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,95,19990,30028,44],
>   "\vmodule_info",
>   [6,101,114,108,97,110,103],
>   [15,103,101,116,95,109,111,100,117,108,101,95,105,110,102,111]])
>   in call from beam_asm:chunk/3 (beam_asm.erl, line 213)
>   in call from beam_asm:build_file/8 (beam_asm.erl, line 97)
>   in call from beam_asm:module/4 (beam_asm.erl, line 31)
>   in call from compile:beam_asm/1 (compile.erl, line 1370)
>   in call from compile:'-internal_comp/4-anonymous-1-'/2 (compile.erl, line
> 329)
>   in call from compile:fold_comp/3 (compile.erl, line 355)
>   in call from compile:internal_comp/4 (compile.erl, line 339)
> error
> 2>
> list_to_binary([16,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,95,19990,30028,44]).
> ** exception error: bad argument
>      in function  list_to_binary/1
>         called as
> list_to_binary([16,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,
>                                   95,19990,30028,44])
> 3>
> unicode:characters_to_binary([16,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,95,19990,30028,44]).
> <<16,104,101,108,108,111,95,209,142,208,189,208,184,208,
>   186,208,190,208,180,95,228,184,150,231,149,140,44>>
>
>
>
> On Fri, May 5, 2017 at 5:35 AM José Valim <jose.valim@REDACTED>
> wrote:
>>
>> I have ran the following on Erlang master, commit ffa80a4137:
>>
>> $ curl
>> https://gist.githubusercontent.com/anonymous/2e8babd349167a49eb6f6d55ec0505c9/raw/cee893bbcd1e9ade6e145c7f66b8599ab9dd6959/hello.erl
>> | tail -n +2 > hello.erl
>> $ erlc hello.erl
>>
>> And everything compiles just fine. Hopefully someone else can give it a
>> try and let us know if they can reproduce the issue or not.
>>
>>
>>
>>
>> José Valim
>> www.plataformatec.com.br
>> Skype: jv.ptec
>> Founder and Director of R&D
>>
>> On Thu, May 4, 2017 at 11:23 PM, derek <denc716@REDACTED> wrote:
>>>
>>> like this gist?
>>> https://gist.github.com/anonymous/2e8babd349167a49eb6f6d55ec0505c9
>>>
>>> On Thu, May 4, 2017 at 3:36 AM José Valim
>>> <jose.valim@REDACTED> wrote:
>>>>
>>>> I have rebuilt Erlang from master and both the test and the code snippet
>>>> you sent by e-mail works. In order to discard any encoding issue in the
>>>> process, can you please push your code snippets to a repository?
>>>>
>>>>
>>>>
>>>> José Valim
>>>> www.plataformatec.com.br
>>>> Skype: jv.ptec
>>>> Founder and Director of R&D
>>>>
>>>> On Thu, May 4, 2017 at 8:04 AM, José Valim
>>>> <jose.valim@REDACTED> wrote:
>>>>>
>>>>> Hi derek,
>>>>>
>>>>> I have sent a PR that improves the coverage around this feature:
>>>>> https://github.com/erlang/otp/pull/1439
>>>>>
>>>>> The test currently passes on an old master reference. I will rebuild my
>>>>> development VM from master and follow up.
>>>>>
>>>>>
>>>>>
>>>>> José Valim
>>>>> www.plataformatec.com.br
>>>>> Skype: jv.ptec
>>>>> Founder and Director of R&D
>>>>>
>>>>> On Thu, May 4, 2017 at 1:11 AM, derek <denc716@REDACTED> wrote:
>>>>>>
>>>>>>
>>>>>> I found this feature from some of the merged PRs of Erlang/OTP 20
>>>>>>
>>>>>>
>>>>>> https://github.com/erlang/otp/blob/master/lib/stdlib/doc/src/unicode_usage.xml#L66-L71
>>>>>> https://github.com/erlang/otp/pulls?q=unicode
>>>>>>
>>>>>> > Erlang/OTP 20.0, atoms and function can contain Unicode characters
>>>>>>
>>>>>> so I built the binary from git checked out source code (from revision
>>>>>> efcb91bce) and play with it: it seems in escript interpreting mode it works,
>>>>>> but compiling mode still has errors:
>>>>>>
>>>>>> ➸ cat ./hello.erl
>>>>>> #!/usr/bin/env escript
>>>>>> %% -*- coding: utf-8 -*-
>>>>>> %%! +pc unicode
>>>>>>
>>>>>> -module(hello).
>>>>>> %-mode(compile).
>>>>>> -export([main/1, 'hello_юникод_世界'/0]).
>>>>>>
>>>>>> main(_) ->
>>>>>>   % io:format("~p~n", [{io:printable_range(), io:getopts()}]),
>>>>>>   % 'hello_'(),
>>>>>>   io:setopts([{encoding,unicode}]),
>>>>>>   % io:format("~p~n", [{io:printable_range(), io:getopts()}]),
>>>>>>   'hello_юникод_世界'(),
>>>>>>   io:format("~tp~n", [{"Hello, 世界, юникод"}]).
>>>>>>
>>>>>> 'hello_юникод_世界'() ->
>>>>>>   io:format("~tp~n", [{'hello_юникод', <<"Hello, 世界; юникод"/utf8>>,
>>>>>> "Hello, 世界; юникод"}]).
>>>>>>
>>>>>> ➸ erlang20 ./hello.erl
>>>>>> {'hello_юникод',<<"Hello, 世界; юникод"/utf8>>,"Hello, 世界; юникод"}
>>>>>> {"Hello, 世界, юникод"}
>>>>>>
>>>>>> If I uncomment the "-mode(compile)." line, it just runs into
>>>>>> compilation error (same as below shell compilation errors)
>>>>>>
>>>>>> Or in the Erlang shell, trying to compile it just failed: (I have to
>>>>>> remove (or comment out) the first "#!/usr/bin/env escript" line)
>>>>>>
>>>>>> ➸ erlang20
>>>>>> Erlang/OTP 20 [DEVELOPMENT] [erts-9.0] [source-efcb91bce] [64-bit]
>>>>>> [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
>>>>>>
>>>>>> Eshell V9.0  (abort with ^G)
>>>>>> 1> c(hello).
>>>>>> hello.erl: internal error in beam_asm;
>>>>>> crash reason: badarg
>>>>>>
>>>>>>   in function  list_to_binary/1
>>>>>>      called as list_to_binary([[5,104,101,108,108,111],
>>>>>>   [4,109,97,105,110],
>>>>>>   [2,105,111],
>>>>>>   [7,115,101,116,111,112,116,115],
>>>>>>   [6,102,111,114,109,97,116],
>>>>>>
>>>>>> [15,104,101,108,108,111,95,1102,1085,1080,1082,1086,1076,95,19990,30028],
>>>>>>   "\vmodule_info",
>>>>>>   [6,101,114,108,97,110,103],
>>>>>>   [15,103,101,116,95,109,111,100,117,108,101,95,105,110,102,111]])
>>>>>>   in call from beam_asm:chunk/3 (beam_asm.erl, line 213)
>>>>>>   in call from beam_asm:build_file/8 (beam_asm.erl, line 97)
>>>>>>   in call from beam_asm:module/4 (beam_asm.erl, line 31)
>>>>>>   in call from compile:beam_asm/1 (compile.erl, line 1370)
>>>>>>   in call from compile:'-internal_comp/4-anonymous-1-'/2 (compile.erl,
>>>>>> line 329)
>>>>>>   in call from compile:fold_comp/3 (compile.erl, line 355)
>>>>>>   in call from compile:internal_comp/4 (compile.erl, line 339)
>>>>>> error
>>>>>> 2>
>>>>>>
>>>>>> I have looked up in many of the commit messages, still not seeing a
>>>>>> good example of how to use unicode in function names? Could some developer
>>>>>> behind this feature give more examples?
>>>>>>
>>>>>> https://github.com/erlang/otp/blame/master/lib/stdlib/doc/src/unicode_usage.xml#L66-L71
>>>>>>
>>>>>> _______________________________________________
>>>>>> erlang-questions mailing list
>>>>>> erlang-questions@REDACTED
>>>>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>>>>
>>>>>
>>>>
>>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>



-- 
Björn Gustavsson, Erlang/OTP, Ericsson AB



More information about the erlang-questions mailing list