Skip to content

Commit

Permalink
Merge pull request sass#1676 from mgreter/feature/issue-1667
Browse files Browse the repository at this point in the history
Make sure hash is recalculated after value update
  • Loading branch information
mgreter committed Nov 4, 2015
2 parents 5d858f9 + 7d99d43 commit d6e3640
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 19 deletions.
40 changes: 22 additions & 18 deletions src/ast.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -891,9 +891,9 @@ namespace Sass {
//////////////////////////////////////////////////////////////////////////
class Binary_Expression : public Expression {
private:
ADD_PROPERTY(enum Sass_OP, type)
ADD_PROPERTY(Expression*, left)
ADD_PROPERTY(Expression*, right)
ADD_HASHED(enum Sass_OP, type)
ADD_HASHED(Expression*, left)
ADD_HASHED(Expression*, right)
size_t hash_;
public:
Binary_Expression(ParserState pstate,
Expand Down Expand Up @@ -960,8 +960,8 @@ namespace Sass {
public:
enum Type { PLUS, MINUS, NOT };
private:
ADD_PROPERTY(Type, type)
ADD_PROPERTY(Expression*, operand)
ADD_HASHED(Type, type)
ADD_HASHED(Expression*, operand)
size_t hash_;
public:
Unary_Expression(ParserState pstate, Type t, Expression* o)
Expand Down Expand Up @@ -1005,8 +1005,8 @@ namespace Sass {
// Individual argument objects for mixin and function calls.
////////////////////////////////////////////////////////////
class Argument : public Expression {
ADD_PROPERTY(Expression*, value)
ADD_PROPERTY(std::string, name)
ADD_HASHED(Expression*, value)
ADD_HASHED(std::string, name)
ADD_PROPERTY(bool, is_rest_argument)
ADD_PROPERTY(bool, is_keyword_argument)
size_t hash_;
Expand Down Expand Up @@ -1072,8 +1072,8 @@ namespace Sass {
// Function calls.
//////////////////
class Function_Call : public Expression {
ADD_PROPERTY(std::string, name)
ADD_PROPERTY(Arguments*, arguments)
ADD_HASHED(std::string, name)
ADD_HASHED(Arguments*, arguments)
ADD_PROPERTY(void*, cookie)
size_t hash_;
public:
Expand Down Expand Up @@ -1168,8 +1168,8 @@ namespace Sass {
public:
enum Type { NUMBER, PERCENTAGE, DIMENSION, HEX };
private:
ADD_PROPERTY(Type, type)
ADD_PROPERTY(std::string, value)
ADD_HASHED(Type, type)
ADD_HASHED(std::string, value)
size_t hash_;
public:
Textual(ParserState pstate, Type t, std::string val)
Expand Down Expand Up @@ -1207,7 +1207,7 @@ namespace Sass {
// Numbers, percentages, dimensions, and colors.
////////////////////////////////////////////////
class Number : public Value {
ADD_PROPERTY(double, value)
ADD_HASHED(double, value)
ADD_PROPERTY(bool, zero)
std::vector<std::string> numerator_units_;
std::vector<std::string> denominator_units_;
Expand All @@ -1233,6 +1233,10 @@ namespace Sass {
{
if (hash_ == 0) {
hash_ = std::hash<double>()(value_);
for (const auto numerator : numerator_units())
hash_combine(hash_, std::hash<std::string>()(numerator));
for (const auto denominator : denominator_units())
hash_combine(hash_, std::hash<std::string>()(denominator));
}
return hash_;
}
Expand All @@ -1248,10 +1252,10 @@ namespace Sass {
// Colors.
//////////
class Color : public Value {
ADD_PROPERTY(double, r)
ADD_PROPERTY(double, g)
ADD_PROPERTY(double, b)
ADD_PROPERTY(double, a)
ADD_HASHED(double, r)
ADD_HASHED(double, g)
ADD_HASHED(double, b)
ADD_HASHED(double, a)
ADD_PROPERTY(bool, sixtuplet)
ADD_PROPERTY(std::string, disp)
size_t hash_;
Expand Down Expand Up @@ -1312,7 +1316,7 @@ namespace Sass {
// Booleans.
////////////
class Boolean : public Value {
ADD_PROPERTY(bool, value)
ADD_HASHED(bool, value)
size_t hash_;
public:
Boolean(ParserState pstate, bool val)
Expand Down Expand Up @@ -1391,7 +1395,7 @@ namespace Sass {
class String_Constant : public String {
ADD_PROPERTY(char, quote_mark)
ADD_PROPERTY(bool, can_compress_whitespace)
ADD_PROPERTY(std::string, value)
ADD_HASHED(std::string, value)
protected:
size_t hash_;
public:
Expand Down
8 changes: 8 additions & 0 deletions src/ast_def_macros.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,12 @@ public:\
type name(type name##__) { return name##_ = name##__; }\
private:

#define ADD_HASHED(type, name)\
protected:\
type name##_;\
public:\
type name() const { return name##_; }\
type name(type name##__) { hash_ = 0; return name##_ = name##__; }\
private:

#endif
4 changes: 3 additions & 1 deletion src/debugger.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
Number* expression = dynamic_cast<Number*>(node);
std::cerr << ind << "Number " << expression;
std::cerr << " (" << pstate_source_position(node) << ")";
std::cerr << " [" << expression->value() << expression->unit() << "]" << std::endl;
std::cerr << " [" << expression->value() << expression->unit() << "]" <<
" [hash: " << expression->hash() << "] " <<
std::endl;
} else if (dynamic_cast<String_Quoted*>(node)) {
String_Quoted* expression = dynamic_cast<String_Quoted*>(node);
std::cerr << ind << "String_Quoted " << expression;
Expand Down

0 comments on commit d6e3640

Please sign in to comment.