Coverage Report

Created: 2023-06-07 06:26

/src/libsass/src/fn_maps.cpp
Line
Count
Source (jump to first uncovered line)
1
#include "operators.hpp"
2
#include "fn_utils.hpp"
3
#include "fn_maps.hpp"
4
5
namespace Sass {
6
7
  namespace Functions {
8
9
    /////////////////
10
    // MAP FUNCTIONS
11
    /////////////////
12
13
    Signature map_get_sig = "map-get($map, $key)";
14
    BUILT_IN(map_get)
15
0
    {
16
      // leaks for "map-get((), foo)" if not Obj
17
      // investigate why this is (unexpected)
18
0
      Map_Obj m = ARGM("$map", Map);
19
0
      ExpressionObj v = ARG("$key", Expression);
20
0
      try {
21
0
        ValueObj val = m->at(v);
22
0
        if (!val) return SASS_MEMORY_NEW(Null, pstate);
23
0
        val->set_delayed(false);
24
0
        return val.detach();
25
0
      } catch (const std::out_of_range&) {
26
0
        return SASS_MEMORY_NEW(Null, pstate);
27
0
      }
28
0
      catch (...) { throw; }
29
0
    }
30
31
    Signature map_has_key_sig = "map-has-key($map, $key)";
32
    BUILT_IN(map_has_key)
33
0
    {
34
0
      Map_Obj m = ARGM("$map", Map);
35
0
      ExpressionObj v = ARG("$key", Expression);
36
0
      return SASS_MEMORY_NEW(Boolean, pstate, m->has(v));
37
0
    }
38
39
    Signature map_keys_sig = "map-keys($map)";
40
    BUILT_IN(map_keys)
41
0
    {
42
0
      Map_Obj m = ARGM("$map", Map);
43
0
      List* result = SASS_MEMORY_NEW(List, pstate, m->length(), SASS_COMMA);
44
0
      for ( auto key : m->keys()) {
45
0
        result->append(key);
46
0
      }
47
0
      return result;
48
0
    }
49
50
    Signature map_values_sig = "map-values($map)";
51
    BUILT_IN(map_values)
52
0
    {
53
0
      Map_Obj m = ARGM("$map", Map);
54
0
      List* result = SASS_MEMORY_NEW(List, pstate, m->length(), SASS_COMMA);
55
0
      for ( auto key : m->keys()) {
56
0
        result->append(m->at(key));
57
0
      }
58
0
      return result;
59
0
    }
60
61
    Signature map_merge_sig = "map-merge($map1, $map2)";
62
    BUILT_IN(map_merge)
63
0
    {
64
0
      Map_Obj m1 = ARGM("$map1", Map);
65
0
      Map_Obj m2 = ARGM("$map2", Map);
66
67
0
      size_t len = m1->length() + m2->length();
68
0
      Map* result = SASS_MEMORY_NEW(Map, pstate, len);
69
      // concat not implemented for maps
70
0
      *result += m1;
71
0
      *result += m2;
72
0
      return result;
73
0
    }
74
75
    Signature map_remove_sig = "map-remove($map, $keys...)";
76
    BUILT_IN(map_remove)
77
0
    {
78
0
      bool remove;
79
0
      Map_Obj m = ARGM("$map", Map);
80
0
      List_Obj arglist = ARG("$keys", List);
81
0
      Map* result = SASS_MEMORY_NEW(Map, pstate, 1);
82
0
      for (auto key : m->keys()) {
83
0
        remove = false;
84
0
        for (size_t j = 0, K = arglist->length(); j < K && !remove; ++j) {
85
0
          remove = Operators::eq(key, arglist->value_at_index(j));
86
0
        }
87
0
        if (!remove) *result << std::make_pair(key, m->at(key));
88
0
      }
89
0
      return result;
90
0
    }
91
92
  }
93
94
}