sassc 2.0.1 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -13,90 +13,86 @@ namespace Sass {
13
13
  // import all the class-specific methods and override as desired
14
14
  using Operation_CRTP<void, Inspect>::operator();
15
15
 
16
- void fallback_impl(AST_Node_Ptr n);
17
-
18
16
  public:
19
17
 
20
18
  Inspect(const Emitter& emi);
21
19
  virtual ~Inspect();
22
20
 
23
21
  // statements
24
- virtual void operator()(Block_Ptr);
25
- virtual void operator()(Ruleset_Ptr);
26
- virtual void operator()(Bubble_Ptr);
27
- virtual void operator()(Supports_Block_Ptr);
28
- virtual void operator()(Media_Block_Ptr);
29
- virtual void operator()(At_Root_Block_Ptr);
30
- virtual void operator()(Directive_Ptr);
31
- virtual void operator()(Keyframe_Rule_Ptr);
32
- virtual void operator()(Declaration_Ptr);
33
- virtual void operator()(Assignment_Ptr);
34
- virtual void operator()(Import_Ptr);
35
- virtual void operator()(Import_Stub_Ptr);
36
- virtual void operator()(Warning_Ptr);
37
- virtual void operator()(Error_Ptr);
38
- virtual void operator()(Debug_Ptr);
39
- virtual void operator()(Comment_Ptr);
40
- virtual void operator()(If_Ptr);
41
- virtual void operator()(For_Ptr);
42
- virtual void operator()(Each_Ptr);
43
- virtual void operator()(While_Ptr);
44
- virtual void operator()(Return_Ptr);
45
- virtual void operator()(Extension_Ptr);
46
- virtual void operator()(Definition_Ptr);
47
- virtual void operator()(Mixin_Call_Ptr);
48
- virtual void operator()(Content_Ptr);
22
+ virtual void operator()(Block*);
23
+ virtual void operator()(Ruleset*);
24
+ virtual void operator()(Bubble*);
25
+ virtual void operator()(Supports_Block*);
26
+ virtual void operator()(Media_Block*);
27
+ virtual void operator()(At_Root_Block*);
28
+ virtual void operator()(Directive*);
29
+ virtual void operator()(Keyframe_Rule*);
30
+ virtual void operator()(Declaration*);
31
+ virtual void operator()(Assignment*);
32
+ virtual void operator()(Import*);
33
+ virtual void operator()(Import_Stub*);
34
+ virtual void operator()(Warning*);
35
+ virtual void operator()(Error*);
36
+ virtual void operator()(Debug*);
37
+ virtual void operator()(Comment*);
38
+ virtual void operator()(If*);
39
+ virtual void operator()(For*);
40
+ virtual void operator()(Each*);
41
+ virtual void operator()(While*);
42
+ virtual void operator()(Return*);
43
+ virtual void operator()(Extension*);
44
+ virtual void operator()(Definition*);
45
+ virtual void operator()(Mixin_Call*);
46
+ virtual void operator()(Content*);
49
47
  // expressions
50
- virtual void operator()(Map_Ptr);
51
- virtual void operator()(Function_Ptr);
52
- virtual void operator()(List_Ptr);
53
- virtual void operator()(Binary_Expression_Ptr);
54
- virtual void operator()(Unary_Expression_Ptr);
55
- virtual void operator()(Function_Call_Ptr);
56
- virtual void operator()(Function_Call_Schema_Ptr);
57
- // virtual void operator()(Custom_Warning_Ptr);
58
- // virtual void operator()(Custom_Error_Ptr);
59
- virtual void operator()(Variable_Ptr);
60
- virtual void operator()(Number_Ptr);
61
- virtual void operator()(Color_Ptr);
62
- virtual void operator()(Boolean_Ptr);
63
- virtual void operator()(String_Schema_Ptr);
64
- virtual void operator()(String_Constant_Ptr);
65
- virtual void operator()(String_Quoted_Ptr);
66
- virtual void operator()(Custom_Error_Ptr);
67
- virtual void operator()(Custom_Warning_Ptr);
68
- virtual void operator()(Supports_Operator_Ptr);
69
- virtual void operator()(Supports_Negation_Ptr);
70
- virtual void operator()(Supports_Declaration_Ptr);
71
- virtual void operator()(Supports_Interpolation_Ptr);
72
- virtual void operator()(Media_Query_Ptr);
73
- virtual void operator()(Media_Query_Expression_Ptr);
74
- virtual void operator()(At_Root_Query_Ptr);
75
- virtual void operator()(Null_Ptr);
76
- virtual void operator()(Parent_Selector_Ptr p);
48
+ virtual void operator()(Map*);
49
+ virtual void operator()(Function*);
50
+ virtual void operator()(List*);
51
+ virtual void operator()(Binary_Expression*);
52
+ virtual void operator()(Unary_Expression*);
53
+ virtual void operator()(Function_Call*);
54
+ // virtual void operator()(Custom_Warning*);
55
+ // virtual void operator()(Custom_Error*);
56
+ virtual void operator()(Variable*);
57
+ virtual void operator()(Number*);
58
+ virtual void operator()(Color_RGBA*);
59
+ virtual void operator()(Color_HSLA*);
60
+ virtual void operator()(Boolean*);
61
+ virtual void operator()(String_Schema*);
62
+ virtual void operator()(String_Constant*);
63
+ virtual void operator()(String_Quoted*);
64
+ virtual void operator()(Custom_Error*);
65
+ virtual void operator()(Custom_Warning*);
66
+ virtual void operator()(Supports_Operator*);
67
+ virtual void operator()(Supports_Negation*);
68
+ virtual void operator()(Supports_Declaration*);
69
+ virtual void operator()(Supports_Interpolation*);
70
+ virtual void operator()(Media_Query*);
71
+ virtual void operator()(Media_Query_Expression*);
72
+ virtual void operator()(At_Root_Query*);
73
+ virtual void operator()(Null*);
74
+ virtual void operator()(Parent_Selector* p);
77
75
  // parameters and arguments
78
- virtual void operator()(Parameter_Ptr);
79
- virtual void operator()(Parameters_Ptr);
80
- virtual void operator()(Argument_Ptr);
81
- virtual void operator()(Arguments_Ptr);
76
+ virtual void operator()(Parameter*);
77
+ virtual void operator()(Parameters*);
78
+ virtual void operator()(Argument*);
79
+ virtual void operator()(Arguments*);
82
80
  // selectors
83
- virtual void operator()(Selector_Schema_Ptr);
84
- virtual void operator()(Placeholder_Selector_Ptr);
85
- virtual void operator()(Element_Selector_Ptr);
86
- virtual void operator()(Class_Selector_Ptr);
87
- virtual void operator()(Id_Selector_Ptr);
88
- virtual void operator()(Attribute_Selector_Ptr);
89
- virtual void operator()(Pseudo_Selector_Ptr);
90
- virtual void operator()(Wrapped_Selector_Ptr);
91
- virtual void operator()(Compound_Selector_Ptr);
92
- virtual void operator()(Complex_Selector_Ptr);
93
- virtual void operator()(Selector_List_Ptr);
81
+ virtual void operator()(Selector_Schema*);
82
+ virtual void operator()(Placeholder_Selector*);
83
+ virtual void operator()(Type_Selector*);
84
+ virtual void operator()(Class_Selector*);
85
+ virtual void operator()(Id_Selector*);
86
+ virtual void operator()(Attribute_Selector*);
87
+ virtual void operator()(Pseudo_Selector*);
88
+ virtual void operator()(Wrapped_Selector*);
89
+ virtual void operator()(Compound_Selector*);
90
+ virtual void operator()(Complex_Selector*);
91
+ virtual void operator()(Selector_List*);
94
92
 
95
- virtual std::string lbracket(List_Ptr);
96
- virtual std::string rbracket(List_Ptr);
93
+ virtual std::string lbracket(List*);
94
+ virtual std::string rbracket(List*);
97
95
 
98
- // template <typename U>
99
- // void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node_Ptr>(x)); }
100
96
  };
101
97
 
102
98
  }
@@ -402,7 +402,7 @@ char *json_encode_string(const char *str)
402
402
  try {
403
403
  emit_string(&sb, str);
404
404
  }
405
- catch (std::exception) {
405
+ catch (std::exception&) {
406
406
  sb_free(&sb);
407
407
  throw;
408
408
  }
@@ -421,7 +421,7 @@ char *json_stringify(const JsonNode *node, const char *space)
421
421
  else
422
422
  emit_value(&sb, node);
423
423
  }
424
- catch (std::exception) {
424
+ catch (std::exception&) {
425
425
  sb_free(&sb);
426
426
  throw;
427
427
  }
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <cctype>
3
6
  #include <iostream>
4
7
  #include <iomanip>
@@ -150,11 +153,11 @@ namespace Sass {
150
153
  // Match word boundary (zero-width lookahead).
151
154
  const char* word_boundary(const char* src) { return is_character(*src) || *src == '#' ? 0 : src; }
152
155
 
153
- // Match linefeed /(?:\n|\r\n?)/
156
+ // Match linefeed /(?:\n|\r\n?|\f)/
154
157
  const char* re_linebreak(const char* src)
155
158
  {
156
159
  // end of file or unix linefeed return here
157
- if (*src == 0 || *src == '\n') return src + 1;
160
+ if (*src == 0 || *src == '\n' || *src == '\f') return src + 1;
158
161
  // a carriage return may optionally be followed by a linefeed
159
162
  if (*src == '\r') return *(src + 1) == '\n' ? src + 2 : src + 1;
160
163
  // no linefeed
@@ -166,7 +169,7 @@ namespace Sass {
166
169
  const char* end_of_line(const char* src)
167
170
  {
168
171
  // end of file or unix linefeed return here
169
- return *src == 0 || *src == '\n' || *src == '\r' ? src : 0;
172
+ return *src == 0 || *src == '\n' || *src == '\r' || *src == '\f' ? src : 0;
170
173
  }
171
174
 
172
175
  // Assert end_of_file boundary (/\z/)
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <iostream>
3
6
  #include <typeinfo>
4
7
  #include <string>
@@ -13,7 +16,7 @@ namespace Sass {
13
16
  Listize::Listize()
14
17
  { }
15
18
 
16
- Expression_Ptr Listize::operator()(Selector_List_Ptr sel)
19
+ Expression* Listize::operator()(Selector_List* sel)
17
20
  {
18
21
  List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
19
22
  l->from_selector(true);
@@ -25,24 +28,24 @@ namespace Sass {
25
28
  return SASS_MEMORY_NEW(Null, l->pstate());
26
29
  }
27
30
 
28
- Expression_Ptr Listize::operator()(Compound_Selector_Ptr sel)
31
+ Expression* Listize::operator()(Compound_Selector* sel)
29
32
  {
30
33
  std::string str;
31
34
  for (size_t i = 0, L = sel->length(); i < L; ++i) {
32
- Expression_Ptr e = (*sel)[i]->perform(this);
35
+ Expression* e = (*sel)[i]->perform(this);
33
36
  if (e) str += e->to_string();
34
37
  }
35
38
  return SASS_MEMORY_NEW(String_Quoted, sel->pstate(), str);
36
39
  }
37
40
 
38
- Expression_Ptr Listize::operator()(Complex_Selector_Ptr sel)
41
+ Expression* Listize::operator()(Complex_Selector* sel)
39
42
  {
40
43
  List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), 2);
41
44
  l->from_selector(true);
42
45
  Compound_Selector_Obj head = sel->head();
43
46
  if (head && !head->is_empty_reference())
44
47
  {
45
- Expression_Ptr hh = head->perform(this);
48
+ Expression* hh = head->perform(this);
46
49
  if (hh) l->append(hh);
47
50
  }
48
51
 
@@ -71,16 +74,11 @@ namespace Sass {
71
74
  if (tail)
72
75
  {
73
76
  Expression_Obj tt = tail->perform(this);
74
- if (List_Ptr ls = Cast<List>(tt))
77
+ if (List* ls = Cast<List>(tt))
75
78
  { l->concat(ls); }
76
79
  }
77
80
  if (l->length() == 0) return 0;
78
81
  return l.detach();
79
82
  }
80
83
 
81
- Expression_Ptr Listize::fallback_impl(AST_Node_Ptr n)
82
- {
83
- return Cast<Expression>(n);
84
- }
85
-
86
84
  }
@@ -1,6 +1,10 @@
1
1
  #ifndef SASS_LISTIZE_H
2
2
  #define SASS_LISTIZE_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
4
8
  #include <vector>
5
9
  #include <iostream>
6
10
 
@@ -13,20 +17,20 @@ namespace Sass {
13
17
 
14
18
  struct Backtrace;
15
19
 
16
- class Listize : public Operation_CRTP<Expression_Ptr, Listize> {
17
-
18
- Expression_Ptr fallback_impl(AST_Node_Ptr n);
20
+ class Listize : public Operation_CRTP<Expression*, Listize> {
19
21
 
20
22
  public:
21
23
  Listize();
22
24
  ~Listize() { }
23
25
 
24
- Expression_Ptr operator()(Selector_List_Ptr);
25
- Expression_Ptr operator()(Complex_Selector_Ptr);
26
- Expression_Ptr operator()(Compound_Selector_Ptr);
26
+ Expression* operator()(Selector_List*);
27
+ Expression* operator()(Complex_Selector*);
28
+ Expression* operator()(Compound_Selector*);
27
29
 
30
+ // generic fallback
28
31
  template <typename U>
29
- Expression_Ptr fallback(U x) { return fallback_impl(x); }
32
+ Expression* fallback(U x)
33
+ { return Cast<Expression>(x); }
30
34
  };
31
35
 
32
36
  }
@@ -18,7 +18,7 @@ namespace Sass {
18
18
  std::cerr << "# REPORTING MISSING DEALLOCATIONS #\n";
19
19
  std::cerr << "###################################\n";
20
20
  for (SharedObj* var : all) {
21
- if (AST_Node_Ptr ast = dynamic_cast<AST_Node*>(var)) {
21
+ if (AST_Node* ast = dynamic_cast<AST_Node*>(var)) {
22
22
  debug_ast(ast);
23
23
  } else {
24
24
  std::cerr << "LEAKED " << var << "\n";
@@ -30,85 +30,4 @@ namespace Sass {
30
30
  #endif
31
31
 
32
32
  bool SharedObj::taint = false;
33
-
34
- SharedObj::SharedObj()
35
- : detached(false)
36
- #ifdef DEBUG_SHARED_PTR
37
- , dbg(false)
38
- #endif
39
- {
40
- refcounter = 0;
41
- #ifdef DEBUG_SHARED_PTR
42
- if (taint) all.push_back(this);
43
- #endif
44
- };
45
-
46
- SharedObj::~SharedObj() {
47
- #ifdef DEBUG_SHARED_PTR
48
- if (dbg) std::cerr << "Destruct " << this << "\n";
49
- if(!all.empty()) { // check needed for MSVC (no clue why?)
50
- all.erase(std::remove(all.begin(), all.end(), this), all.end());
51
- }
52
- #endif
53
- };
54
-
55
- void SharedPtr::decRefCount() {
56
- if (node) {
57
- -- node->refcounter;
58
- #ifdef DEBUG_SHARED_PTR
59
- if (node->dbg) std::cerr << "- " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
60
- #endif
61
- if (node->refcounter == 0) {
62
- #ifdef DEBUG_SHARED_PTR
63
- // AST_Node_Ptr ast = dynamic_cast<AST_Node*>(node);
64
- if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
65
- #endif
66
- if (!node->detached) {
67
- delete(node);
68
- }
69
- }
70
- }
71
- }
72
-
73
- void SharedPtr::incRefCount() {
74
- if (node) {
75
- ++ node->refcounter;
76
- node->detached = false;
77
- #ifdef DEBUG_SHARED_PTR
78
- if (node->dbg) {
79
- std::cerr << "+ " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
80
- }
81
- #endif
82
- }
83
- }
84
-
85
- SharedPtr::~SharedPtr() {
86
- decRefCount();
87
- }
88
-
89
-
90
- // the create constructor
91
- SharedPtr::SharedPtr(SharedObj* ptr)
92
- : node(ptr) {
93
- incRefCount();
94
- }
95
- // copy assignment operator
96
- SharedPtr& SharedPtr::operator=(const SharedPtr& rhs) {
97
- void* cur_ptr = (void*) node;
98
- void* rhs_ptr = (void*) rhs.node;
99
- if (cur_ptr == rhs_ptr) {
100
- return *this;
101
- }
102
- decRefCount();
103
- node = rhs.node;
104
- incRefCount();
105
- return *this;
106
- }
107
-
108
- // the copy constructor
109
- SharedPtr::SharedPtr(const SharedPtr& obj)
110
- : node(obj.node) {
111
- incRefCount();
112
- }
113
-
114
- }
33
+ }
@@ -3,6 +3,8 @@
3
3
 
4
4
  #include "sass/base.h"
5
5
 
6
+ #include <iostream>
7
+ #include <string>
6
8
  #include <vector>
7
9
 
8
10
  namespace Sass {
@@ -39,168 +41,150 @@ namespace Sass {
39
41
  #endif
40
42
 
41
43
  class SharedObj {
42
- protected:
43
- friend class SharedPtr;
44
- friend class Memory_Manager;
44
+ public:
45
+ SharedObj() : refcount(0), detached(false) {
46
+ #ifdef DEBUG_SHARED_PTR
47
+ if (taint) all.push_back(this);
48
+ #endif
49
+ }
50
+ virtual ~SharedObj() {
51
+ #ifdef DEBUG_SHARED_PTR
52
+ all.clear();
53
+ #endif
54
+ }
55
+
45
56
  #ifdef DEBUG_SHARED_PTR
46
- static std::vector<SharedObj*> all;
47
- std::string file;
48
- size_t line;
57
+ static void dumpMemLeaks();
58
+ SharedObj* trace(std::string file, size_t line) {
59
+ this->file = file;
60
+ this->line = line;
61
+ return this;
62
+ }
63
+ std::string getDbgFile() { return file; }
64
+ size_t getDbgLine() { return line; }
65
+ void setDbg(bool dbg) { this->dbg = dbg; }
66
+ size_t getRefCount() const { return refcount; }
49
67
  #endif
50
- static bool taint;
51
- long refcounter;
52
- // long refcount;
68
+
69
+ static void setTaint(bool val) { taint = val; }
70
+
71
+ virtual const std::string to_string() const = 0;
72
+ protected:
73
+ friend class SharedPtr;
74
+ friend class Memory_Manager;
75
+ size_t refcount;
53
76
  bool detached;
77
+ static bool taint;
54
78
  #ifdef DEBUG_SHARED_PTR
55
- bool dbg;
56
- #endif
57
- public:
58
- #ifdef DEBUG_SHARED_PTR
59
- static void dumpMemLeaks();
60
- SharedObj* trace(std::string file, size_t line) {
61
- this->file = file;
62
- this->line = line;
63
- return this;
64
- }
65
- #endif
66
- SharedObj();
67
- #ifdef DEBUG_SHARED_PTR
68
- std::string getDbgFile() {
69
- return file;
70
- }
71
- size_t getDbgLine() {
72
- return line;
73
- }
74
- void setDbg(bool dbg) {
75
- this->dbg = dbg;
76
- }
79
+ std::string file;
80
+ size_t line;
81
+ bool dbg = false;
82
+ static std::vector<SharedObj*> all;
77
83
  #endif
78
- static void setTaint(bool val) {
79
- taint = val;
80
- }
81
- virtual ~SharedObj();
82
- long getRefCount() {
83
- return refcounter;
84
- }
85
84
  };
86
85
 
87
-
88
86
  class SharedPtr {
89
- protected:
90
- SharedObj* node;
91
- protected:
92
- void decRefCount();
93
- void incRefCount();
94
- public:
95
- // the empty constructor
96
- SharedPtr()
97
- : node(NULL) {};
98
- // the create constructor
99
- SharedPtr(SharedObj* ptr);
100
- // the copy constructor
101
- SharedPtr(const SharedPtr& obj);
102
- // the move constructor
103
- SharedPtr(SharedPtr&& obj);
104
- // copy assignment operator
105
- SharedPtr& operator=(const SharedPtr& obj);
106
- // move assignment operator
107
- SharedPtr& operator=(SharedPtr&& obj);
108
- // pure virtual destructor
109
- virtual ~SharedPtr() = 0;
110
- public:
111
- SharedObj* obj () const {
112
- return node;
113
- };
114
- SharedObj* operator-> () const {
115
- return node;
116
- };
117
- bool isNull () {
118
- return node == NULL;
119
- };
120
- bool isNull () const {
121
- return node == NULL;
122
- };
123
- SharedObj* detach() const {
124
- if (node) {
125
- node->detached = true;
87
+ public:
88
+ SharedPtr() : node(nullptr) {}
89
+ SharedPtr(SharedObj* ptr) : node(ptr) {
90
+ incRefCount();
91
+ }
92
+ SharedPtr(const SharedPtr& obj) : SharedPtr(obj.node) {}
93
+ ~SharedPtr() {
94
+ decRefCount();
95
+ }
96
+
97
+ SharedPtr& operator=(SharedObj* other_node) {
98
+ if (node != other_node) {
99
+ decRefCount();
100
+ node = other_node;
101
+ incRefCount();
102
+ } else if (node != nullptr) {
103
+ node->detached = false;
126
104
  }
127
- return node;
128
- };
129
- operator bool() const {
130
- return node != NULL;
131
- };
105
+ return *this;
106
+ }
132
107
 
133
- };
108
+ SharedPtr& operator=(const SharedPtr& obj) {
109
+ return *this = obj.node;
110
+ }
134
111
 
135
- template < class T >
136
- class SharedImpl : private SharedPtr {
137
- public:
138
- SharedImpl()
139
- : SharedPtr(NULL) {};
140
- SharedImpl(T* node)
141
- : SharedPtr(node) {};
142
- template < class U >
143
- SharedImpl(SharedImpl<U> obj)
144
- : SharedPtr(static_cast<T*>(obj.ptr())) {}
145
- SharedImpl(T&& node)
146
- : SharedPtr(node) {};
147
- SharedImpl(const T& node)
148
- : SharedPtr(node) {};
149
- // the copy constructor
150
- SharedImpl(const SharedImpl<T>& impl)
151
- : SharedPtr(impl.node) {};
152
- // the move constructor
153
- SharedImpl(SharedImpl<T>&& impl)
154
- : SharedPtr(impl.node) {};
155
- // copy assignment operator
156
- SharedImpl<T>& operator=(const SharedImpl<T>& rhs) {
157
- if (node) decRefCount();
158
- node = rhs.node;
159
- incRefCount();
160
- return *this;
112
+ // Prevents all SharedPtrs from freeing this node until it is assigned to another SharedPtr.
113
+ SharedObj* detach() {
114
+ if (node != nullptr) node->detached = true;
115
+ return node;
161
116
  }
162
- // move assignment operator
163
- SharedImpl<T>& operator=(SharedImpl<T>&& rhs) {
164
- // don't move our self
165
- if (this != &rhs) {
166
- if (node) decRefCount();
167
- node = std::move(rhs.node);
168
- rhs.node = NULL;
117
+
118
+ SharedObj* obj() const { return node; }
119
+ SharedObj* operator->() const { return node; }
120
+ bool isNull() const { return node == nullptr; }
121
+ operator bool() const { return node != nullptr; }
122
+
123
+ protected:
124
+ SharedObj* node;
125
+ void decRefCount() {
126
+ if (node == nullptr) return;
127
+ --node->refcount;
128
+ #ifdef DEBUG_SHARED_PTR
129
+ if (node->dbg) std::cerr << "- " << node << " X " << node->refcount << " (" << this << ") " << "\n";
130
+ #endif
131
+ if (node->refcount == 0 && !node->detached) {
132
+ #ifdef DEBUG_SHARED_PTR
133
+ if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
134
+ #endif
135
+ delete node;
169
136
  }
170
- return *this;
171
137
  }
172
- ~SharedImpl() {};
173
- public:
174
- operator T*() const {
175
- return static_cast<T*>(this->obj());
138
+ void incRefCount() {
139
+ if (node == nullptr) return;
140
+ node->detached = false;
141
+ ++node->refcount;
142
+ #ifdef DEBUG_SHARED_PTR
143
+ if (node->dbg) std::cerr << "+ " << node << " X " << node->refcount << " (" << this << ") " << "\n";
144
+ #endif
176
145
  }
177
- operator T&() const {
178
- return *static_cast<T*>(this->obj());
146
+ };
147
+
148
+ template <class T>
149
+ class SharedImpl : private SharedPtr {
150
+ public:
151
+ SharedImpl() : SharedPtr(nullptr) {}
152
+
153
+ template <class U>
154
+ SharedImpl(U* node) :
155
+ SharedPtr(static_cast<T*>(node)) {}
156
+
157
+ template <class U>
158
+ SharedImpl(const SharedImpl<U>& impl) :
159
+ SharedImpl(impl.ptr()) {}
160
+
161
+ template <class U>
162
+ SharedImpl<T>& operator=(U *rhs) {
163
+ return static_cast<SharedImpl<T>&>(
164
+ SharedPtr::operator=(static_cast<T*>(rhs)));
179
165
  }
180
- T& operator* () const {
181
- return *static_cast<T*>(this->obj());
182
- };
183
- T* operator-> () const {
184
- return static_cast<T*>(this->obj());
185
- };
186
- T* ptr () const {
187
- return static_cast<T*>(this->obj());
188
- };
189
- T* detach() const {
190
- if (this->obj() == NULL) return NULL;
191
- return static_cast<T*>(SharedPtr::detach());
166
+
167
+ template <class U>
168
+ SharedImpl<T>& operator=(const SharedImpl<U>& rhs) {
169
+ return static_cast<SharedImpl<T>&>(
170
+ SharedPtr::operator=(static_cast<const SharedImpl<T>&>(rhs)));
192
171
  }
193
- bool isNull() const {
194
- return this->obj() == NULL;
172
+
173
+ operator const std::string() const {
174
+ if (node) return node->to_string();
175
+ return "[nullptr]";
195
176
  }
196
- bool operator<(const T& rhs) const {
197
- return *this->ptr() < rhs;
198
- };
199
- operator bool() const {
200
- return this->obj() != NULL;
201
- };
177
+
178
+ using SharedPtr::isNull;
179
+ using SharedPtr::operator bool;
180
+ operator T*() const { return static_cast<T*>(this->obj()); }
181
+ operator T&() const { return *static_cast<T*>(this->obj()); }
182
+ T& operator* () const { return *static_cast<T*>(this->obj()); };
183
+ T* operator-> () const { return static_cast<T*>(this->obj()); };
184
+ T* ptr () const { return static_cast<T*>(this->obj()); };
185
+ T* detach() { return static_cast<T*>(SharedPtr::detach()); }
202
186
  };
203
187
 
204
188
  }
205
189
 
206
- #endif
190
+ #endif