sassc 1.11.4 → 1.12.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 (137) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +2 -2
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/README.md +4 -1
  5. data/ext/libsass/.editorconfig +1 -1
  6. data/ext/libsass/.github/CONTRIBUTING.md +7 -7
  7. data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
  8. data/ext/libsass/.gitignore +3 -0
  9. data/ext/libsass/.travis.yml +37 -18
  10. data/ext/libsass/GNUmakefile.am +23 -37
  11. data/ext/libsass/Makefile +10 -6
  12. data/ext/libsass/Makefile.conf +3 -0
  13. data/ext/libsass/Readme.md +68 -63
  14. data/ext/libsass/appveyor.yml +7 -3
  15. data/ext/libsass/configure.ac +10 -14
  16. data/ext/libsass/docs/api-context-internal.md +29 -21
  17. data/ext/libsass/docs/api-context.md +26 -6
  18. data/ext/libsass/docs/api-doc.md +49 -16
  19. data/ext/libsass/docs/api-function-example.md +1 -1
  20. data/ext/libsass/docs/api-function.md +31 -7
  21. data/ext/libsass/docs/api-importer.md +19 -19
  22. data/ext/libsass/docs/api-value.md +4 -2
  23. data/ext/libsass/docs/build-on-windows.md +4 -4
  24. data/ext/libsass/docs/build-with-mingw.md +3 -3
  25. data/ext/libsass/docs/build.md +9 -9
  26. data/ext/libsass/docs/custom-functions-internal.md +10 -8
  27. data/ext/libsass/docs/implementations.md +20 -8
  28. data/ext/libsass/docs/unicode.md +16 -10
  29. data/ext/libsass/include/sass/base.h +0 -3
  30. data/ext/libsass/include/sass/context.h +20 -2
  31. data/ext/libsass/include/sass/functions.h +31 -0
  32. data/ext/libsass/include/sass/values.h +3 -1
  33. data/ext/libsass/include/sass/version.h +1 -1
  34. data/ext/libsass/include/sass/version.h.in +1 -1
  35. data/ext/libsass/include/sass2scss.h +1 -1
  36. data/ext/libsass/res/resource.rc +6 -6
  37. data/ext/libsass/script/ci-build-libsass +10 -5
  38. data/ext/libsass/script/ci-build-plugin +62 -0
  39. data/ext/libsass/script/ci-install-compiler +1 -1
  40. data/ext/libsass/script/ci-install-deps +4 -7
  41. data/ext/libsass/script/ci-report-coverage +13 -3
  42. data/ext/libsass/script/tap-driver +1 -1
  43. data/ext/libsass/script/tap-runner +1 -1
  44. data/ext/libsass/src/GNUmakefile.am +1 -1
  45. data/ext/libsass/src/ast.cpp +537 -762
  46. data/ext/libsass/src/ast.hpp +377 -419
  47. data/ext/libsass/src/ast_def_macros.hpp +26 -1
  48. data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
  49. data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
  50. data/ext/libsass/src/b64/encode.h +3 -1
  51. data/ext/libsass/src/backtrace.cpp +46 -0
  52. data/ext/libsass/src/backtrace.hpp +7 -54
  53. data/ext/libsass/src/bind.cpp +72 -50
  54. data/ext/libsass/src/bind.hpp +0 -1
  55. data/ext/libsass/src/cencode.c +6 -0
  56. data/ext/libsass/src/check_nesting.cpp +157 -135
  57. data/ext/libsass/src/check_nesting.hpp +11 -10
  58. data/ext/libsass/src/color_maps.cpp +10 -6
  59. data/ext/libsass/src/color_maps.hpp +6 -8
  60. data/ext/libsass/src/constants.cpp +4 -3
  61. data/ext/libsass/src/constants.hpp +4 -3
  62. data/ext/libsass/src/context.cpp +110 -47
  63. data/ext/libsass/src/context.hpp +11 -1
  64. data/ext/libsass/src/cssize.cpp +105 -94
  65. data/ext/libsass/src/cssize.hpp +4 -5
  66. data/ext/libsass/src/debugger.hpp +247 -244
  67. data/ext/libsass/src/emitter.cpp +30 -6
  68. data/ext/libsass/src/emitter.hpp +7 -0
  69. data/ext/libsass/src/environment.cpp +67 -16
  70. data/ext/libsass/src/environment.hpp +28 -7
  71. data/ext/libsass/src/error_handling.cpp +92 -64
  72. data/ext/libsass/src/error_handling.hpp +64 -43
  73. data/ext/libsass/src/eval.cpp +494 -544
  74. data/ext/libsass/src/eval.hpp +17 -23
  75. data/ext/libsass/src/expand.cpp +182 -154
  76. data/ext/libsass/src/expand.hpp +4 -5
  77. data/ext/libsass/src/extend.cpp +299 -291
  78. data/ext/libsass/src/extend.hpp +46 -11
  79. data/ext/libsass/src/file.cpp +103 -36
  80. data/ext/libsass/src/file.hpp +21 -4
  81. data/ext/libsass/src/functions.cpp +561 -312
  82. data/ext/libsass/src/functions.hpp +8 -5
  83. data/ext/libsass/src/inspect.cpp +108 -53
  84. data/ext/libsass/src/inspect.hpp +5 -2
  85. data/ext/libsass/src/lexer.cpp +15 -7
  86. data/ext/libsass/src/lexer.hpp +13 -4
  87. data/ext/libsass/src/listize.cpp +3 -2
  88. data/ext/libsass/src/listize.hpp +0 -1
  89. data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
  90. data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
  91. data/ext/libsass/src/node.cpp +34 -38
  92. data/ext/libsass/src/node.hpp +6 -8
  93. data/ext/libsass/src/operation.hpp +2 -2
  94. data/ext/libsass/src/operators.cpp +240 -0
  95. data/ext/libsass/src/operators.hpp +30 -0
  96. data/ext/libsass/src/output.cpp +22 -20
  97. data/ext/libsass/src/parser.cpp +719 -358
  98. data/ext/libsass/src/parser.hpp +57 -22
  99. data/ext/libsass/src/plugins.cpp +28 -10
  100. data/ext/libsass/src/position.cpp +21 -3
  101. data/ext/libsass/src/position.hpp +2 -1
  102. data/ext/libsass/src/prelexer.cpp +104 -19
  103. data/ext/libsass/src/prelexer.hpp +10 -3
  104. data/ext/libsass/src/remove_placeholders.cpp +9 -10
  105. data/ext/libsass/src/remove_placeholders.hpp +1 -5
  106. data/ext/libsass/src/sass.cpp +62 -4
  107. data/ext/libsass/src/sass.hpp +5 -2
  108. data/ext/libsass/src/sass_context.cpp +96 -58
  109. data/ext/libsass/src/sass_context.hpp +7 -5
  110. data/ext/libsass/src/sass_functions.cpp +63 -1
  111. data/ext/libsass/src/sass_functions.hpp +19 -1
  112. data/ext/libsass/src/sass_util.cpp +3 -3
  113. data/ext/libsass/src/sass_util.hpp +4 -4
  114. data/ext/libsass/src/sass_values.cpp +42 -39
  115. data/ext/libsass/src/sass_values.hpp +2 -1
  116. data/ext/libsass/src/source_map.cpp +16 -18
  117. data/ext/libsass/src/subset_map.cpp +6 -8
  118. data/ext/libsass/src/subset_map.hpp +6 -6
  119. data/ext/libsass/src/to_c.cpp +2 -2
  120. data/ext/libsass/src/to_value.cpp +8 -3
  121. data/ext/libsass/src/to_value.hpp +1 -0
  122. data/ext/libsass/src/units.cpp +349 -45
  123. data/ext/libsass/src/units.hpp +39 -22
  124. data/ext/libsass/src/utf8/checked.h +7 -0
  125. data/ext/libsass/src/utf8/unchecked.h +7 -0
  126. data/ext/libsass/src/utf8_string.cpp +1 -1
  127. data/ext/libsass/src/util.cpp +139 -45
  128. data/ext/libsass/src/util.hpp +4 -7
  129. data/ext/libsass/src/values.cpp +15 -23
  130. data/ext/libsass/win/libsass.sln +13 -2
  131. data/ext/libsass/win/libsass.sln.DotSettings +9 -0
  132. data/ext/libsass/win/libsass.targets +3 -0
  133. data/ext/libsass/win/libsass.vcxproj.filters +9 -0
  134. data/lib/sassc/version.rb +1 -1
  135. data/sassc.gemspec +1 -1
  136. data/test/native_test.rb +1 -1
  137. metadata +11 -4
@@ -1,9 +1,8 @@
1
1
  #ifndef SASS_SASS_CONTEXT_H
2
2
  #define SASS_SASS_CONTEXT_H
3
3
 
4
- #include "sass.h"
5
- #include "sass.hpp"
6
- #include "context.hpp"
4
+ #include "sass/base.h"
5
+ #include "sass/context.h"
7
6
  #include "ast_fwd_decl.hpp"
8
7
 
9
8
  // sass config options structure
@@ -33,7 +32,7 @@ struct Sass_Options : Sass_Output_Options {
33
32
  char* input_path;
34
33
 
35
34
  // The output path is used for source map
36
- // generation. Libsass will not write to
35
+ // generation. LibSass will not write to
37
36
  // this file, it is just used to create
38
37
  // information in source-maps etc.
39
38
  char* output_path;
@@ -41,9 +40,12 @@ struct Sass_Options : Sass_Output_Options {
41
40
  // Colon-separated list of paths
42
41
  // Semicolon-separated on Windows
43
42
  // Maybe use array interface instead?
43
+ char* extension;
44
44
  char* include_path;
45
45
  char* plugin_path;
46
46
 
47
+ // Extensions (linked string list)
48
+ struct string_list* extensions;
47
49
  // Include paths (linked string list)
48
50
  struct string_list* include_paths;
49
51
  // Plugin paths (linked string list)
@@ -127,4 +129,4 @@ struct Sass_Compiler {
127
129
  Sass::Block_Obj root;
128
130
  };
129
131
 
130
- #endif
132
+ #endif
@@ -2,6 +2,7 @@
2
2
  #include <cstring>
3
3
  #include "util.hpp"
4
4
  #include "context.hpp"
5
+ #include "values.hpp"
5
6
  #include "sass/functions.h"
6
7
  #include "sass_functions.hpp"
7
8
 
@@ -17,12 +18,30 @@ extern "C" {
17
18
  {
18
19
  Sass_Function_Entry cb = (Sass_Function_Entry) calloc(1, sizeof(Sass_Function));
19
20
  if (cb == 0) return 0;
20
- cb->signature = signature;
21
+ cb->signature = sass_copy_c_string(signature);
21
22
  cb->function = function;
22
23
  cb->cookie = cookie;
23
24
  return cb;
24
25
  }
25
26
 
27
+ void ADDCALL sass_delete_function(Sass_Function_Entry entry)
28
+ {
29
+ free(entry->signature);
30
+ free(entry);
31
+ }
32
+
33
+ // Deallocator for the allocated memory
34
+ void ADDCALL sass_delete_function_list(Sass_Function_List list)
35
+ {
36
+ Sass_Function_List it = list;
37
+ if (list == 0) return;
38
+ while(*list) {
39
+ sass_delete_function(*list);
40
+ ++list;
41
+ }
42
+ free(it);
43
+ }
44
+
26
45
  // Setters and getters for callbacks on function lists
27
46
  Sass_Function_Entry ADDCALL sass_function_get_list_entry(Sass_Function_List list, size_t pos) { return list[pos]; }
28
47
  void sass_function_set_list_entry(Sass_Function_List list, size_t pos, Sass_Function_Entry cb) { list[pos] = cb; }
@@ -57,6 +76,18 @@ extern "C" {
57
76
  return (Sass_Importer_List) calloc(length + 1, sizeof(Sass_Importer_Entry));
58
77
  }
59
78
 
79
+ // Deallocator for the allocated memory
80
+ void ADDCALL sass_delete_importer_list(Sass_Importer_List list)
81
+ {
82
+ Sass_Importer_List it = list;
83
+ if (list == 0) return;
84
+ while(*list) {
85
+ sass_delete_importer(*list);
86
+ ++list;
87
+ }
88
+ free(it);
89
+ }
90
+
60
91
  Sass_Importer_Entry ADDCALL sass_importer_get_list_entry(Sass_Importer_List list, size_t idx) { return list[idx]; }
61
92
  void ADDCALL sass_importer_set_list_entry(Sass_Importer_List list, size_t idx, Sass_Importer_Entry cb) { list[idx] = cb; }
62
93
 
@@ -126,6 +157,37 @@ extern "C" {
126
157
  free(import);
127
158
  }
128
159
 
160
+ // Getter for callee entry
161
+ const char* ADDCALL sass_callee_get_name(Sass_Callee_Entry entry) { return entry->name; }
162
+ const char* ADDCALL sass_callee_get_path(Sass_Callee_Entry entry) { return entry->path; }
163
+ size_t ADDCALL sass_callee_get_line(Sass_Callee_Entry entry) { return entry->line; }
164
+ size_t ADDCALL sass_callee_get_column(Sass_Callee_Entry entry) { return entry->column; }
165
+ enum Sass_Callee_Type ADDCALL sass_callee_get_type(Sass_Callee_Entry entry) { return entry->type; }
166
+ Sass_Env_Frame ADDCALL sass_callee_get_env (Sass_Callee_Entry entry) { return &entry->env; }
167
+
168
+ // Getters and Setters for environments (lexical, local and global)
169
+ union Sass_Value* ADDCALL sass_env_get_lexical (Sass_Env_Frame env, const char* name) {
170
+ Expression_Ptr ex = Cast<Expression>((*env->frame)[name]);
171
+ return ex != NULL ? ast_node_to_sass_value(ex) : NULL;
172
+ }
173
+ void ADDCALL sass_env_set_lexical (Sass_Env_Frame env, const char* name, union Sass_Value* val) {
174
+ (*env->frame)[name] = sass_value_to_ast_node(val);
175
+ }
176
+ union Sass_Value* ADDCALL sass_env_get_local (Sass_Env_Frame env, const char* name) {
177
+ Expression_Ptr ex = Cast<Expression>(env->frame->get_local(name));
178
+ return ex != NULL ? ast_node_to_sass_value(ex) : NULL;
179
+ }
180
+ void ADDCALL sass_env_set_local (Sass_Env_Frame env, const char* name, union Sass_Value* val) {
181
+ env->frame->set_local(name, sass_value_to_ast_node(val));
182
+ }
183
+ union Sass_Value* ADDCALL sass_env_get_global (Sass_Env_Frame env, const char* name) {
184
+ Expression_Ptr ex = Cast<Expression>(env->frame->get_global(name));
185
+ return ex != NULL ? ast_node_to_sass_value(ex) : NULL;
186
+ }
187
+ void ADDCALL sass_env_set_global (Sass_Env_Frame env, const char* name, union Sass_Value* val) {
188
+ env->frame->set_global(name, sass_value_to_ast_node(val));
189
+ }
190
+
129
191
  // Getter for import entry
130
192
  const char* ADDCALL sass_import_get_imp_path(Sass_Import_Entry entry) { return entry->imp_path; }
131
193
  const char* ADDCALL sass_import_get_abs_path(Sass_Import_Entry entry) { return entry->abs_path; }
@@ -2,10 +2,12 @@
2
2
  #define SASS_SASS_FUNCTIONS_H
3
3
 
4
4
  #include "sass.h"
5
+ #include "environment.hpp"
6
+ #include "functions.hpp"
5
7
 
6
8
  // Struct to hold custom function callback
7
9
  struct Sass_Function {
8
- const char* signature;
10
+ char* signature;
9
11
  Sass_Function_Fn function;
10
12
  void* cookie;
11
13
  };
@@ -22,6 +24,22 @@ struct Sass_Import {
22
24
  size_t column;
23
25
  };
24
26
 
27
+ // External environments
28
+ struct Sass_Env {
29
+ // links to parent frames
30
+ Sass::Env* frame;
31
+ };
32
+
33
+ // External call entry
34
+ struct Sass_Callee {
35
+ const char* name;
36
+ const char* path;
37
+ size_t line;
38
+ size_t column;
39
+ enum Sass_Callee_Type type;
40
+ struct Sass_Env env;
41
+ };
42
+
25
43
  // Struct to hold importer callback
26
44
  struct Sass_Importer {
27
45
  Sass_Importer_Fn importer;
@@ -37,7 +37,7 @@ namespace Sass {
37
37
  end
38
38
  end
39
39
  */
40
- Node paths(const Node& arrs, Context& ctx) {
40
+ Node paths(const Node& arrs) {
41
41
 
42
42
  Node loopStart = Node::createCollection();
43
43
  loopStart.collection()->push_back(Node::createCollection());
@@ -108,7 +108,7 @@ namespace Sass {
108
108
  return flattened
109
109
  end
110
110
  */
111
- Node flatten(Node& arr, Context& ctx, int n) {
111
+ Node flatten(Node& arr, int n) {
112
112
  if (n != -1 && n == 0) {
113
113
  return arr;
114
114
  }
@@ -124,7 +124,7 @@ namespace Sass {
124
124
  if (e.isCollection()) {
125
125
 
126
126
  // e.collection().got_line_feed = e.got_line_feed;
127
- Node recurseFlattened = flatten(e, ctx, n - 1);
127
+ Node recurseFlattened = flatten(e, n - 1);
128
128
 
129
129
  if(e.got_line_feed) {
130
130
  flattened.got_line_feed = e.got_line_feed;
@@ -28,7 +28,7 @@ namespace Sass {
28
28
  # # [1, 4, 5],
29
29
  # # [2, 4, 5]]
30
30
  */
31
- Node paths(const Node& arrs, Context& ctx);
31
+ Node paths(const Node& arrs);
32
32
 
33
33
 
34
34
  /*
@@ -40,7 +40,7 @@ namespace Sass {
40
40
  bool operator()(const Node& one, const Node& two, Node& out) const {
41
41
  // TODO: Is this the correct C++ interpretation?
42
42
  // block ||= proc {|a, b| a == b && a}
43
- if (nodesEqual(one, two, true)) {
43
+ if (one == two) {
44
44
  out = one;
45
45
  return true;
46
46
  }
@@ -139,7 +139,7 @@ namespace Sass {
139
139
  http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
140
140
  */
141
141
  template<typename ComparatorType>
142
- Node lcs(Node& x, Node& y, const ComparatorType& comparator, Context& ctx) {
142
+ Node lcs(Node& x, Node& y, const ComparatorType& comparator) {
143
143
  DEBUG_PRINTLN(LCS, "LCS: X=" << x << " Y=" << y)
144
144
 
145
145
  Node newX = Node::createCollection();
@@ -169,7 +169,7 @@ namespace Sass {
169
169
  # @param n [int] The number of levels to flatten
170
170
  # @return [NodeCollection] The flattened array
171
171
  */
172
- Node flatten(Node& arr, Context& ctx, int n = -1);
172
+ Node flatten(Node& arr, int n = -1);
173
173
 
174
174
 
175
175
  /*
@@ -4,6 +4,7 @@
4
4
  #include "util.hpp"
5
5
  #include "eval.hpp"
6
6
  #include "values.hpp"
7
+ #include "operators.hpp"
7
8
  #include "sass/values.h"
8
9
  #include "sass_values.hpp"
9
10
 
@@ -54,6 +55,8 @@ extern "C" {
54
55
  size_t ADDCALL sass_list_get_length(const union Sass_Value* v) { return v->list.length; }
55
56
  enum Sass_Separator ADDCALL sass_list_get_separator(const union Sass_Value* v) { return v->list.separator; }
56
57
  void ADDCALL sass_list_set_separator(union Sass_Value* v, enum Sass_Separator separator) { v->list.separator = separator; }
58
+ bool ADDCALL sass_list_get_is_bracketed(const union Sass_Value* v) { return v->list.is_bracketed; }
59
+ void ADDCALL sass_list_set_is_bracketed(union Sass_Value* v, bool is_bracketed) { v->list.is_bracketed = is_bracketed; }
57
60
  // Getters and setters for Sass_List values
58
61
  union Sass_Value* ADDCALL sass_list_get_value(const union Sass_Value* v, size_t i) { return v->list.values[i]; }
59
62
  void ADDCALL sass_list_set_value(union Sass_Value* v, size_t i, union Sass_Value* value) { v->list.values[i] = value; }
@@ -130,13 +133,14 @@ extern "C" {
130
133
  return v;
131
134
  }
132
135
 
133
- union Sass_Value* ADDCALL sass_make_list(size_t len, enum Sass_Separator sep)
136
+ union Sass_Value* ADDCALL sass_make_list(size_t len, enum Sass_Separator sep, bool is_bracketed)
134
137
  {
135
138
  union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
136
139
  if (v == 0) return 0;
137
140
  v->list.tag = SASS_LIST;
138
141
  v->list.length = len;
139
142
  v->list.separator = sep;
143
+ v->list.is_bracketed = is_bracketed;
140
144
  v->list.values = (union Sass_Value**) calloc(len, sizeof(union Sass_Value*));
141
145
  if (v->list.values == 0) { free(v); return 0; }
142
146
  return v;
@@ -218,6 +222,7 @@ extern "C" {
218
222
  case SASS_WARNING: {
219
223
  free(val->error.message);
220
224
  } break;
225
+ default: break;
221
226
  }
222
227
 
223
228
  free(val);
@@ -233,26 +238,26 @@ extern "C" {
233
238
  switch(val->unknown.tag) {
234
239
  case SASS_NULL: {
235
240
  return sass_make_null();
236
- } break;
241
+ }
237
242
  case SASS_BOOLEAN: {
238
243
  return sass_make_boolean(val->boolean.value);
239
- } break;
244
+ }
240
245
  case SASS_NUMBER: {
241
246
  return sass_make_number(val->number.value, val->number.unit);
242
- } break;
247
+ }
243
248
  case SASS_COLOR: {
244
249
  return sass_make_color(val->color.r, val->color.g, val->color.b, val->color.a);
245
- } break;
250
+ }
246
251
  case SASS_STRING: {
247
252
  return sass_string_is_quoted(val) ? sass_make_qstring(val->string.value) : sass_make_string(val->string.value);
248
- } break;
253
+ }
249
254
  case SASS_LIST: {
250
- union Sass_Value* list = sass_make_list(val->list.length, val->list.separator);
255
+ union Sass_Value* list = sass_make_list(val->list.length, val->list.separator, val->list.is_bracketed);
251
256
  for (i = 0; i < list->list.length; i++) {
252
257
  list->list.values[i] = sass_clone_value(val->list.values[i]);
253
258
  }
254
259
  return list;
255
- } break;
260
+ }
256
261
  case SASS_MAP: {
257
262
  union Sass_Value* map = sass_make_map(val->map.length);
258
263
  for (i = 0; i < val->map.length; i++) {
@@ -260,13 +265,14 @@ extern "C" {
260
265
  map->map.pairs[i].value = sass_clone_value(val->map.pairs[i].value);
261
266
  }
262
267
  return map;
263
- } break;
268
+ }
264
269
  case SASS_ERROR: {
265
270
  return sass_make_error(val->error.message);
266
- } break;
271
+ }
267
272
  case SASS_WARNING: {
268
273
  return sass_make_warning(val->warning.message);
269
- } break;
274
+ }
275
+ default: break;
270
276
  }
271
277
 
272
278
  return 0;
@@ -284,7 +290,7 @@ extern "C" {
284
290
  union Sass_Value* ADDCALL sass_value_op (enum Sass_OP op, const union Sass_Value* a, const union Sass_Value* b)
285
291
  {
286
292
 
287
- Sass::Value_Ptr rv = 0;
293
+ Sass::Value_Ptr rv;
288
294
 
289
295
  try {
290
296
 
@@ -294,41 +300,41 @@ extern "C" {
294
300
 
295
301
  // see if it's a relational expression
296
302
  switch(op) {
297
- case Sass_OP::EQ: return sass_make_boolean(Eval::eq(&lhs, &rhs));
298
- case Sass_OP::NEQ: return sass_make_boolean(!Eval::eq(&lhs, &rhs));
299
- case Sass_OP::GT: return sass_make_boolean(!Eval::lt(&lhs, &rhs, "gt") && !Eval::eq(&lhs, &rhs));
300
- case Sass_OP::GTE: return sass_make_boolean(!Eval::lt(&lhs, &rhs, "gte"));
301
- case Sass_OP::LT: return sass_make_boolean(Eval::lt(&lhs, &rhs, "lt"));
302
- case Sass_OP::LTE: return sass_make_boolean(Eval::lt(&lhs, &rhs, "lte") || Eval::eq(&lhs, &rhs));
303
- case Sass_OP::AND: return ast_node_to_sass_value(lhs->is_false() ? &lhs : &rhs);
304
- case Sass_OP::OR: return ast_node_to_sass_value(lhs->is_false() ? &rhs : &lhs);
305
- default: break;
303
+ case Sass_OP::EQ: return sass_make_boolean(Operators::eq(lhs, rhs));
304
+ case Sass_OP::NEQ: return sass_make_boolean(Operators::neq(lhs, rhs));
305
+ case Sass_OP::GT: return sass_make_boolean(Operators::gt(lhs, rhs));
306
+ case Sass_OP::GTE: return sass_make_boolean(Operators::gte(lhs, rhs));
307
+ case Sass_OP::LT: return sass_make_boolean(Operators::lt(lhs, rhs));
308
+ case Sass_OP::LTE: return sass_make_boolean(Operators::lte(lhs, rhs));
309
+ case Sass_OP::AND: return ast_node_to_sass_value(lhs->is_false() ? lhs : rhs);
310
+ case Sass_OP::OR: return ast_node_to_sass_value(lhs->is_false() ? rhs : lhs);
311
+ default: break;
306
312
  }
307
313
 
308
314
  if (sass_value_is_number(a) && sass_value_is_number(b)) {
309
- Number_Ptr_Const l_n = SASS_MEMORY_CAST(Number, lhs);
310
- Number_Ptr_Const r_n = SASS_MEMORY_CAST(Number, rhs);
311
- rv = Eval::op_numbers(op, *l_n, *r_n, options);
315
+ Number_Ptr_Const l_n = Cast<Number>(lhs);
316
+ Number_Ptr_Const r_n = Cast<Number>(rhs);
317
+ rv = Operators::op_numbers(op, *l_n, *r_n, options, l_n->pstate());
312
318
  }
313
319
  else if (sass_value_is_number(a) && sass_value_is_color(a)) {
314
- Number_Ptr_Const l_n = SASS_MEMORY_CAST(Number, lhs);
315
- Color_Ptr_Const r_c = SASS_MEMORY_CAST(Color, rhs);
316
- rv = Eval::op_number_color(op, *l_n, *r_c, options);
320
+ Number_Ptr_Const l_n = Cast<Number>(lhs);
321
+ Color_Ptr_Const r_c = Cast<Color>(rhs);
322
+ rv = Operators::op_number_color(op, *l_n, *r_c, options, l_n->pstate());
317
323
  }
318
324
  else if (sass_value_is_color(a) && sass_value_is_number(b)) {
319
- Color_Ptr_Const l_c = SASS_MEMORY_CAST(Color, lhs);
320
- Number_Ptr_Const r_n = SASS_MEMORY_CAST(Number, rhs);
321
- rv = Eval::op_color_number(op, *l_c, *r_n, options);
325
+ Color_Ptr_Const l_c = Cast<Color>(lhs);
326
+ Number_Ptr_Const r_n = Cast<Number>(rhs);
327
+ rv = Operators::op_color_number(op, *l_c, *r_n, options, l_c->pstate());
322
328
  }
323
329
  else if (sass_value_is_color(a) && sass_value_is_color(b)) {
324
- Color_Ptr_Const l_c = SASS_MEMORY_CAST(Color, lhs);
325
- Color_Ptr_Const r_c = SASS_MEMORY_CAST(Color, rhs);
326
- rv = Eval::op_colors(op, *l_c, *r_c, options);
330
+ Color_Ptr_Const l_c = Cast<Color>(lhs);
331
+ Color_Ptr_Const r_c = Cast<Color>(rhs);
332
+ rv = Operators::op_colors(op, *l_c, *r_c, options, l_c->pstate());
327
333
  }
328
334
  else /* convert other stuff to string and apply operation */ {
329
- Value_Ptr l_v = SASS_MEMORY_CAST(Value, lhs);
330
- Value_Ptr r_v = SASS_MEMORY_CAST(Value, rhs);
331
- rv = Eval::op_strings(op, *l_v, *r_v, options);
335
+ Value_Ptr l_v = Cast<Value>(lhs);
336
+ Value_Ptr r_v = Cast<Value>(rhs);
337
+ rv = Operators::op_strings(op, *l_v, *r_v, options, l_v->pstate());
332
338
  }
333
339
 
334
340
  // ToDo: maybe we should should return null value?
@@ -346,9 +352,6 @@ extern "C" {
346
352
  catch (std::string& e) { return sass_make_error(e.c_str()); }
347
353
  catch (const char* e) { return sass_make_error(e); }
348
354
  catch (...) { return sass_make_error("unknown"); }
349
-
350
- return 0;
351
-
352
355
  }
353
356
 
354
357
  }
@@ -35,6 +35,7 @@ struct Sass_String {
35
35
  struct Sass_List {
36
36
  enum Sass_Tag tag;
37
37
  enum Sass_Separator separator;
38
+ bool is_bracketed;
38
39
  size_t length;
39
40
  // null terminated "array"
40
41
  union Sass_Value** values;
@@ -78,4 +79,4 @@ struct Sass_MapPair {
78
79
  union Sass_Value* value;
79
80
  };
80
81
 
81
- #endif
82
+ #endif
@@ -2,7 +2,6 @@
2
2
  #include <string>
3
3
  #include <sstream>
4
4
  #include <iostream>
5
- #include <cstddef>
6
5
  #include <iomanip>
7
6
 
8
7
  #include "ast.hpp"
@@ -25,9 +24,9 @@ namespace Sass {
25
24
 
26
25
  json_append_member(json_srcmap, "version", json_mknumber(3));
27
26
 
28
- const char *include = file.c_str();
29
- JsonNode *json_include = json_mkstring(include);
30
- json_append_member(json_srcmap, "file", json_include);
27
+ const char *file_name = file.c_str();
28
+ JsonNode *json_file_name = json_mkstring(file_name);
29
+ json_append_member(json_srcmap, "file", json_file_name);
31
30
 
32
31
  // pass-through sourceRoot option
33
32
  if (!ctx.source_map_root.empty()) {
@@ -35,35 +34,34 @@ namespace Sass {
35
34
  json_append_member(json_srcmap, "sourceRoot", root);
36
35
  }
37
36
 
38
- JsonNode *json_includes = json_mkarray();
37
+ JsonNode *json_sources = json_mkarray();
39
38
  for (size_t i = 0; i < source_index.size(); ++i) {
40
- std::string include(links[source_index[i]]);
39
+ std::string source(links[source_index[i]]);
41
40
  if (ctx.c_options.source_map_file_urls) {
42
- include = File::rel2abs(include);
41
+ source = File::rel2abs(source);
43
42
  // check for windows abs path
44
- if (include[0] == '/') {
43
+ if (source[0] == '/') {
45
44
  // ends up with three slashes
46
- include = "file://" + include;
45
+ source = "file://" + source;
47
46
  } else {
48
47
  // needs an additional slash
49
- include = "file:///" + include;
48
+ source = "file:///" + source;
50
49
  }
51
50
  }
52
- const char* inc = include.c_str();
53
- JsonNode *json_include = json_mkstring(inc);
54
- json_append_element(json_includes, json_include);
51
+ const char* source_name = source.c_str();
52
+ JsonNode *json_source_name = json_mkstring(source_name);
53
+ json_append_element(json_sources, json_source_name);
55
54
  }
56
- json_append_member(json_srcmap, "sources", json_includes);
55
+ json_append_member(json_srcmap, "sources", json_sources);
57
56
 
58
- if (include_sources) {
57
+ if (include_sources && source_index.size()) {
59
58
  JsonNode *json_contents = json_mkarray();
60
59
  for (size_t i = 0; i < source_index.size(); ++i) {
61
60
  const Resource& resource(sources[source_index[i]]);
62
61
  JsonNode *json_content = json_mkstring(resource.contents);
63
62
  json_append_element(json_contents, json_content);
64
63
  }
65
- if (json_contents->children.head)
66
- json_append_member(json_srcmap, "sourcesContent", json_contents);
64
+ json_append_member(json_srcmap, "sourcesContent", json_contents);
67
65
  }
68
66
 
69
67
  JsonNode *json_names = json_mkarray();
@@ -138,7 +136,7 @@ namespace Sass {
138
136
  }
139
137
  }
140
138
  }
141
- // will adjust the offset
139
+ // adjust the buffer offset
142
140
  prepend(Offset(out.buffer));
143
141
  // now add the new mappings
144
142
  VECTOR_UNSHIFT(mappings, out.smap.mappings);