@@ -25,7 +25,9 @@ namespace filtering
{
bool
-has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s);
+has_harmless_name_change(const decl_base_sptr& f,
+ const decl_base_sptr& s,
+ const diff_context_sptr& ctxt);
bool union_diff_has_harmless_changes(const diff *d);
@@ -2836,6 +2836,14 @@ public:
enumerators&
get_enumerators();
+ bool
+ find_enumerator_by_value(int64_t value,
+ enum_type_decl::enumerator& result);
+
+ bool
+ find_enumerator_by_name(const string& name,
+ enum_type_decl::enumerator& result);
+
virtual string
get_pretty_representation(bool internal = false,
bool qualified_name = true) const;
@@ -40,6 +40,13 @@ static bool
type_diff_has_cv_qual_change_only(const type_base_sptr& f,
const type_base_sptr& s);
+static bool
+has_harmful_enum_change(const diff* diff);
+
+static bool
+has_harmless_enum_change(const type_base_sptr& f,
+ const type_base_sptr& s,
+ const diff_context_sptr& ctxt);
using std::dynamic_pointer_cast;
/// Walk the diff sub-trees of a a @ref corpus_diff and apply a filter
@@ -756,9 +763,14 @@ integral_type_has_harmless_name_change(const decl_base_sptr& f,
///
/// @param s the second decl to consider in the comparison.
///
+/// @param ctxt the diff context to use for fine grained comparison of
+/// @p f and @p s.
+///
/// @return true iff decl @p s represents a harmless change over @p f.
bool
-has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
+has_harmless_name_change(const decl_base_sptr& f,
+ const decl_base_sptr& s,
+ const diff_context_sptr& ctxt)
{
// So, a harmless name change is either ...
return (decl_name_changed(f, s)
@@ -785,23 +797,17 @@ has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
// ... Only qualifers changed on the type without having
// the underlying type changed ...
|| type_diff_has_cv_qual_change_only(is_type(f), is_type(s))
+ || has_harmless_enum_change(is_type(f), is_type(s), ctxt)
// ... or a data member name change, without having its
// type changed ...
|| (is_data_member(f)
&& is_data_member(s)
&& (is_var_decl(f)->get_type()
== is_var_decl(s)->get_type()))
- // .. an enum name change without having any other part
- // of the enum to change.
- || (is_enum_type(f)
- && is_enum_type(s)
- && !enum_has_non_name_change(*is_enum_type(f),
- *is_enum_type(s),
- 0))
|| integral_type_has_harmless_name_change(f, s)));
}
-/// Test if two decls represents a harmful name change.
+/// Test if two decls represent a harmful name change.
///
/// A harmful name change is a name change that is not harmless, so
/// this function uses the function has_harmless_name_change.
@@ -810,11 +816,15 @@ has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
///
/// @param s the second decl to consider in the comparison.
///
+/// @param ctxt the diff context to use for comparison.
+///
/// @return true iff decl @p s represents a harmful name change over
/// @p f.
bool
-has_harmful_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
-{return decl_name_changed(f, s) && ! has_harmless_name_change(f, s);}
+has_harmful_name_change(const decl_base_sptr& f,
+ const decl_base_sptr& s,
+ const diff_context_sptr& ctxt)
+{return decl_name_changed(f, s) && ! has_harmless_name_change(f, s, ctxt);}
/// Test if a diff node represents a harmful name change.
///
@@ -833,7 +843,7 @@ has_harmful_name_change(const diff* dif)
decl_base_sptr f = is_decl(dif->first_subject()),
s = is_decl(dif->second_subject());
- return has_harmful_name_change(f, s);
+ return has_harmful_name_change(f, s, dif->context());
}
/// Test if a class_diff node has non-static members added or
@@ -1699,22 +1709,52 @@ has_enumerator_insertion(const diff* diff)
return false;
}
-/// Test if an enum_diff carries an enumerator removal.
+/// Test if an enum_diff carries an enumerator removal or an
+/// enumerator value change.
///
/// @param diff the enum_diff to consider.
///
/// @return true iff @p diff carries an enumerator removal or change.
static bool
-has_enumerator_removal_or_change(const diff* diff)
+has_enumerator_removal_or_value_change(const diff* diff)
{
if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
- return (!d->deleted_enumerators().empty()
- || !d->changed_enumerators().empty());
+ {
+ if (!d->deleted_enumerators().empty())
+ return true;
+
+ for (auto& entry : d->changed_enumerators())
+ {
+ const changed_enumerator& change = entry.second;
+ if (change.first.get_value() != change.second.get_value())
+ return true;
+ }
+ }
+ return false;
+}
+
+/// Test if a diff node carries an enumerator name or value change.
+///
+/// @param diff the diff node to consider.
+///
+/// @return true iff the diff node @p diff carries an enumerator name
+/// or value change.
+static bool
+has_enumerator_change(const diff* diff)
+{
+ if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
+ return !d->changed_enumerators().empty();
return false;
}
/// Test if an enum_diff carries a harmful change.
///
+/// For now, a harmful enum change is either a change that:
+///
+/// - changes the size of the enum type
+///
+/// - or removes (or changes) an existing enumerator value.
+///
/// @param diff the enum_diff to consider.
///
/// @return true iff @p diff carries a harmful change.
@@ -1722,8 +1762,9 @@ static bool
has_harmful_enum_change(const diff* diff)
{
if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
- return (has_enumerator_removal_or_change(d)
- || has_type_size_change(d));
+ if (has_type_size_change(d) || has_enumerator_removal_or_value_change(d))
+ return true;
+
return false;
}
@@ -1773,6 +1814,77 @@ has_harmless_enum_to_int_change(const diff* diff)
return false;
}
+/// Test if two types represent a harmless (that can be filtered out
+/// by default) enum type change.
+///
+/// A harmless enum type change is either an enumerator insertion or
+/// an enumerator change that doesn't represents a harmful enum change
+/// at the same time. Note that a harmless enum to int change is a
+/// harmless enum change too.
+///
+/// @param t1 the first version of the type to consider.
+///
+/// @param t2 the second version of the type to consider.
+///
+/// @param ctxt the diff context to use to compare @p t1 and @p t2.
+///
+/// @return true iff {t1, t2} represents a harmless enum change.
+static bool
+has_harmless_enum_change(const type_base_sptr& t1,
+ const type_base_sptr& t2,
+ const diff_context_sptr& ctxt)
+{
+ type_base_sptr f = peel_typedef_type(t1);
+ type_base_sptr s = peel_typedef_type(t2);
+ enum_type_decl_sptr e1 = is_enum_type(f);
+ enum_type_decl_sptr e2 = is_enum_type(s);
+
+ if (!e1 || !e2)
+ return false;
+
+ enum_diff_sptr dyf = compute_diff(e1, e2, ctxt);
+ if (((has_enumerator_insertion(dyf.get()) || has_enumerator_change(dyf.get()))
+ && !has_harmful_enum_change(dyf.get()))
+ || has_harmless_enum_to_int_change(dyf.get()))
+ return true;
+
+ return false;
+}
+
+/// Test if two types represent a harmless (that can be filtered out
+/// by default) enum type change.
+///
+/// A harmless enum type change is either an enumerator insertion or
+/// an enumerator change that doesn't represents a harmful enum change
+/// at the same time. Note that a harmless enum to int change is a
+/// harmless enum change too.
+///
+/// @param t1 the first version of the type to consider.
+///
+/// @param t2 the second version of the type to consider.
+///
+/// @param ctxt the diff context to use to compare @p t1 and @p t2.
+///
+/// @return true iff {t1, t2} represents a harmless enum change.
+static bool
+has_harmless_enum_change(const diff* d)
+{
+ if (!d)
+ return false;
+
+ if (((has_enumerator_insertion(d) || has_enumerator_change(d))
+ && !has_harmful_enum_change(d))
+ || has_harmless_enum_to_int_change(d))
+ return true;
+
+ type_base_sptr f = is_type(d->first_subject());
+ type_base_sptr s = is_type(d->second_subject());
+ if (!f || !s)
+ return false;
+
+ return has_harmless_enum_change(f, s, d->context());
+}
+
/// Test if an @ref fn_parm_diff node has a top cv qualifier change on
/// the type of the function parameter.
///
@@ -2132,7 +2244,7 @@ categorize_harmless_diff_node(diff *d, bool pre)
if (is_compatible_change(f, s))
category |= COMPATIBLE_TYPE_CHANGE_CATEGORY;
- if (has_harmless_name_change(f, s)
+ if (has_harmless_name_change(f, s, d->context())
|| class_diff_has_harmless_odr_violation_change(d))
category |= HARMLESS_DECL_NAME_CHANGE_CATEGORY;
@@ -2150,9 +2262,7 @@ categorize_harmless_diff_node(diff *d, bool pre)
if (has_data_member_replaced_by_anon_dm(d))
category |= HARMLESS_DATA_MEMBER_CHANGE_CATEGORY;
- if ((has_enumerator_insertion(d)
- && !has_harmful_enum_change(d))
- || has_harmless_enum_to_int_change(d))
+ if (has_harmless_enum_change(d))
category |= HARMLESS_ENUM_CHANGE_CATEGORY;
if (function_name_changed_but_not_symbol(d))
@@ -4666,6 +4666,66 @@ enum_diff::ensure_lookup_tables_populated()
}
}
}
+
+ // If a new enumerator is added with a value that already existed
+ // in the old enum but with a new name, then populate the
+ // enum_diff::priv_::changed_enumerators_ data member with a
+ // change that represents a change to an enumerator name. The
+ // enum_diff::priv_::inserted_enumerators_ is adjusted accordingly
+ // an the 'new' enumerator is removed in this case.
+
+ enum_type_decl::enumerators enums_to_erase;
+ for (auto& entry : priv_->inserted_enumerators_)
+ {
+ enum_type_decl::enumerator& final_enumerator = entry.second;
+ enum_type_decl::enumerator initial_enumerator;
+ if (first_enum()->find_enumerator_by_value(entry.second.get_value(),
+ initial_enumerator))
+ {
+ enum_type_decl::enumerator foo;
+ if (!second_enum()->
+ find_enumerator_by_name(initial_enumerator.get_name(),
+ foo))
+ {
+ priv_->changed_enumerators_[initial_enumerator.get_name()] =
+ std::make_pair(initial_enumerator, final_enumerator);
+ enums_to_erase.push_back(final_enumerator);
+ }
+ }
+ }
+
+ for (auto& enomerator : enums_to_erase)
+ priv_->inserted_enumerators_.erase(enomerator.get_name());
+
+ // If an enumerator is deleted yet its value (with a new name) is
+ // still present among enumerators of the newer enum then populate
+ // the enum_diff::priv_::changed_enumerators_ data member with a
+ // change that represents a change to an enumerator name. The
+ // enum_diff::priv_::deleted_enumerators_ is adjusted accordingly
+ // an the 'new' enumerator is removed in this case.
+
+ enums_to_erase.clear();
+ for (auto& entry : priv_->deleted_enumerators_)
+ {
+ enum_type_decl::enumerator& initial_enumerator = entry.second;
+ enum_type_decl::enumerator final_enumerator;
+ if (second_enum()->find_enumerator_by_value(entry.second.get_value(),
+ final_enumerator))
+ {
+ enum_type_decl::enumerator foo;
+ if (!first_enum()->
+ find_enumerator_by_name(final_enumerator.get_name(),
+ foo))
+ {
+ priv_->changed_enumerators_[initial_enumerator.get_name()] =
+ std::make_pair(initial_enumerator, final_enumerator);
+ enums_to_erase.push_back(initial_enumerator);
+ }
+ }
+ }
+
+ for (auto& enomerator : enums_to_erase)
+ priv_->deleted_enumerators_.erase(enomerator.get_name());
}
}
@@ -203,14 +203,43 @@ default_reporter::report(const enum_diff& d, ostream& out,
i != sorted_changed_enumerators.end();
++i)
{
- out << indent
- << " '"
- << (first->get_is_anonymous()
- ? i->first.get_name()
- : i->first.get_qualified_name())
- << "' from value '"
- << i->first.get_value() << "' to '"
- << i->second.get_value() << "'";
+ out << indent;
+ if (i->first.get_value() != i->second.get_value())
+ {
+ out << " '"
+ << (first->get_is_anonymous()
+ ? i->first.get_name()
+ : i->first.get_qualified_name())
+ << "' from value '"
+ << i->first.get_value() << "' to '"
+ << i->second.get_value() << "'";
+ }
+ else if (i->first.get_name() != i->second.get_name())
+ {
+ out << "from '"
+ << (first->get_is_anonymous()
+ ? i->first.get_name()
+ : i->first.get_qualified_name())
+ << " = " << i->first.get_value()
+ << "' to '"
+ << (second->get_is_anonymous()
+ ? i->second.get_name()
+ : i->second.get_qualified_name())
+ << " = " << i->second.get_value()
+ << "'";
+ }
+ else
+ {
+ out << "enumerator change from '"
+ << i->first.get_name()
+ << " = "
+ << i->first.get_value()
+ << "' to '"
+ << i->second.get_name()
+ << " = "
+ << i->second.get_value()
+ << "' could not be determined - please report as a bug";
+ }
report_loc_info(second, *ctxt, out);
out << "\n";
}
@@ -245,7 +274,7 @@ default_reporter::report_non_type_typedef_changes(const typedef_diff &d,
maybe_report_diff_for_member(f, s, d.context(), out, indent);
- if ((filtering::has_harmless_name_change(f, s)
+ if ((filtering::has_harmless_name_change(f, s, d.context())
&& ((d.context()->get_allowed_category()
& HARMLESS_DECL_NAME_CHANGE_CATEGORY)
|| d.context()->show_leaf_changes_only()))
@@ -20025,6 +20025,54 @@ enum_type_decl::get_sorted_enumerators() const
return priv_->sorted_enumerators_;
}
+/// Find an enumerator by its value.
+///
+/// @param value the enumerator value to look for.
+///
+/// @param result output parameter. This is set to the enumerator
+/// which value is @p value, if found. This is set iff the function
+/// returns true.
+///
+/// @return true iff an enumerator with value @p value was found and
+/// returned by argument via @p result.
+bool
+enum_type_decl::find_enumerator_by_value(int64_t value,
+ enum_type_decl:: enumerator& result)
+{
+ for (auto& e : get_enumerators())
+ if (e.get_value() == value)
+ {
+ result = e;
+ return true;
+ }
+
+ return false;
+}
+
+/// Find an enumerator by its name
+///
+/// @param name the enumerator name to look for.
+///
+/// @param result output parameter. This is set to the enumerator
+/// which name is @p name, if found. This is set iff the function
+/// returns true.
+///
+/// @return true iff an enumerator with name @p name was found and
+/// returned by argument via @p result.
+bool
+enum_type_decl::find_enumerator_by_name(const string& name,
+ enum_type_decl::enumerator& result)
+{
+ for (auto& e : get_enumerators())
+ if (e.get_name() == name)
+ {
+ result = e;
+ return true;
+ }
+
+ return false;
+}
+
/// Get the pretty representation of the current instance of @ref
/// enum_type_decl.
///
@@ -544,7 +544,7 @@ represent(const var_diff_sptr &diff,
if (!filtering::has_anonymous_data_member_change(diff) && o_name != n_name)
{
- if (filtering::has_harmless_name_change(o, n)
+ if (filtering::has_harmless_name_change(o, n, ctxt)
&& !(ctxt->get_allowed_category()
& HARMLESS_DECL_NAME_CHANGE_CATEGORY))
;
@@ -986,7 +986,7 @@ report_name_size_and_alignment_changes(decl_base_sptr first,
&& fn != sn)
{
if (!(ctxt->get_allowed_category() & HARMLESS_DECL_NAME_CHANGE_CATEGORY)
- && filtering::has_harmless_name_change(first, second))
+ && filtering::has_harmless_name_change(first, second, ctxt))
// This is a harmless name change. but then
// HARMLESS_DECL_NAME_CHANGE_CATEGORY doesn't seem allowed.
;
@@ -1,10 +1,8 @@
1 changed type:
'enum E' changed:
type size hasn't changed
- 1 enumerator deletion:
- 'E::e2' value '1'
- 1 enumerator insertion:
- 'E::e1' value '1'
+ 1 enumerator change:
+ from 'E::e2 = 1' to 'E::e1 = 1'
1 changed declaration:
'function void foo(E)' was changed to 'function void foo(E)':
parameter 1 of type 'enum E' has sub-type changes:
@@ -479,18 +479,12 @@ Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
3 data member changes:
type of 'op_type type' changed:
type size hasn't changed
- 5 enumerator deletions:
- 'op_type::AST_OP_RSHIFT' value '6'
- 'op_type::AST_OP_LSHIFT' value '7'
- 'op_type::AST_OP_BIN_AND' value '10'
- 'op_type::AST_OP_BIN_OR' value '11'
- 'op_type::AST_OP_BIN_XOR' value '12'
- 5 enumerator insertions:
- 'op_type::AST_OP_BIT_RSHIFT' value '6'
- 'op_type::AST_OP_BIT_LSHIFT' value '7'
- 'op_type::AST_OP_BIT_AND' value '10'
- 'op_type::AST_OP_BIT_OR' value '11'
- 'op_type::AST_OP_BIT_XOR' value '12'
+ 5 enumerator changes:
+ from 'op_type::AST_OP_RSHIFT = 6' to 'op_type::AST_OP_BIT_RSHIFT = 6'
+ from 'op_type::AST_OP_LSHIFT = 7' to 'op_type::AST_OP_BIT_LSHIFT = 7'
+ from 'op_type::AST_OP_BIN_AND = 10' to 'op_type::AST_OP_BIT_AND = 10'
+ from 'op_type::AST_OP_BIN_OR = 11' to 'op_type::AST_OP_BIT_OR = 11'
+ from 'op_type::AST_OP_BIN_XOR = 12' to 'op_type::AST_OP_BIT_XOR = 12'
type of 'filter_node* lchild' changed:
pointed to type 'struct filter_node' changed, as being reported
type of 'filter_node* rchild' changed:
@@ -505,10 +499,8 @@ Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
2 data member changes:
type of 'unary_op_type type' changed:
type size hasn't changed
- 1 enumerator deletion:
- 'unary_op_type::AST_UNARY_BIN_NOT' value '4'
- 1 enumerator insertion:
- 'unary_op_type::AST_UNARY_BIT_NOT' value '4'
+ 1 enumerator change:
+ from 'unary_op_type::AST_UNARY_BIN_NOT = 4' to 'unary_op_type::AST_UNARY_BIT_NOT = 4'
type of 'filter_node* child' changed:
pointed to type 'struct filter_node' changed, as being reported
'cds_list_head allocated_nodes' offset changed from 576 to 640 (in bits) (by +64 bits)
@@ -41,20 +41,7 @@
type size hasn't changed
1 data member insertion:
'SSLAuthType authType', at offset 736 (in bits) at sslt.h:250:1
- 1 data member changes (1 filtered):
- type of 'SSLAuthType authAlgorithm' changed:
- underlying type 'enum SSLAuthType' at sslt.h:87:1 changed:
- type size hasn't changed
- 1 enumerator deletion:
- 'SSLAuthType::ssl_auth_rsa' value '1'
- 7 enumerator insertions:
- 'SSLAuthType::ssl_auth_rsa_decrypt' value '1'
- 'SSLAuthType::ssl_auth_ecdh_rsa' value '5'
- 'SSLAuthType::ssl_auth_ecdh_ecdsa' value '6'
- 'SSLAuthType::ssl_auth_rsa_sign' value '7'
- 'SSLAuthType::ssl_auth_rsa_pss' value '8'
- 'SSLAuthType::ssl_auth_psk' value '9'
- 'SSLAuthType::ssl_auth_size' value '10'
+ no data member changes (2 filtered);
1 Changed variable:
@@ -1,5 +1,5 @@
================ changes of 'libspice-server.so.1.8.0'===============
- Functions changes summary: 1 Removed, 1 Changed (78 filtered out), 8 Added functions
+ Functions changes summary: 1 Removed, 0 Changed (79 filtered out), 8 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 Removed function:
@@ -17,32 +17,5 @@
[A] 'function void spice_server_set_playback_rate(SpicePlaybackInstance*, uint32_t)' {spice_server_set_playback_rate@@SPICE_SERVER_0.12.5}
[A] 'function void spice_server_set_record_rate(SpiceRecordInstance*, uint32_t)' {spice_server_set_record_rate@@SPICE_SERVER_0.12.5}
- 1 function with some indirect sub-type change:
-
- [C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
- return type changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
- type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
- type size hasn't changed
- 7 enumerator deletions:
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
- 9 enumerator insertions:
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
-
================ end of changes of 'libspice-server.so.1.8.0'===============
@@ -20,34 +20,8 @@
2 functions with some indirect sub-type change:
[C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
- return type changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
- type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
- type size hasn't changed
- 7 enumerator deletions:
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
- 9 enumerator insertions:
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
[C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:4286:1 has some indirect sub-type changes:
- parameter 2 of type 'typedef spice_image_compression_t' changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
================ end of changes of 'libspice-server.so.1.8.0'===============
@@ -471,30 +471,7 @@
'_CursorItem* free_cursor_items' offset changed from 15379584 to 14739584 (in bits) (by -640000 bits)
'RedMemSlotInfo mem_slots' offset changed from 15379648 to 14739648 (in bits) (by -640000 bits)
'ImageCache image_cache' offset changed from 15380032 to 14739968 (in bits) (by -640064 bits)
- type of 'spice_image_compression_t image_compression' changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
- type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
- type size hasn't changed
- 7 enumerator deletions:
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
- 9 enumerator insertions:
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
- and offset changed from 15445824 to 14805760 (in bits) (by -640064 bits)
+ 'spice_image_compression_t image_compression' offset changed from 15445824 to 14805760 (in bits) (by -640064 bits)
'spice_wan_compression_t jpeg_state' offset changed from 15445856 to 14805792 (in bits) (by -640064 bits)
'spice_wan_compression_t zlib_glz_state' offset changed from 15445888 to 14805824 (in bits) (by -640064 bits)
'uint32_t mouse_mode' offset changed from 15445920 to 14805856 (in bits) (by -640064 bits)
@@ -823,9 +800,6 @@
pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
[C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
- return type changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
parameter 1 of type 'SpiceServer*' has sub-type changes:
pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
@@ -1013,9 +987,6 @@
[C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:4286:1 has some indirect sub-type changes:
parameter 1 of type 'SpiceServer*' has sub-type changes:
pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
- parameter 2 of type 'typedef spice_image_compression_t' changed:
- typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
- underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
[C] 'function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)' at reds.c:4300:1 has some indirect sub-type changes:
parameter 1 of type 'SpiceServer*' has sub-type changes:
@@ -1,6 +1,6 @@
================ changes of 'libspice-server.so.1.8.0'===============
-Leaf changes summary: 10 artifacts changed (14 filtered out)
- Changed leaf types summary: 1 (14 filtered out) leaf types changed
+Leaf changes summary: 9 artifacts changed (15 filtered out)
+ Changed leaf types summary: 0 (15 filtered out) leaf types changed
Removed/Changed/Added functions summary: 1 Removed, 0 Changed, 8 Added functions
Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
@@ -19,106 +19,5 @@ Leaf changes summary: 10 artifacts changed (14 filtered out)
[A] 'function void spice_server_set_playback_rate(SpicePlaybackInstance*, uint32_t)' {spice_server_set_playback_rate@@SPICE_SERVER_0.12.5}
[A] 'function void spice_server_set_record_rate(SpiceRecordInstance*, uint32_t)' {spice_server_set_record_rate@@SPICE_SERVER_0.12.5}
- 'enum spice_image_compression_t at spice.h:471:1' changed:
- type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
- type size hasn't changed
- 7 enumerator deletions:
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
- 'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
- 9 enumerator insertions:
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
- 'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
- 79 impacted interfaces:
- function void spice_qxl_add_memslot(QXLInstance*, QXLDevMemSlot*)
- function void spice_qxl_add_memslot_async(QXLInstance*, QXLDevMemSlot*, uint64_t)
- function void spice_qxl_create_primary_surface(QXLInstance*, uint32_t, QXLDevSurfaceCreate*)
- function void spice_qxl_create_primary_surface_async(QXLInstance*, uint32_t, QXLDevSurfaceCreate*, uint64_t)
- function void spice_qxl_del_memslot(QXLInstance*, uint32_t, uint32_t)
- function void spice_qxl_destroy_primary_surface(QXLInstance*, uint32_t)
- function void spice_qxl_destroy_primary_surface_async(QXLInstance*, uint32_t, uint64_t)
- function void spice_qxl_destroy_surface_async(QXLInstance*, uint32_t, uint64_t)
- function void spice_qxl_destroy_surface_wait(QXLInstance*, uint32_t)
- function void spice_qxl_destroy_surfaces(QXLInstance*)
- function void spice_qxl_destroy_surfaces_async(QXLInstance*, uint64_t)
- function void spice_qxl_driver_unload(QXLInstance*)
- function void spice_qxl_flush_surfaces_async(QXLInstance*, uint64_t)
- function void spice_qxl_loadvm_commands(QXLInstance*, QXLCommandExt*, uint32_t)
- function void spice_qxl_monitors_config_async(QXLInstance*, QXLPHYSICAL, int, uint64_t)
- function void spice_qxl_oom(QXLInstance*)
- function void spice_qxl_reset_cursor(QXLInstance*)
- function void spice_qxl_reset_image_cache(QXLInstance*)
- function void spice_qxl_reset_memslots(QXLInstance*)
- function void spice_qxl_set_max_monitors(QXLInstance*, unsigned int)
- function void spice_qxl_start(QXLInstance*)
- function void spice_qxl_stop(QXLInstance*)
- function void spice_qxl_update_area(QXLInstance*, uint32_t, QXLRect*, QXLRect*, uint32_t, uint32_t)
- function void spice_qxl_update_area_async(QXLInstance*, uint32_t, QXLRect*, uint32_t, uint64_t)
- function void spice_qxl_wakeup(QXLInstance*)
- function int spice_server_add_client(SpiceServer*, int, int)
- function int spice_server_add_interface(SpiceServer*, SpiceBaseInstance*)
- function int spice_server_add_renderer(SpiceServer*, const char*)
- function int spice_server_add_ssl_client(SpiceServer*, int, int)
- function void spice_server_char_device_wakeup(SpiceCharDeviceInstance*)
- function void spice_server_destroy(SpiceServer*)
- function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)
- function int spice_server_get_num_clients(SpiceServer*)
- function int spice_server_get_peer_info(SpiceServer*, sockaddr*, socklen_t*)
- function int spice_server_get_sock_info(SpiceServer*, sockaddr*, socklen_t*)
- function int spice_server_init(SpiceServer*, SpiceCoreInterface*)
- function int spice_server_is_server_mouse(SpiceServer*)
- function int spice_server_migrate_connect(SpiceServer*, const char*, int, int, const char*)
- function int spice_server_migrate_end(SpiceServer*, int)
- function int spice_server_migrate_info(SpiceServer*, const char*, int, int, const char*)
- function int spice_server_migrate_start(SpiceServer*)
- function int spice_server_migrate_switch(SpiceServer*)
- function SpiceServer* spice_server_new(void)
- function void spice_server_playback_get_buffer(SpicePlaybackInstance*, uint32_t**, uint32_t*)
- function void spice_server_playback_put_samples(SpicePlaybackInstance*, uint32_t*)
- function void spice_server_playback_set_mute(SpicePlaybackInstance*, uint8_t)
- function void spice_server_playback_set_volume(SpicePlaybackInstance*, uint8_t, uint16_t*)
- function void spice_server_playback_start(SpicePlaybackInstance*)
- function void spice_server_playback_stop(SpicePlaybackInstance*)
- function void spice_server_port_event(SpiceCharDeviceInstance*, uint8_t)
- function uint32_t spice_server_record_get_samples(SpiceRecordInstance*, uint32_t*, uint32_t)
- function void spice_server_record_set_mute(SpiceRecordInstance*, uint8_t)
- function void spice_server_record_set_volume(SpiceRecordInstance*, uint8_t, uint16_t*)
- function void spice_server_record_start(SpiceRecordInstance*)
- function void spice_server_record_stop(SpiceRecordInstance*)
- function void spice_server_set_addr(SpiceServer*, const char*, int)
- function int spice_server_set_agent_copypaste(SpiceServer*, int)
- function int spice_server_set_agent_file_xfer(SpiceServer*, int)
- function int spice_server_set_agent_mouse(SpiceServer*, int)
- function int spice_server_set_channel_security(SpiceServer*, const char*, int)
- function int spice_server_set_compat_version(SpiceServer*, spice_compat_version_t)
- function int spice_server_set_exit_on_disconnect(SpiceServer*, int)
- function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)
- function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)
- function int spice_server_set_listen_socket_fd(SpiceServer*, int)
- function void spice_server_set_name(SpiceServer*, const char*)
- function int spice_server_set_noauth(SpiceServer*)
- function int spice_server_set_playback_compression(SpiceServer*, int)
- function int spice_server_set_port(SpiceServer*, int)
- function int spice_server_set_sasl(SpiceServer*, int)
- function int spice_server_set_sasl_appname(SpiceServer*, const char*)
- function void spice_server_set_seamless_migration(SpiceServer*, int)
- function int spice_server_set_streaming_video(SpiceServer*, int)
- function int spice_server_set_ticket(SpiceServer*, const char*, int, int, int)
- function int spice_server_set_tls(SpiceServer*, int, const char*, const char*, const char*, const char*, const char*, const char*)
- function void spice_server_set_uuid(SpiceServer*, const uint8_t*)
- function int spice_server_set_zlib_glz_compression(SpiceServer*, spice_wan_compression_t)
- function void spice_server_vm_start(SpiceServer*)
- function void spice_server_vm_stop(SpiceServer*)
================ end of changes of 'libspice-server.so.1.8.0'===============