summaryrefslogtreecommitdiffstats
path: root/third_party/rust/uniffi_core/src/metadata.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/uniffi_core/src/metadata.rs')
-rw-r--r--third_party/rust/uniffi_core/src/metadata.rs53
1 files changed, 45 insertions, 8 deletions
diff --git a/third_party/rust/uniffi_core/src/metadata.rs b/third_party/rust/uniffi_core/src/metadata.rs
index 770d2b36d5..dc61a1bfcb 100644
--- a/third_party/rust/uniffi_core/src/metadata.rs
+++ b/third_party/rust/uniffi_core/src/metadata.rs
@@ -32,13 +32,14 @@ pub mod codes {
pub const RECORD: u8 = 2;
pub const ENUM: u8 = 3;
pub const INTERFACE: u8 = 4;
- pub const ERROR: u8 = 5;
pub const NAMESPACE: u8 = 6;
pub const CONSTRUCTOR: u8 = 7;
pub const UDL_FILE: u8 = 8;
pub const CALLBACK_INTERFACE: u8 = 9;
pub const TRAIT_METHOD: u8 = 10;
pub const UNIFFI_TRAIT: u8 = 11;
+ pub const TRAIT_INTERFACE: u8 = 12;
+ pub const CALLBACK_TRAIT_INTERFACE: u8 = 13;
pub const UNKNOWN: u8 = 255;
// Type codes
@@ -66,20 +67,24 @@ pub mod codes {
pub const TYPE_CALLBACK_INTERFACE: u8 = 21;
pub const TYPE_CUSTOM: u8 = 22;
pub const TYPE_RESULT: u8 = 23;
- pub const TYPE_FUTURE: u8 = 24;
- pub const TYPE_FOREIGN_EXECUTOR: u8 = 25;
+ pub const TYPE_TRAIT_INTERFACE: u8 = 24;
+ pub const TYPE_CALLBACK_TRAIT_INTERFACE: u8 = 25;
pub const TYPE_UNIT: u8 = 255;
- // Literal codes for LiteralMetadata - note that we don't support
- // all variants in the "emit/reader" context.
+ // Literal codes for LiteralMetadata
pub const LIT_STR: u8 = 0;
pub const LIT_INT: u8 = 1;
pub const LIT_FLOAT: u8 = 2;
pub const LIT_BOOL: u8 = 3;
- pub const LIT_NULL: u8 = 4;
+ pub const LIT_NONE: u8 = 4;
+ pub const LIT_SOME: u8 = 5;
+ pub const LIT_EMPTY_SEQ: u8 = 6;
}
-const BUF_SIZE: usize = 4096;
+// For large errors (e.g. enums) a buffer size of ~4k - ~8k
+// is not enough. See issues on Github: #1968 and #2041 and
+// for an example see fixture/large-error
+const BUF_SIZE: usize = 16384;
// This struct is a kludge around the fact that Rust const generic support doesn't quite handle our
// needs.
@@ -168,7 +173,17 @@ impl MetadataBuffer {
self.concat_value(value as u8)
}
- // Concatenate a string to this buffer.
+ // Option<bool>
+ pub const fn concat_option_bool(self, value: Option<bool>) -> Self {
+ self.concat_value(match value {
+ None => 0,
+ Some(false) => 1,
+ Some(true) => 2,
+ })
+ }
+
+ // Concatenate a string to this buffer. The maximum string length is 255 bytes. For longer strings,
+ // use `concat_long_str()`.
//
// Strings are encoded as a `u8` length, followed by the utf8 data.
//
@@ -189,6 +204,28 @@ impl MetadataBuffer {
self
}
+ // Concatenate a longer string to this buffer.
+ //
+ // Strings are encoded as a `u16` length, followed by the utf8 data.
+ //
+ // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
+ // allocated an extra buffer.
+ pub const fn concat_long_str(mut self, string: &str) -> Self {
+ assert!(self.size + string.len() + 1 < BUF_SIZE);
+ let [lo, hi] = (string.len() as u16).to_le_bytes();
+ self.bytes[self.size] = lo;
+ self.bytes[self.size + 1] = hi;
+ self.size += 2;
+ let bytes = string.as_bytes();
+ let mut i = 0;
+ while i < bytes.len() {
+ self.bytes[self.size] = bytes[i];
+ self.size += 1;
+ i += 1;
+ }
+ self
+ }
+
// Create an array from this MetadataBuffer
//
// SIZE should always be `self.size`. This is part of the kludge to hold us over until Rust