aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2015-04-16Merge branch 'bjorn/maps'Björn Gustavsson
* 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
2015-04-16Merge branch 'egil/refactor-message-queue-probes'Björn-Egil Dahlberg
* egil/refactor-message-queue-probes: erts: Refactor dtrace call probes erts: Refactor erts_queue_message
2015-04-15Merge branch 'sverk/nlmills-pr653/efile-union-pwritev/OTP-12653'Sverker Eriksson
* sverk/nlmills-pr653/efile-union-pwritev/OTP-12653: erts: Cleanup code in invoke_pwritev Use the correct union member inside efile_drv
2015-04-15Merge branch 'sverk/crypto/rm-EVP_CIPHER_CTX_new'Sverker Eriksson
* sverk/crypto/rm-EVP_CIPHER_CTX_new: crypto: Fix undefined symbol EVP_CIPHER_CTX_new
2015-04-15Merge branch 'ia/ssh/channel-gracefull-shutdown/OTP-12648'Ingela Anderton Andin
* ia/ssh/channel-gracefull-shutdown/OTP-12648: ssh: Shutdown sftp channel gracefully
2015-04-15Document the new {badmap,Term} and {badkey,Key} exceptionsBjörn Gustavsson
2015-04-15Raise more descriptive error messages for failed map operationsBjörn Gustavsson
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.
2015-04-14Merge branch 'egil/fix-maps-module-exceptions/OTP-12657'Björn-Egil Dahlberg
* egil/fix-maps-module-exceptions/OTP-12657: stdlib: Correct maps module exceptions upon errors
2015-04-14Merge branch 'egil/fix-maps-match_spec-return/OTP-12656'Björn-Egil Dahlberg
* egil/fix-maps-match_spec-return/OTP-12656: erts: Fix building of Map result from match_specs
2015-04-14Merge branch 'peppe/common_test/report_error_if_missing_suite'Peter Andersson
* peppe/common_test/report_error_if_missing_suite: Fix problem with suite compilation failures not being correctly reported OTP-10816
2015-04-14erts: Refactor dtrace call probesBjörn-Egil Dahlberg
2015-04-14erts: Refactor erts_queue_messageBjörn-Egil Dahlberg
2015-04-14ssh: Shutdown sftp channel gracefullyIngela Anderton Andin
If ssh_connection:subsystem/4 fails we do not want to crash but rather terminate gracefully.
2015-04-14Merge branch 'ia/inets/remove-ssi/OTP-12156'Ingela Anderton Andin
* ia/inets/remove-ssi/OTP-12156: inets: Remove SSI (Server Side Includes)
2015-04-14Merge branch 'hb/stdlib/fix_orddict_doc/OTP-12651'Hans Bolinder
* hb/stdlib/fix_orddict_doc/OTP-12651: stdlib: Correct orddict(3)
2015-04-14stdlib: Correct orddict(3)Hans Bolinder
fold() and map() handle elements in a well-defined order. Thanks to Rabbe Fogelholm for pointing out the bug.
2015-04-13Merge remote-tracking branch 'origin/peppe/common_test/longname_problem'Peter Andersson
* origin/peppe/common_test/longname_problem: Fix error in ct_logs, not handling long names correctly OTP-12643
2015-04-13Fix problem with suite compilation failures not being correctly reportedPeter Andersson
Also do some minor logging improvements
2015-04-13erl_term.h: Add is_not_map() macroBjörn Gustavsson
For consistency with other data types, add the is_not_map() macro.
2015-04-13Tigthen code for the i_get_map_elements/3 instructionBjörn Gustavsson
2015-04-13Pre-compute hash values for the general get_map_elements instructionBjörn Gustavsson
See the previous commit for justification and use cases.
2015-04-13Teach the loader to pre-compute the hash value for single-key lookupsBjörn Gustavsson
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).
2015-04-13Optimize use of i_get_map_element/4Björn Gustavsson
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.
2015-04-13beam_emu: Slightly optimize update_map_{assoc,exact}Björn Gustavsson
In the update loop for big maps, the E variable is restored for each turn of the loop. It only needs to be restored if a garbage collection has been performed. Also add a new test case that attempts to force several garbage collections while updating a map, to help us find bugs with incorrect restoration of the E variable after a garbage collection.
2015-04-13v3_codegen: Don't sort map keys in map creation/updateBjörn Gustavsson
It is no longer necessary to sort the keys, since the loader does the sorting.
2015-04-13beam_validator: No longer require strict literal term orderBjörn Gustavsson
The BEAM loader will now sort keys for maps during loading, so beam_validator should not require the keys to be ordered any order. However, we must still ensure that literals keys are unique (which was implicitly guaranteed by the strict ordering requirement).
2015-04-13Sort maps keys in the loaderBjörn Gustavsson
The map instructions require that the keys in the instructions are sorted (for flatmaps). But that is an implementation detail that should not exposed outside of the BEAM virtual machine. Therefore, make the sorting of the keys the responsibility of the loader and not the compiler. Also note that the sort order for maps with numeric keys or keys with numeric components has changed in OTP 18. That means that code compiled for OTP 17 that operated on maps with map keys might not work in OTP 18 without the sorting in the loader (although it is unlikely to be an issue in practice).
2015-04-13De-optimize the has_map_fields instructionsBjörn Gustavsson
The has_map_fields instruction is infrequently used. Thus there is no need to have the fastest possible implementation; it is better to have an implementation that reduces the code size in the already big process_main() function. We can transform has_map_fields to a get_map_elements instruction, targeting the same unused x[0] register for all keys. That instruction will only be marginally slower than existing implementation.
2015-04-13erts/map_SUITE.erl: Add a test case that tests has_map_fieldsBjörn Gustavsson
The has_map_fields instruction was not tested at all by erts/map_SUITE.erl
2015-04-13Fully evaluate is_map/1 for literals at load-timeBjörn Gustavsson
The compiler will only emit is_map/1 instructions with literal argument if optimization is turned off. Therefore, the only reason for this commit is cleanliness.
2015-04-13map_SUITE: Add tests of is_map/1 with literal mapsBjörn Gustavsson
To be sure that the compiler and BEAM virtual machine correctly handles literals maps, we must test it.
2015-04-13Run a clone of map_SUITE without optimizationsBjörn Gustavsson
Create a clone of map_SUITE named map_no_opt_SUITE to ensure that the loader can cope with unoptimized map instructions.
2015-04-13Remove the fail label operand of the new_map instructionBjörn Gustavsson
The new_map instruction cannot fail, and thus needs no fail label.
2015-04-13Correct transformation of put_map_assoc to new_mapBjörn Gustavsson
A put_map_assoc instruction with an empty source map should be converted to a simpler new_map instruction. The transformation didn't happen because an empty source map is no longer represented as a NIL term (as it was in the beginning before map literals were implemented).
2015-04-13Remove support for put_map_exact without a source mapBjörn Gustavsson
Using the exact operator (':=') is only allowed when an existing map is being updated. Thus the following causes a compilation error: #{k:=v} Therefore there is no need to support the put_map_exact instruction without a source map.
2015-04-13stdlib: Correct maps module exceptions upon errorsBjörn-Egil Dahlberg
Bad input to maps module function will now yield exceptions: * {badmap,NotMap} or, * badarg
2015-04-10erts: Cleanup code in invoke_pwritevSverker Eriksson
2015-04-10Use the correct union member inside efile_drvNick Mills
The `invoke_pwritev()` function was in some places using the union member intended for the `invoke_writev()` function.
2015-04-10Fix error in ct_logs, not handling long names correctlyPeter Andersson
2015-04-10Merge branch 'egil/maps-test-coverage'Björn-Egil Dahlberg
* egil/maps-test-coverage: erts: Remove code that was commented out erts: Cover maps:values/1 for large maps erts: Test maps:from_list/1 shrinking
2015-04-10Merge branch 'egil/fix-maps-deep-colliding-merge'Björn-Egil Dahlberg
* egil/fix-maps-deep-colliding-merge: erts: Fix deep colliding hash values in maps:from_list/1
2015-04-10Merge branch 'egil/fix-hash-float-zero/OTP-12641'Björn-Egil Dahlberg
* egil/fix-hash-float-zero/OTP-12641: erts: Ensure hashing of zero is consistent
2015-04-10erts: Ensure hashing of zero is consistentBjörn-Egil Dahlberg
Erlang treats positive and negative zero as equal, meaning, true = 0.0 =:= 0.0/-1 However, Erlangs hash functions: hash, phash and phash2 did not reflect this behaviour. Meaning, the hash values produced by the different hash functions would not be identical for positive and negative zero. This commit ensures that hash value of positive zero is always produced regardless of the signedness of the zero float, i.e. true = erlang:phash2(0.0) =:= erlang:phash2(0.0/-1)
2015-04-10erts: Remove code that was commented outBjörn-Egil Dahlberg
2015-04-10erts: Fix building of Map result from match_specsBjörn-Egil Dahlberg
A faulty "box-value" entered into the heap which could cause a segmentation fault in the garbage collector if it was written on a heap fragment.
2015-04-10Merge branch 'maint-17'Zandra Hird
Conflicts: OTP_VERSION
2015-04-10Updated OTP versionOTP-17.5.1Erlang/OTP
2015-04-10Update release notesErlang/OTP
2015-04-10Merge branch 'ia/ssh/packet_size0/OTP-12645' into maint-17Erlang/OTP
* ia/ssh/packet_size0/OTP-12645: ssh: Reset upgrade instructions to default ssh: Change version (vsn.mk) ssh: Option minimal_remote_max_packet_size and test cases ssh: fix loop bug for zero maximum_packet_size. ssh: Add ssh_info:print/1 to write onto a file descriptor ssh: Add {active, false} to ssh listen socket ssh: Change send_buf implementation from list to queue ssh: Remove error report
2015-04-10Merge branch 'bjorn/stdlib/cuddle-with-tests'Björn Gustavsson
* bjorn/stdlib/cuddle-with-tests: Eliminate deprecated now/0 used as timestamp Eliminate use of now/0 for creating a unique filename Eliminate use of deprecated now/0 for measuring time Eliminate use of deprecated now/0 for random number generation Speed up timer_simple_SUITE:timer_perf/1 Speed up timer_SUITE Optimize gen_server_SUITE:hibernate/1 Optimize gen_event_SUITE:hibernate/1 Optimize gen_fsm_SUITE:hibernate/1 Optimize unicode_SUITE:ex_binaries_errors* test cases Optimize unicode_SUITE:binaries_errors/1 binary_module_SUITE: Remove unnecessary calls to the binref module Optimize binary_module:random_ref_comp/1 Optimize io_proto_SUITE:unicode_options_gen/1