From 86c070baa8612e5ac2c8a7ccfb03d50e940a4858 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Thu, 6 Apr 2023 14:29:53 +0200 Subject: [PATCH] gccrs: libproc_macro: Add literal ffi implementations Add literal type related ffi functions implementation. libgrust/ChangeLog: * libproc_macro/literal.h (Literal__drop): Implement drop. (Literal__string): Constructor from a string function prototype. (Literal__byte_string): Constructor from a byte string function prototype. (Literal__from_string): Add function body, no implementation yet. * libproc_macro/literal.cc: New file. Signed-off-by: Pierre-Emmanuel Patry --- libgrust/libproc_macro/literal.cc | 80 +++++++++++++++++++++++++++++++ libgrust/libproc_macro/literal.h | 15 ++++++ 2 files changed, 95 insertions(+) create mode 100644 libgrust/libproc_macro/literal.cc diff --git a/libgrust/libproc_macro/literal.cc b/libgrust/libproc_macro/literal.cc new file mode 100644 index 000000000000..a667fcb72fe2 --- /dev/null +++ b/libgrust/libproc_macro/literal.cc @@ -0,0 +1,80 @@ +// Copyright (C) 2023 Free Software Foundation, Inc. +// +// This file is part of the GNU Proc Macro Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +#include "literal.h" +#include + +extern "C" { + +void +Literal__drop (Literal *lit) +{ + switch (lit->tag) + { + case STRING: + delete lit->payload.string_payload.data; + lit->payload.string_payload.len = 0; + break; + case BYTE_STRING: + delete lit->payload.byte_string_payload.data; + lit->payload.byte_string_payload.size = 0; + break; + case CHAR: + case UNSIGNED: + case SIGNED: + case USIZE: + case ISIZE: + case FLOAT32: + case FLOAT64: + break; + } +} + +Literal +Literal__string (const unsigned char *str, std::uint64_t len) +{ + unsigned char *data = new unsigned char[len]; + StringPayload str_payload = {data, len}; + std::memcpy (data, str, len); + LiteralPayload payload; + payload.string_payload = str_payload; + return {STRING, payload}; +} + +Literal +Literal__byte_string (const std::uint8_t *bytes, std::uint64_t len) +{ + std::uint8_t *data = new std::uint8_t[len]; + ByteStringPayload bstr_payload = {data, len}; + std::memcpy (data, bytes, len); + LiteralPayload payload; + payload.byte_string_payload = bstr_payload; + return {BYTE_STRING, payload}; +} + +bool +Literal__from_string (const unsigned char *str, std::uint64_t len, Literal *lit) +{ + // FIXME: implement this function with parser + return false; +} +} diff --git a/libgrust/libproc_macro/literal.h b/libgrust/libproc_macro/literal.h index 7b3e3c5965ad..62a14522d1db 100644 --- a/libgrust/libproc_macro/literal.h +++ b/libgrust/libproc_macro/literal.h @@ -158,4 +158,19 @@ struct Literal LiteralPayload payload; }; +extern "C" { +void +Literal__drop (Literal *lit); + +Literal +Literal__string (const unsigned char *str, std::uint64_t len); + +Literal +Literal__byte_string (const std::uint8_t *bytes, std::uint64_t len); + +bool +Literal__from_string (const unsigned char *str, std::uint64_t len, + Literal *lit); +} + #endif /* ! LITERAL_H */ -- 2.47.2