#ifndef _CTF_AST_H
#define _CTF_AST_H
+#include <memory>
+
#include <glib.h>
#include <stdint.h>
#include <stdio.h>
const char *node_type(struct ctf_node *node);
+struct ctf_visitor_generate_ir_deleter
+{
+ void operator()(struct ctf_visitor_generate_ir *visitor);
+};
+
struct ctf_visitor_generate_ir
{
+ using UP = std::unique_ptr<ctf_visitor_generate_ir, ctf_visitor_generate_ir_deleter>;
+
explicit ctf_visitor_generate_ir(ctf_metadata_decoder_config decoderConfig,
bt2c::Logger loggerParam) :
decoder_config {std::move(decoderConfig)},
bt2c::Logger logger;
};
-struct ctf_visitor_generate_ir *
+ctf_visitor_generate_ir::UP
ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *config);
-void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor);
-
bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *visitor);
struct ctf_trace_class *
bt2c::Logger logger;
struct ctf_scanner *scanner = nullptr;
GString *text = nullptr;
- struct ctf_visitor_generate_ir *visitor = nullptr;
+ ctf_visitor_generate_ir::UP visitor;
bt_uuid_t uuid {};
bool is_uuid_set = false;
int bo = 0;
}
BT_CPPLOGD_SPEC(mdec->logger, "Destroying CTF metadata decoder: addr={}", fmt::ptr(mdec));
- ctf_visitor_generate_ir_destroy(mdec->visitor);
+
delete mdec;
}
}
if (mdec->config.create_trace_class) {
- ret = ctf_visitor_generate_ir_visit_node(mdec->visitor, &mdec->scanner->ast->root);
+ ret = ctf_visitor_generate_ir_visit_node(mdec->visitor.get(), &mdec->scanner->ast->root);
switch (ret) {
case 0:
/* Success */
{
BT_ASSERT_DBG(mdec);
BT_ASSERT_DBG(mdec->config.create_trace_class);
- return ctf_visitor_generate_ir_get_ir_trace_class(mdec->visitor);
+ return ctf_visitor_generate_ir_get_ir_trace_class(mdec->visitor.get());
}
struct ctf_trace_class *
{
BT_ASSERT_DBG(mdec);
BT_ASSERT_DBG(mdec->config.create_trace_class);
- return ctf_visitor_generate_ir_borrow_ctf_trace_class(mdec->visitor);
+ return ctf_visitor_generate_ir_borrow_ctf_trace_class(mdec->visitor.get());
}
const char *ctf_metadata_decoder_get_text(struct ctf_metadata_decoder *mdec)
* @param trace Associated trace
* @returns New visitor context, or NULL on error
*/
-static struct ctf_visitor_generate_ir *
+static ctf_visitor_generate_ir::UP
ctx_create(const struct ctf_metadata_decoder_config *decoder_config, const bt2c::Logger& logger)
{
BT_ASSERT(decoder_config);
- ctf_visitor_generate_ir *ctx = new ctf_visitor_generate_ir {*decoder_config, logger};
+ ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {*decoder_config, logger}};
if (decoder_config->self_comp) {
ctx->trace_class = bt_trace_class_create(decoder_config->self_comp);
}
/* Root declaration scope */
- ctx->current_scope = ctx_decl_scope_create(ctx, NULL);
+ ctx->current_scope = ctx_decl_scope_create(ctx.get(), NULL);
if (!ctx->current_scope) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(ctx->logger, "Cannot create declaration scope.");
goto error;
goto end;
error:
- ctx_destroy(ctx);
- ctx = NULL;
+ ctx.reset();
end:
return ctx;
return ret;
}
-struct ctf_visitor_generate_ir *
+ctf_visitor_generate_ir::UP
ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *decoder_config)
{
- struct ctf_visitor_generate_ir *ctx = NULL;
-
bt2c::Logger logger {decoder_config->logger, "PLUGIN/CTF/META/IR-VISITOR"};
/* Create visitor's context */
- ctx = ctx_create(decoder_config, logger);
+ ctf_visitor_generate_ir::UP ctx = ctx_create(decoder_config, logger);
+
if (!ctx) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Cannot create visitor's context.");
goto error;
goto end;
error:
- ctx_destroy(ctx);
- ctx = NULL;
+ ctx.reset();
end:
return ctx;
}
-void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor)
+static void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor)
{
ctx_destroy(visitor);
}
+void ctf_visitor_generate_ir_deleter::operator()(ctf_visitor_generate_ir *visitor)
+{
+ ctf_visitor_generate_ir_destroy(visitor);
+}
+
bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *ctx)
{
BT_ASSERT_DBG(ctx);