sassc 2.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +17 -17
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/units.cpp +19 -19
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
| @@ -283,21 +283,21 @@ extern "C" { | |
| 283 283 |  | 
| 284 284 | 
             
              union Sass_Value* ADDCALL sass_value_stringify (const union Sass_Value* v, bool compressed, int precision)
         | 
| 285 285 | 
             
              {
         | 
| 286 | 
            -
                 | 
| 286 | 
            +
                ValueObj val = sass_value_to_ast_node(v);
         | 
| 287 287 | 
             
                Sass_Inspect_Options options(compressed ? COMPRESSED : NESTED, precision);
         | 
| 288 | 
            -
                 | 
| 288 | 
            +
                sass::string str(val->to_string(options));
         | 
| 289 289 | 
             
                return sass_make_qstring(str.c_str());
         | 
| 290 290 | 
             
              }
         | 
| 291 291 |  | 
| 292 292 | 
             
              union Sass_Value* ADDCALL sass_value_op (enum Sass_OP op, const union Sass_Value* a, const union Sass_Value* b)
         | 
| 293 293 | 
             
              {
         | 
| 294 294 |  | 
| 295 | 
            -
                Sass:: | 
| 295 | 
            +
                Sass::ValueObj rv;
         | 
| 296 296 |  | 
| 297 297 | 
             
                try {
         | 
| 298 298 |  | 
| 299 | 
            -
                   | 
| 300 | 
            -
                   | 
| 299 | 
            +
                  ValueObj lhs = sass_value_to_ast_node(a);
         | 
| 300 | 
            +
                  ValueObj rhs = sass_value_to_ast_node(b);
         | 
| 301 301 | 
             
                  struct Sass_Inspect_Options options(NESTED, 5);
         | 
| 302 302 |  | 
| 303 303 | 
             
                  // see if it's a relational expression
         | 
| @@ -340,12 +340,10 @@ extern "C" { | |
| 340 340 | 
             
                    rv = Operators::op_colors(op, *l_c, *r_c, options, l_c->pstate());
         | 
| 341 341 | 
             
                  }
         | 
| 342 342 | 
             
                  else /* convert other stuff to string and apply operation */ {
         | 
| 343 | 
            -
                     | 
| 344 | 
            -
                    Value* r_v = Cast<Value>(rhs);
         | 
| 345 | 
            -
                    rv = Operators::op_strings(op, *l_v, *r_v, options, l_v->pstate());
         | 
| 343 | 
            +
                    rv = Operators::op_strings(op, *lhs, *rhs, options, lhs->pstate());
         | 
| 346 344 | 
             
                  }
         | 
| 347 345 |  | 
| 348 | 
            -
                  // ToDo: maybe we should  | 
| 346 | 
            +
                  // ToDo: maybe we should return null value?
         | 
| 349 347 | 
             
                  if (!rv) return sass_make_error("invalid return value");
         | 
| 350 348 |  | 
| 351 349 | 
             
                  // convert result back to ast node
         | 
| @@ -356,7 +354,7 @@ extern "C" { | |
| 356 354 | 
             
                catch (Exception::InvalidSass& e) { return sass_make_error(e.what()); }
         | 
| 357 355 | 
             
                catch (std::bad_alloc&) { return sass_make_error("memory exhausted"); }
         | 
| 358 356 | 
             
                catch (std::exception& e) { return sass_make_error(e.what()); }
         | 
| 359 | 
            -
                catch ( | 
| 357 | 
            +
                catch (sass::string& e) { return sass_make_error(e.c_str()); }
         | 
| 360 358 | 
             
                catch (const char* e) { return sass_make_error(e); }
         | 
| 361 359 | 
             
                catch (...) { return sass_make_error("unknown"); }
         | 
| 362 360 | 
             
              }
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            #ifndef SASS_SETTINGS_H
         | 
| 2 | 
            +
            #define SASS_SETTINGS_H
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            // Global compile time settings should go here
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            // When enabled we use our custom memory pool allocator
         | 
| 7 | 
            +
            // With intense workloads this can double the performance
         | 
| 8 | 
            +
            // Max memory usage mostly only grows by a slight amount
         | 
| 9 | 
            +
            // #define SASS_CUSTOM_ALLOCATOR
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            // How many buckets should we have for the free-list
         | 
| 12 | 
            +
            // Determines when allocations go directly to malloc/free
         | 
| 13 | 
            +
            // For maximum size of managed items multiply by alignment
         | 
| 14 | 
            +
            #define SassAllocatorBuckets 512
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            // The size of the memory pool arenas in bytes.
         | 
| 17 | 
            +
            #define SassAllocatorArenaSize (1024 * 256)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            #endif
         | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            #include <stdio.h>
         | 
| 2 | 
            +
            #include <string.h>
         | 
| 3 | 
            +
            #include "source.hpp"
         | 
| 4 | 
            +
            #include "utf8/checked.h"
         | 
| 5 | 
            +
            #include "position.hpp"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            namespace Sass {
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              SourceData::SourceData()
         | 
| 10 | 
            +
                : SharedObj()
         | 
| 11 | 
            +
              {
         | 
| 12 | 
            +
              }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              SourceFile::SourceFile(
         | 
| 15 | 
            +
                const char* path,
         | 
| 16 | 
            +
                const char* data,
         | 
| 17 | 
            +
                size_t srcid) :
         | 
| 18 | 
            +
                SourceData(),
         | 
| 19 | 
            +
                path(sass_copy_c_string(path)),
         | 
| 20 | 
            +
                data(sass_copy_c_string(data)),
         | 
| 21 | 
            +
                length(0),
         | 
| 22 | 
            +
                srcid(srcid)
         | 
| 23 | 
            +
              {
         | 
| 24 | 
            +
                length = strlen(data);
         | 
| 25 | 
            +
              }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              SourceFile::~SourceFile() {
         | 
| 28 | 
            +
                sass_free_memory(path);
         | 
| 29 | 
            +
                sass_free_memory(data);
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              const char* SourceFile::end() const
         | 
| 33 | 
            +
              {
         | 
| 34 | 
            +
                return data + length;
         | 
| 35 | 
            +
              }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              const char* SourceFile::begin() const
         | 
| 38 | 
            +
              {
         | 
| 39 | 
            +
                return data;
         | 
| 40 | 
            +
              }
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              const char* SourceFile::getRawData() const
         | 
| 43 | 
            +
              {
         | 
| 44 | 
            +
                return data;
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              SourceSpan SourceFile::getSourceSpan()
         | 
| 48 | 
            +
              {
         | 
| 49 | 
            +
                return SourceSpan(this);
         | 
| 50 | 
            +
              }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              ItplFile::ItplFile(const char* data, const SourceSpan& pstate) :
         | 
| 53 | 
            +
                SourceFile(pstate.getPath(),
         | 
| 54 | 
            +
                  data, pstate.getSrcId()),
         | 
| 55 | 
            +
                pstate(pstate)
         | 
| 56 | 
            +
              {}
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              const char* ItplFile::getRawData() const
         | 
| 59 | 
            +
              {
         | 
| 60 | 
            +
                return pstate.getRawData();
         | 
| 61 | 
            +
              }
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              SourceSpan ItplFile::getSourceSpan()
         | 
| 64 | 
            +
              {
         | 
| 65 | 
            +
                return SourceSpan(pstate);
         | 
| 66 | 
            +
              }
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            }
         | 
| 69 | 
            +
             | 
| @@ -0,0 +1,95 @@ | |
| 1 | 
            +
            #ifndef SASS_SOURCE_H
         | 
| 2 | 
            +
            #define SASS_SOURCE_H
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            #include "sass.hpp"
         | 
| 5 | 
            +
            #include "memory.hpp"
         | 
| 6 | 
            +
            #include "position.hpp"
         | 
| 7 | 
            +
            #include "source_data.hpp"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            namespace Sass {
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              class SourceFile :
         | 
| 12 | 
            +
                public SourceData {
         | 
| 13 | 
            +
              protected:
         | 
| 14 | 
            +
                char* path;
         | 
| 15 | 
            +
                char* data;
         | 
| 16 | 
            +
                size_t length;
         | 
| 17 | 
            +
                size_t srcid;
         | 
| 18 | 
            +
              public:
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                SourceFile(
         | 
| 21 | 
            +
                  const char* path,
         | 
| 22 | 
            +
                  const char* data,
         | 
| 23 | 
            +
                  size_t srcid);
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                ~SourceFile();
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                const char* end() const override final;
         | 
| 28 | 
            +
                const char* begin() const override final;
         | 
| 29 | 
            +
                virtual const char* getRawData() const override;
         | 
| 30 | 
            +
                virtual SourceSpan getSourceSpan() override;
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                size_t size() const override final {
         | 
| 33 | 
            +
                  return length;
         | 
| 34 | 
            +
                }
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                virtual const char* getPath() const override {
         | 
| 37 | 
            +
                  return path;
         | 
| 38 | 
            +
                }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                virtual size_t getSrcId() const override {
         | 
| 41 | 
            +
                  return srcid;
         | 
| 42 | 
            +
                }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              };
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              class SynthFile :
         | 
| 47 | 
            +
                public SourceData {
         | 
| 48 | 
            +
              protected:
         | 
| 49 | 
            +
                const char* path;
         | 
| 50 | 
            +
              public:
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                SynthFile(
         | 
| 53 | 
            +
                  const char* path) :
         | 
| 54 | 
            +
                  path(path)
         | 
| 55 | 
            +
                {}
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                ~SynthFile() {}
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                const char* end() const override final { return nullptr; }
         | 
| 60 | 
            +
                const char* begin() const override final { return nullptr; };
         | 
| 61 | 
            +
                virtual const char* getRawData() const override { return nullptr; };
         | 
| 62 | 
            +
                virtual SourceSpan getSourceSpan() override { return SourceSpan(path); };
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                size_t size() const override final {
         | 
| 65 | 
            +
                  return 0;
         | 
| 66 | 
            +
                }
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                virtual const char* getPath() const override {
         | 
| 69 | 
            +
                  return path;
         | 
| 70 | 
            +
                }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                virtual size_t getSrcId() const override {
         | 
| 73 | 
            +
                  return std::string::npos;
         | 
| 74 | 
            +
                }
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              };
         | 
| 77 | 
            +
              
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              class ItplFile :
         | 
| 80 | 
            +
                public SourceFile {
         | 
| 81 | 
            +
              private:
         | 
| 82 | 
            +
                SourceSpan pstate;
         | 
| 83 | 
            +
              public:
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                ItplFile(const char* data,
         | 
| 86 | 
            +
                  const SourceSpan& pstate);
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                // Offset getPosition() const override final;
         | 
| 89 | 
            +
                const char* getRawData() const override final;
         | 
| 90 | 
            +
                SourceSpan getSourceSpan() override final;
         | 
| 91 | 
            +
              };
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            #endif
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            #ifndef SASS_SOURCE_DATA_H
         | 
| 2 | 
            +
            #define SASS_SOURCE_DATA_H
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            #include "sass.hpp"
         | 
| 5 | 
            +
            #include "memory.hpp"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            namespace Sass {
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              class SourceSpan;
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              class SourceData :
         | 
| 12 | 
            +
                public SharedObj {
         | 
| 13 | 
            +
              public:
         | 
| 14 | 
            +
                SourceData();
         | 
| 15 | 
            +
                virtual size_t size() const = 0;
         | 
| 16 | 
            +
                virtual size_t getSrcId() const = 0;
         | 
| 17 | 
            +
                virtual const char* end() const = 0;
         | 
| 18 | 
            +
                virtual const char* begin() const = 0;
         | 
| 19 | 
            +
                virtual const char* getPath() const = 0;
         | 
| 20 | 
            +
                // virtual Offset getPosition() const = 0;
         | 
| 21 | 
            +
                virtual const char* getRawData() const = 0;
         | 
| 22 | 
            +
                virtual SourceSpan getSourceSpan() = 0;
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                sass::string to_string() const override {
         | 
| 25 | 
            +
                  return sass::string{ begin(), end() };
         | 
| 26 | 
            +
                }
         | 
| 27 | 
            +
                ~SourceData() {}
         | 
| 28 | 
            +
              };
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            #endif
         | 
| @@ -15,13 +15,13 @@ | |
| 15 15 |  | 
| 16 16 | 
             
            namespace Sass {
         | 
| 17 17 | 
             
              SourceMap::SourceMap() : current_position(0, 0, 0), file("stdin") { }
         | 
| 18 | 
            -
              SourceMap::SourceMap(const  | 
| 18 | 
            +
              SourceMap::SourceMap(const sass::string& file) : current_position(0, 0, 0), file(file) { }
         | 
| 19 19 |  | 
| 20 | 
            -
               | 
| 20 | 
            +
              sass::string SourceMap::render_srcmap(Context &ctx) {
         | 
| 21 21 |  | 
| 22 22 | 
             
                const bool include_sources = ctx.c_options.source_map_contents;
         | 
| 23 | 
            -
                const  | 
| 24 | 
            -
                const  | 
| 23 | 
            +
                const sass::vector<sass::string> links = ctx.srcmap_links;
         | 
| 24 | 
            +
                const sass::vector<Resource>& sources(ctx.resources);
         | 
| 25 25 |  | 
| 26 26 | 
             
                JsonNode* json_srcmap = json_mkobject();
         | 
| 27 27 |  | 
| @@ -39,7 +39,7 @@ namespace Sass { | |
| 39 39 |  | 
| 40 40 | 
             
                JsonNode *json_sources = json_mkarray();
         | 
| 41 41 | 
             
                for (size_t i = 0; i < source_index.size(); ++i) {
         | 
| 42 | 
            -
                   | 
| 42 | 
            +
                  sass::string source(links[source_index[i]]);
         | 
| 43 43 | 
             
                  if (ctx.c_options.source_map_file_urls) {
         | 
| 44 44 | 
             
                    source = File::rel2abs(source);
         | 
| 45 45 | 
             
                    // check for windows abs path
         | 
| @@ -72,19 +72,19 @@ namespace Sass { | |
| 72 72 | 
             
                // no problem as we do not alter any identifiers
         | 
| 73 73 | 
             
                json_append_member(json_srcmap, "names", json_names);
         | 
| 74 74 |  | 
| 75 | 
            -
                 | 
| 75 | 
            +
                sass::string mappings = serialize_mappings();
         | 
| 76 76 | 
             
                JsonNode *json_mappings = json_mkstring(mappings.c_str());
         | 
| 77 77 | 
             
                json_append_member(json_srcmap, "mappings", json_mappings);
         | 
| 78 78 |  | 
| 79 79 | 
             
                char *str = json_stringify(json_srcmap, "\t");
         | 
| 80 | 
            -
                 | 
| 80 | 
            +
                sass::string result = sass::string(str);
         | 
| 81 81 | 
             
                free(str);
         | 
| 82 82 | 
             
                json_delete(json_srcmap);
         | 
| 83 83 | 
             
                return result;
         | 
| 84 84 | 
             
              }
         | 
| 85 85 |  | 
| 86 | 
            -
               | 
| 87 | 
            -
                 | 
| 86 | 
            +
              sass::string SourceMap::serialize_mappings() {
         | 
| 87 | 
            +
                sass::string result = "";
         | 
| 88 88 |  | 
| 89 89 | 
             
                size_t previous_generated_line = 0;
         | 
| 90 90 | 
             
                size_t previous_generated_column = 0;
         | 
| @@ -101,7 +101,7 @@ namespace Sass { | |
| 101 101 | 
             
                  if (generated_line != previous_generated_line) {
         | 
| 102 102 | 
             
                    previous_generated_column = 0;
         | 
| 103 103 | 
             
                    if (generated_line > previous_generated_line) {
         | 
| 104 | 
            -
                      result +=  | 
| 104 | 
            +
                      result += sass::string(generated_line - previous_generated_line, ';');
         | 
| 105 105 | 
             
                      previous_generated_line = generated_line;
         | 
| 106 106 | 
             
                    }
         | 
| 107 107 | 
             
                  }
         | 
| @@ -175,23 +175,27 @@ namespace Sass { | |
| 175 175 |  | 
| 176 176 | 
             
              void SourceMap::add_open_mapping(const AST_Node* node)
         | 
| 177 177 | 
             
              {
         | 
| 178 | 
            -
                 | 
| 178 | 
            +
                const SourceSpan& span(node->pstate());
         | 
| 179 | 
            +
                Position from(span.getSrcId(), span.position);
         | 
| 180 | 
            +
                mappings.push_back(Mapping(from, current_position));
         | 
| 179 181 | 
             
              }
         | 
| 180 182 |  | 
| 181 183 | 
             
              void SourceMap::add_close_mapping(const AST_Node* node)
         | 
| 182 184 | 
             
              {
         | 
| 183 | 
            -
                 | 
| 185 | 
            +
                const SourceSpan& span(node->pstate());
         | 
| 186 | 
            +
                Position to(span.getSrcId(), span.position + span.offset);
         | 
| 187 | 
            +
                mappings.push_back(Mapping(to, current_position));
         | 
| 184 188 | 
             
              }
         | 
| 185 189 |  | 
| 186 | 
            -
               | 
| 190 | 
            +
              SourceSpan SourceMap::remap(const SourceSpan& pstate) {
         | 
| 187 191 | 
             
                for (size_t i = 0; i < mappings.size(); ++i) {
         | 
| 188 192 | 
             
                  if (
         | 
| 189 | 
            -
                    mappings[i].generated_position.file == pstate. | 
| 190 | 
            -
                    mappings[i].generated_position.line == pstate.line &&
         | 
| 191 | 
            -
                    mappings[i].generated_position.column == pstate.column
         | 
| 192 | 
            -
                  ) return  | 
| 193 | 
            +
                    mappings[i].generated_position.file == pstate.getSrcId() &&
         | 
| 194 | 
            +
                    mappings[i].generated_position.line == pstate.position.line &&
         | 
| 195 | 
            +
                    mappings[i].generated_position.column == pstate.position.column
         | 
| 196 | 
            +
                  ) return SourceSpan(pstate.source, mappings[i].original_position, pstate.offset);
         | 
| 193 197 | 
             
                }
         | 
| 194 | 
            -
                return  | 
| 198 | 
            +
                return SourceSpan(pstate.source, Position(-1, -1, -1), Offset(0, 0));
         | 
| 195 199 |  | 
| 196 200 | 
             
              }
         | 
| 197 201 |  | 
| @@ -9,6 +9,9 @@ | |
| 9 9 | 
             
            #include "position.hpp"
         | 
| 10 10 | 
             
            #include "mapping.hpp"
         | 
| 11 11 |  | 
| 12 | 
            +
            #include "backtrace.hpp"
         | 
| 13 | 
            +
            #include "memory.hpp"
         | 
| 14 | 
            +
             | 
| 12 15 | 
             
            #define VECTOR_PUSH(vec, ins) vec.insert(vec.end(), ins.begin(), ins.end())
         | 
| 13 16 | 
             
            #define VECTOR_UNSHIFT(vec, ins) vec.insert(vec.begin(), ins.begin(), ins.end())
         | 
| 14 17 |  | 
| @@ -20,9 +23,9 @@ namespace Sass { | |
| 20 23 | 
             
              class SourceMap {
         | 
| 21 24 |  | 
| 22 25 | 
             
              public:
         | 
| 23 | 
            -
                 | 
| 26 | 
            +
                sass::vector<size_t> source_index;
         | 
| 24 27 | 
             
                SourceMap();
         | 
| 25 | 
            -
                SourceMap(const  | 
| 28 | 
            +
                SourceMap(const sass::string& file);
         | 
| 26 29 |  | 
| 27 30 | 
             
                void append(const Offset& offset);
         | 
| 28 31 | 
             
                void prepend(const Offset& offset);
         | 
| @@ -31,17 +34,17 @@ namespace Sass { | |
| 31 34 | 
             
                void add_open_mapping(const AST_Node* node);
         | 
| 32 35 | 
             
                void add_close_mapping(const AST_Node* node);
         | 
| 33 36 |  | 
| 34 | 
            -
                 | 
| 35 | 
            -
                 | 
| 37 | 
            +
                sass::string render_srcmap(Context &ctx);
         | 
| 38 | 
            +
                SourceSpan remap(const SourceSpan& pstate);
         | 
| 36 39 |  | 
| 37 40 | 
             
              private:
         | 
| 38 41 |  | 
| 39 | 
            -
                 | 
| 42 | 
            +
                sass::string serialize_mappings();
         | 
| 40 43 |  | 
| 41 | 
            -
                 | 
| 44 | 
            +
                sass::vector<Mapping> mappings;
         | 
| 42 45 | 
             
                Position current_position;
         | 
| 43 46 | 
             
            public:
         | 
| 44 | 
            -
                 | 
| 47 | 
            +
                sass::string file;
         | 
| 45 48 | 
             
            private:
         | 
| 46 49 | 
             
                Base64VLQ base64vlq;
         | 
| 47 50 | 
             
              };
         | 
| @@ -49,11 +52,11 @@ private: | |
| 49 52 | 
             
              class OutputBuffer {
         | 
| 50 53 | 
             
                public:
         | 
| 51 54 | 
             
                  OutputBuffer(void)
         | 
| 52 | 
            -
                  : buffer( | 
| 55 | 
            +
                  : buffer(),
         | 
| 53 56 | 
             
                    smap()
         | 
| 54 57 | 
             
                  { }
         | 
| 55 58 | 
             
                public:
         | 
| 56 | 
            -
                   | 
| 59 | 
            +
                  sass::string buffer;
         | 
| 57 60 | 
             
                  SourceMap smap;
         | 
| 58 61 | 
             
              };
         | 
| 59 62 |  | 
    
        data/ext/libsass/src/units.cpp
    CHANGED
    
    | @@ -65,7 +65,7 @@ namespace Sass { | |
| 65 65 | 
             
                }
         | 
| 66 66 | 
             
              };
         | 
| 67 67 |  | 
| 68 | 
            -
               | 
| 68 | 
            +
              sass::string get_unit_class(UnitType unit)
         | 
| 69 69 | 
             
              {
         | 
| 70 70 | 
             
                switch (unit & 0xFF00)
         | 
| 71 71 | 
             
                {
         | 
| @@ -91,7 +91,7 @@ namespace Sass { | |
| 91 91 | 
             
                }
         | 
| 92 92 | 
             
              };
         | 
| 93 93 |  | 
| 94 | 
            -
              UnitType string_to_unit(const  | 
| 94 | 
            +
              UnitType string_to_unit(const sass::string& s)
         | 
| 95 95 | 
             
              {
         | 
| 96 96 | 
             
                // size units
         | 
| 97 97 | 
             
                if      (s == "px")   return UnitType::PX;
         | 
| @@ -149,7 +149,7 @@ namespace Sass { | |
| 149 149 | 
             
                }
         | 
| 150 150 | 
             
              }
         | 
| 151 151 |  | 
| 152 | 
            -
               | 
| 152 | 
            +
              sass::string unit_to_class(const sass::string& s)
         | 
| 153 153 | 
             
              {
         | 
| 154 154 | 
             
                if      (s == "px")   return "LENGTH";
         | 
| 155 155 | 
             
                else if (s == "pt")   return "LENGTH";
         | 
| @@ -177,7 +177,7 @@ namespace Sass { | |
| 177 177 | 
             
              }
         | 
| 178 178 |  | 
| 179 179 | 
             
              // throws incompatibleUnits exceptions
         | 
| 180 | 
            -
              double conversion_factor(const  | 
| 180 | 
            +
              double conversion_factor(const sass::string& s1, const sass::string& s2)
         | 
| 181 181 | 
             
              {
         | 
| 182 182 | 
             
                // assert for same units
         | 
| 183 183 | 
             
                if (s1 == s2) return 1;
         | 
| @@ -219,7 +219,7 @@ namespace Sass { | |
| 219 219 | 
             
                return 0;
         | 
| 220 220 | 
             
              }
         | 
| 221 221 |  | 
| 222 | 
            -
              double convert_units(const  | 
| 222 | 
            +
              double convert_units(const sass::string& lhs, const sass::string& rhs, int& lhsexp, int& rhsexp)
         | 
| 223 223 | 
             
              {
         | 
| 224 224 | 
             
                double f = 0;
         | 
| 225 225 | 
             
                // do not convert same ones
         | 
| @@ -283,7 +283,7 @@ namespace Sass { | |
| 283 283 | 
             
                double factor = 1;
         | 
| 284 284 |  | 
| 285 285 | 
             
                for (size_t i = 0; i < iL; i++) {
         | 
| 286 | 
            -
                   | 
| 286 | 
            +
                  sass::string &lhs = numerators[i];
         | 
| 287 287 | 
             
                  UnitType ulhs = string_to_unit(lhs);
         | 
| 288 288 | 
             
                  if (ulhs == UNKNOWN) continue;
         | 
| 289 289 | 
             
                  UnitClass clhs = get_unit_type(ulhs);
         | 
| @@ -296,7 +296,7 @@ namespace Sass { | |
| 296 296 | 
             
                }
         | 
| 297 297 |  | 
| 298 298 | 
             
                for (size_t n = 0; n < nL; n++) {
         | 
| 299 | 
            -
                   | 
| 299 | 
            +
                  sass::string &rhs = denominators[n];
         | 
| 300 300 | 
             
                  UnitType urhs = string_to_unit(rhs);
         | 
| 301 301 | 
             
                  if (urhs == UNKNOWN) continue;
         | 
| 302 302 | 
             
                  UnitClass crhs = get_unit_type(urhs);
         | 
| @@ -328,7 +328,7 @@ namespace Sass { | |
| 328 328 | 
             
                // it seems that a map table will fit nicely to do this
         | 
| 329 329 | 
             
                // we basically construct exponents for each unit
         | 
| 330 330 | 
             
                // has the advantage that they will be pre-sorted
         | 
| 331 | 
            -
                std::map< | 
| 331 | 
            +
                std::map<sass::string, int> exponents;
         | 
| 332 332 |  | 
| 333 333 | 
             
                // initialize by summing up occurrences in unit vectors
         | 
| 334 334 | 
             
                // this will already cancel out equivalent units (e.q. px/px)
         | 
| @@ -341,7 +341,7 @@ namespace Sass { | |
| 341 341 | 
             
                // convert between compatible units
         | 
| 342 342 | 
             
                for (size_t i = 0; i < iL; i++) {
         | 
| 343 343 | 
             
                  for (size_t n = 0; n < nL; n++) {
         | 
| 344 | 
            -
                     | 
| 344 | 
            +
                    sass::string &lhs = numerators[i], &rhs = denominators[n];
         | 
| 345 345 | 
             
                    int &lhsexp = exponents[lhs], &rhsexp = exponents[rhs];
         | 
| 346 346 | 
             
                    double f(convert_units(lhs, rhs, lhsexp, rhsexp));
         | 
| 347 347 | 
             
                    if (f == 0) continue;
         | 
| @@ -367,9 +367,9 @@ namespace Sass { | |
| 367 367 |  | 
| 368 368 | 
             
              }
         | 
| 369 369 |  | 
| 370 | 
            -
               | 
| 370 | 
            +
              sass::string Units::unit() const
         | 
| 371 371 | 
             
              {
         | 
| 372 | 
            -
                 | 
| 372 | 
            +
                sass::string u;
         | 
| 373 373 | 
             
                size_t iL = numerators.size();
         | 
| 374 374 | 
             
                size_t nL = denominators.size();
         | 
| 375 375 | 
             
                for (size_t i = 0; i < iL; i += 1) {
         | 
| @@ -400,11 +400,11 @@ namespace Sass { | |
| 400 400 | 
             
              double Units::convert_factor(const Units& r) const
         | 
| 401 401 | 
             
              {
         | 
| 402 402 |  | 
| 403 | 
            -
                 | 
| 404 | 
            -
                 | 
| 403 | 
            +
                sass::vector<sass::string> miss_nums(0);
         | 
| 404 | 
            +
                sass::vector<sass::string> miss_dens(0);
         | 
| 405 405 | 
             
                // create copy since we need these for state keeping
         | 
| 406 | 
            -
                 | 
| 407 | 
            -
                 | 
| 406 | 
            +
                sass::vector<sass::string> r_nums(r.numerators);
         | 
| 407 | 
            +
                sass::vector<sass::string> r_dens(r.denominators);
         | 
| 408 408 |  | 
| 409 409 | 
             
                auto l_num_it = numerators.begin();
         | 
| 410 410 | 
             
                auto l_num_end = numerators.end();
         | 
| @@ -419,7 +419,7 @@ namespace Sass { | |
| 419 419 | 
             
                while (l_num_it != l_num_end)
         | 
| 420 420 | 
             
                {
         | 
| 421 421 | 
             
                  // get and increment afterwards
         | 
| 422 | 
            -
                  const  | 
| 422 | 
            +
                  const sass::string l_num = *(l_num_it ++);
         | 
| 423 423 |  | 
| 424 424 | 
             
                  auto r_num_it = r_nums.begin(), r_num_end = r_nums.end();
         | 
| 425 425 |  | 
| @@ -428,7 +428,7 @@ namespace Sass { | |
| 428 428 | 
             
                  while (r_num_it != r_num_end)
         | 
| 429 429 | 
             
                  {
         | 
| 430 430 | 
             
                    // get and increment afterwards
         | 
| 431 | 
            -
                    const  | 
| 431 | 
            +
                    const sass::string r_num = *(r_num_it);
         | 
| 432 432 | 
             
                    // get possible conversion factor for units
         | 
| 433 433 | 
             
                    double conversion = conversion_factor(l_num, r_num);
         | 
| 434 434 | 
             
                    // skip incompatible numerator
         | 
| @@ -456,7 +456,7 @@ namespace Sass { | |
| 456 456 | 
             
                while (l_den_it != l_den_end)
         | 
| 457 457 | 
             
                {
         | 
| 458 458 | 
             
                  // get and increment afterwards
         | 
| 459 | 
            -
                  const  | 
| 459 | 
            +
                  const sass::string l_den = *(l_den_it ++);
         | 
| 460 460 |  | 
| 461 461 | 
             
                  auto r_den_it = r_dens.begin();
         | 
| 462 462 | 
             
                  auto r_den_end = r_dens.end();
         | 
| @@ -466,7 +466,7 @@ namespace Sass { | |
| 466 466 | 
             
                  while (r_den_it != r_den_end)
         | 
| 467 467 | 
             
                  {
         | 
| 468 468 | 
             
                    // get and increment afterwards
         | 
| 469 | 
            -
                    const  | 
| 469 | 
            +
                    const sass::string r_den = *(r_den_it);
         | 
| 470 470 | 
             
                    // get possible conversion factor for units
         | 
| 471 471 | 
             
                    double conversion = conversion_factor(l_den, r_den);
         | 
| 472 472 | 
             
                    // skip incompatible denominator
         |