sassc 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -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 <cstdlib>
3
6
  #include <cmath>
4
7
  #include <iostream>
@@ -17,7 +20,8 @@
17
20
  #include "position.hpp"
18
21
  #include "sass/values.h"
19
22
  #include "to_value.hpp"
20
- #include "to_c.hpp"
23
+ #include "ast2c.hpp"
24
+ #include "c2ast.hpp"
21
25
  #include "context.hpp"
22
26
  #include "backtrace.hpp"
23
27
  #include "lexer.hpp"
@@ -26,6 +30,8 @@
26
30
  #include "expand.hpp"
27
31
  #include "color_maps.hpp"
28
32
  #include "sass_functions.hpp"
33
+ #include "error_handling.hpp"
34
+ #include "util_string.hpp"
29
35
 
30
36
  namespace Sass {
31
37
 
@@ -47,14 +53,34 @@ namespace Sass {
47
53
  return exp.environment();
48
54
  }
49
55
 
50
- Selector_List_Obj Eval::selector()
56
+ const sass::string Eval::cwd()
57
+ {
58
+ return ctx.cwd();
59
+ }
60
+
61
+ struct Sass_Inspect_Options& Eval::options()
62
+ {
63
+ return ctx.c_options;
64
+ }
65
+
66
+ struct Sass_Compiler* Eval::compiler()
67
+ {
68
+ return ctx.c_compiler;
69
+ }
70
+
71
+ EnvStack& Eval::env_stack()
51
72
  {
52
- return exp.selector();
73
+ return exp.env_stack;
53
74
  }
54
75
 
55
- Expression_Ptr Eval::operator()(Block_Ptr b)
76
+ sass::vector<Sass_Callee>& Eval::callee_stack()
56
77
  {
57
- Expression_Ptr val = 0;
78
+ return ctx.callee_stack;
79
+ }
80
+
81
+ Expression* Eval::operator()(Block* b)
82
+ {
83
+ Expression* val = 0;
58
84
  for (size_t i = 0, L = b->length(); i < L; ++i) {
59
85
  val = b->at(i)->perform(this);
60
86
  if (val) return val;
@@ -62,14 +88,20 @@ namespace Sass {
62
88
  return val;
63
89
  }
64
90
 
65
- Expression_Ptr Eval::operator()(Assignment_Ptr a)
91
+ Expression* Eval::operator()(Assignment* a)
66
92
  {
67
- Env* env = exp.environment();
68
- std::string var(a->variable());
93
+ Env* env = environment();
94
+ sass::string var(a->variable());
69
95
  if (a->is_global()) {
96
+ if (!env->has_global(var)) {
97
+ deprecated(
98
+ "!global assignments won't be able to declare new variables in future versions.",
99
+ "Consider adding `" + var + ": null` at the top level.",
100
+ true, a->pstate());
101
+ }
70
102
  if (a->is_default()) {
71
103
  if (env->has_global(var)) {
72
- Expression_Ptr e = Cast<Expression>(env->get_global(var));
104
+ Expression* e = Cast<Expression>(env->get_global(var));
73
105
  if (!e || e->concrete_type() == Expression::NULL_VAL) {
74
106
  env->set_global(var, a->value()->perform(this));
75
107
  }
@@ -88,7 +120,7 @@ namespace Sass {
88
120
  while (cur && cur->is_lexical()) {
89
121
  if (cur->has_local(var)) {
90
122
  if (AST_Node_Obj node = cur->get_local(var)) {
91
- Expression_Ptr e = Cast<Expression>(node);
123
+ Expression* e = Cast<Expression>(node);
92
124
  if (!e || e->concrete_type() == Expression::NULL_VAL) {
93
125
  cur->set_local(var, a->value()->perform(this));
94
126
  }
@@ -104,7 +136,7 @@ namespace Sass {
104
136
  }
105
137
  else if (env->has_global(var)) {
106
138
  if (AST_Node_Obj node = env->get_global(var)) {
107
- Expression_Ptr e = Cast<Expression>(node);
139
+ Expression* e = Cast<Expression>(node);
108
140
  if (!e || e->concrete_type() == Expression::NULL_VAL) {
109
141
  env->set_global(var, a->value()->perform(this));
110
142
  }
@@ -123,12 +155,12 @@ namespace Sass {
123
155
  return 0;
124
156
  }
125
157
 
126
- Expression_Ptr Eval::operator()(If_Ptr i)
158
+ Expression* Eval::operator()(If* i)
127
159
  {
128
- Expression_Obj rv = 0;
129
- Env env(exp.environment());
130
- exp.env_stack.push_back(&env);
131
- Expression_Obj cond = i->predicate()->perform(this);
160
+ ExpressionObj rv;
161
+ Env env(environment());
162
+ env_stack().push_back(&env);
163
+ ExpressionObj cond = i->predicate()->perform(this);
132
164
  if (!cond->is_false()) {
133
165
  rv = i->block()->perform(this);
134
166
  }
@@ -136,21 +168,21 @@ namespace Sass {
136
168
  Block_Obj alt = i->alternative();
137
169
  if (alt) rv = alt->perform(this);
138
170
  }
139
- exp.env_stack.pop_back();
171
+ env_stack().pop_back();
140
172
  return rv.detach();
141
173
  }
142
174
 
143
175
  // For does not create a new env scope
144
176
  // But iteration vars are reset afterwards
145
- Expression_Ptr Eval::operator()(For_Ptr f)
177
+ Expression* Eval::operator()(ForRule* f)
146
178
  {
147
- std::string variable(f->variable());
148
- Expression_Obj low = f->lower_bound()->perform(this);
179
+ sass::string variable(f->variable());
180
+ ExpressionObj low = f->lower_bound()->perform(this);
149
181
  if (low->concrete_type() != Expression::NUMBER) {
150
182
  traces.push_back(Backtrace(low->pstate()));
151
183
  throw Exception::TypeMismatch(traces, *low, "integer");
152
184
  }
153
- Expression_Obj high = f->upper_bound()->perform(this);
185
+ ExpressionObj high = f->upper_bound()->perform(this);
154
186
  if (high->concrete_type() != Expression::NUMBER) {
155
187
  traces.push_back(Backtrace(high->pstate()));
156
188
  throw Exception::TypeMismatch(traces, *high, "integer");
@@ -159,7 +191,7 @@ namespace Sass {
159
191
  Number_Obj sass_end = Cast<Number>(high);
160
192
  // check if units are valid for sequence
161
193
  if (sass_start->unit() != sass_end->unit()) {
162
- std::stringstream msg; msg << "Incompatible units: '"
194
+ sass::ostream msg; msg << "Incompatible units: '"
163
195
  << sass_end->unit() << "' and '"
164
196
  << sass_start->unit() << "'.";
165
197
  error(msg.str(), low->pstate(), traces);
@@ -168,9 +200,9 @@ namespace Sass {
168
200
  double end = sass_end->value();
169
201
  // only create iterator once in this environment
170
202
  Env env(environment(), true);
171
- exp.env_stack.push_back(&env);
203
+ env_stack().push_back(&env);
172
204
  Block_Obj body = f->block();
173
- Expression_Ptr val = 0;
205
+ Expression* val = 0;
174
206
  if (start < end) {
175
207
  if (f->is_inclusive()) ++end;
176
208
  for (double i = start;
@@ -192,26 +224,25 @@ namespace Sass {
192
224
  if (val) break;
193
225
  }
194
226
  }
195
- exp.env_stack.pop_back();
227
+ env_stack().pop_back();
196
228
  return val;
197
229
  }
198
230
 
199
231
  // Eval does not create a new env scope
200
232
  // But iteration vars are reset afterwards
201
- Expression_Ptr Eval::operator()(Each_Ptr e)
233
+ Expression* Eval::operator()(EachRule* e)
202
234
  {
203
- std::vector<std::string> variables(e->variables());
204
- Expression_Obj expr = e->list()->perform(this);
235
+ sass::vector<sass::string> variables(e->variables());
236
+ ExpressionObj expr = e->list()->perform(this);
205
237
  Env env(environment(), true);
206
- exp.env_stack.push_back(&env);
207
- List_Obj list = 0;
208
- Map_Ptr map = 0;
238
+ env_stack().push_back(&env);
239
+ List_Obj list;
240
+ Map* map = nullptr;
209
241
  if (expr->concrete_type() == Expression::MAP) {
210
242
  map = Cast<Map>(expr);
211
243
  }
212
- else if (Selector_List_Ptr ls = Cast<Selector_List>(expr)) {
213
- Listize listize;
214
- Expression_Obj rv = ls->perform(&listize);
244
+ else if (SelectorList * ls = Cast<SelectorList>(expr)) {
245
+ ExpressionObj rv = Listize::perform(ls);
215
246
  list = Cast<List>(rv);
216
247
  }
217
248
  else if (expr->concrete_type() != Expression::LIST) {
@@ -223,14 +254,14 @@ namespace Sass {
223
254
  }
224
255
 
225
256
  Block_Obj body = e->block();
226
- Expression_Obj val = 0;
257
+ ExpressionObj val;
227
258
 
228
259
  if (map) {
229
- for (Expression_Obj key : map->keys()) {
230
- Expression_Obj value = map->at(key);
260
+ for (ExpressionObj key : map->keys()) {
261
+ ExpressionObj value = map->at(key);
231
262
 
232
263
  if (variables.size() == 1) {
233
- List_Ptr variable = SASS_MEMORY_NEW(List, map->pstate(), 2, SASS_SPACE);
264
+ List* variable = SASS_MEMORY_NEW(List, map->pstate(), 2, SASS_SPACE);
234
265
  variable->append(key);
235
266
  variable->append(value);
236
267
  env.set_local(variables[0], variable);
@@ -244,25 +275,23 @@ namespace Sass {
244
275
  }
245
276
  }
246
277
  else {
247
- if (list->length() == 1 && Cast<Selector_List>(list)) {
278
+ if (list->length() == 1 && Cast<SelectorList>(list)) {
248
279
  list = Cast<List>(list);
249
280
  }
250
281
  for (size_t i = 0, L = list->length(); i < L; ++i) {
251
- Expression_Ptr item = list->at(i);
282
+ Expression* item = list->at(i);
252
283
  // unwrap value if the expression is an argument
253
- if (Argument_Ptr arg = Cast<Argument>(item)) item = arg->value();
284
+ if (Argument* arg = Cast<Argument>(item)) item = arg->value();
254
285
  // check if we got passed a list of args (investigate)
255
- if (List_Ptr scalars = Cast<List>(item)) {
286
+ if (List* scalars = Cast<List>(item)) {
256
287
  if (variables.size() == 1) {
257
- Expression_Ptr var = scalars;
288
+ Expression* var = scalars;
258
289
  env.set_local(variables[0], var);
259
290
  } else {
260
- // XXX: this is never hit via spec tests
291
+ // https://github.com/sass/libsass/issues/3078
261
292
  for (size_t j = 0, K = variables.size(); j < K; ++j) {
262
- Expression_Ptr res = j >= scalars->length()
263
- ? SASS_MEMORY_NEW(Null, expr->pstate())
264
- : scalars->at(j);
265
- env.set_local(variables[j], res);
293
+ env.set_local(variables[j], j >= scalars->length()
294
+ ? SASS_MEMORY_NEW(Null, expr->pstate()) : scalars->at(j));
266
295
  }
267
296
  }
268
297
  } else {
@@ -270,7 +299,7 @@ namespace Sass {
270
299
  env.set_local(variables.at(0), item);
271
300
  for (size_t j = 1, K = variables.size(); j < K; ++j) {
272
301
  // XXX: this is never hit via spec tests
273
- Expression_Ptr res = SASS_MEMORY_NEW(Null, expr->pstate());
302
+ Expression* res = SASS_MEMORY_NEW(Null, expr->pstate());
274
303
  env.set_local(variables[j], res);
275
304
  }
276
305
  }
@@ -279,177 +308,177 @@ namespace Sass {
279
308
  if (val) break;
280
309
  }
281
310
  }
282
- exp.env_stack.pop_back();
311
+ env_stack().pop_back();
283
312
  return val.detach();
284
313
  }
285
314
 
286
- Expression_Ptr Eval::operator()(While_Ptr w)
315
+ Expression* Eval::operator()(WhileRule* w)
287
316
  {
288
- Expression_Obj pred = w->predicate();
317
+ ExpressionObj pred = w->predicate();
289
318
  Block_Obj body = w->block();
290
319
  Env env(environment(), true);
291
- exp.env_stack.push_back(&env);
292
- Expression_Obj cond = pred->perform(this);
320
+ env_stack().push_back(&env);
321
+ ExpressionObj cond = pred->perform(this);
293
322
  while (!cond->is_false()) {
294
- Expression_Obj val = body->perform(this);
323
+ ExpressionObj val = body->perform(this);
295
324
  if (val) {
296
- exp.env_stack.pop_back();
325
+ env_stack().pop_back();
297
326
  return val.detach();
298
327
  }
299
328
  cond = pred->perform(this);
300
329
  }
301
- exp.env_stack.pop_back();
330
+ env_stack().pop_back();
302
331
  return 0;
303
332
  }
304
333
 
305
- Expression_Ptr Eval::operator()(Return_Ptr r)
334
+ Expression* Eval::operator()(Return* r)
306
335
  {
307
336
  return r->value()->perform(this);
308
337
  }
309
338
 
310
- Expression_Ptr Eval::operator()(Warning_Ptr w)
339
+ Expression* Eval::operator()(WarningRule* w)
311
340
  {
312
- Sass_Output_Style outstyle = ctx.c_options.output_style;
313
- ctx.c_options.output_style = NESTED;
314
- Expression_Obj message = w->message()->perform(this);
315
- Env* env = exp.environment();
341
+ Sass_Output_Style outstyle = options().output_style;
342
+ options().output_style = NESTED;
343
+ ExpressionObj message = w->message()->perform(this);
344
+ Env* env = environment();
316
345
 
317
346
  // try to use generic function
318
347
  if (env->has("@warn[f]")) {
319
348
 
320
349
  // add call stack entry
321
- ctx.callee_stack.push_back({
350
+ callee_stack().push_back({
322
351
  "@warn",
323
- w->pstate().path,
324
- w->pstate().line + 1,
325
- w->pstate().column + 1,
352
+ w->pstate().getPath(),
353
+ w->pstate().getLine(),
354
+ w->pstate().getColumn(),
326
355
  SASS_CALLEE_FUNCTION,
327
356
  { env }
328
357
  });
329
358
 
330
- Definition_Ptr def = Cast<Definition>((*env)["@warn[f]"]);
359
+ Definition* def = Cast<Definition>((*env)["@warn[f]"]);
331
360
  // Block_Obj body = def->block();
332
361
  // Native_Function func = def->native_function();
333
362
  Sass_Function_Entry c_function = def->c_function();
334
363
  Sass_Function_Fn c_func = sass_function_get_function(c_function);
335
364
 
336
- To_C to_c;
365
+ AST2C ast2c;
337
366
  union Sass_Value* c_args = sass_make_list(1, SASS_COMMA, false);
338
- sass_list_set_value(c_args, 0, message->perform(&to_c));
339
- union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
340
- ctx.c_options.output_style = outstyle;
341
- ctx.callee_stack.pop_back();
367
+ sass_list_set_value(c_args, 0, message->perform(&ast2c));
368
+ union Sass_Value* c_val = c_func(c_args, c_function, compiler());
369
+ options().output_style = outstyle;
370
+ callee_stack().pop_back();
342
371
  sass_delete_value(c_args);
343
372
  sass_delete_value(c_val);
344
373
  return 0;
345
374
 
346
375
  }
347
376
 
348
- std::string result(unquote(message->to_sass()));
377
+ sass::string result(unquote(message->to_sass()));
349
378
  std::cerr << "WARNING: " << result << std::endl;
350
379
  traces.push_back(Backtrace(w->pstate()));
351
380
  std::cerr << traces_to_string(traces, " ");
352
381
  std::cerr << std::endl;
353
- ctx.c_options.output_style = outstyle;
382
+ options().output_style = outstyle;
354
383
  traces.pop_back();
355
384
  return 0;
356
385
  }
357
386
 
358
- Expression_Ptr Eval::operator()(Error_Ptr e)
387
+ Expression* Eval::operator()(ErrorRule* e)
359
388
  {
360
- Sass_Output_Style outstyle = ctx.c_options.output_style;
361
- ctx.c_options.output_style = NESTED;
362
- Expression_Obj message = e->message()->perform(this);
363
- Env* env = exp.environment();
389
+ Sass_Output_Style outstyle = options().output_style;
390
+ options().output_style = NESTED;
391
+ ExpressionObj message = e->message()->perform(this);
392
+ Env* env = environment();
364
393
 
365
394
  // try to use generic function
366
395
  if (env->has("@error[f]")) {
367
396
 
368
397
  // add call stack entry
369
- ctx.callee_stack.push_back({
398
+ callee_stack().push_back({
370
399
  "@error",
371
- e->pstate().path,
372
- e->pstate().line + 1,
373
- e->pstate().column + 1,
400
+ e->pstate().getPath(),
401
+ e->pstate().getLine(),
402
+ e->pstate().getColumn(),
374
403
  SASS_CALLEE_FUNCTION,
375
404
  { env }
376
405
  });
377
406
 
378
- Definition_Ptr def = Cast<Definition>((*env)["@error[f]"]);
407
+ Definition* def = Cast<Definition>((*env)["@error[f]"]);
379
408
  // Block_Obj body = def->block();
380
409
  // Native_Function func = def->native_function();
381
410
  Sass_Function_Entry c_function = def->c_function();
382
411
  Sass_Function_Fn c_func = sass_function_get_function(c_function);
383
412
 
384
- To_C to_c;
413
+ AST2C ast2c;
385
414
  union Sass_Value* c_args = sass_make_list(1, SASS_COMMA, false);
386
- sass_list_set_value(c_args, 0, message->perform(&to_c));
387
- union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
388
- ctx.c_options.output_style = outstyle;
389
- ctx.callee_stack.pop_back();
415
+ sass_list_set_value(c_args, 0, message->perform(&ast2c));
416
+ union Sass_Value* c_val = c_func(c_args, c_function, compiler());
417
+ options().output_style = outstyle;
418
+ callee_stack().pop_back();
390
419
  sass_delete_value(c_args);
391
420
  sass_delete_value(c_val);
392
421
  return 0;
393
422
 
394
423
  }
395
424
 
396
- std::string result(unquote(message->to_sass()));
397
- ctx.c_options.output_style = outstyle;
425
+ sass::string result(unquote(message->to_sass()));
426
+ options().output_style = outstyle;
398
427
  error(result, e->pstate(), traces);
399
428
  return 0;
400
429
  }
401
430
 
402
- Expression_Ptr Eval::operator()(Debug_Ptr d)
431
+ Expression* Eval::operator()(DebugRule* d)
403
432
  {
404
- Sass_Output_Style outstyle = ctx.c_options.output_style;
405
- ctx.c_options.output_style = NESTED;
406
- Expression_Obj message = d->value()->perform(this);
407
- Env* env = exp.environment();
433
+ Sass_Output_Style outstyle = options().output_style;
434
+ options().output_style = NESTED;
435
+ ExpressionObj message = d->value()->perform(this);
436
+ Env* env = environment();
408
437
 
409
438
  // try to use generic function
410
439
  if (env->has("@debug[f]")) {
411
440
 
412
441
  // add call stack entry
413
- ctx.callee_stack.push_back({
442
+ callee_stack().push_back({
414
443
  "@debug",
415
- d->pstate().path,
416
- d->pstate().line + 1,
417
- d->pstate().column + 1,
444
+ d->pstate().getPath(),
445
+ d->pstate().getLine(),
446
+ d->pstate().getColumn(),
418
447
  SASS_CALLEE_FUNCTION,
419
448
  { env }
420
449
  });
421
450
 
422
- Definition_Ptr def = Cast<Definition>((*env)["@debug[f]"]);
451
+ Definition* def = Cast<Definition>((*env)["@debug[f]"]);
423
452
  // Block_Obj body = def->block();
424
453
  // Native_Function func = def->native_function();
425
454
  Sass_Function_Entry c_function = def->c_function();
426
455
  Sass_Function_Fn c_func = sass_function_get_function(c_function);
427
456
 
428
- To_C to_c;
457
+ AST2C ast2c;
429
458
  union Sass_Value* c_args = sass_make_list(1, SASS_COMMA, false);
430
- sass_list_set_value(c_args, 0, message->perform(&to_c));
431
- union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
432
- ctx.c_options.output_style = outstyle;
433
- ctx.callee_stack.pop_back();
459
+ sass_list_set_value(c_args, 0, message->perform(&ast2c));
460
+ union Sass_Value* c_val = c_func(c_args, c_function, compiler());
461
+ options().output_style = outstyle;
462
+ callee_stack().pop_back();
434
463
  sass_delete_value(c_args);
435
464
  sass_delete_value(c_val);
436
465
  return 0;
437
466
 
438
467
  }
439
468
 
440
- std::string cwd(ctx.cwd());
441
- std::string result(unquote(message->to_sass()));
442
- std::string abs_path(Sass::File::rel2abs(d->pstate().path, cwd, cwd));
443
- std::string rel_path(Sass::File::abs2rel(d->pstate().path, cwd, cwd));
444
- std::string output_path(Sass::File::path_for_console(rel_path, abs_path, d->pstate().path));
445
- ctx.c_options.output_style = outstyle;
469
+ sass::string result(unquote(message->to_sass()));
470
+ sass::string abs_path(Sass::File::rel2abs(d->pstate().getPath(), cwd(), cwd()));
471
+ sass::string rel_path(Sass::File::abs2rel(d->pstate().getPath(), cwd(), cwd()));
472
+ sass::string output_path(Sass::File::path_for_console(rel_path, abs_path, d->pstate().getPath()));
473
+ options().output_style = outstyle;
446
474
 
447
- std::cerr << output_path << ":" << d->pstate().line+1 << " DEBUG: " << result;
475
+ std::cerr << output_path << ":" << d->pstate().getLine() << " DEBUG: " << result;
448
476
  std::cerr << std::endl;
449
477
  return 0;
450
478
  }
451
479
 
452
- Expression_Ptr Eval::operator()(List_Ptr l)
480
+
481
+ Expression* Eval::operator()(List* l)
453
482
  {
454
483
  // special case for unevaluated map
455
484
  if (l->separator() == SASS_HASH) {
@@ -458,8 +487,8 @@ namespace Sass {
458
487
  l->length() / 2);
459
488
  for (size_t i = 0, L = l->length(); i < L; i += 2)
460
489
  {
461
- Expression_Obj key = (*l)[i+0]->perform(this);
462
- Expression_Obj val = (*l)[i+1]->perform(this);
490
+ ExpressionObj key = (*l)[i+0]->perform(this);
491
+ ExpressionObj val = (*l)[i+1]->perform(this);
463
492
  // make sure the color key never displays its real name
464
493
  key->is_delayed(true); // verified
465
494
  *lm << std::make_pair(key, val);
@@ -490,7 +519,7 @@ namespace Sass {
490
519
  return ll.detach();
491
520
  }
492
521
 
493
- Expression_Ptr Eval::operator()(Map_Ptr m)
522
+ Expression* Eval::operator()(Map* m)
494
523
  {
495
524
  if (m->is_expanded()) return m;
496
525
 
@@ -505,8 +534,8 @@ namespace Sass {
505
534
  m->pstate(),
506
535
  m->length());
507
536
  for (auto key : m->keys()) {
508
- Expression_Ptr ex_key = key->perform(this);
509
- Expression_Ptr ex_val = m->at(key);
537
+ Expression* ex_key = key->perform(this);
538
+ Expression* ex_val = m->at(key);
510
539
  if (ex_val == NULL) continue;
511
540
  ex_val = ex_val->perform(this);
512
541
  *mm << std::make_pair(ex_key, ex_val);
@@ -522,11 +551,11 @@ namespace Sass {
522
551
  return mm.detach();
523
552
  }
524
553
 
525
- Expression_Ptr Eval::operator()(Binary_Expression_Ptr b_in)
554
+ Expression* Eval::operator()(Binary_Expression* b_in)
526
555
  {
527
556
 
528
- Expression_Obj lhs = b_in->left();
529
- Expression_Obj rhs = b_in->right();
557
+ ExpressionObj lhs = b_in->left();
558
+ ExpressionObj rhs = b_in->right();
530
559
  enum Sass_OP op_type = b_in->optype();
531
560
 
532
561
  if (op_type == Sass_OP::AND) {
@@ -543,21 +572,21 @@ namespace Sass {
543
572
  }
544
573
 
545
574
  // Evaluate variables as early o
546
- while (Variable_Ptr l_v = Cast<Variable>(lhs)) {
575
+ while (Variable* l_v = Cast<Variable>(lhs)) {
547
576
  lhs = operator()(l_v);
548
577
  }
549
- while (Variable_Ptr r_v = Cast<Variable>(rhs)) {
578
+ while (Variable* r_v = Cast<Variable>(rhs)) {
550
579
  rhs = operator()(r_v);
551
580
  }
552
581
 
553
- Binary_Expression_Obj b = b_in;
582
+ Binary_ExpressionObj b = b_in;
554
583
 
555
584
  // Evaluate sub-expressions early on
556
- while (Binary_Expression_Ptr l_b = Cast<Binary_Expression>(lhs)) {
585
+ while (Binary_Expression* l_b = Cast<Binary_Expression>(lhs)) {
557
586
  if (!force && l_b->is_delayed()) break;
558
587
  lhs = operator()(l_b);
559
588
  }
560
- while (Binary_Expression_Ptr r_b = Cast<Binary_Expression>(rhs)) {
589
+ while (Binary_Expression* r_b = Cast<Binary_Expression>(rhs)) {
561
590
  if (!force && r_b->is_delayed()) break;
562
591
  rhs = operator()(r_b);
563
592
  }
@@ -571,9 +600,9 @@ namespace Sass {
571
600
 
572
601
  // specific types we know are final
573
602
  // handle them early to avoid overhead
574
- if (Number_Ptr l_n = Cast<Number>(lhs)) {
603
+ if (Number* l_n = Cast<Number>(lhs)) {
575
604
  // lhs is number and rhs is number
576
- if (Number_Ptr r_n = Cast<Number>(rhs)) {
605
+ if (Number* r_n = Cast<Number>(rhs)) {
577
606
  try {
578
607
  switch (op_type) {
579
608
  case Sass_OP::EQ: return *l_n == *r_n ? bool_true : bool_false;
@@ -583,7 +612,7 @@ namespace Sass {
583
612
  case Sass_OP::LTE: return *l_n < *r_n || *l_n == *r_n ? bool_true : bool_false;
584
613
  case Sass_OP::GT: return *l_n < *r_n || *l_n == *r_n ? bool_false : bool_true;
585
614
  case Sass_OP::ADD: case Sass_OP::SUB: case Sass_OP::MUL: case Sass_OP::DIV: case Sass_OP::MOD:
586
- return Operators::op_numbers(op_type, *l_n, *r_n, ctx.c_options, b_in->pstate());
615
+ return Operators::op_numbers(op_type, *l_n, *r_n, options(), b_in->pstate());
587
616
  default: break;
588
617
  }
589
618
  }
@@ -594,17 +623,15 @@ namespace Sass {
594
623
  }
595
624
  }
596
625
  // lhs is number and rhs is color
597
- else if (Color_Ptr r_c = Cast<Color>(rhs)) {
626
+ // Todo: allow to work with HSLA colors
627
+ else if (Color* r_col = Cast<Color>(rhs)) {
628
+ Color_RGBA_Obj r_c = r_col->toRGBA();
598
629
  try {
599
630
  switch (op_type) {
600
631
  case Sass_OP::EQ: return *l_n == *r_c ? bool_true : bool_false;
601
632
  case Sass_OP::NEQ: return *l_n == *r_c ? bool_false : bool_true;
602
- case Sass_OP::LT: return *l_n < *r_c ? bool_true : bool_false;
603
- case Sass_OP::GTE: return *l_n < *r_c ? bool_false : bool_true;
604
- case Sass_OP::LTE: return *l_n < *r_c || *l_n == *r_c ? bool_true : bool_false;
605
- case Sass_OP::GT: return *l_n < *r_c || *l_n == *r_c ? bool_false : bool_true;
606
633
  case Sass_OP::ADD: case Sass_OP::SUB: case Sass_OP::MUL: case Sass_OP::DIV: case Sass_OP::MOD:
607
- return Operators::op_number_color(op_type, *l_n, *r_c, ctx.c_options, b_in->pstate());
634
+ return Operators::op_number_color(op_type, *l_n, *r_c, options(), b_in->pstate());
608
635
  default: break;
609
636
  }
610
637
  }
@@ -615,9 +642,11 @@ namespace Sass {
615
642
  }
616
643
  }
617
644
  }
618
- else if (Color_Ptr l_c = Cast<Color>(lhs)) {
645
+ else if (Color* l_col = Cast<Color>(lhs)) {
646
+ Color_RGBA_Obj l_c = l_col->toRGBA();
619
647
  // lhs is color and rhs is color
620
- if (Color_Ptr r_c = Cast<Color>(rhs)) {
648
+ if (Color* r_col = Cast<Color>(rhs)) {
649
+ Color_RGBA_Obj r_c = r_col->toRGBA();
621
650
  try {
622
651
  switch (op_type) {
623
652
  case Sass_OP::EQ: return *l_c == *r_c ? bool_true : bool_false;
@@ -627,7 +656,7 @@ namespace Sass {
627
656
  case Sass_OP::LTE: return *l_c < *r_c || *l_c == *r_c ? bool_true : bool_false;
628
657
  case Sass_OP::GT: return *l_c < *r_c || *l_c == *r_c ? bool_false : bool_true;
629
658
  case Sass_OP::ADD: case Sass_OP::SUB: case Sass_OP::MUL: case Sass_OP::DIV: case Sass_OP::MOD:
630
- return Operators::op_colors(op_type, *l_c, *r_c, ctx.c_options, b_in->pstate());
659
+ return Operators::op_colors(op_type, *l_c, *r_c, options(), b_in->pstate());
631
660
  default: break;
632
661
  }
633
662
  }
@@ -638,17 +667,13 @@ namespace Sass {
638
667
  }
639
668
  }
640
669
  // lhs is color and rhs is number
641
- else if (Number_Ptr r_n = Cast<Number>(rhs)) {
670
+ else if (Number* r_n = Cast<Number>(rhs)) {
642
671
  try {
643
672
  switch (op_type) {
644
673
  case Sass_OP::EQ: return *l_c == *r_n ? bool_true : bool_false;
645
674
  case Sass_OP::NEQ: return *l_c == *r_n ? bool_false : bool_true;
646
- case Sass_OP::LT: return *l_c < *r_n ? bool_true : bool_false;
647
- case Sass_OP::GTE: return *l_c < *r_n ? bool_false : bool_true;
648
- case Sass_OP::LTE: return *l_c < *r_n || *l_c == *r_n ? bool_true : bool_false;
649
- case Sass_OP::GT: return *l_c < *r_n || *l_c == *r_n ? bool_false : bool_true;
650
675
  case Sass_OP::ADD: case Sass_OP::SUB: case Sass_OP::MUL: case Sass_OP::DIV: case Sass_OP::MOD:
651
- return Operators::op_color_number(op_type, *l_c, *r_n, ctx.c_options, b_in->pstate());
676
+ return Operators::op_color_number(op_type, *l_c, *r_n, options(), b_in->pstate());
652
677
  default: break;
653
678
  }
654
679
  }
@@ -663,10 +688,10 @@ namespace Sass {
663
688
  String_Schema_Obj ret_schema;
664
689
 
665
690
  // only the last item will be used to eval the binary expression
666
- if (String_Schema_Ptr s_l = Cast<String_Schema>(b->left())) {
691
+ if (String_Schema* s_l = Cast<String_Schema>(b->left())) {
667
692
  if (!s_l->has_interpolant() && (!s_l->is_right_interpolant())) {
668
693
  ret_schema = SASS_MEMORY_NEW(String_Schema, b->pstate());
669
- Binary_Expression_Obj bin_ex = SASS_MEMORY_NEW(Binary_Expression, b->pstate(),
694
+ Binary_ExpressionObj bin_ex = SASS_MEMORY_NEW(Binary_Expression, b->pstate(),
670
695
  b->op(), s_l->last(), b->right());
671
696
  bin_ex->is_delayed(b->left()->is_delayed() || b->right()->is_delayed()); // unverified
672
697
  for (size_t i = 0; i < s_l->length() - 1; ++i) {
@@ -676,11 +701,11 @@ namespace Sass {
676
701
  return ret_schema->perform(this);
677
702
  }
678
703
  }
679
- if (String_Schema_Ptr s_r = Cast<String_Schema>(b->right())) {
704
+ if (String_Schema* s_r = Cast<String_Schema>(b->right())) {
680
705
 
681
706
  if (!s_r->has_interpolant() && (!s_r->is_left_interpolant() || op_type == Sass_OP::DIV)) {
682
707
  ret_schema = SASS_MEMORY_NEW(String_Schema, b->pstate());
683
- Binary_Expression_Obj bin_ex = SASS_MEMORY_NEW(Binary_Expression, b->pstate(),
708
+ Binary_ExpressionObj bin_ex = SASS_MEMORY_NEW(Binary_Expression, b->pstate(),
684
709
  b->op(), b->left(), s_r->first());
685
710
  bin_ex->is_delayed(b->left()->is_delayed() || b->right()->is_delayed()); // verified
686
711
  ret_schema->append(bin_ex->perform(this));
@@ -716,14 +741,14 @@ namespace Sass {
716
741
  AST_Node_Obj lu = lhs;
717
742
  AST_Node_Obj ru = rhs;
718
743
 
719
- Expression::Concrete_Type l_type;
720
- Expression::Concrete_Type r_type;
744
+ Expression::Type l_type;
745
+ Expression::Type r_type;
721
746
 
722
747
  // Is one of the operands an interpolant?
723
748
  String_Schema_Obj s1 = Cast<String_Schema>(b->left());
724
749
  String_Schema_Obj s2 = Cast<String_Schema>(b->right());
725
- Binary_Expression_Obj b1 = Cast<Binary_Expression>(b->left());
726
- Binary_Expression_Obj b2 = Cast<Binary_Expression>(b->right());
750
+ Binary_ExpressionObj b1 = Cast<Binary_Expression>(b->left());
751
+ Binary_ExpressionObj b2 = Cast<Binary_Expression>(b->right());
727
752
 
728
753
  bool schema_op = false;
729
754
 
@@ -737,16 +762,16 @@ namespace Sass {
737
762
  if (op_type == Sass_OP::DIV || op_type == Sass_OP::MUL || op_type == Sass_OP::MOD || op_type == Sass_OP::ADD || op_type == Sass_OP::SUB ||
738
763
  op_type == Sass_OP::EQ) {
739
764
  // If possible upgrade LHS to a number (for number to string compare)
740
- if (String_Constant_Ptr str = Cast<String_Constant>(lhs)) {
741
- std::string value(str->value());
765
+ if (String_Constant* str = Cast<String_Constant>(lhs)) {
766
+ sass::string value(str->value());
742
767
  const char* start = value.c_str();
743
768
  if (Prelexer::sequence < Prelexer::dimension, Prelexer::end_of_file >(start) != 0) {
744
769
  lhs = Parser::lexed_dimension(b->pstate(), str->value());
745
770
  }
746
771
  }
747
772
  // If possible upgrade RHS to a number (for string to number compare)
748
- if (String_Constant_Ptr str = Cast<String_Constant>(rhs)) {
749
- std::string value(str->value());
773
+ if (String_Constant* str = Cast<String_Constant>(rhs)) {
774
+ sass::string value(str->value());
750
775
  const char* start = value.c_str();
751
776
  if (Prelexer::sequence < Prelexer::dimension, Prelexer::number >(start) != 0) {
752
777
  rhs = Parser::lexed_dimension(b->pstate(), str->value());
@@ -755,17 +780,17 @@ namespace Sass {
755
780
  }
756
781
 
757
782
  To_Value to_value(ctx);
758
- Value_Obj v_l = Cast<Value>(lhs->perform(&to_value));
759
- Value_Obj v_r = Cast<Value>(rhs->perform(&to_value));
783
+ ValueObj v_l = Cast<Value>(lhs->perform(&to_value));
784
+ ValueObj v_r = Cast<Value>(rhs->perform(&to_value));
760
785
 
761
786
  if (force_delay) {
762
- std::string str("");
763
- str += v_l->to_string(ctx.c_options);
787
+ sass::string str("");
788
+ str += v_l->to_string(options());
764
789
  if (b->op().ws_before) str += " ";
765
790
  str += b->separator();
766
791
  if (b->op().ws_after) str += " ";
767
- str += v_r->to_string(ctx.c_options);
768
- String_Constant_Ptr val = SASS_MEMORY_NEW(String_Constant, b->pstate(), str);
792
+ str += v_r->to_string(options());
793
+ String_Constant* val = SASS_MEMORY_NEW(String_Constant, b->pstate(), str);
769
794
  val->is_interpolant(b->left()->has_interpolant());
770
795
  return val;
771
796
  }
@@ -785,7 +810,6 @@ namespace Sass {
785
810
  }
786
811
  catch (Exception::OperationError& err)
787
812
  {
788
- // throw Exception::Base(b->pstate(), err.what());
789
813
  traces.push_back(Backtrace(b->pstate()));
790
814
  throw Exception::SassValueError(traces, b->pstate(), err);
791
815
  }
@@ -795,35 +819,35 @@ namespace Sass {
795
819
 
796
820
  // ToDo: throw error in op functions
797
821
  // ToDo: then catch and re-throw them
798
- Expression_Obj rv;
822
+ ExpressionObj rv;
799
823
  try {
800
- ParserState pstate(b->pstate());
824
+ SourceSpan pstate(b->pstate());
801
825
  if (l_type == Expression::NUMBER && r_type == Expression::NUMBER) {
802
- Number_Ptr l_n = Cast<Number>(lhs);
803
- Number_Ptr r_n = Cast<Number>(rhs);
826
+ Number* l_n = Cast<Number>(lhs);
827
+ Number* r_n = Cast<Number>(rhs);
804
828
  l_n->reduce(); r_n->reduce();
805
- rv = Operators::op_numbers(op_type, *l_n, *r_n, ctx.c_options, pstate);
829
+ rv = Operators::op_numbers(op_type, *l_n, *r_n, options(), pstate);
806
830
  }
807
831
  else if (l_type == Expression::NUMBER && r_type == Expression::COLOR) {
808
- Number_Ptr l_n = Cast<Number>(lhs);
809
- Color_Ptr r_c = Cast<Color>(rhs);
810
- rv = Operators::op_number_color(op_type, *l_n, *r_c, ctx.c_options, pstate);
832
+ Number* l_n = Cast<Number>(lhs);
833
+ Color_RGBA_Obj r_c = Cast<Color>(rhs)->toRGBA();
834
+ rv = Operators::op_number_color(op_type, *l_n, *r_c, options(), pstate);
811
835
  }
812
836
  else if (l_type == Expression::COLOR && r_type == Expression::NUMBER) {
813
- Color_Ptr l_c = Cast<Color>(lhs);
814
- Number_Ptr r_n = Cast<Number>(rhs);
815
- rv = Operators::op_color_number(op_type, *l_c, *r_n, ctx.c_options, pstate);
837
+ Color_RGBA_Obj l_c = Cast<Color>(lhs)->toRGBA();
838
+ Number* r_n = Cast<Number>(rhs);
839
+ rv = Operators::op_color_number(op_type, *l_c, *r_n, options(), pstate);
816
840
  }
817
841
  else if (l_type == Expression::COLOR && r_type == Expression::COLOR) {
818
- Color_Ptr l_c = Cast<Color>(lhs);
819
- Color_Ptr r_c = Cast<Color>(rhs);
820
- rv = Operators::op_colors(op_type, *l_c, *r_c, ctx.c_options, pstate);
842
+ Color_RGBA_Obj l_c = Cast<Color>(lhs)->toRGBA();
843
+ Color_RGBA_Obj r_c = Cast<Color>(rhs)->toRGBA();
844
+ rv = Operators::op_colors(op_type, *l_c, *r_c, options(), pstate);
821
845
  }
822
846
  else {
823
847
  To_Value to_value(ctx);
824
848
  // this will leak if perform does not return a value!
825
- Value_Obj v_l = Cast<Value>(lhs->perform(&to_value));
826
- Value_Obj v_r = Cast<Value>(rhs->perform(&to_value));
849
+ ValueObj v_l = Cast<Value>(lhs->perform(&to_value));
850
+ ValueObj v_r = Cast<Value>(rhs->perform(&to_value));
827
851
  bool interpolant = b->is_right_interpolant() ||
828
852
  b->is_left_interpolant() ||
829
853
  b->is_interpolant();
@@ -838,15 +862,15 @@ namespace Sass {
838
862
  traces.push_back(Backtrace(v_r->pstate()));
839
863
  throw Exception::InvalidValue(traces, *v_r);
840
864
  }
841
- Value_Ptr ex = Operators::op_strings(b->op(), *v_l, *v_r, ctx.c_options, pstate, !interpolant); // pass true to compress
842
- if (String_Constant_Ptr str = Cast<String_Constant>(ex))
865
+ Value* ex = Operators::op_strings(b->op(), *v_l, *v_r, options(), pstate, !interpolant); // pass true to compress
866
+ if (String_Constant* str = Cast<String_Constant>(ex))
843
867
  {
844
868
  if (str->concrete_type() == Expression::STRING)
845
869
  {
846
- String_Constant_Ptr lstr = Cast<String_Constant>(lhs);
847
- String_Constant_Ptr rstr = Cast<String_Constant>(rhs);
870
+ String_Constant* lstr = Cast<String_Constant>(lhs);
871
+ String_Constant* rstr = Cast<String_Constant>(rhs);
848
872
  if (op_type != Sass_OP::SUB) {
849
- if (String_Constant_Ptr org = lstr ? lstr : rstr)
873
+ if (String_Constant* org = lstr ? lstr : rstr)
850
874
  { str->quote_mark(org->quote_mark()); }
851
875
  }
852
876
  }
@@ -874,11 +898,11 @@ namespace Sass {
874
898
 
875
899
  }
876
900
 
877
- Expression_Ptr Eval::operator()(Unary_Expression_Ptr u)
901
+ Expression* Eval::operator()(Unary_Expression* u)
878
902
  {
879
- Expression_Obj operand = u->operand()->perform(this);
903
+ ExpressionObj operand = u->operand()->perform(this);
880
904
  if (u->optype() == Unary_Expression::NOT) {
881
- Boolean_Ptr result = SASS_MEMORY_NEW(Boolean, u->pstate(), (bool)*operand);
905
+ Boolean* result = SASS_MEMORY_NEW(Boolean, u->pstate(), (bool)*operand);
882
906
  result->value(!result->value());
883
907
  return result;
884
908
  }
@@ -890,28 +914,35 @@ namespace Sass {
890
914
  return cpy.detach(); // return the copy
891
915
  }
892
916
  else if (u->optype() == Unary_Expression::SLASH) {
893
- std::string str = '/' + nr->to_string(ctx.c_options);
917
+ sass::string str = '/' + nr->to_string(options());
894
918
  return SASS_MEMORY_NEW(String_Constant, u->pstate(), str);
895
919
  }
896
920
  // nothing for positive
897
921
  return nr.detach();
898
922
  }
899
923
  else {
900
- // Special cases: +/- variables which evaluate to null ouput just +/-,
924
+ // Special cases: +/- variables which evaluate to null output just +/-,
901
925
  // but +/- null itself outputs the string
902
926
  if (operand->concrete_type() == Expression::NULL_VAL && Cast<Variable>(u->operand())) {
903
927
  u->operand(SASS_MEMORY_NEW(String_Quoted, u->pstate(), ""));
904
928
  }
905
929
  // Never apply unary opertions on colors @see #2140
906
- else if (Color_Ptr color = Cast<Color>(operand)) {
930
+ else if (Color* color = Cast<Color>(operand)) {
907
931
  // Use the color name if this was eval with one
908
932
  if (color->disp().length() > 0) {
909
- operand = SASS_MEMORY_NEW(String_Constant, operand->pstate(), color->disp());
910
- u->operand(operand);
933
+ Unary_ExpressionObj cpy = SASS_MEMORY_COPY(u);
934
+ cpy->operand(SASS_MEMORY_NEW(String_Constant, operand->pstate(), color->disp()));
935
+ return SASS_MEMORY_NEW(String_Quoted,
936
+ cpy->pstate(),
937
+ cpy->inspect());
911
938
  }
912
939
  }
913
940
  else {
914
- u->operand(operand);
941
+ Unary_ExpressionObj cpy = SASS_MEMORY_COPY(u);
942
+ cpy->operand(operand);
943
+ return SASS_MEMORY_NEW(String_Quoted,
944
+ cpy->pstate(),
945
+ cpy->inspect());
915
946
  }
916
947
 
917
948
  return SASS_MEMORY_NEW(String_Quoted,
@@ -922,16 +953,26 @@ namespace Sass {
922
953
  return u;
923
954
  }
924
955
 
925
- Expression_Ptr Eval::operator()(Function_Call_Ptr c)
956
+ Expression* Eval::operator()(Function_Call* c)
926
957
  {
927
958
  if (traces.size() > Constants::MaxCallStack) {
928
959
  // XXX: this is never hit via spec tests
929
- std::ostringstream stm;
960
+ sass::ostream stm;
930
961
  stm << "Stack depth exceeded max of " << Constants::MaxCallStack;
931
962
  error(stm.str(), c->pstate(), traces);
932
963
  }
933
- std::string name(Util::normalize_underscores(c->name()));
934
- std::string full_name(name + "[f]");
964
+
965
+ if (Cast<String_Schema>(c->sname())) {
966
+ ExpressionObj evaluated_name = c->sname()->perform(this);
967
+ ExpressionObj evaluated_args = c->arguments()->perform(this);
968
+ sass::string str(evaluated_name->to_string());
969
+ str += evaluated_args->to_string();
970
+ return SASS_MEMORY_NEW(String_Constant, c->pstate(), str);
971
+ }
972
+
973
+ sass::string name(Util::normalize_underscores(c->name()));
974
+ sass::string full_name(name + "[f]");
975
+
935
976
  // we make a clone here, need to implement that further
936
977
  Arguments_Obj args = c->arguments();
937
978
 
@@ -949,11 +990,11 @@ namespace Sass {
949
990
  c->name(),
950
991
  args);
951
992
  if (args->has_named_arguments()) {
952
- error("Function " + c->name() + " doesn't support keyword arguments", c->pstate(), traces);
993
+ error("Plain CSS function " + c->name() + " doesn't support keyword arguments", c->pstate(), traces);
953
994
  }
954
- String_Quoted_Ptr str = SASS_MEMORY_NEW(String_Quoted,
995
+ String_Quoted* str = SASS_MEMORY_NEW(String_Quoted,
955
996
  c->pstate(),
956
- lit->to_string(ctx.c_options));
997
+ lit->to_string(options()));
957
998
  str->is_interpolant(c->is_interpolant());
958
999
  return str;
959
1000
  } else {
@@ -969,28 +1010,28 @@ namespace Sass {
969
1010
  if (full_name != "if[f]") {
970
1011
  args = Cast<Arguments>(args->perform(this));
971
1012
  }
972
- Definition_Ptr def = Cast<Definition>((*env)[full_name]);
1013
+ Definition* def = Cast<Definition>((*env)[full_name]);
973
1014
 
974
1015
  if (c->func()) def = c->func()->definition();
975
1016
 
976
1017
  if (def->is_overload_stub()) {
977
- std::stringstream ss;
1018
+ sass::ostream ss;
978
1019
  size_t L = args->length();
979
1020
  // account for rest arguments
980
1021
  if (args->has_rest_argument() && args->length() > 0) {
981
1022
  // get the rest arguments list
982
- List_Ptr rest = Cast<List>(args->last()->value());
1023
+ List* rest = Cast<List>(args->last()->value());
983
1024
  // arguments before rest argument plus rest
984
1025
  if (rest) L += rest->length() - 1;
985
1026
  }
986
1027
  ss << full_name << L;
987
1028
  full_name = ss.str();
988
- std::string resolved_name(full_name);
989
- if (!env->has(resolved_name)) error("overloaded function `" + std::string(c->name()) + "` given wrong number of arguments", c->pstate(), traces);
1029
+ sass::string resolved_name(full_name);
1030
+ if (!env->has(resolved_name)) error("overloaded function `" + sass::string(c->name()) + "` given wrong number of arguments", c->pstate(), traces);
990
1031
  def = Cast<Definition>((*env)[resolved_name]);
991
1032
  }
992
1033
 
993
- Expression_Obj result = c;
1034
+ ExpressionObj result = c;
994
1035
  Block_Obj body = def->block();
995
1036
  Native_Function func = def->native_function();
996
1037
  Sass_Function_Entry c_function = def->c_function();
@@ -999,17 +1040,17 @@ namespace Sass {
999
1040
 
1000
1041
  Parameters_Obj params = def->parameters();
1001
1042
  Env fn_env(def->environment());
1002
- exp.env_stack.push_back(&fn_env);
1043
+ env_stack().push_back(&fn_env);
1003
1044
 
1004
1045
  if (func || body) {
1005
- bind(std::string("Function"), c->name(), params, args, &ctx, &fn_env, this);
1006
- std::string msg(", in function `" + c->name() + "`");
1046
+ bind(sass::string("Function"), c->name(), params, args, &fn_env, this, traces);
1047
+ sass::string msg(", in function `" + c->name() + "`");
1007
1048
  traces.push_back(Backtrace(c->pstate(), msg));
1008
- ctx.callee_stack.push_back({
1049
+ callee_stack().push_back({
1009
1050
  c->name().c_str(),
1010
- c->pstate().path,
1011
- c->pstate().line + 1,
1012
- c->pstate().column + 1,
1051
+ c->pstate().getPath(),
1052
+ c->pstate().getLine(),
1053
+ c->pstate().getColumn(),
1013
1054
  SASS_CALLEE_FUNCTION,
1014
1055
  { env }
1015
1056
  });
@@ -1019,12 +1060,12 @@ namespace Sass {
1019
1060
  result = body->perform(this);
1020
1061
  }
1021
1062
  else if (func) {
1022
- result = func(fn_env, *env, ctx, def->signature(), c->pstate(), traces, exp.selector_stack);
1063
+ result = func(fn_env, *env, ctx, def->signature(), c->pstate(), traces, exp.getSelectorStack(), exp.originalStack);
1023
1064
  }
1024
1065
  if (!result) {
1025
- error(std::string("Function ") + c->name() + " finished without @return", c->pstate(), traces);
1066
+ error(sass::string("Function ") + c->name() + " finished without @return", c->pstate(), traces);
1026
1067
  }
1027
- ctx.callee_stack.pop_back();
1068
+ callee_stack().pop_back();
1028
1069
  traces.pop_back();
1029
1070
  }
1030
1071
 
@@ -1041,37 +1082,43 @@ namespace Sass {
1041
1082
  }
1042
1083
 
1043
1084
  // populates env with default values for params
1044
- std::string ff(c->name());
1045
- bind(std::string("Function"), c->name(), params, args, &ctx, &fn_env, this);
1046
- std::string msg(", in function `" + c->name() + "`");
1085
+ sass::string ff(c->name());
1086
+ bind(sass::string("Function"), c->name(), params, args, &fn_env, this, traces);
1087
+ sass::string msg(", in function `" + c->name() + "`");
1047
1088
  traces.push_back(Backtrace(c->pstate(), msg));
1048
- ctx.callee_stack.push_back({
1089
+ callee_stack().push_back({
1049
1090
  c->name().c_str(),
1050
- c->pstate().path,
1051
- c->pstate().line + 1,
1052
- c->pstate().column + 1,
1091
+ c->pstate().getPath(),
1092
+ c->pstate().getLine(),
1093
+ c->pstate().getColumn(),
1053
1094
  SASS_CALLEE_C_FUNCTION,
1054
1095
  { env }
1055
1096
  });
1056
1097
 
1057
- To_C to_c;
1098
+ AST2C ast2c;
1058
1099
  union Sass_Value* c_args = sass_make_list(params->length(), SASS_COMMA, false);
1059
1100
  for(size_t i = 0; i < params->length(); i++) {
1060
1101
  Parameter_Obj param = params->at(i);
1061
- std::string key = param->name();
1102
+ sass::string key = param->name();
1062
1103
  AST_Node_Obj node = fn_env.get_local(key);
1063
- Expression_Obj arg = Cast<Expression>(node);
1064
- sass_list_set_value(c_args, i, arg->perform(&to_c));
1104
+ ExpressionObj arg = Cast<Expression>(node);
1105
+ sass_list_set_value(c_args, i, arg->perform(&ast2c));
1065
1106
  }
1066
- union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
1107
+ union Sass_Value* c_val = c_func(c_args, c_function, compiler());
1067
1108
  if (sass_value_get_tag(c_val) == SASS_ERROR) {
1068
- error("error in C function " + c->name() + ": " + sass_error_get_message(c_val), c->pstate(), traces);
1109
+ sass::string message("error in C function " + c->name() + ": " + sass_error_get_message(c_val));
1110
+ sass_delete_value(c_val);
1111
+ sass_delete_value(c_args);
1112
+ error(message, c->pstate(), traces);
1069
1113
  } else if (sass_value_get_tag(c_val) == SASS_WARNING) {
1070
- error("warning in C function " + c->name() + ": " + sass_warning_get_message(c_val), c->pstate(), traces);
1114
+ sass::string message("warning in C function " + c->name() + ": " + sass_warning_get_message(c_val));
1115
+ sass_delete_value(c_val);
1116
+ sass_delete_value(c_args);
1117
+ error(message, c->pstate(), traces);
1071
1118
  }
1072
- result = cval_to_astnode(c_val, traces, c->pstate());
1119
+ result = c2ast(c_val, traces, c->pstate());
1073
1120
 
1074
- ctx.callee_stack.pop_back();
1121
+ callee_stack().pop_back();
1075
1122
  traces.pop_back();
1076
1123
  sass_delete_value(c_args);
1077
1124
  if (c_val != c_args)
@@ -1080,35 +1127,25 @@ namespace Sass {
1080
1127
 
1081
1128
  // link back to function definition
1082
1129
  // only do this for custom functions
1083
- if (result->pstate().file == std::string::npos)
1130
+ if (result->pstate().getSrcId() == sass::string::npos)
1084
1131
  result->pstate(c->pstate());
1085
1132
 
1086
1133
  result = result->perform(this);
1087
1134
  result->is_interpolant(c->is_interpolant());
1088
- exp.env_stack.pop_back();
1135
+ env_stack().pop_back();
1089
1136
  return result.detach();
1090
1137
  }
1091
1138
 
1092
- Expression_Ptr Eval::operator()(Function_Call_Schema_Ptr s)
1093
- {
1094
- Expression_Ptr evaluated_name = s->name()->perform(this);
1095
- Expression_Ptr evaluated_args = s->arguments()->perform(this);
1096
- String_Schema_Obj ss = SASS_MEMORY_NEW(String_Schema, s->pstate(), 2);
1097
- ss->append(evaluated_name);
1098
- ss->append(evaluated_args);
1099
- return ss->perform(this);
1100
- }
1101
-
1102
- Expression_Ptr Eval::operator()(Variable_Ptr v)
1139
+ Expression* Eval::operator()(Variable* v)
1103
1140
  {
1104
- Expression_Obj value = 0;
1141
+ ExpressionObj value;
1105
1142
  Env* env = environment();
1106
- const std::string& name(v->name());
1143
+ const sass::string& name(v->name());
1107
1144
  EnvResult rv(env->find(name));
1108
1145
  if (rv.found) value = static_cast<Expression*>(rv.it->second.ptr());
1109
1146
  else error("Undefined variable: \"" + v->name() + "\".", v->pstate(), traces);
1110
- if (Argument_Ptr arg = Cast<Argument>(value)) value = arg->value();
1111
- if (Number_Ptr nr = Cast<Number>(value)) nr->zero(true); // force flag
1147
+ if (Argument* arg = Cast<Argument>(value)) value = arg->value();
1148
+ if (Number* nr = Cast<Number>(value)) nr->zero(true); // force flag
1112
1149
  value->is_interpolant(v->is_interpolant());
1113
1150
  if (force) value->is_expanded(false);
1114
1151
  value->set_delayed(false); // verified
@@ -1117,27 +1154,32 @@ namespace Sass {
1117
1154
  return value.detach();
1118
1155
  }
1119
1156
 
1120
- Expression_Ptr Eval::operator()(Color_Ptr c)
1157
+ Expression* Eval::operator()(Color_RGBA* c)
1121
1158
  {
1122
1159
  return c;
1123
1160
  }
1124
1161
 
1125
- Expression_Ptr Eval::operator()(Number_Ptr n)
1162
+ Expression* Eval::operator()(Color_HSLA* c)
1163
+ {
1164
+ return c;
1165
+ }
1166
+
1167
+ Expression* Eval::operator()(Number* n)
1126
1168
  {
1127
1169
  return n;
1128
1170
  }
1129
1171
 
1130
- Expression_Ptr Eval::operator()(Boolean_Ptr b)
1172
+ Expression* Eval::operator()(Boolean* b)
1131
1173
  {
1132
1174
  return b;
1133
1175
  }
1134
1176
 
1135
- void Eval::interpolation(Context& ctx, std::string& res, Expression_Obj ex, bool into_quotes, bool was_itpl) {
1177
+ void Eval::interpolation(Context& ctx, sass::string& res, ExpressionObj ex, bool into_quotes, bool was_itpl) {
1136
1178
 
1137
1179
  bool needs_closing_brace = false;
1138
1180
 
1139
- if (Arguments_Ptr args = Cast<Arguments>(ex)) {
1140
- List_Ptr ll = SASS_MEMORY_NEW(List, args->pstate(), 0, SASS_COMMA);
1181
+ if (Arguments* args = Cast<Arguments>(ex)) {
1182
+ List* ll = SASS_MEMORY_NEW(List, args->pstate(), 0, SASS_COMMA);
1141
1183
  for(auto arg : args->elements()) {
1142
1184
  ll->append(arg->value());
1143
1185
  }
@@ -1146,7 +1188,7 @@ namespace Sass {
1146
1188
  res += "(";
1147
1189
  ex = ll;
1148
1190
  }
1149
- if (Number_Ptr nr = Cast<Number>(ex)) {
1191
+ if (Number* nr = Cast<Number>(ex)) {
1150
1192
  Number reduced(nr);
1151
1193
  reduced.reduce();
1152
1194
  if (!reduced.is_valid_css_unit()) {
@@ -1154,10 +1196,10 @@ namespace Sass {
1154
1196
  throw Exception::InvalidValue(traces, *nr);
1155
1197
  }
1156
1198
  }
1157
- if (Argument_Ptr arg = Cast<Argument>(ex)) {
1199
+ if (Argument* arg = Cast<Argument>(ex)) {
1158
1200
  ex = arg->value();
1159
1201
  }
1160
- if (String_Quoted_Ptr sq = Cast<String_Quoted>(ex)) {
1202
+ if (String_Quoted* sq = Cast<String_Quoted>(ex)) {
1161
1203
  if (was_itpl) {
1162
1204
  bool was_interpolant = ex->is_interpolant();
1163
1205
  ex = SASS_MEMORY_NEW(String_Constant, sq->pstate(), sq->value());
@@ -1168,18 +1210,18 @@ namespace Sass {
1168
1210
  if (Cast<Null>(ex)) { return; }
1169
1211
 
1170
1212
  // parent selector needs another go
1171
- if (Cast<Parent_Selector>(ex)) {
1213
+ if (Cast<Parent_Reference>(ex)) {
1172
1214
  // XXX: this is never hit via spec tests
1173
1215
  ex = ex->perform(this);
1174
1216
  }
1175
1217
 
1176
- if (List_Ptr l = Cast<List>(ex)) {
1218
+ if (List* l = Cast<List>(ex)) {
1177
1219
  List_Obj ll = SASS_MEMORY_NEW(List, l->pstate(), 0, l->separator());
1178
1220
  // this fixes an issue with bourbon sample, not really sure why
1179
1221
  // if (l->size() && Cast<Null>((*l)[0])) { res += ""; }
1180
- for(Expression_Obj item : *l) {
1222
+ for(ExpressionObj item : *l) {
1181
1223
  item->is_interpolant(l->is_interpolant());
1182
- std::string rl(""); interpolation(ctx, rl, item, into_quotes, l->is_interpolant());
1224
+ sass::string rl(""); interpolation(ctx, rl, item, into_quotes, l->is_interpolant());
1183
1225
  bool is_null = Cast<Null>(item) != 0; // rl != ""
1184
1226
  if (!is_null) ll->append(SASS_MEMORY_NEW(String_Quoted, item->pstate(), rl));
1185
1227
  }
@@ -1187,12 +1229,12 @@ namespace Sass {
1187
1229
  // here. Normally single list items are already unwrapped.
1188
1230
  if (l->size() > 1) {
1189
1231
  // string_to_output would fail "#{'_\a' '_\a'}";
1190
- std::string str(ll->to_string(ctx.c_options));
1232
+ sass::string str(ll->to_string(options()));
1191
1233
  str = read_hex_escapes(str); // read escapes
1192
1234
  newline_to_space(str); // replace directly
1193
1235
  res += str; // append to result string
1194
1236
  } else {
1195
- res += (ll->to_string(ctx.c_options));
1237
+ res += (ll->to_string(options()));
1196
1238
  }
1197
1239
  ll->is_interpolant(l->is_interpolant());
1198
1240
  }
@@ -1202,14 +1244,13 @@ namespace Sass {
1202
1244
  // Selector_List
1203
1245
  // String_Quoted
1204
1246
  // String_Constant
1205
- // Parent_Selector
1206
1247
  // Binary_Expression
1207
1248
  else {
1208
1249
  // ex = ex->perform(this);
1209
1250
  if (into_quotes && ex->is_interpolant()) {
1210
- res += evacuate_escapes(ex ? ex->to_string(ctx.c_options) : "");
1251
+ res += evacuate_escapes(ex ? ex->to_string(options()) : "");
1211
1252
  } else {
1212
- std::string str(ex ? ex->to_string(ctx.c_options) : "");
1253
+ sass::string str(ex ? ex->to_string(options()) : "");
1213
1254
  if (into_quotes) str = read_hex_escapes(str);
1214
1255
  res += str; // append to result string
1215
1256
  }
@@ -1219,14 +1260,14 @@ namespace Sass {
1219
1260
 
1220
1261
  }
1221
1262
 
1222
- Expression_Ptr Eval::operator()(String_Schema_Ptr s)
1263
+ Expression* Eval::operator()(String_Schema* s)
1223
1264
  {
1224
1265
  size_t L = s->length();
1225
1266
  bool into_quotes = false;
1226
1267
  if (L > 1) {
1227
1268
  if (!Cast<String_Quoted>((*s)[0]) && !Cast<String_Quoted>((*s)[L - 1])) {
1228
- if (String_Constant_Ptr l = Cast<String_Constant>((*s)[0])) {
1229
- if (String_Constant_Ptr r = Cast<String_Constant>((*s)[L - 1])) {
1269
+ if (String_Constant* l = Cast<String_Constant>((*s)[0])) {
1270
+ if (String_Constant* r = Cast<String_Constant>((*s)[L - 1])) {
1230
1271
  if (r->value().size() > 0) {
1231
1272
  if (l->value()[0] == '"' && r->value()[r->value().size() - 1] == '"') into_quotes = true;
1232
1273
  if (l->value()[0] == '\'' && r->value()[r->value().size() - 1] == '\'') into_quotes = true;
@@ -1237,12 +1278,12 @@ namespace Sass {
1237
1278
  }
1238
1279
  bool was_quoted = false;
1239
1280
  bool was_interpolant = false;
1240
- std::string res("");
1281
+ sass::string res("");
1241
1282
  for (size_t i = 0; i < L; ++i) {
1242
1283
  bool is_quoted = Cast<String_Quoted>((*s)[i]) != NULL;
1243
1284
  if (was_quoted && !(*s)[i]->is_interpolant() && !was_interpolant) { res += " "; }
1244
1285
  else if (i > 0 && is_quoted && !(*s)[i]->is_interpolant() && !was_interpolant) { res += " "; }
1245
- Expression_Obj ex = (*s)[i]->perform(this);
1286
+ ExpressionObj ex = (*s)[i]->perform(this);
1246
1287
  interpolation(ctx, res, ex, into_quotes, ex->is_interpolant());
1247
1288
  was_quoted = Cast<String_Quoted>((*s)[i]) != NULL;
1248
1289
  was_interpolant = (*s)[i]->is_interpolant();
@@ -1250,12 +1291,13 @@ namespace Sass {
1250
1291
  }
1251
1292
  if (!s->is_interpolant()) {
1252
1293
  if (s->length() > 1 && res == "") return SASS_MEMORY_NEW(Null, s->pstate());
1253
- return SASS_MEMORY_NEW(String_Constant, s->pstate(), res, s->css());
1294
+ String_Constant_Obj str = SASS_MEMORY_NEW(String_Constant, s->pstate(), res, s->css());
1295
+ return str.detach();
1254
1296
  }
1255
1297
  // string schema seems to have a special unquoting behavior (also handles "nested" quotes)
1256
1298
  String_Quoted_Obj str = SASS_MEMORY_NEW(String_Quoted, s->pstate(), res, 0, false, false, false, s->css());
1257
1299
  // if (s->is_interpolant()) str->quote_mark(0);
1258
- // String_Constant_Ptr str = SASS_MEMORY_NEW(String_Constant, s->pstate(), res);
1300
+ // String_Constant* str = SASS_MEMORY_NEW(String_Constant, s->pstate(), res);
1259
1301
  if (str->quote_mark()) str->quote_mark('*');
1260
1302
  else if (!is_in_comment) str->value(string_to_output(str->value()));
1261
1303
  str->is_interpolant(s->is_interpolant());
@@ -1263,85 +1305,78 @@ namespace Sass {
1263
1305
  }
1264
1306
 
1265
1307
 
1266
- Expression_Ptr Eval::operator()(String_Constant_Ptr s)
1308
+ Expression* Eval::operator()(String_Constant* s)
1267
1309
  {
1268
- if (!s->is_delayed() && name_to_color(s->value())) {
1269
- Color_Ptr c = SASS_MEMORY_COPY(name_to_color(s->value())); // copy
1270
- c->pstate(s->pstate());
1271
- c->disp(s->value());
1272
- c->is_delayed(true);
1273
- return c;
1274
- }
1275
1310
  return s;
1276
1311
  }
1277
1312
 
1278
- Expression_Ptr Eval::operator()(String_Quoted_Ptr s)
1313
+ Expression* Eval::operator()(String_Quoted* s)
1279
1314
  {
1280
- String_Quoted_Ptr str = SASS_MEMORY_NEW(String_Quoted, s->pstate(), "");
1315
+ String_Quoted* str = SASS_MEMORY_NEW(String_Quoted, s->pstate(), "");
1281
1316
  str->value(s->value());
1282
1317
  str->quote_mark(s->quote_mark());
1283
1318
  str->is_interpolant(s->is_interpolant());
1284
1319
  return str;
1285
1320
  }
1286
1321
 
1287
- Expression_Ptr Eval::operator()(Supports_Operator_Ptr c)
1322
+ Expression* Eval::operator()(SupportsOperation* c)
1288
1323
  {
1289
- Expression_Ptr left = c->left()->perform(this);
1290
- Expression_Ptr right = c->right()->perform(this);
1291
- Supports_Operator_Ptr cc = SASS_MEMORY_NEW(Supports_Operator,
1324
+ Expression* left = c->left()->perform(this);
1325
+ Expression* right = c->right()->perform(this);
1326
+ SupportsOperation* cc = SASS_MEMORY_NEW(SupportsOperation,
1292
1327
  c->pstate(),
1293
- Cast<Supports_Condition>(left),
1294
- Cast<Supports_Condition>(right),
1328
+ Cast<SupportsCondition>(left),
1329
+ Cast<SupportsCondition>(right),
1295
1330
  c->operand());
1296
1331
  return cc;
1297
1332
  }
1298
1333
 
1299
- Expression_Ptr Eval::operator()(Supports_Negation_Ptr c)
1334
+ Expression* Eval::operator()(SupportsNegation* c)
1300
1335
  {
1301
- Expression_Ptr condition = c->condition()->perform(this);
1302
- Supports_Negation_Ptr cc = SASS_MEMORY_NEW(Supports_Negation,
1336
+ Expression* condition = c->condition()->perform(this);
1337
+ SupportsNegation* cc = SASS_MEMORY_NEW(SupportsNegation,
1303
1338
  c->pstate(),
1304
- Cast<Supports_Condition>(condition));
1339
+ Cast<SupportsCondition>(condition));
1305
1340
  return cc;
1306
1341
  }
1307
1342
 
1308
- Expression_Ptr Eval::operator()(Supports_Declaration_Ptr c)
1343
+ Expression* Eval::operator()(SupportsDeclaration* c)
1309
1344
  {
1310
- Expression_Ptr feature = c->feature()->perform(this);
1311
- Expression_Ptr value = c->value()->perform(this);
1312
- Supports_Declaration_Ptr cc = SASS_MEMORY_NEW(Supports_Declaration,
1345
+ Expression* feature = c->feature()->perform(this);
1346
+ Expression* value = c->value()->perform(this);
1347
+ SupportsDeclaration* cc = SASS_MEMORY_NEW(SupportsDeclaration,
1313
1348
  c->pstate(),
1314
1349
  feature,
1315
1350
  value);
1316
1351
  return cc;
1317
1352
  }
1318
1353
 
1319
- Expression_Ptr Eval::operator()(Supports_Interpolation_Ptr c)
1354
+ Expression* Eval::operator()(Supports_Interpolation* c)
1320
1355
  {
1321
- Expression_Ptr value = c->value()->perform(this);
1322
- Supports_Interpolation_Ptr cc = SASS_MEMORY_NEW(Supports_Interpolation,
1356
+ Expression* value = c->value()->perform(this);
1357
+ Supports_Interpolation* cc = SASS_MEMORY_NEW(Supports_Interpolation,
1323
1358
  c->pstate(),
1324
1359
  value);
1325
1360
  return cc;
1326
1361
  }
1327
1362
 
1328
- Expression_Ptr Eval::operator()(At_Root_Query_Ptr e)
1363
+ Expression* Eval::operator()(At_Root_Query* e)
1329
1364
  {
1330
- Expression_Obj feature = e->feature();
1365
+ ExpressionObj feature = e->feature();
1331
1366
  feature = (feature ? feature->perform(this) : 0);
1332
- Expression_Obj value = e->value();
1367
+ ExpressionObj value = e->value();
1333
1368
  value = (value ? value->perform(this) : 0);
1334
- Expression_Ptr ee = SASS_MEMORY_NEW(At_Root_Query,
1369
+ Expression* ee = SASS_MEMORY_NEW(At_Root_Query,
1335
1370
  e->pstate(),
1336
1371
  Cast<String>(feature),
1337
1372
  value);
1338
1373
  return ee;
1339
1374
  }
1340
1375
 
1341
- Media_Query_Ptr Eval::operator()(Media_Query_Ptr q)
1376
+ Media_Query* Eval::operator()(Media_Query* q)
1342
1377
  {
1343
1378
  String_Obj t = q->media_type();
1344
- t = static_cast<String_Ptr>(t.isNull() ? 0 : t->perform(this));
1379
+ t = static_cast<String*>(t.isNull() ? 0 : t->perform(this));
1345
1380
  Media_Query_Obj qq = SASS_MEMORY_NEW(Media_Query,
1346
1381
  q->pstate(),
1347
1382
  t,
@@ -1349,21 +1384,21 @@ namespace Sass {
1349
1384
  q->is_negated(),
1350
1385
  q->is_restricted());
1351
1386
  for (size_t i = 0, L = q->length(); i < L; ++i) {
1352
- qq->append(static_cast<Media_Query_Expression_Ptr>((*q)[i]->perform(this)));
1387
+ qq->append(static_cast<Media_Query_Expression*>((*q)[i]->perform(this)));
1353
1388
  }
1354
1389
  return qq.detach();
1355
1390
  }
1356
1391
 
1357
- Expression_Ptr Eval::operator()(Media_Query_Expression_Ptr e)
1392
+ Expression* Eval::operator()(Media_Query_Expression* e)
1358
1393
  {
1359
- Expression_Obj feature = e->feature();
1394
+ ExpressionObj feature = e->feature();
1360
1395
  feature = (feature ? feature->perform(this) : 0);
1361
1396
  if (feature && Cast<String_Quoted>(feature)) {
1362
1397
  feature = SASS_MEMORY_NEW(String_Quoted,
1363
1398
  feature->pstate(),
1364
1399
  Cast<String_Quoted>(feature)->value());
1365
1400
  }
1366
- Expression_Obj value = e->value();
1401
+ ExpressionObj value = e->value();
1367
1402
  value = (value ? value->perform(this) : 0);
1368
1403
  if (value && Cast<String_Quoted>(value)) {
1369
1404
  // XXX: this is never hit via spec tests
@@ -1378,14 +1413,14 @@ namespace Sass {
1378
1413
  e->is_interpolated());
1379
1414
  }
1380
1415
 
1381
- Expression_Ptr Eval::operator()(Null_Ptr n)
1416
+ Expression* Eval::operator()(Null* n)
1382
1417
  {
1383
1418
  return n;
1384
1419
  }
1385
1420
 
1386
- Expression_Ptr Eval::operator()(Argument_Ptr a)
1421
+ Expression* Eval::operator()(Argument* a)
1387
1422
  {
1388
- Expression_Obj val = a->value()->perform(this);
1423
+ ExpressionObj val = a->value()->perform(this);
1389
1424
  bool is_rest_argument = a->is_rest_argument();
1390
1425
  bool is_keyword_argument = a->is_keyword_argument();
1391
1426
 
@@ -1412,25 +1447,25 @@ namespace Sass {
1412
1447
  is_keyword_argument);
1413
1448
  }
1414
1449
 
1415
- Expression_Ptr Eval::operator()(Arguments_Ptr a)
1450
+ Expression* Eval::operator()(Arguments* a)
1416
1451
  {
1417
1452
  Arguments_Obj aa = SASS_MEMORY_NEW(Arguments, a->pstate());
1418
1453
  if (a->length() == 0) return aa.detach();
1419
1454
  for (size_t i = 0, L = a->length(); i < L; ++i) {
1420
- Expression_Obj rv = (*a)[i]->perform(this);
1421
- Argument_Ptr arg = Cast<Argument>(rv);
1455
+ ExpressionObj rv = (*a)[i]->perform(this);
1456
+ Argument* arg = Cast<Argument>(rv);
1422
1457
  if (!(arg->is_rest_argument() || arg->is_keyword_argument())) {
1423
1458
  aa->append(arg);
1424
1459
  }
1425
1460
  }
1426
1461
 
1427
1462
  if (a->has_rest_argument()) {
1428
- Expression_Obj rest = a->get_rest_argument()->perform(this);
1429
- Expression_Obj splat = Cast<Argument>(rest)->value()->perform(this);
1463
+ ExpressionObj rest = a->get_rest_argument()->perform(this);
1464
+ ExpressionObj splat = Cast<Argument>(rest)->value()->perform(this);
1430
1465
 
1431
1466
  Sass_Separator separator = SASS_COMMA;
1432
- List_Ptr ls = Cast<List>(splat);
1433
- Map_Ptr ms = Cast<Map>(splat);
1467
+ List* ls = Cast<List>(splat);
1468
+ Map* ms = Cast<Map>(splat);
1434
1469
 
1435
1470
  List_Obj arglist = SASS_MEMORY_NEW(List,
1436
1471
  splat->pstate(),
@@ -1453,226 +1488,56 @@ namespace Sass {
1453
1488
  }
1454
1489
 
1455
1490
  if (a->has_keyword_argument()) {
1456
- Expression_Obj rv = a->get_keyword_argument()->perform(this);
1457
- Argument_Ptr rvarg = Cast<Argument>(rv);
1458
- Expression_Obj kwarg = rvarg->value()->perform(this);
1491
+ ExpressionObj rv = a->get_keyword_argument()->perform(this);
1492
+ Argument* rvarg = Cast<Argument>(rv);
1493
+ ExpressionObj kwarg = rvarg->value()->perform(this);
1459
1494
 
1460
1495
  aa->append(SASS_MEMORY_NEW(Argument, kwarg->pstate(), kwarg, "", false, true));
1461
1496
  }
1462
1497
  return aa.detach();
1463
1498
  }
1464
1499
 
1465
- Expression_Ptr Eval::operator()(Comment_Ptr c)
1500
+ Expression* Eval::operator()(Comment* c)
1466
1501
  {
1467
1502
  return 0;
1468
1503
  }
1469
1504
 
1470
- inline Expression_Ptr Eval::fallback_impl(AST_Node_Ptr n)
1471
- {
1472
- return static_cast<Expression_Ptr>(n);
1473
- }
1474
-
1475
- // All the binary helpers.
1476
-
1477
- Expression_Ptr cval_to_astnode(union Sass_Value* v, Backtraces traces, ParserState pstate)
1478
- {
1479
- using std::strlen;
1480
- using std::strcpy;
1481
- Expression_Ptr e = NULL;
1482
- switch (sass_value_get_tag(v)) {
1483
- case SASS_BOOLEAN: {
1484
- e = SASS_MEMORY_NEW(Boolean, pstate, !!sass_boolean_get_value(v));
1485
- } break;
1486
- case SASS_NUMBER: {
1487
- e = SASS_MEMORY_NEW(Number, pstate, sass_number_get_value(v), sass_number_get_unit(v));
1488
- } break;
1489
- case SASS_COLOR: {
1490
- e = SASS_MEMORY_NEW(Color, pstate, sass_color_get_r(v), sass_color_get_g(v), sass_color_get_b(v), sass_color_get_a(v));
1491
- } break;
1492
- case SASS_STRING: {
1493
- if (sass_string_is_quoted(v))
1494
- e = SASS_MEMORY_NEW(String_Quoted, pstate, sass_string_get_value(v));
1495
- else {
1496
- e = SASS_MEMORY_NEW(String_Constant, pstate, sass_string_get_value(v));
1497
- }
1498
- } break;
1499
- case SASS_LIST: {
1500
- List_Ptr l = SASS_MEMORY_NEW(List, pstate, sass_list_get_length(v), sass_list_get_separator(v));
1501
- for (size_t i = 0, L = sass_list_get_length(v); i < L; ++i) {
1502
- l->append(cval_to_astnode(sass_list_get_value(v, i), traces, pstate));
1503
- }
1504
- l->is_bracketed(sass_list_get_is_bracketed(v));
1505
- e = l;
1506
- } break;
1507
- case SASS_MAP: {
1508
- Map_Ptr m = SASS_MEMORY_NEW(Map, pstate);
1509
- for (size_t i = 0, L = sass_map_get_length(v); i < L; ++i) {
1510
- *m << std::make_pair(
1511
- cval_to_astnode(sass_map_get_key(v, i), traces, pstate),
1512
- cval_to_astnode(sass_map_get_value(v, i), traces, pstate));
1513
- }
1514
- e = m;
1515
- } break;
1516
- case SASS_NULL: {
1517
- e = SASS_MEMORY_NEW(Null, pstate);
1518
- } break;
1519
- case SASS_ERROR: {
1520
- error("Error in C function: " + std::string(sass_error_get_message(v)), pstate, traces);
1521
- } break;
1522
- case SASS_WARNING: {
1523
- error("Warning in C function: " + std::string(sass_warning_get_message(v)), pstate, traces);
1524
- } break;
1525
- default: break;
1526
- }
1527
- return e;
1528
- }
1529
-
1530
- Selector_List_Ptr Eval::operator()(Selector_List_Ptr s)
1531
- {
1532
- std::vector<Selector_List_Obj> rv;
1533
- Selector_List_Obj sl = SASS_MEMORY_NEW(Selector_List, s->pstate());
1534
- sl->is_optional(s->is_optional());
1535
- sl->media_block(s->media_block());
1536
- sl->is_optional(s->is_optional());
1537
- for (size_t i = 0, iL = s->length(); i < iL; ++i) {
1538
- rv.push_back(operator()((*s)[i]));
1539
- }
1540
-
1541
- // we should actually permutate parent first
1542
- // but here we have permutated the selector first
1543
- size_t round = 0;
1544
- while (round != std::string::npos) {
1545
- bool abort = true;
1546
- for (size_t i = 0, iL = rv.size(); i < iL; ++i) {
1547
- if (rv[i]->length() > round) {
1548
- sl->append((*rv[i])[round]);
1549
- abort = false;
1550
- }
1551
- }
1552
- if (abort) {
1553
- round = std::string::npos;
1554
- } else {
1555
- ++ round;
1556
- }
1557
-
1558
- }
1559
- return sl.detach();
1560
- }
1561
-
1562
-
1563
- Selector_List_Ptr Eval::operator()(Complex_Selector_Ptr s)
1564
- {
1565
- bool implicit_parent = !exp.old_at_root_without_rule;
1566
- if (is_in_selector_schema) exp.selector_stack.push_back(0);
1567
- Selector_List_Obj resolved = s->resolve_parent_refs(exp.selector_stack, traces, implicit_parent);
1568
- if (is_in_selector_schema) exp.selector_stack.pop_back();
1569
- for (size_t i = 0; i < resolved->length(); i++) {
1570
- Complex_Selector_Ptr is = resolved->at(i)->first();
1571
- while (is) {
1572
- if (is->head()) {
1573
- is->head(operator()(is->head()));
1574
- }
1575
- is = is->tail();
1576
- }
1577
- }
1578
- return resolved.detach();
1579
- }
1580
-
1581
- Compound_Selector_Ptr Eval::operator()(Compound_Selector_Ptr s)
1582
- {
1583
- for (size_t i = 0; i < s->length(); i++) {
1584
- Simple_Selector_Ptr ss = s->at(i);
1585
- // skip parents here (called via resolve_parent_refs)
1586
- if (ss == NULL || Cast<Parent_Selector>(ss)) continue;
1587
- s->at(i) = Cast<Simple_Selector>(ss->perform(this));
1588
- }
1589
- return s;
1590
- }
1591
-
1592
- Selector_List_Ptr Eval::operator()(Selector_Schema_Ptr s)
1505
+ SelectorList* Eval::operator()(Selector_Schema* s)
1593
1506
  {
1594
1507
  LOCAL_FLAG(is_in_selector_schema, true);
1595
1508
  // the parser will look for a brace to end the selector
1596
- ctx.c_options.in_selector = true; // do not compress colors
1597
- Expression_Obj sel = s->contents()->perform(this);
1598
- std::string result_str(sel->to_string(ctx.c_options));
1599
- ctx.c_options.in_selector = false; // flag temporary only
1509
+ ExpressionObj sel = s->contents()->perform(this);
1510
+ sass::string result_str(sel->to_string(options()));
1600
1511
  result_str = unquote(Util::rtrim(result_str));
1601
- char* temp_cstr = sass_copy_c_string(result_str.c_str());
1602
- ctx.strings.push_back(temp_cstr); // attach to context
1603
- Parser p = Parser::from_c_str(temp_cstr, ctx, traces, s->pstate());
1604
- p.last_media_block = s->media_block();
1605
- // a selector schema may or may not connect to parent?
1606
- bool chroot = s->connect_parent() == false;
1607
- Selector_List_Obj sl = p.parse_selector_list(chroot);
1608
- auto vec_str_rend = ctx.strings.rend();
1609
- auto vec_str_rbegin = ctx.strings.rbegin();
1610
- // remove the first item searching from the back
1611
- // we cannot assume our item is still the last one
1612
- // order is not important, so we can optimize this
1613
- auto it = std::find(vec_str_rbegin, vec_str_rend, temp_cstr);
1614
- // undefined behavior if not found!
1615
- if (it != vec_str_rend) {
1616
- // overwrite with last item
1617
- *it = ctx.strings.back();
1618
- // remove last one from vector
1619
- ctx.strings.pop_back();
1620
- // free temporary copy
1621
- free(temp_cstr);
1622
- }
1512
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile,
1513
+ result_str.c_str(), s->pstate());
1514
+ Parser p(source, ctx, traces);
1515
+
1516
+ // If a schema contains a reference to parent it is already
1517
+ // connected to it, so don't connect implicitly anymore
1518
+ SelectorListObj parsed = p.parseSelectorList(true);
1623
1519
  flag_is_in_selector_schema.reset();
1624
- return operator()(sl);
1520
+ return parsed.detach();
1625
1521
  }
1626
1522
 
1627
- Expression_Ptr Eval::operator()(Parent_Selector_Ptr p)
1523
+ Expression* Eval::operator()(Parent_Reference* p)
1628
1524
  {
1629
- if (Selector_List_Obj pr = selector()) {
1630
- exp.selector_stack.pop_back();
1631
- Selector_List_Obj rv = operator()(pr);
1632
- exp.selector_stack.push_back(rv);
1633
- return rv.detach();
1525
+ if (SelectorListObj pr = exp.original()) {
1526
+ return operator()(pr);
1634
1527
  } else {
1635
1528
  return SASS_MEMORY_NEW(Null, p->pstate());
1636
1529
  }
1637
1530
  }
1638
1531
 
1639
- Simple_Selector_Ptr Eval::operator()(Simple_Selector_Ptr s)
1532
+ SimpleSelector* Eval::operator()(SimpleSelector* s)
1640
1533
  {
1641
1534
  return s;
1642
1535
  }
1643
1536
 
1644
- // hotfix to avoid invalid nested `:not` selectors
1645
- // probably the wrong place, but this should ultimately
1646
- // be fixed by implement superselector correctly for `:not`
1647
- // first use of "find" (ATM only implemented for selectors)
1648
- bool hasNotSelector(AST_Node_Obj obj) {
1649
- if (Wrapped_Selector_Ptr w = Cast<Wrapped_Selector>(obj)) {
1650
- return w->name() == ":not";
1651
- }
1652
- return false;
1653
- }
1654
-
1655
- Wrapped_Selector_Ptr Eval::operator()(Wrapped_Selector_Ptr s)
1537
+ PseudoSelector* Eval::operator()(PseudoSelector* pseudo)
1656
1538
  {
1657
-
1658
- if (s->name() == ":not") {
1659
- if (exp.selector_stack.back()) {
1660
- if (s->selector()->find(hasNotSelector)) {
1661
- s->selector()->clear();
1662
- s->name(" ");
1663
- } else if (s->selector()->length() == 1) {
1664
- Complex_Selector_Ptr cs = s->selector()->at(0);
1665
- if (cs->tail()) {
1666
- s->selector()->clear();
1667
- s->name(" ");
1668
- }
1669
- } else if (s->selector()->length() > 1) {
1670
- s->selector()->clear();
1671
- s->name(" ");
1672
- }
1673
- }
1674
- }
1675
- return s;
1539
+ // ToDo: should we eval selector?
1540
+ return pseudo;
1676
1541
  };
1677
1542
 
1678
1543
  }