lvalp->s = objstack_alloc(scanner->objstack, len);
if (src[0] == 'L') {
// TODO: import wide string
- _BT_LOGE_LINENO(yyget_lineno(scanner),
+ _BT_LOGE_APPEND_CAUSE_LINENO(yyget_lineno(scanner),
"wide characters are not supported as of this version: "
"scanner-addr=%p", scanner);
return -1;
node = objstack_alloc(scanner->objstack, sizeof(*node));
if (!node) {
- _BT_LOGE_LINENO(yyget_lineno(scanner->scanner),
+ _BT_LOGE_APPEND_CAUSE_LINENO(yyget_lineno(scanner->scanner),
"failed to allocate one stack entry: "
"scanner-addr=%p", scanner);
return &error_node;
static
void yyerror(struct ctf_scanner *scanner, yyscan_t yyscanner, const char *str)
{
- _BT_LOGE_LINENO(yyget_lineno(scanner->scanner),
+ _BT_LOGE_APPEND_CAUSE_LINENO(yyget_lineno(scanner->scanner),
"%s: token=\"%s\"", str, yyget_text(scanner->scanner));
}
if (!scanner)
return;
- finalize_scope(&scanner->root_scope);
+
+ struct ctf_scanner_scope *scope = scanner->cs;
+
+ do {
+ struct ctf_scanner_scope *parent = scope->parent;
+ finalize_scope(scope);
+
+ /*
+ * The root scope is allocated within the ctf_scanner structure,
+ * do doesn't need freeing. All others are allocated on their
+ * own.
+ */
+ if (scope != &scanner->root_scope)
+ free(scope);
+
+ scope = parent;
+ } while (scope);
+
objstack_destroy(scanner->objstack);
ret = yylex_destroy(scanner->scanner);
if (ret)