Skip to content

Commit 04d96da

Browse files
committed
Implements call stack queries (functions and mixins)
1 parent 7abaa75 commit 04d96da

File tree

8 files changed

+100
-0
lines changed

8 files changed

+100
-0
lines changed

include/sass/context.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ ADDAPI struct Sass_Options* ADDCALL sass_compiler_get_options(struct Sass_Compil
143143
ADDAPI size_t ADDCALL sass_compiler_get_import_stack_size(struct Sass_Compiler* compiler);
144144
ADDAPI Sass_Import_Entry ADDCALL sass_compiler_get_last_import(struct Sass_Compiler* compiler);
145145
ADDAPI Sass_Import_Entry ADDCALL sass_compiler_get_import_entry(struct Sass_Compiler* compiler, size_t idx);
146+
ADDAPI size_t ADDCALL sass_compiler_get_callee_stack_size(struct Sass_Compiler* compiler);
147+
ADDAPI Sass_Callee_Entry ADDCALL sass_compiler_get_last_callee(struct Sass_Compiler* compiler);
148+
ADDAPI Sass_Callee_Entry ADDCALL sass_compiler_get_callee_entry(struct Sass_Compiler* compiler, size_t idx);
146149

147150
// Push function for paths (no manipulation support for now)
148151
ADDAPI void ADDCALL sass_option_push_plugin_path (struct Sass_Options* options, const char* path);

include/sass/functions.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ extern "C" {
1111

1212

1313
// Forward declaration
14+
struct Sass_Callee;
1415
struct Sass_Import;
1516
struct Sass_Options;
1617
struct Sass_Compiler;
1718
struct Sass_Importer;
1819
struct Sass_Function;
1920

21+
// Typedef helpers for callee lists
22+
typedef struct Sass_Callee (*Sass_Callee_Entry);
2023
// Typedef helpers for import lists
2124
typedef struct Sass_Import (*Sass_Import_Entry);
2225
typedef struct Sass_Import* (*Sass_Import_List);
@@ -34,6 +37,12 @@ typedef struct Sass_Function* (*Sass_Function_List);
3437
typedef union Sass_Value* (*Sass_Function_Fn)
3538
(const union Sass_Value*, Sass_Function_Entry cb, struct Sass_Compiler* compiler);
3639

40+
// Type of function calls
41+
enum Sass_Callee_Type {
42+
SASS_CALLEE_MIXIN,
43+
SASS_CALLEE_FUNCTION,
44+
SASS_CALLEE_C_FUNCTION,
45+
};
3746

3847
// Creator for sass custom importer return argument list
3948
ADDAPI Sass_Importer_List ADDCALL sass_make_importer_list (size_t length);
@@ -66,6 +75,12 @@ ADDAPI Sass_Import_Entry ADDCALL sass_import_set_error(Sass_Import_Entry import,
6675
ADDAPI void ADDCALL sass_import_set_list_entry (Sass_Import_List list, size_t idx, Sass_Import_Entry entry);
6776
ADDAPI Sass_Import_Entry ADDCALL sass_import_get_list_entry (Sass_Import_List list, size_t idx);
6877

78+
// Getters for callee entry
79+
ADDAPI const char* ADDCALL sass_callee_get_name (Sass_Callee_Entry);
80+
ADDAPI const char* ADDCALL sass_callee_get_path (Sass_Callee_Entry);
81+
ADDAPI size_t ADDCALL sass_callee_get_line (Sass_Callee_Entry);
82+
ADDAPI size_t ADDCALL sass_callee_get_column (Sass_Callee_Entry);
83+
ADDAPI enum Sass_Callee_Type ADDCALL sass_callee_get_type (Sass_Callee_Entry);
6984
// Getters for import entry
7085
ADDAPI const char* ADDCALL sass_import_get_imp_path (Sass_Import_Entry);
7186
ADDAPI const char* ADDCALL sass_import_get_abs_path (Sass_Import_Entry);

src/context.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ namespace Sass {
5050
std::map<const std::string, StyleSheet> sheets;
5151
Subset_Map subset_map;
5252
std::vector<Sass_Import_Entry> import_stack;
53+
std::vector<Sass_Callee> callee_stack;
5354

5455
struct Sass_Compiler* c_compiler;
5556

src/eval.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "parser.hpp"
2525
#include "expand.hpp"
2626
#include "color_maps.hpp"
27+
#include "sass_functions.hpp"
2728

2829
namespace Sass {
2930

@@ -334,6 +335,16 @@ namespace Sass {
334335
// try to use generic function
335336
if (env->has("@warn[f]")) {
336337

338+
// add call stack entry
339+
ctx.callee_stack.push_back({
340+
"@warn",
341+
w->pstate().path,
342+
w->pstate().line + 1,
343+
w->pstate().column + 1,
344+
SASS_CALLEE_FUNCTION,
345+
{ env }
346+
});
347+
337348
Definition_Ptr def = SASS_MEMORY_CAST(Definition, (*env)["@warn[f]"]);
338349
// Block_Obj body = def->block();
339350
// Native_Function func = def->native_function();
@@ -345,6 +356,7 @@ namespace Sass {
345356
sass_list_set_value(c_args, 0, message->perform(&to_c));
346357
union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
347358
ctx.c_options.output_style = outstyle;
359+
ctx.callee_stack.pop_back();
348360
sass_delete_value(c_args);
349361
sass_delete_value(c_val);
350362
return 0;
@@ -370,6 +382,16 @@ namespace Sass {
370382
// try to use generic function
371383
if (env->has("@error[f]")) {
372384

385+
// add call stack entry
386+
ctx.callee_stack.push_back({
387+
"@error",
388+
e->pstate().path,
389+
e->pstate().line + 1,
390+
e->pstate().column + 1,
391+
SASS_CALLEE_FUNCTION,
392+
{ env }
393+
});
394+
373395
Definition_Ptr def = SASS_MEMORY_CAST(Definition, (*env)["@error[f]"]);
374396
// Block_Obj body = def->block();
375397
// Native_Function func = def->native_function();
@@ -381,6 +403,7 @@ namespace Sass {
381403
sass_list_set_value(c_args, 0, message->perform(&to_c));
382404
union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
383405
ctx.c_options.output_style = outstyle;
406+
ctx.callee_stack.pop_back();
384407
sass_delete_value(c_args);
385408
sass_delete_value(c_val);
386409
return 0;
@@ -403,6 +426,16 @@ namespace Sass {
403426
// try to use generic function
404427
if (env->has("@debug[f]")) {
405428

429+
// add call stack entry
430+
ctx.callee_stack.push_back({
431+
"@debug",
432+
d->pstate().path,
433+
d->pstate().line + 1,
434+
d->pstate().column + 1,
435+
SASS_CALLEE_FUNCTION,
436+
{ env }
437+
});
438+
406439
Definition_Ptr def = SASS_MEMORY_CAST(Definition, (*env)["@debug[f]"]);
407440
// Block_Obj body = def->block();
408441
// Native_Function func = def->native_function();
@@ -414,6 +447,7 @@ namespace Sass {
414447
sass_list_set_value(c_args, 0, message->perform(&to_c));
415448
union Sass_Value* c_val = c_func(c_args, c_function, ctx.c_compiler);
416449
ctx.c_options.output_style = outstyle;
450+
ctx.callee_stack.pop_back();
417451
sass_delete_value(c_args);
418452
sass_delete_value(c_val);
419453
return 0;
@@ -874,6 +908,14 @@ namespace Sass {
874908
bind(std::string("Function"), c->name(), params, args, &ctx, &fn_env, this);
875909
Backtrace here(backtrace(), c->pstate(), ", in function `" + c->name() + "`");
876910
exp.backtrace_stack.push_back(&here);
911+
ctx.callee_stack.push_back({
912+
c->name().c_str(),
913+
c->pstate().path,
914+
c->pstate().line + 1,
915+
c->pstate().column + 1,
916+
SASS_CALLEE_FUNCTION
917+
});
918+
877919
// eval the body if user-defined or special, invoke underlying CPP function if native
878920
if (body /* && !Prelexer::re_special_fun(name.c_str()) */) {
879921
result = body->perform(this);
@@ -885,6 +927,7 @@ namespace Sass {
885927
error(std::string("Function ") + c->name() + " did not return a value", c->pstate());
886928
}
887929
exp.backtrace_stack.pop_back();
930+
ctx.callee_stack.pop_back();
888931
}
889932

890933
// else if it's a user-defined c function
@@ -905,6 +948,13 @@ namespace Sass {
905948

906949
Backtrace here(backtrace(), c->pstate(), ", in function `" + c->name() + "`");
907950
exp.backtrace_stack.push_back(&here);
951+
ctx.callee_stack.push_back({
952+
c->name().c_str(),
953+
c->pstate().path,
954+
c->pstate().line + 1,
955+
c->pstate().column + 1,
956+
SASS_CALLEE_C_FUNCTION
957+
});
908958

909959
To_C to_c;
910960
union Sass_Value* c_args = sass_make_list(params->length(), SASS_COMMA, false);
@@ -924,6 +974,7 @@ namespace Sass {
924974
result = cval_to_astnode(c_val, backtrace(), c->pstate());
925975

926976
exp.backtrace_stack.pop_back();
977+
ctx.callee_stack.pop_back();
927978
sass_delete_value(c_args);
928979
if (c_val != c_args)
929980
sass_delete_value(c_val);

src/expand.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "backtrace.hpp"
1010
#include "context.hpp"
1111
#include "parser.hpp"
12+
#include "sass_functions.hpp"
1213

1314
namespace Sass {
1415

@@ -706,6 +707,14 @@ namespace Sass {
706707
Arguments_Obj args = SASS_MEMORY_CAST(Arguments, rv);
707708
Backtrace new_bt(backtrace(), c->pstate(), ", in mixin `" + c->name() + "`");
708709
backtrace_stack.push_back(&new_bt);
710+
ctx.callee_stack.push_back({
711+
c->name().c_str(),
712+
c->pstate().path,
713+
c->pstate().line + 1,
714+
c->pstate().column + 1,
715+
SASS_CALLEE_MIXIN
716+
});
717+
709718
Env new_env(def->environment());
710719
env_stack.push_back(&new_env);
711720
if (c->block()) {
@@ -735,6 +744,7 @@ namespace Sass {
735744

736745
env_stack.pop_back();
737746
backtrace_stack.pop_back();
747+
ctx.callee_stack.pop_back();
738748

739749
recursions --;
740750
return trace.detach();

src/sass_context.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,10 @@ extern "C" {
674674
size_t ADDCALL sass_compiler_get_import_stack_size(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->import_stack.size(); }
675675
Sass_Import_Entry ADDCALL sass_compiler_get_last_import(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->import_stack.back(); }
676676
Sass_Import_Entry ADDCALL sass_compiler_get_import_entry(struct Sass_Compiler* compiler, size_t idx) { return compiler->cpp_ctx->import_stack[idx]; }
677+
// Getters for Sass_Compiler options (query function stack)
678+
size_t ADDCALL sass_compiler_get_callee_stack_size(struct Sass_Compiler* compiler) { return compiler->cpp_ctx->callee_stack.size(); }
679+
Sass_Callee_Entry ADDCALL sass_compiler_get_last_callee(struct Sass_Compiler* compiler) { return &compiler->cpp_ctx->callee_stack.back(); }
680+
Sass_Callee_Entry ADDCALL sass_compiler_get_callee_entry(struct Sass_Compiler* compiler, size_t idx) { return &compiler->cpp_ctx->callee_stack[idx]; }
677681

678682
// Calculate the size of the stored null terminated array
679683
size_t ADDCALL sass_context_get_included_files_size (struct Sass_Context* ctx)

src/sass_functions.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ extern "C" {
126126
free(import);
127127
}
128128

129+
// Getter for callee entry
130+
const char* ADDCALL sass_callee_get_name(Sass_Callee_Entry entry) { return entry->name; }
131+
const char* ADDCALL sass_callee_get_path(Sass_Callee_Entry entry) { return entry->path; }
132+
size_t ADDCALL sass_callee_get_line(Sass_Callee_Entry entry) { return entry->line; }
133+
size_t ADDCALL sass_callee_get_column(Sass_Callee_Entry entry) { return entry->column; }
134+
enum Sass_Callee_Type ADDCALL sass_callee_get_type(Sass_Callee_Entry entry) { return entry->type; }
135+
129136
// Getter for import entry
130137
const char* ADDCALL sass_import_get_imp_path(Sass_Import_Entry entry) { return entry->imp_path; }
131138
const char* ADDCALL sass_import_get_abs_path(Sass_Import_Entry entry) { return entry->abs_path; }

src/sass_functions.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ struct Sass_Import {
2222
size_t column;
2323
};
2424

25+
// External call entry
26+
struct Sass_Callee {
27+
const char* name;
28+
const char* path;
29+
size_t line;
30+
size_t column;
31+
enum Sass_Callee_Type type;
32+
};
33+
2534
// Struct to hold importer callback
2635
struct Sass_Importer {
2736
Sass_Importer_Fn importer;

0 commit comments

Comments
 (0)