Match std::string's behavior on (nullptr, 0) construction
diff --git a/src/cxx.cc b/src/cxx.cc
index 715e0ce..cbda8b9 100644
--- a/src/cxx.cc
+++ b/src/cxx.cc
@@ -57,12 +57,23 @@
String::~String() noexcept { cxxbridge05$string$drop(this); }
-String::String(const std::string &s) : String(s.data(), s.length()) {}
+String::String(const std::string &s) {
+ if (!cxxbridge05$string$from(this, s.data(), s.length())) {
+ panic<std::invalid_argument>("data for rust::String is not utf-8");
+ }
+}
-String::String(const char *s) : String(s, std::strlen(s)) {}
+String::String(const char *s) {
+ if (!cxxbridge05$string$from(this, s, std::strlen(s))) {
+ panic<std::invalid_argument>("data for rust::String is not utf-8");
+ }
+}
String::String(const char *s, size_t len) {
- if (!cxxbridge05$string$from(this, s, len)) {
+ if (!cxxbridge05$string$from(
+ this,
+ s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s,
+ len)) {
panic<std::invalid_argument>("data for rust::String is not utf-8");
}
}
@@ -104,15 +115,26 @@
return os;
}
-Str::Str() noexcept : repr(Repr{reinterpret_cast<const char *>(this), 0}) {}
+Str::Str() noexcept : repr(Repr{reinterpret_cast<const char *>(1), 0}) {}
Str::Str(const Str &) noexcept = default;
-Str::Str(const std::string &s) : Str(s.data(), s.length()) {}
+Str::Str(const std::string &s) : repr(Repr{s.data(), s.length()}) {
+ if (!cxxbridge05$str$valid(this->repr.ptr, this->repr.len)) {
+ panic<std::invalid_argument>("data for rust::Str is not utf-8");
+ }
+}
-Str::Str(const char *s) : Str(s, std::strlen(s)) {}
+Str::Str(const char *s) : repr(Repr{s, std::strlen(s)}) {
+ if (!cxxbridge05$str$valid(this->repr.ptr, this->repr.len)) {
+ panic<std::invalid_argument>("data for rust::Str is not utf-8");
+ }
+}
-Str::Str(const char *s, size_t len) : repr(Repr{s, len}) {
+Str::Str(const char *s, size_t len)
+ : repr(
+ Repr{s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s,
+ len}) {
if (!cxxbridge05$str$valid(this->repr.ptr, this->repr.len)) {
panic<std::invalid_argument>("data for rust::Str is not utf-8");
}