bond/CHANGELOG.md

34 KiB

Bond Changelog

Notable changes--especially new features and breaking changes--are recorded here.

Bond's version numbers follow Semantic Versioning. Each release is tagged with a Git tag. The NuGet packages follow the Git tag versions. The Bond compiler (gbc) and compiler library have a slightly different versioning scheme, following the Haskell community's package versioning policy.

Unreleased

  • gbc & compiler library: (major bump already done in bond.cabal)
  • IDL core version: TBD
  • IDL comm version: TBD
  • C++ version: (major bump needed)
  • C# NuGet version: (minor bump needed)
  • C# Comm NuGet version: TBD

gbc and Bond compiler library

  • C++ codegen now properly generates move assignment operator which was broken for some cases.
  • C++ codegen no longer generates checks for C++11, except for MSVC 2013 workarounds.
  • C++ codegen no longer generates data member initialization that invokes a constructor accepting Comparer for associative containers.
  • C++ codegen now can generate copy and move constructors with an allocator argument when a custom allocator is used and --alloc-ctors is passed to gbc.
  • C++ codegen now can generate type aliases that correspond to ones in IDL when --type-aliases flag is passed to gbc.
  • C++ codegen now can use std::scoped_allocator_adaptor for strings and containers when custom allocator is used and --scoped-alloc flag is passed to gbc.
  • C++ codegen now generates lazily constructed enum name-to-value and value-to-name maps. Additionally, a user-defined map type can now be provided to GetNameToValueMap and GetValueToNameMap.
  • import statements can now end with an optional semicolon.

C++

  • Breaking change Constructors accepting a Comparer have been removed from bond::maybe and bond::nullable types.
  • The CMake build now enforces a minimum Boost version of 1.58. The build has required Boost 1.58 or later since version 5.2.0, but this was not enforced.
  • gRPC v1.7.1 is now required to use Bond-over-gRPC.
  • Fixed includes for gRPC services with events or parameterless methods. Issue #735
  • Fixed a bug which would read an unrelated struct's field(s) when deserializing a base struct. Issue #742
  • Fixed a bug in bond::MapTo<T>::Field where Protocols type parameter was not passed to bond::Apply.

C#

  • The C# attribute Bond.Attribute can now be applied to methods. This fixes broken codegen when attributes are used on service methods. Issue #617
  • Bond Attributes on service methods are now present on all the client overloads for the methods. Previously, just the "friendly" method had the attributes.

7.0.2: 2017-10-30

  • gbc & compiler library: 0.10.1.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 7.0.2
  • C# NuGet version: 7.0.1
  • C# Comm NuGet version: 0.14.0

C++

  • Fixed a memory leak when deserializing Bond-over-gRPC messages that were stored as multiple slices.

C#

  • There were no C# changes in this release.

7.0.1: 2017-10-26

  • gbc & compiler library: 0.10.1.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 7.0.0
  • C# NuGet version: 7.0.1
  • C# Comm NuGet version: 0.14.0

C#

  • Fixes a regression introduced in 7.0.0 that resulted in an exception during generation of Serializer instances if the type contained an aliased required blob field.

7.0.0: 2017-10-24

  • gbc & compiler library: 0.10.1.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 7.0.0
  • C# NuGet version: 7.0.0
  • C# Comm NuGet version: 0.13.0

gbc and Bond compiler library

  • Add service/method annotations in C# for Comm and gRPC.
  • Add service/method metadata support in C++ for gRPC.
  • C++ codegen now uses std::allocator_traits for rebinding allocator types.

C++

  • Added bond::make_box helper function to create bond::Box<T> instances.
  • When Unicode conversion fails during JSON deserialization to wstring, a bond::CoreException is now thrown instead of a Boost exception.
  • When SimpleJSON deserializes a map key with no matching value, a bond::CoreException is now thrown.
  • When SimpleJSON deserializes a map key of non-primitive type, a bond::CoreException is now thrown.
  • Errors from some versions of G++ like "non-template type Deserialize used as a template" have been fixed. Issue #538
  • Guard against overflows in OutputMemoryStream, blob, and SimpleArray.
  • Use RapidJSON's iterative parser to handle deeply nested JSON data without causing a stack overflow.
  • Guard against min/max being function-style macros in more places.
  • Allow Bond-generated C++ types to use non-default-constructable allocators. (This works even on MSVC 2013 by only compiling the generated-type's default constructor if it is used. The default constructor is now a templated constructor that is invokable with zero arguments.)
  • Fixed some macro uses that did not have sufficient parenthesis around parameters and resulted in compiler errors.
  • Added the bond::ext::gRPC::shared_unary_call type. This type can be used when shared ownership semantics are needed for unary_call instances.
  • Provide compile-time access to metadata about gRPC services and methods.
  • Using bond::ext::gRPC::wait_callback no longer causes a shared_ptr cycle and the resulting resource leak.
  • Ensure that bond_grpc.h and bond_const_grpc.h are generated when the CMake variable BOND_ENABLE_GRPC is set to that importing bond.bond and bond_const.bond when defining a service works.
  • Added bond::capped_allocator adapter that will allow to limit the max number of bytes to allocate during deserialization.

C#

  • Breaking change The code generation MSBuild targets no longer support Mono's xbuild: only MSBuild is supported. Mono has deprecated xbuild in favor of MSBuild now that MSBuild is open source and cross-platform.
  • Breaking change The code generation MSBuild targets now automatically compile the generated _grpc.cs files if --grpc is passed to gbc. Explicit <Compile Include="$(IntermediateOutputPath)foo_grpc.cs" /> lines in MSBuild projects will need to be removed to fix error MSB3105 about duplicate items. See commit a120cd99 for an example of how to fix this. Issue #448
  • Breaking change The low-level API IParser.ContainerHandler now has an arraySegment parameter for the converted blob.
  • The code generation MSBuild targets will now skip compiling the _types.cs files when --structs=false is passed to gbc.
  • Added Bond.Box.Create helper method to create Bond.Box<T> instances.
  • Reflection.IsBonded now recognizes custom IBonded implementations.
  • Use Newtonsoft's JSON.NET BigInteger support -- when available -- to handle the full range of uint64 values in the SimpleJson protocol (.NET 4.5 or greater, .NET Standard 1.6 or greater).
  • Bond.IO.Unsafe.InputStream can now be used with streams that do not implement Stream.Seek, like System.IO.Compression.GzipStream. Issue #498
  • Fix a bug in CompactBinaryWriter when using v2 that repeated first pass when a bonded field was serailized, resulting in extra work and extra state left in the CompactBinaryWriter.
  • Apply IDL annotations to services and methods for gRPC. Issue #617
  • Fixed a bug that produced C# code that couldn't be compiled when using Bond-over-gRPC with a generic type instantiated with a collection. Issue #623
  • When targeting .NET 4.5, avoid resolving external entities when using SimpleXmlReader.
  • Remove redundant conversions during serialization of aliased blobs.

C# Comm

  • Apply IDL annotations to services and methods for Comm.

6.0.1

This version was not used.

6.0.0: 2017-06-29

  • gbc & compiler library: 0.10.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 6.0.0
  • C# NuGet version: 6.0.0
  • C# Comm NuGet version: 0.12.0

gbc and Bond compiler library

  • IDL support for service inheritance syntax
    • Breaking change In the Bond Haskell library, the Service type has a new field serviceBase.
  • C++ codegen now generates extern templates of bond::Apply instead of overloads.
  • C++ codegen hides FieldTemplate details, shortening symbol names.

C++

  • Breaking change A C++11 compiler is now required. The minimum supported C++ compiler versions are now:
    • Clang 3.4 or newer
    • GNU C++ 4.7 or newer
    • Microsoft Visual C++ 2013 or newer
  • Breaking change The generated apply.h/.cpp files now contain extern templates of bond::Apply instead of overload implementations. Calls to bare Apply or TypeNamespace::Apply must be changed to bond::Apply.
  • Breaking change Users who are implementing custom streams are now required to provide the free functions CreateInputBuffer, CreateOutputBuffer and GetBufferRange, depending on which scenarios are used (there will be a corresponding compilation error for each case).
    • Users who were mistakenly calling bond::Merge<T> with explicit an template argument will get a compilation error. To fix, remove the <T> part.
    • In addition, users of MSVC12 are required to define a range_type typedef as a return type of corresponding GetBufferRange inside their custom input buffer implementation.
    • Please see InputBuffer, OutputBuffer, and the bf example for more details.
  • Breaking change The bond::customize<protocols> has been removed. All the public APIs that require a protocol list (e.g. bond::Marshal) now accept an extra template argument Protocols which defaults to bond::BuiltInProtocols. Custom input streams now require bond::type_id<> to be specialized with a unique magic number. For more details please see the bf example.
  • Initial support for sending Bond objects over gRPC has been added.
  • The bond::Apply function now has a uniform signature. Call sites for the Marshaler<Writer> transform overload that were mistakenly passing Writer explicitly (e.g. bond::Apply<Writer>(marshaler, value)) will now get a compiler error. To fix, remove the <Writer> part: bond::Apply(marshaler, value).
  • Fixed a bug that caused serialization using CompactBinaryWriter<OutputCounter> (to get the expected length of serializing with compact binary) to produced bogus results.
  • Fixed custom streams support which was broken for some scenarios.
  • For Visual C++ 2017 compability, RapidJSON v1.0.0 or newer is now required. The RapidJSON submodule that Bond uses by default has been updated to v1.1.0 due to a warning from clang in earlier versions.
  • C++ codegen hides FieldTemplate details, shortening symbol names.

C#

  • Breaking change Support for .NET 4.0 has been dropped from the supported frameworks.
  • Breaking change The deprecated type Bond.BondReflection has been removed. The type Bond.Reflection should be used instead.
  • Breaking change Bond assemblies are now strong-name signed with the bond.snk key in the repository instead of with a Microsoft key. This allows anyone to produce compatible assemblies, not just Microsoft. Official distribution of Bond will continue to be Authenticode signed with a Microsoft certificate. Issue #414
    • The new public key for assemblies is now 00240000048000009400000006020000002400005253413100040000010001000d504ac18b4b149d2f7b0059b482f9b6d44d39059e6a96ff0a2a52678b5cfd8567cc67254132cd2debb5b95f6a1206a15c6f8ddac137c6c3ef4995f28c359acaa683a90995c8f08df7ce0aaa8836d331a344a514c443f112f80bf2ebed40ccb32d7df63c09b0d7bef80aecdc23ec200a458d4f8bafbcdeb9bf5ba111fbbd4787
  • Breaking change Bond assemblies now have assembly and file versions that correspond to their NuGet package version. Strong name identities will now change release-over-release in line with the NuGet package versions. Issue #325
  • The codegen MSBuild targets will now re-run codegen if gbc itself has been changed.
  • Fixed a bug where JSON and XML protocols would permit the serialization of non-nullable string fields that were set to null instead of throwing a NullReferenceException. Issue #417

5.3.1: 2017-04-25

  • gbc & compiler library: 0.9.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 5.3.0
  • C# NuGet version: 5.3.1
  • C# Comm NuGet version: 0.11.1

C#

  • Cleaned up documentation comments.

5.3.0: 2017-04-12

  • gbc & compiler library: 0.9.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 5.3.0
  • C# NuGet version: 5.3.0
  • C# Comm NuGet version: 0.11.0

gbc and Bond compiler library

  • C++ codegen ensures that parameter names do not shadow field names.
  • When generating C++ apply files, there are now explicit bond::Apply<> instantiations for CompactBinaryWriter<OutputCounter> and SimpleBinaryWriter<Null> writers. Pull request #373
    • Breaking change (Haskell library only): Language.Bond.Codegen.Cpp.ApplyOverloads.Protocol is now a union of ProtocolReader and ProtocolWriter to permit mixing and matching of reader/writer protocols without having to explicitly compute the full cross product.
  • Add gbc flags to pick which C# files to generate (structs, gRPC, and comm). Only structs are generated by default.
  • gbc ensures that method names are unique within a service. Issue #381

C++

  • Fix Python shared_ptr converter build break with Boost 1.63.
  • Improve compliance with Microsoft's SDL.
  • Eliminate need for warning suppression on MSVC14 via warning.h in Bond itself. warning.h is still in place on MSVC12; furthermore, we don't alter warning.h for now as it may be depended upon by application code.
  • Avoid unaligned memory access on non-x86/x64 platforms. Issue #305
  • Improve compliance with strict-aliasing rules.
    • Bond now builds on Clang/GCC with -fstrict-aliasing.
  • When generating C++ apply files, there are now explicit bond::Apply<> instantiations for CompactBinaryWriter<OutputCounter> and SimpleBinaryWriter<Null> writers. Pull request #373
  • Improve C++ allocator support Issue #379 Pull request #380
    • Support C++11 and above allocator model for rebind
    • Simplify detection of the default allocator
  • Remove per-field instantiation of DynamicParser<>::UnknownFieldOrTypeMismatch method.

C#

  • Added gRPC integration. See the Bond-over-gRPC manual.
  • Added controls to cap incremental allocation between reads in Bond.IO.Unsafe.InputStream.
  • Extended fix for bug parsing JSON when a string value is a date. Pull request #358
  • Bond C# 5.1.0 accidentally broke backward compability by renaming Bond.Reflection to Bond.BondReflection. This has been fixed: Bond.BondReflection was unrenamed back to Bond.Reflection, and a shim Bond.BondReflection type now redirects all calls to their original names to minimize further breakage. Issue #369
    • Code that started using Bond.BondReflection by name will encounter warning CS0618 indicating use of an obselete method/type. To fix this, use the original name Bond.Reflection. This warning can be suppressed if needed. However...
    • ...the shim type Bond.BondReflection will be removed during or after the next major release of C# Bond.

C# Comm

  • Breaking change To generate C# Comm files, be sure to pass the --comm flag to gbc. See how the pingpong example was updated.
  • C# Comm is now deprecated. We recommend that you use Bond-over-gRPC. See the Bond-over-gRPC manual.
  • EpoxyListener's StopAsync() now stops all the outstanding connections that it accepted.
  • EpoxyTransport's StopAsync() now stops all the connections and listeners that it created.

5.2.0: 2017-02-07

  • gbc & compiler library: 0.8.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 5.2.0
  • C# NuGet version: 5.2.0
  • C# Comm NuGet version: 0.10.0

gbc and Bond compiler library

  • Breaking change: The C++ Comm .cpp template has been renamed to comm_cpp from types_comm_cpp to match the file it generates.
  • Add export-attribute option for C++ and make apply-attribute a deprecated synonym for export-attribute
  • Fix C++ Comm build problems when services are shared via DLL. Issue #314

C++

  • Fixed compatibility with RapidJSON v1.1.0. Issue #271
  • The minimum supported version of Boost is now 1.58
  • The bf utility now supports multiple payloads. Pull request #288
  • Fixed an issue with aliased enums. Pull request #288
  • Fixed an issue with template parameter deduction in bond::is_nullable that occurs with Microsoft Visual C++ 2015 Update 3. Issue #306

C++ Comm

  • Fixed a multiply-defined symbol linker error for bond::comm::epoxy::detail::MakeConfigFrame.

C#

  • Added controls to cap pre-allocation during deserialization of containers and blobs.
  • Fixed computation of default value for aliased bool and wstring fields. Issue #300

C# Comm

  • Resources are now properly cleaned up if failures are encountered when establishing client-side Epoxy connections.
  • The generated interfaces for services are now public. They were inadvertently internal before.

5.1.0: 2016-11-14

  • gbc & compiler library: 0.7.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.2
  • C++ version: 5.1.0
  • C# NuGet version: 5.1.0
  • C# Comm NuGet version: 0.9.0

gbc and Bond compiler library

  • Breaking change: The Haskell utility functions structName and structParams were renamed to className and classParams (in the Language.Bond.Codegen.Cpp.Util module).
  • Added initial support for generating C++ Comm services and proxies.

C++ Comm

  • The initial C++ Comm code has been merged in, but there is still work left to be done before the first preview release. Use at your own risk.

C#

  • Bond C# now supports .NET Standard 1.0, 1.3, and 1.6, so you can use Bond in .NET Core applications. Pull request #243
    • Not all assemblies work with all versions of the .NET Standard or on all platforms. The manual lists which assemblies target which frameworks.
    • Bond C# Comm is not yet building with .NET Core toolchain, so its .NET Core support is preliminary.
  • Bond.JSON now depends on Newsoft.JSON 9.0.1, the earliest version that supports .NET Standard 1.0.
  • A new assembly, Bond.Reflection.dll, has been added, due to some internal refactoring needed for .NET Core support. Many of the Bond assemblies now have a dependency on this assembly, so you'll need to deploy it. If you use NuGet to consume Bond, this is should be handled automatically.
  • Fixed a bug in the MSBuild targets that caused codegen to always be run if all of the BondCodegen items have Options metadata.
  • Fixed a bug in the MSBuild targets that caused compilation to fail if the $BondOutputDirectory did not end with a trailing slash.

C# Comm

  • The constructor for LayerStackProvider no longer requires a logger; instead, the transport's logger is passed to OnSend/OnReceive. Before, using the same logger with a transport and LayerStackProvider required a duplicate implementation.
  • Fixed a bug that prevented EpoxyListener from accepting multiple connections in parallel.

C# Comm 0.8.0: 2016-10-12

  • C# Comm NuGet version: 0.8.0

C# Comm

  • EpoxyTransport can be configured to enable TCP keep-alive to help detect dead connections. See EpoxyTransportBuilder.SetKeepAliveTimes for details.

5.0.0: 2016-09-12

  • gbc & compiler library: 0.6.0.0
  • IDL core version: 2.0
  • IDL comm version: 1.1
  • C++ version: 5.0.0
  • C# NuGet version: 5.0.0
  • C# Comm NuGet version: 0.7.0

IDL core

  • Breaking change: bond.TypeDef.list_sub_type field removed, as it was breaking some consumers of serialized SchemaDef. We plan to restore this field in the future. Issue #161 re-opened

IDL comm

  • Update IDL to conform to naming conventions.
  • Adjust IDL for changes made to Epoxy internals

C++

  • Breaking change: Runtime SchemaDef list_sub_type field removed, as it was breaking some consumers of serialized SchemaDef. We plan to restore this field in the future. Issue #161 re-opened
  • Generated enum types now have a FromEnum method that can be used to convert from an enum value to a string. Now generated enum types have all four of ToEnum, FromEnum, ToString, and FromString. (The ...Enum variants return false on failure, while the ...String variants throw.)

C#

  • Breaking change: Runtime SchemaDef list_sub_type field removed, as it was breaking some consumers of serialized SchemaDef. We plan to restore this field in the future. Issue #161 re-opened
  • The Bond.Runtime NuGet package no longer artificially limits Newtonsoft.Json to versions before 10. Issue #212

C# Comm

  • EpoxyListeners can now be configured to require clients to authenticate themselves with a certificate. This is configured via the clientCertificateRequired parameter when creating an EpoxyServerTlsConfig.
  • Internals of the Epoxy protocol cleaned up. See the updated wire format specification.

4.3.0: 2016-08-23

  • gbc & compiler library: 0.5.0.0
  • IDL core version: 1.0 (first release)
  • IDL comm version: 1.0 (first release)
  • C++ version: 4.3.0
  • C# NuGet version: 4.3.0
  • C# Comm NuGet version: 0.6.0

gbc and Bond compiler library

  • Breaking change: Runtime SchemaDef now includes information about whether BT_LIST fields are nullable or blobs. Issue #161
  • User-defined TypeMappings can now be created. This makes is easier to implement code generation for new languages. Pull request #172
  • Validate default value type mistmatches. Issue #72 Issue #128
  • Validate default value out-of-range values. Issue #73
  • Fail when struct field has default value of nothing. Issue #164
  • Fail when enum field doesn't have default value. Issue #177
  • Validate default value of type aliases
  • Generated types will used = default move constructors if possible. This results in many generated types having noexcept move constructors.
  • Fix a bug where, if a Bond namespace contained a struct and an enum value with the same name, generated C++ would contain ambiguous references. Issue #202

IDL core

  • Set up a separate IDL directory so that IDL is independent of language bindings. Pull request #219

IDL comm

  • Set up a separate IDL directory so that IDL is independent of language bindings. Convert comm IDL files to use C++-style naming convention. Pull request #219

C++

  • Improvements in the nullable implementation. Pull request #174
    • Correctly use allocator model.
    • Reduce size of nullable in the normal case.
    • And others
  • Runtime SchemaDef now includes information about whether BT_LIST fields are nullable or blobs. Issue #161
  • The following Bond types have (possibly conditional) noexcept move constructors: blob, bonded, maybe, nullable, RuntimeSchema, value.

C#

  • Bond can now be used with Newtonsoft.Json >= 7.0.1 and < 10
  • Runtime SchemaDef now includes information about whether BT_LIST fields are nullable or blobs. Issue #161

C# Comm

  • Logging interface revamped to make it non-static, eliminate boilerplate code, and to handle logging-related exceptions gracefully.
    • LogHandler renamed to ILogSink.
    • TransportBuilder.SetLogSink added to associate a logger with a transport.
    • TransportBuilder.EnableDebugLogging added to control whether debug logs are emitted or not.
    • The ILogSink.Log method is now provided a pre-formatted string instead of a format string and its arguments.
  • Transport is now parameterized with Connection and Listener implementations. This eliminates the need to cast the results of transport.ConnectToAsync() and transport.MakeListener() to transport-specific subtypes.
  • Epoxy has a hook for performing custom host to IP address resolution. This is configured with EpoxyTransportBuilder.SetResolver.
  • Bond-generated Errors now give clients opaque GUIDs. These GUIDs can be matched against emitted metrics for debugging.
  • Epoxy can now be configured to use TLS to secure the connection.
    • TLS configuration is set via EpoxyTransportBuilder.SetClientTlsConfig/EpoxyTransportBuilder.SetServerTlsConfig.
    • See the TLS example for even more details.

4.2.1: 2016-06-02

  • gbc & compiler library: 0.4.1.0
  • C# NuGet version: 4.2.1
  • C# Comm NuGet version: 0.5.0

gbc

C#

  • Added Deserializer.TryDeserialize().
  • Added two new NuGet packages to make it easier to consume Bond piecemeal.
    • Bond.Compiler: contains gbc, bond.bond, and bond_const.bond in a tools-only package
    • Bond.Compiler.CSharp: contains gbc and C# MSBuild targets. No longer do you have to consume Bond.CSharp (which pulls in all of the rest of Bond) just to get codegen.

C# Comm

4.2.0: 2016-04-28

  • gbc & compiler library: 0.4.0.2
  • C# NuGet version: 4.2.0

C#

  • Add support for Compact Binary v2 writing. Issue #70

4.1.0: 2016-04-22

  • gbc & compiler library: 0.4.0.2
  • C# NuGet version: 4.1.0

gbc

C++

  • Enums are now cast to 32-bit integers to avoid some compiler warnings.
  • Bond can be used in code bases where there is a function-style macro named U.

C#

4.0.2: 2015-12-14

  • gbc & compiler library: 0.4.0.1
  • C# NuGet version: 4.0.2

Bond compiler library

C#

Breaking changes between 3.x and 4.x

Bond C# had the following breaking changes introduced in 4.x compared to the 3.x versions:

  • The Bond.Core.CSharp NuGet package was introduced so that not all uses of Bond depend on Json.NET. The Bond.Runtime.CSharp package still depends on Json.NET and also depends on Bond.Core.CSharp. The primary package remains Bond.CSharp.
  • CompactBinaryReader<InputStream> now explicitly implements ICloneable<CompactBinaryReader<InputStream>> instead of implicitly. FastBinaryReader and SimpleBinaryReader were likewise changed.

Earlier release

These sections need to be written. In the meantime, consult the repository's history.