aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tools')
-rw-r--r--lib/tools/c_src/erl_memory.c73
-rw-r--r--lib/tools/doc/src/notes.xml44
-rw-r--r--lib/tools/emacs/erlang.el6
-rw-r--r--lib/tools/emacs/test.erl.indented13
-rw-r--r--lib/tools/emacs/test.erl.orig13
-rw-r--r--lib/tools/src/cover.erl7
-rw-r--r--lib/tools/src/xref_reader.erl10
-rw-r--r--lib/tools/test/cover_SUITE.erl18
-rw-r--r--lib/tools/test/xref_SUITE.erl15
-rw-r--r--lib/tools/test/xref_SUITE_data/read/read.erl27
-rw-r--r--lib/tools/vsn.mk2
11 files changed, 167 insertions, 61 deletions
diff --git a/lib/tools/c_src/erl_memory.c b/lib/tools/c_src/erl_memory.c
index 86e84723b1..c4e126a7b1 100644
--- a/lib/tools/c_src/erl_memory.c
+++ b/lib/tools/c_src/erl_memory.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2003-2012. All Rights Reserved.
+ * Copyright Ericsson AB 2003-2013. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -30,6 +30,7 @@
# undef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
+typedef int socklen_t;
#else
# if defined(__linux__) && defined(__GNUC__)
# define _GNU_SOURCE 1
@@ -149,11 +150,11 @@ typedef struct {
typedef struct em_buffer_ {
struct em_buffer_ *next;
int write;
- usgnd_int_8 *data;
- usgnd_int_8 *data_end;
- usgnd_int_8 *end;
+ char *data;
+ char *data_end;
+ char *end;
size_t size;
- usgnd_int_8 start[EM_DEFAULT_BUF_SZ];
+ char start[EM_DEFAULT_BUF_SZ];
} em_buffer;
typedef struct {
@@ -173,7 +174,7 @@ typedef struct {
} em_buf_queue;
typedef struct {
- usgnd_int_8 *ptr;
+ char *ptr;
size_t size;
} em_area;
@@ -460,7 +461,7 @@ enqueue(em_state *state, em_buf_queue *queue, size_t min_size)
bsize = min_size;
buf = (em_buffer *) (*state->alloc)(sizeof(em_buffer)
- + (sizeof(usgnd_int_8)
+ + (sizeof(char)
* (bsize-EM_DEFAULT_BUF_SZ)));
if (buf) {
buf->size = bsize;
@@ -595,12 +596,12 @@ get_next_write_area(em_area *area, em_state *state, em_buf_queue *queue,
\* */
static INLINE size_t
-write_str(usgnd_int_8 **dstpp, char *srcp)
+write_str(char **dstpp, char *srcp)
{
size_t i = 0;
if (dstpp)
while (srcp[i])
- *((*dstpp)++) = (usgnd_int_8) srcp[i++];
+ *((*dstpp)++) = srcp[i++];
else
while (srcp[i]) i++;
return i;
@@ -608,7 +609,7 @@ write_str(usgnd_int_8 **dstpp, char *srcp)
static size_t
-write_strings(usgnd_int_8 **ptr,
+write_strings(char **ptr,
char **strings,
char *first_line_prefix,
char *line_prefix,
@@ -640,10 +641,10 @@ write_strings(usgnd_int_8 **ptr,
}
static size_t
-write_title(usgnd_int_8 **bufp, size_t *overflow, size_t width, char *str)
+write_title(char **bufp, size_t *overflow, size_t width, char *str)
{
size_t i, sz, ws;
- usgnd_int_8 *p, *endp;
+ char *p, *endp;
/*
* Writes at least one '|' character at the beginning.
@@ -689,16 +690,16 @@ write_title(usgnd_int_8 **bufp, size_t *overflow, size_t width, char *str)
*(p++) = '|';
while (ws > 1) {
ws--;
- *(p++) = (usgnd_int_8) ' ';
+ *(p++) = ' ';
}
i = 0;
while (str[i] && (overflow || p < endp))
- *(p++) = (usgnd_int_8) str[i++];
+ *(p++) = str[i++];
while (ws) {
ws--;
- *(p++) = (usgnd_int_8) ' ';
+ *(p++) = ' ';
}
ASSERT(overflow || p == endp);
@@ -708,7 +709,7 @@ write_title(usgnd_int_8 **bufp, size_t *overflow, size_t width, char *str)
}
static size_t
-write_obj_sub_titles(em_state *state, usgnd_int_8 **bufp, size_t *overflow)
+write_obj_sub_titles(em_state *state, char **bufp, size_t *overflow)
{
size_t field_width = state->output.field_width;
size_t size = write_title(bufp, overflow, field_width, "size");
@@ -733,12 +734,12 @@ write_obj_sub_titles(em_state *state, usgnd_int_8 **bufp, size_t *overflow)
}
static size_t
-write_header(em_state *state, usgnd_int_8 *ptr, int trunc)
+write_header(em_state *state, char *ptr, int trunc)
{
#define MIN_LTEXT_SZ 18
#define HEADER_EOL_STR "|\n"
- usgnd_int_8 *p;
- usgnd_int_8 **pp;
+ char *p;
+ char **pp;
int i;
size_t overflow;
size_t *ofp;
@@ -855,7 +856,7 @@ write_header(em_state *state, usgnd_int_8 *ptr, int trunc)
}
static INLINE void
-write_mem_info(em_state *state, usgnd_int_8 **p, em_mem_info *mi)
+write_mem_info(em_state *state, char **p, em_mem_info *mi)
{
int fw = state->output.field_width - 1;
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->size);
@@ -894,7 +895,7 @@ write_mem_info(em_state *state, usgnd_int_8 **p, em_mem_info *mi)
}
static INLINE void
-write_max_ever_mem_info(em_state *state, usgnd_int_8 **p, em_mem_info *mi)
+write_max_ever_mem_info(em_state *state, char **p, em_mem_info *mi)
{
int fw = state->output.field_width - 1;
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_size);
@@ -913,13 +914,13 @@ static void
print_string(em_state *state, char *str)
{
em_area area = {NULL, 0};
- usgnd_int_8 *p;
+ char *p;
/* Get area */
get_next_write_area(&area,state,&state->output.queue,write_str(NULL,str));
- p = (usgnd_int_8 *) area.ptr;
+ p = area.ptr;
area.size = write_str(&p, str);
/* Leave area */
@@ -938,7 +939,7 @@ print_emu_arg(em_state *state)
struct hostent *hp;
struct in_addr iaddr;
usgnd_int_16 port;
- int saddr_size = sizeof(saddr);
+ socklen_t saddr_size = sizeof(saddr);
size_t size;
char *format = "> Emulator command line argument: +Mit %s\n";
@@ -996,7 +997,7 @@ print_emu_arg(em_state *state)
}
static size_t
-write_allocator_info(em_state *state, usgnd_int_8 *ptr)
+write_allocator_info(em_state *state, char *ptr)
{
usgnd_int_32 aix, i, j;
char *header = "> Allocator information:\n";
@@ -1008,8 +1009,8 @@ write_allocator_info(em_state *state, usgnd_int_8 *ptr)
char **strings;
size_t strings_size;
size_t max_line_size = 80;
- usgnd_int_8 *p = ptr;
- usgnd_int_8 **pp = ptr ? &p : NULL;
+ char *p = ptr;
+ char **pp = ptr ? &p : NULL;
strings_size = state->trace_info.max_block_type_ix + 1;
if (strings_size < state->trace_info.max_allocator_ix + 1)
@@ -1140,7 +1141,7 @@ static void
print_main_footer(em_state *state)
{
em_area area = {NULL, 0};
- usgnd_int_8 *p;
+ char *p;
int i;
char *stop_str =
"> Trace stopped\n";
@@ -1248,7 +1249,7 @@ print_main_footer(em_state *state)
static void
print_info(em_state *state, usgnd_int_32 secs, char *extra)
{
- usgnd_int_8 *p;
+ char *p;
int i;
size_t size;
em_area area = {NULL, 0};
@@ -1913,7 +1914,7 @@ error_msg(int res, char *msg)
#if EMEM_d_SWITCH
static size_t
-write_output_filename(usgnd_int_8 *ptr,
+write_output_filename(char *ptr,
char *dirname,
char *nodename,
char *hostname,
@@ -1921,8 +1922,8 @@ write_output_filename(usgnd_int_8 *ptr,
char *pid)
{
size_t sz = 0;
- usgnd_int_8 *p = ptr;
- usgnd_int_8 **pp = ptr ? &p : NULL;
+ char *p = ptr;
+ char **pp = ptr ? &p : NULL;
sz += write_str(pp, dirname);
if (pp) *((*pp)++) = DIR_SEP_CHAR;
sz++;
@@ -2246,7 +2247,7 @@ process_trace(em_state *state)
if (!area.size)
return EM_TRUNCATED_TRACE_ERROR;
res = emtp_parse(state->trace_state,
- &area.ptr, &area.size,
+ (usgnd_int_8 **)&area.ptr, &area.size,
NULL, 0, NULL);
if (res == EMTP_HEADER_PARSED)
break;
@@ -2277,7 +2278,7 @@ process_trace(em_state *state)
while (area.size) {
ops_len = EM_NO_OF_OPS;
res = emtp_parse(state->trace_state,
- &area.ptr, &area.size,
+ (usgnd_int_8 **)&area.ptr, &area.size,
ops, sizeof(emtp_operation), &ops_len);
if (res < 0)
return res;
@@ -2555,7 +2556,7 @@ init_connection(em_state *state)
SOCKET lsock;
SOCKET sock = INVALID_SOCKET;
struct sockaddr_in my_addr;
- int oth_addr_len;
+ socklen_t oth_addr_len;
struct sockaddr_in oth_addr;
#ifdef __WIN32__
WORD wVersionRequested = MAKEWORD(2,0);
@@ -2738,7 +2739,7 @@ output_thread_func(void *arg)
error_msg(EIO, "Output queue");
}
if (fwrite((void *) area.ptr,
- sizeof(usgnd_int_8),
+ sizeof(char),
area.size,
state->output.stream) != area.size) {
disconnect_queue_reader(&state->output.queue);
diff --git a/lib/tools/doc/src/notes.xml b/lib/tools/doc/src/notes.xml
index d8239460b3..2e4c354fbd 100644
--- a/lib/tools/doc/src/notes.xml
+++ b/lib/tools/doc/src/notes.xml
@@ -30,6 +30,50 @@
</header>
<p>This document describes the changes made to the Tools application.</p>
+<section><title>Tools 2.6.13</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Erlang-specific compilation error regexp is added in
+ erlang-eunit.el. This defvar was earlier in erlang.el,
+ but was erroneously removed in R15B02, while still used
+ by erlang-eunit.el.</p>
+ <p>
+ Own Id: OTP-11417 Aux Id: seq12447 </p>
+ </item>
+ <item>
+ <p>
+ Take compiler options from beam in cover:compile_beam.
+ Thanks to Péter Gömöri.</p>
+ <p>
+ Own Id: OTP-11439</p>
+ </item>
+ <item>
+ <p>
+ Silence warnings (Thanks to Anthony Ramine)</p>
+ <p>
+ Own Id: OTP-11517</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Add iodata, nonempty_string to built-in type highlighting
+ for emacs. Thanks to Paul Oliver.</p>
+ <p>
+ Own Id: OTP-11394</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Tools 2.6.12</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index c395d22356..c1e9bec6ae 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -2600,6 +2600,12 @@ Value is list (stack token-start token-type in-what)."
(if (save-excursion
(goto-char (match-end 1))
(erlang-skip-blank to)
+ ;; Use erlang-variable-regexp here to look for an
+ ;; optional variable name to match EEP37 named funs.
+ (if (looking-at erlang-variable-regexp)
+ (progn
+ (goto-char (match-end 0))
+ (erlang-skip-blank to)))
(eq (following-char) ?\())
(erlang-push (list 'fun token (current-column)) stack)))
((looking-at "\\(begin\\|query\\)[^_a-zA-Z0-9]")
diff --git a/lib/tools/emacs/test.erl.indented b/lib/tools/emacs/test.erl.indented
index 7e61bcc45b..0de626125c 100644
--- a/lib/tools/emacs/test.erl.indented
+++ b/lib/tools/emacs/test.erl.indented
@@ -483,6 +483,19 @@ indent_fun() ->
Y = true andalso
kalle
end),
+ %% check EEP37 named funs
+ Fn1 = fun Fact(N) when N > 0 ->
+ F = Fact(N-1),
+ N * F;
+ Fact(0) ->
+ 1
+ end,
+ %% check anonymous funs too
+ Fn2 = fun(0) ->
+ 1;
+ (N) ->
+ N
+ end,
ok.
indent_try_catch() ->
diff --git a/lib/tools/emacs/test.erl.orig b/lib/tools/emacs/test.erl.orig
index 932758997d..57263d573b 100644
--- a/lib/tools/emacs/test.erl.orig
+++ b/lib/tools/emacs/test.erl.orig
@@ -483,6 +483,19 @@ Var = spawn(fun(X)
Y = true andalso
kalle
end),
+%% check EEP37 named funs
+Fn1 = fun Fact(N) when N > 0 ->
+ F = Fact(N-1),
+ N * F;
+Fact(0) ->
+ 1
+ end,
+%% check anonymous funs too
+ Fn2 = fun(0) ->
+1;
+ (N) ->
+ N
+ end,
ok.
indent_try_catch() ->
diff --git a/lib/tools/src/cover.erl b/lib/tools/src/cover.erl
index 13d9aefb0c..6aeb251ac2 100644
--- a/lib/tools/src/cover.erl
+++ b/lib/tools/src/cover.erl
@@ -1883,6 +1883,13 @@ munge_expr({'fun',Line,{clauses,Clauses}}, Vars) ->
%% Only for Vsn=raw_abstract_v1
{MungedClauses,Vars2}=munge_clauses(Clauses, Vars),
{{'fun',Line,{clauses,MungedClauses}}, Vars2};
+munge_expr({named_fun,Line,Name,Clauses,_Extra}, Vars) ->
+ {MungedClauses,Vars2}=munge_clauses(Clauses, Vars),
+ {{named_fun,Line,Name,MungedClauses}, Vars2};
+munge_expr({named_fun,Line,Name,Clauses}, Vars) ->
+ %% Only for Vsn=raw_abstract_v1
+ {MungedClauses,Vars2}=munge_clauses(Clauses, Vars),
+ {{named_fun,Line,Name,MungedClauses}, Vars2};
munge_expr({bin,Line,BinElements}, Vars) ->
{MungedBinElements,Vars2} = munge_exprs(BinElements, Vars, []),
{{bin,Line,MungedBinElements}, Vars2};
diff --git a/lib/tools/src/xref_reader.erl b/lib/tools/src/xref_reader.erl
index d3601c6ea0..142d28ebe6 100644
--- a/lib/tools/src/xref_reader.erl
+++ b/lib/tools/src/xref_reader.erl
@@ -171,6 +171,11 @@ expr({'fun', Line, {function, Name, Arity}, _Extra}, S) ->
handle_call(local, S#xrefr.module, Name, Arity, Line, S);
expr({'fun', _Line, {clauses, Cs}, _Extra}, S) ->
clauses(Cs, S);
+expr({named_fun, _Line, '_', Cs, _Extra}, S) ->
+ clauses(Cs, S);
+expr({named_fun, _Line, Name, Cs, _Extra}, S) ->
+ S1 = S#xrefr{funvars = [Name | S#xrefr.funvars]},
+ clauses(Cs, S1);
expr({call, Line, {atom, _, Name}, As}, S) ->
S1 = handle_call(local, S#xrefr.module, Name, length(As), Line, S),
expr(As, S1);
@@ -186,6 +191,9 @@ expr({match, _Line, {var,_,Var}, {'fun', _, {clauses, Cs}, _Extra}}, S) ->
%% that are passed around by the "expansion" of list comprehension.
S1 = S#xrefr{funvars = [Var | S#xrefr.funvars]},
clauses(Cs, S1);
+expr({match, _Line, {var,_,Var}, {named_fun, _, _, _, _} = Fun}, S) ->
+ S1 = S#xrefr{funvars = [Var | S#xrefr.funvars]},
+ expr(Fun, S1);
expr({match, _Line, {var,_,Var}, E}, S) ->
%% Used for resolving code like
%% Args = [A,B], apply(m, f, Args)
@@ -288,6 +296,8 @@ funarg({'fun', _, _Clauses, _Extra}, _S) -> true;
funarg({'fun', _, {function,_,_,_}}, _S) ->
%% New abstract format for fun M:F/A in R15.
true;
+funarg({named_fun, _, _, _, _}, _S) ->
+ true;
funarg({var, _, Var}, S) -> member(Var, S#xrefr.funvars);
funarg(_, _S) -> false.
diff --git a/lib/tools/test/cover_SUITE.erl b/lib/tools/test/cover_SUITE.erl
index 29b26c7a76..bd71218474 100644
--- a/lib/tools/test/cover_SUITE.erl
+++ b/lib/tools/test/cover_SUITE.erl
@@ -28,7 +28,7 @@
export_import/1,
otp_5031/1, eif/1, otp_5305/1, otp_5418/1, otp_6115/1, otp_7095/1,
otp_8188/1, otp_8270/1, otp_8273/1, otp_8340/1,
- otp_10979_hanging_node/1, compile_beam_opts/1]).
+ otp_10979_hanging_node/1, compile_beam_opts/1, eep37/1]).
-include_lib("test_server/include/test_server.hrl").
@@ -53,7 +53,7 @@ all() ->
dont_reconnect_after_stop, stop_node_after_disconnect,
export_import, otp_5031, eif, otp_5305, otp_5418,
otp_6115, otp_7095, otp_8188, otp_8270, otp_8273,
- otp_8340, otp_10979_hanging_node, compile_beam_opts];
+ otp_8340, otp_10979_hanging_node, compile_beam_opts, eep37];
_pid ->
{skip,
"It looks like the test server is running "
@@ -1382,6 +1382,20 @@ comprehension_8188(Cf) ->
ok.
+eep37(Config) when is_list(Config) ->
+ [{{t,1},1},{{t,2},1},{{t,4},6},{{t,6},1},{{t,8},1}] =
+ analyse_expr(<<"begin\n" % 1
+ " F =\n" % 1
+ " fun Fact(N) when N > 0 ->\n"
+ " N * Fact(N - 1);\n" % 6
+ " Fact(0) ->\n"
+ " 1\n" % 1
+ " end,\n"
+ " F(6)\n" % 1
+ "end\n">>,
+ Config),
+ ok.
+
otp_10979_hanging_node(_Config) ->
P1 = processes(),
diff --git a/lib/tools/test/xref_SUITE.erl b/lib/tools/test/xref_SUITE.erl
index 31b0b13b7b..353275ae3b 100644
--- a/lib/tools/test/xref_SUITE.erl
+++ b/lib/tools/test/xref_SUITE.erl
@@ -1047,7 +1047,7 @@ read_expected(Version) ->
POS1 = 28, POS2 = POS1+10, POS3 = POS2+6, POS4 = POS3+6, POS5 = POS4+10,
POS6 = POS5+5, POS7 = POS6+6, POS8 = POS7+6, POS9 = POS8+8,
POS10 = POS9+10, POS11 = POS10+7, POS12 = POS11+8, POS13 = POS12+10,
- POS14 = POS13+18, % POS15 = POS14+23,
+ POS14 = POS13+18, POS15 = POS14+23,
FF = {read,funfuns,0},
U = [{POS1+5,{FF,{dist,'$F_EXPR',0}}},
@@ -1098,6 +1098,7 @@ read_expected(Version) ->
{POS1+1,{FF,{mod17,fun17,0}}},
{POS1+2,{FF,{erlang,spawn,1}}},
{POS1+2,{FF,{read,local,0}}},
+ {POS1+3,{FF,{erlang,binary_to_term,1}}},
{POS1+3,{FF,{erlang,spawn,1}}},
{POS1+4,{FF,{dist,func,0}}},
{POS1+4,{FF,{erlang,spawn,1}}},
@@ -1196,11 +1197,6 @@ read_expected(Version) ->
{0,{FF,{modul,'$F_EXPR',179}}}]
++ O1;
_ ->
-% [{POS15+2,{{read,bi,0},{foo,t,0}}},
-% {POS15+3,{{read,bi,0},{bar,t,0}}},
-% {POS15+6,{{read,bi,0},{read,local,0}}},
-% {POS15+8,{{read,bi,0},{foo,t,0}}},
-% {POS15+10,{{read,bi,0},{bar,t,0}}}] ++
[{16,{FF,{read,'$F_EXPR',178}}},
{17,{FF,{modul,'$F_EXPR',179}}}]
++
@@ -1211,7 +1207,6 @@ read_expected(Version) ->
OKB1 = [{POS13+1,{FF,{erts_debug,apply,4}}},
{POS13+2,{FF,{erts_debug,apply,4}}},
{POS13+3,{FF,{erts_debug,apply,4}}},
- {POS1+3, {FF,{erlang,binary_to_term,1}}},
{POS3+1, {FF,{erlang,spawn,3}}},
{POS3+2, {FF,{erlang,spawn,3}}},
{POS3+3, {FF,{erlang,spawn_link,3}}},
@@ -1227,7 +1222,11 @@ read_expected(Version) ->
_ ->
[{POS13+16, {{read,bi,0},{erlang,'!',2}}},
{POS13+16, {{read,bi,0},{erlang,'-',1}}},
- {POS13+16, {{read,bi,0},{erlang,self,0}}}]
+ {POS13+16, {{read,bi,0},{erlang,self,0}}},
+ {POS15+1, {{read,bi,0},{erlang,'>',2}}},
+ {POS15+2, {{read,bi,0},{erlang,'-',2}}},
+ {POS15+2, {{read,bi,0},{erlang,'*',2}}},
+ {POS15+8, {{read,bi,0},{erlang,'/',2}}}]
end
++ [{POS14+19, {{read,bi,0},{erlang,'+',2}}},
{POS14+21, {{read,bi,0},{erlang,'+',2}}},
diff --git a/lib/tools/test/xref_SUITE_data/read/read.erl b/lib/tools/test/xref_SUITE_data/read/read.erl
index 19694c9e25..5f388194b0 100644
--- a/lib/tools/test/xref_SUITE_data/read/read.erl
+++ b/lib/tools/test/xref_SUITE_data/read/read.erl
@@ -156,20 +156,19 @@ bi() ->
<<D:16, E, F/binary>> = Bin3,
X = 9, <<(X+1):8>>,
_Fyy = <<X:4/little-signed-integer-unit:8>>,
- D + E + F.
-%bi() ->
-% %% POS15=POS14+13
-% try
-% foo:t(),
-% bar:t()
-% of
-% {v,1} ->
-% local();
-% {v,2} ->
-% foo:t()
-% catch
-% {'EXIT',_} -> bar:t()
-% end.
+ D + E + F;
+bi() ->
+ %% EEP37. POS15=POS14+23
+ F = fun Fact(N) when N > 0 ->
+ N * Fact(N - 1);
+ Fact(0) ->
+ 1
+ end,
+ F(6),
+ G = fun _(foo) -> bar;
+ _(X) -> X / 3
+ end,
+ G(foo).
local() ->
true.
diff --git a/lib/tools/vsn.mk b/lib/tools/vsn.mk
index c51b833dd0..0cead00554 100644
--- a/lib/tools/vsn.mk
+++ b/lib/tools/vsn.mk
@@ -1 +1 @@
-TOOLS_VSN = 2.6.12
+TOOLS_VSN = 2.6.13