Age | Commit message (Collapse) | Author |
|
Profiling shows that subst_vsub/3 dominates the running time. It
is therefore worthwhile optimizing it.
|
|
As a minor optimization, eliminate unnecessary cons operations
in store/3, append/3, append_list/3, update/4, and update_counter/3.
|
|
To run eprof for a compiler pass:
erlc +'{eprof,beam_asm}' file.erl
The name of the compiler pass is the name as printed when
'time' option is used. It is usually, but not always, the module
name for the compiler pass.
|
|
Several compiler passes have unnecessary wrapper functions that
can be easily eliminated.
|
|
If we want to have test cases that run eprof, we must make sure that
there are no modules loaded that don't have a working module_info/1
function, since eprof calls module_info(functions) to retrieve the
list of functions in the module. Some test cases load modules compiled
from Core Erlang that don't have any module_info/1 functions, so
we will need make sure that all such modules have been unloaded.
Add z_SUITE:loaded/1 to run after all other test cases to verify that
all modules that the code server consider loaded are indeed loaded and
all have working module_info/0,1 functions.
|
|
For tidiness, always place .core files in data directories.
|
|
The .core or .S files that are compiled in the test cases
may lack module_info/0,1 functions, which will cause problems if
we (for example) try to run eprof later. To avoid that problem,
unload each module directly after testing it.
|
|
Don't unload modules using BIFs; use the code server to ensure
that code:all_loaded/0 only lists code that is actually loaded.
|
|
* wmalik/slave-specs:
Remove unused comments
Fix Host and Name type in slave.erl
|
|
A warning for an unmatched return was introduced in aaa7c917.
The caller of openzip_close/1 ignores the return value, which
could be an error tuple. In this situation, handling a fatal
error, it is OK to ignore the return value; thus, we only need
to make it explicit that we are ignoring the return value.
|
|
* ia/public_key/bitstring/OTP-12110:
ssl: Adjust to public_key application removing legacy compact_bit_string switch
public_key: Update vsn for OTP 18
public_key: Reject bad signatures as early as possible
public_key: Remove legacy switch compact_bit_string
|
|
|
|
|
|
Erlang bitstring type only uses as many bits as required, and
does not use padding to create complete bytes as ASN1 compact_bitstring
did. crypto:verify/5 will now fail, for some incorrect signatures
as it expects complete bytes which an incorrect signature may not have.
Instead of catching the failing crypto function and then returning
false we check the input and reject it right away.
|
|
* E.I bitstrings will not be decode as {Unused, Binary}, they are now
Erlang bitstrings.
* Also the compact_bit_string implies the legacy_erlang_types switch
- So removing the switch will also make OCTET STRING values be represented
as binaries.
- Undecoded open type will now be wrapped in a asn1_OPENTYPE tuple.
We need to handle this in pubkey_pbe.erl, maybe this can be eliminated
later by updating/refreshing ASN1-specs.
This will change some values in records returned by the public_key API
making this change a potentiall incompatibility.
|
|
* egil/cmp-immediate-optimization/OTP-12663:
erts: Optimize comparison operator for frequent immediates
|
|
* egil/fix-icount:
erts: Assume counting opcodes are correctly generated
erts: Remove instruction_count command option
|
|
* ia/ssl/inet-dep:
ssl: Add runtime depenency due to commit 4e0a5e36b38e3f15ed8f7d700d26f2424a47111c
|
|
* Assertion is only removed because we are in icount mode.
|
|
* We use compile directive icount instead
|
|
* egil/fix-percept/OTP-12662:
percept: Fix http server config
|
|
* egil/maps-refactor:
erts: Use make_small for size terms on flat maps
Conflicts:
erts/emulator/beam/erl_bif_guard.c
|
|
|
|
* bjorn/maps:
Document the new {badmap,Term} and {badkey,Key} exceptions
Raise more descriptive error messages for failed map operations
erl_term.h: Add is_not_map() macro
Tigthen code for the i_get_map_elements/3 instruction
Pre-compute hash values for the general get_map_elements instruction
Teach the loader to pre-compute the hash value for single-key lookups
Optimize use of i_get_map_element/4
beam_emu: Slightly optimize update_map_{assoc,exact}
v3_codegen: Don't sort map keys in map creation/update
beam_validator: No longer require strict literal term order
Sort maps keys in the loader
De-optimize the has_map_fields instructions
erts/map_SUITE.erl: Add a test case that tests has_map_fields
Fully evaluate is_map/1 for literals at load-time
map_SUITE: Add tests of is_map/1 with literal maps
Run a clone of map_SUITE without optimizations
Remove the fail label operand of the new_map instruction
Correct transformation of put_map_assoc to new_map
Remove support for put_map_exact without a source map
|
|
4e0a5e36b38e3f15ed8f7d700d26f2424a47111c
|
|
* egil/refactor-message-queue-probes:
erts: Refactor dtrace call probes
erts: Refactor erts_queue_message
|
|
* sverk/nlmills-pr653/efile-union-pwritev/OTP-12653:
erts: Cleanup code in invoke_pwritev
Use the correct union member inside efile_drv
|
|
* sverk/crypto/rm-EVP_CIPHER_CTX_new:
crypto: Fix undefined symbol EVP_CIPHER_CTX_new
|
|
* ia/ssh/channel-gracefull-shutdown/OTP-12648:
ssh: Shutdown sftp channel gracefully
|
|
* small integers
* atoms
|
|
|
|
According to EEP-43 for maps, a 'badmap' exception should be
generated when an attempt is made to update non-map term such as:
<<>>#{a=>42}
That was not implemented in the OTP 17.
José Valim suggested that we should take the opportunity to
improve the errors coming from map operations:
http://erlang.org/pipermail/erlang-questions/2015-February/083588.html
This commit implement better errors from map operations similar
to his suggestion.
When a map update operation (Map#{...}) or a BIF that expects a map
is given a non-map term, the exception will be:
{badmap,Term}
This kind of exception is similar to the {badfun,Term} exception
from operations that expect a fun.
When a map operation requires a key that is not present in a map,
the following exception will be raised:
{badkey,Key}
José Valim suggested that the exception should be
{badkey,Key,Map}. We decided not to do that because the map
could potentially be huge and cause problems if the error
propagated through links to other processes.
For BIFs, it could be argued that the exceptions could be simply
'badmap' and 'badkey', because the bad map and bad key can be found in
the argument list for the BIF in the stack backtrace. However, for the
map update operation (Map#{...}), the bad map or bad key will not be
included in the stack backtrace, so that information must be included
in the exception reason itself. For consistency, the BIFs should raise
the same exceptions as update operation.
If more than one key is missing, it is undefined which of
keys that will be reported in the {badkey,Key} exception.
|
|
|
|
The module mod_include no longer exists.
|
|
* egil/fix-maps-module-exceptions/OTP-12657:
stdlib: Correct maps module exceptions upon errors
|
|
* egil/fix-maps-match_spec-return/OTP-12656:
erts: Fix building of Map result from match_specs
|
|
* peppe/common_test/report_error_if_missing_suite:
Fix problem with suite compilation failures not being correctly reported
OTP-10816
|
|
|
|
|
|
If ssh_connection:subsystem/4 fails we do not want to crash but rather
terminate gracefully.
|
|
* ia/inets/remove-ssi/OTP-12156:
inets: Remove SSI (Server Side Includes)
|
|
* hb/stdlib/fix_orddict_doc/OTP-12651:
stdlib: Correct orddict(3)
|
|
fold() and map() handle elements in a well-defined order.
Thanks to Rabbe Fogelholm for pointing out the bug.
|
|
* origin/peppe/common_test/longname_problem:
Fix error in ct_logs, not handling long names correctly
OTP-12643
|
|
Also do some minor logging improvements
|
|
For consistency with other data types, add the is_not_map() macro.
|
|
|
|
See the previous commit for justification and use cases.
|
|
Let the loader pre-compute the hash value when a single, literal key
is matched as in:
#{<<"some_key">>:=V} = Map
In my measurements, this optimization resulted in a 30 percent
speedup for short binary keys.
Unfortunately, this optimizization makes no difference for small
maps with less than 32 keys, since the hash value is not used.
Still, there are the following use cases:
* A map used instead of a record with more than 32 entries. I have
seen some applications with huge records.
* Lookup in JSON dictionaries represented as maps.
The hash value will only be used when the map is a hash map
(currently, that means at least 32 entries).
|
|
In the i_get_map_element/4 instruction, for literal keys other than
atoms, the key would be put into x[0] instead of used directly in the
instruction. The reason is that the original implementation of maps
only supported atom keys.
|