Age | Commit message (Collapse) | Author |
|
Tuple calls is the ability to invoke a function on a tuple
as first argument:
1> Var = dict:new().
{dict,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
2> Var:size().
0
This behaviour is considered by most to be undesired and confusing,
especially when it comes to errors. For example, imagine you invoke
"Mod:new()" where a Mod is an atom and you accidentally pass {ok, dict}.
It raises:
{undef,[{ok,new,[{ok,dict}],[]},...]}
As it attempts to invoke ok:new/1, which is really hard to debug
as there is no call to new/1 on the source code.
Furthemore, this behaviour is implemented at the VM level, which
imposes such semantics on all languages running on BEAM.
Since we cannot remove the behaviour above, this proposal makes the
behaviour opt-in with a compiler flag:
-compile(tuple_calls).
This means that, if a codebase relies on this functionality, they
can keep compatibility by adding configuring their build tool to
always use the 'tuple_calls' flag or explicitly on each module.
As long as the compile attribute above is listed, the codebase will
work on old and new Erlang versions alike. The only downside of the
current implementation is that modules compiled on OTP 20 that rely
on 'tuple_calls' will have to be recompiled to run with 'tuple_calls'
on OTP 21+.
|
|
|
|
* maint:
Updated OTP version
Update release notes
Update version numbers
erts: Fix bug in quick alloc
Fix old length usage in string
stdlib: Fix bug in proc_lib
Support arbitrary crash report in proc_lib.
|
|
* maint-20:
Updated OTP version
Update release notes
Update version numbers
erts: Fix bug in quick alloc
Fix old length usage in string
stdlib: Fix bug in proc_lib
Support arbitrary crash report in proc_lib.
|
|
|
|
Support e2k platform
OTP-14492
|
|
|
|
Choose a "lagom" low value to provoke both
fallback on erts_alloc
AND thread racing in lockless deallocation queue.
|
|
|
|
|
|
* sverker/prealloc-race-bug/OTP-14491:
erts: Fix bug in quick alloc
|
|
* rickard/statistics/OTP-14484:
Fix statistics(wall_clock) and statistics(runtime) implementation
|
|
into maint-20
* lukas/erts/fix_outputv_port_task_cleanup/ERL-428/OTP-14481:
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
erts: Cleanup dropped port tasks correctly
|
|
* john/erts/fix-port-leak/OTP-13939/ERL-193:
Add a testcase for OTP-13939/ERL-193
Mark socket disconnected on tcp_send_or_shutdown_error
# Conflicts:
# lib/kernel/test/gen_tcp_misc_SUITE.erl
|
|
The effect of the race is that a pre-allocated memory block
is inserted last without updating tail.data.last, which will cause
all subsequent insertions to also fail to update tail.data.last.
Hence all pre-allocation for this quick alloc instance is leaked
for this thread and will fallback on erts_alloc.
|
|
|
|
* sverker/erts/apply-badarg/ERL-432/OTP-14490:
erts: Make apply throw 'badarg' if Args is not a list
|
|
Bit syntax instructions never store their result in a Y register.
Therefore, change the bit syntax instructions to use 'x' as the
destination instead of 'd'. That will simplify the code that stores
the result, and will be a slight reduction in code size and execution
time.
|
|
|
|
* maint:
Eliminate potential unsafe use of general destination
|
|
* bjorn/erts/fix-gen-dest:
Eliminate potential unsafe use of general destination
|
|
|
|
instead of a strange 'undef' exception.
|
|
* maint-19:
Updated OTP version
Update release notes
Update version numbers
Fix statistics(wall_clock) and statistics(runtime) implementation
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
Add a testcase for OTP-13939/ERL-193
erts: Cleanup dropped port tasks correctly
Mark socket disconnected on tcp_send_or_shutdown_error
|
|
|
|
|
|
* rickard/statistics/OTP-14484:
Fix statistics(wall_clock) and statistics(runtime) implementation
|
|
into maint-19
* lukas/erts/fix_outputv_port_task_cleanup/ERL-428/OTP-14481:
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
erts: Cleanup dropped port tasks correctly
|
|
* john/erts/fix-port-leak/OTP-13939/ERL-193:
Add a testcase for OTP-13939/ERL-193
Mark socket disconnected on tcp_send_or_shutdown_error
# Conflicts:
# lib/kernel/test/gen_tcp_misc_SUITE.erl
|
|
a3407eaa2104d6 eliminated the -gen_dest flag for macros in ops.tab.
It turns out that the new implementation (taking the address of the
X or X destination register) is unsafe if the destination is a Y
register and there can be a GC. The problem is that the address to
the Y register will change if there is a GC.
Fortunately, the few instructions in OTP 20 that have a general
destinations are safe. The put_list_ssd instruction never does a GC.
The bit syntax instructions that may do a GC will always store the
result to an X register.
To be completely sure, rewrite the destination register from 'd' to
'x' for the bit syntax instructions. That means that a bit syntax
instruction with a Y register destionation will abort the loading
if it is encountered.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OTP-14337
* rickard/t2b-latin1-atom:
Fix minor vsn 1 in term_to_binary/2 broken in this branch
|
|
|
|
OTP-14337
* rickard/t2b-latin1-atom:
Update primary bootstrap
Update preloaded modules
Fix erl_interface tests
Introduce minor vsn 2 in term_to_binary/2
Revert "kernel: Try mend disk_log whitebox tests"
Revert "erts: Do not generate atoms on old latin1 external format"
|
|
|
|
|
|
|
|
Before this fix, the extra data attached to a port task had to
be cleaned up by the calling function. This caused problems
because the outputv call, co-allocates the extra data with the
port task. So in rare circumstances the port task would be
free'd before the extra data was free'd which led to segfault
when looking at the port task.
This has been fixed by the generic PORT_TASK_ABORT behaviour
being used even for tasks dropped in the erts_schedule_proc2port_signal
API.
|
|
The socket left lingering due to {exit_on_close, false} will accept writes
in a confusing way, returning either enotconn or blocking. This fix allows
socket to know that it has been closed recently, and new writes won't pass.
|
|
The relevant macros are already guarded by said #ifdefs.
|
|
You're not supposed to do this, but it behaved correctly even with a debug
build aside from degraded performance (The scheduler started to busy-wait
for new operations rather than sleep).
|
|
This reverts commit 65b04e233e09e3cc2e0fda3c28e155b95c5a4baf.
|
|
|
|
|