Skip to content

Commit a089875

Browse files
authored
Merge pull request #3022 from mgreter/bugfix/3019-extend-error-src-lifetime
Extend `error_src` lifetime on c-api context
2 parents f7567ea + ed91ca4 commit a089875

File tree

6 files changed

+16
-5
lines changed

6 files changed

+16
-5
lines changed

docs/api-context-internal.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ struct Sass_Context : Sass_Options
117117
char* error_file;
118118
size_t error_line;
119119
size_t error_column;
120-
const char* error_src;
120+
char* error_src;
121121

122122
// report imported files
123123
char** included_files;

docs/api-context.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ char* error_message;
124124
char* error_file;
125125
size_t error_line;
126126
size_t error_column;
127+
char* error_src;
127128
```
128129
```C
129130
// report imported files
@@ -202,6 +203,7 @@ const char* sass_context_get_error_json (struct Sass_Context* ctx);
202203
const char* sass_context_get_error_text (struct Sass_Context* ctx);
203204
const char* sass_context_get_error_message (struct Sass_Context* ctx);
204205
const char* sass_context_get_error_file (struct Sass_Context* ctx);
206+
const char* sass_context_get_error_src (struct Sass_Context* ctx);
205207
size_t sass_context_get_error_line (struct Sass_Context* ctx);
206208
size_t sass_context_get_error_column (struct Sass_Context* ctx);
207209
const char* sass_context_get_source_map_string (struct Sass_Context* ctx);
@@ -221,6 +223,7 @@ char* sass_context_take_error_json (struct Sass_Context* ctx);
221223
char* sass_context_take_error_text (struct Sass_Context* ctx);
222224
char* sass_context_take_error_message (struct Sass_Context* ctx);
223225
char* sass_context_take_error_file (struct Sass_Context* ctx);
226+
char* sass_context_take_error_src (struct Sass_Context* ctx);
224227
char* sass_context_take_output_string (struct Sass_Context* ctx);
225228
char* sass_context_take_source_map_string (struct Sass_Context* ctx);
226229
```

include/sass/context.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ ADDAPI char* ADDCALL sass_context_take_error_json (struct Sass_Context* ctx);
134134
ADDAPI char* ADDCALL sass_context_take_error_text (struct Sass_Context* ctx);
135135
ADDAPI char* ADDCALL sass_context_take_error_message (struct Sass_Context* ctx);
136136
ADDAPI char* ADDCALL sass_context_take_error_file (struct Sass_Context* ctx);
137+
ADDAPI char* ADDCALL sass_context_take_error_src (struct Sass_Context* ctx);
137138
ADDAPI char* ADDCALL sass_context_take_output_string (struct Sass_Context* ctx);
138139
ADDAPI char* ADDCALL sass_context_take_source_map_string (struct Sass_Context* ctx);
139140
ADDAPI char** ADDCALL sass_context_take_included_files (struct Sass_Context* ctx);

src/parser.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2894,6 +2894,10 @@ namespace Sass {
28942894
Position p(pos.line ? pos : before_token);
28952895
ParserState pstate(path, source, p, Offset(0, 0));
28962896
// `pstate.src` may not outlive stack unwind so we must copy it.
2897+
// This is needed since we often parse dynamically generated code,
2898+
// e.g. for interpolations, and we normally don't want to keep this
2899+
// memory around after we parsed the AST tree successfully. Only on
2900+
// errors we want to preserve them for better error reporting.
28972901
char *src_copy = sass_copy_c_string(pstate.src);
28982902
pstate.src = src_copy;
28992903
traces.push_back(Backtrace(pstate));

src/sass_context.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ namespace Sass {
122122
c_ctx->error_file = sass_copy_c_string(e.pstate.path);
123123
c_ctx->error_line = e.pstate.line + 1;
124124
c_ctx->error_column = e.pstate.column + 1;
125-
c_ctx->error_src = e.pstate.src;
125+
c_ctx->error_src = sass_copy_c_string(e.pstate.src);
126126
c_ctx->output_string = 0;
127127
c_ctx->source_map_string = 0;
128128
json_delete(json_err);
@@ -277,8 +277,8 @@ extern "C" {
277277
c_ctx->error_message = 0;
278278
c_ctx->error_status = 0;
279279
// reset error position
280-
c_ctx->error_src = 0;
281280
c_ctx->error_file = 0;
281+
c_ctx->error_src = 0;
282282
c_ctx->error_line = std::string::npos;
283283
c_ctx->error_column = std::string::npos;
284284

@@ -542,6 +542,7 @@ extern "C" {
542542
if (ctx->error_text) free(ctx->error_text);
543543
if (ctx->error_json) free(ctx->error_json);
544544
if (ctx->error_file) free(ctx->error_file);
545+
if (ctx->error_src) free(ctx->error_src);
545546
free_string_array(ctx->included_files);
546547
// play safe and reset properties
547548
ctx->output_string = 0;
@@ -550,6 +551,7 @@ extern "C" {
550551
ctx->error_text = 0;
551552
ctx->error_json = 0;
552553
ctx->error_file = 0;
554+
ctx->error_src = 0;
553555
ctx->included_files = 0;
554556
// debug leaked memory
555557
#ifdef DEBUG_SHARED_PTR
@@ -648,9 +650,9 @@ extern "C" {
648650
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_message);
649651
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_text);
650652
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_file);
653+
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_src);
651654
IMPLEMENT_SASS_CONTEXT_GETTER(size_t, error_line);
652655
IMPLEMENT_SASS_CONTEXT_GETTER(size_t, error_column);
653-
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_src);
654656
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, output_string);
655657
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, source_map_string);
656658
IMPLEMENT_SASS_CONTEXT_GETTER(char**, included_files);
@@ -660,6 +662,7 @@ extern "C" {
660662
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_message);
661663
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_text);
662664
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_file);
665+
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_src);
663666
IMPLEMENT_SASS_CONTEXT_TAKER(char*, output_string);
664667
IMPLEMENT_SASS_CONTEXT_TAKER(char*, source_map_string);
665668
IMPLEMENT_SASS_CONTEXT_TAKER(char**, included_files);

src/sass_context.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ struct Sass_Context : Sass_Options
9090
char* error_file;
9191
size_t error_line;
9292
size_t error_column;
93-
const char* error_src;
93+
char* error_src;
9494

9595
// report imported files
9696
char** included_files;

0 commit comments

Comments
 (0)