Age | Commit message (Collapse) | Author | |
---|---|---|---|
2018-01-22 | Don't build a stacktrace if it's only passed to erlang:raise/3 | Björn Gustavsson | |
Consider the following function: function({function,Name,Arity,CLabel,Is0}, Lc0) -> try %% Optimize the code for the function. catch Class:Error:Stack -> io:format("Function: ~w/~w\n", [Name,Arity]), erlang:raise(Class, Error, Stack) end. The stacktrace is retrieved, but it is only used in the call to erlang:raise/3. There is no need to build a stacktrace in this function. We can avoid the building if we introduce an instruction called raw_raise/3 that works exactly like the erlang:raise/3 BIF except that its third argument must be a raw stacktrace. | |||
2017-11-30 | Add syntax in try/catch to retrieve the stacktrace directly | Björn Gustavsson | |
This commit adds a new syntax for retrieving the stacktrace without calling erlang:get_stacktrace/0. That allow us to deprecate erlang:get_stacktrace/0 and ultimately remove it. The problem with erlang:get_stacktrace/0 is that it can keep huge terms in a process for an indefinite time after an exception. The stacktrace can be huge after a 'function_clause' exception or a failed call to a BIF or operator, because the arguments for the call will be included in the stacktrace. For example: 1> catch abs(lists:seq(1, 1000)). {'EXIT',{badarg,[{erlang,abs, [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20|...]], []}, {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]}, {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,431}]}, {shell,exprs,7,[{file,"shell.erl"},{line,687}]}, {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]}, {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}} 2> erlang:get_stacktrace(). [{erlang,abs, [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24|...]], []}, {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]}, {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,431}]}, {shell,exprs,7,[{file,"shell.erl"},{line,687}]}, {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]}, {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}] 3> We can extend the syntax for clauses in try/catch to optionally bind the stacktrace to a variable. Here is an example using the current syntax: try Expr catch C:E -> Stk = erlang:get_stacktrace(), . . . In the new syntax, it would look like: try Expr catch C:E:Stk -> . . . Only a variable (not a pattern) is allowed in the stacktrace position, to discourage matching of the stacktrace. (Matching would also be expensive, because the raw format of the stacktrace would have to be converted to the cooked form before matching.) Note that: try Expr catch E -> . . . is a shorthand for: try Expr catch throw:E -> . . . If the stacktrace is to be retrieved for a throw, the 'throw:' prefix must be explicitly included: try Expr catch throw:E:Stk -> . . . | |||
2017-11-16 | HiPE: Unique ref receive opt | Magnus Lång | |
2017-03-28 | hipe_icode_range: Add comment about side-effects | Magnus Lång | |
2017-03-27 | hipe: Fix range analysis of calls with ignored res | Magnus Lång | |
HiPE's range analysis would not update the arguments of a callee when the result of the call was ignored. Fixes ERL-278. | |||
2017-03-27 | hipe: Fix range analysis of 'rem' operator | Magnus Lång | |
erl_bif_types contains a fixed and improved copy-paste (obvious from the dead Max_range2_leq_zero if branches) of hipe_icode_range:range_rem/2. For now, delete the dead code and propagate back fixes and improvements to hipe_icode_range. | |||
2016-11-23 | Correct copyright on remaining hipe files | Richard Carlsson | |
2016-07-11 | hipe_ssa_liveness: Use map as liveness ADT | Magnus Lång | |
2016-07-11 | hipe_icode_range: Use maps over gb_trees,sets | Magnus Lång | |
Also, remove unused field 'counter' from #state{}. | |||
2016-07-11 | hipe_icode_{bincomp,range}: Improve complexity | Magnus Lång | |
hipe_icode_bincomp:find_bs_get_integer/3 was quadratic for no good reason. By observing that NewSuccs and Rest are always disjoint, we can see that the worklist does not need to be a set. Furthermore, by replacing the ordset Visited with a map, we reduce complexity to (a very low) O(n lg n). On cuter_binlib, this change reduced the time for hipe_icode_bincomp from 60s to .25s. Using a gb_set for Visited gives .5s, and a sets:set 1s. We apply the same optimisation to hipe_icode_range. | |||
2016-05-31 | Code rewrites to avoid exported vars warnings | Kostis Sagonas | |
2016-05-31 | Use type name, not record notation, in specs | Kostis Sagonas | |
2016-03-15 | update copyright-year | Henrik Nord | |
2015-11-27 | hipe: Guard against enormous numbers in ranges | Magnus Lång | |
This allows us to compile bs_match_int_SUITE with HiPE without a system_limit crash. | |||
2015-06-18 | Change license text to APLv2 | Bruce Yinhe | |
2014-02-23 | Deprecate pre-defined built-in types | Hans Bolinder | |
The types array(), dict(), digraph(), gb_set(), gb_tree(), queue(), set(), and tid() have been deprecated. They will be removed in OTP 18.0. Instead the types array:array(), dict:dict(), digraph:graph(), gb_set:set(), gb_tree:tree(), queue:queue(), sets:set(), and ets:tid() can be used. (Note: it has always been necessary to use ets:tid().) It is allowed in OTP 17.0 to locally re-define the types array(), dict(), and so on. New types array:array/1, dict:dict/2, gb_sets:set/1, gb_trees:tree/2, queue:queue/1, and sets:set/1 have been added. | |||
2013-06-12 | Update copyright years | Björn-Egil Dahlberg | |
2013-02-25 | Fix bug related to the handling of is_number/1 by the range analysis | Kostis Sagonas | |
The following module produced erroneous results when compiled with HiPE: -module(a). -export([foo/1]). foo(X) when is_number(X) -> is_integer(X). Running: 1> c(a). 2> a:foo(0). true 3> hipe:c(a). 4> a:foo(0). false % *** WRONG *** The problem was that the 'number' case for the `hipe_icode:type_test/1` was going to the default case where the argument was determined as being something other than an integer. Thanks to Sebastian Egner and Johannes Weißl for bringing the bug into attention. Fixed on the day it was reported. | |||
2011-02-14 | Cleanup specs | Kostis Sagonas | |
2011-02-14 | Fix bug in the simplification of inexact comparisons | Kostis Sagonas | |
On 31/1/2011 Paul Guyot reported a bug in the native code compilation of inexact equality/inequality tests between floats and integers. The relevant test was: f(X) -> Y = X / 2, Y == 0. and hipe erroneously evaluated the calls f(0) and f(0.0) to 'false'. The culprit was in the simplification code of the Icode range analysis which used an erroneous test (lists:any/1 instead of lists:all/1). | |||
2011-02-14 | Various cleanups and cosmetic changes | Kostis Sagonas | |
2010-11-22 | hipe: Update types and specs | Kostis Sagonas | |
2009-11-20 | The R13B03 release.OTP_R13B03 | Erlang/OTP | |