This commit is contained in:
+213
@@ -0,0 +1,213 @@
|
||||
# Protocol Buffers - Google's data interchange format
|
||||
# Copyright 2022 Google Inc. All rights reserved.
|
||||
#
|
||||
# Use of this source code is governed by a BSD-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
module Google
|
||||
module Protobuf
|
||||
class FFI
|
||||
extend ::FFI::Library
|
||||
# Workaround for Bazel's use of symlinks + JRuby's __FILE__ and `caller`
|
||||
# that resolves them.
|
||||
if ENV['BAZEL'] == 'true'
|
||||
ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi', ENV['PWD']
|
||||
else
|
||||
ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi'
|
||||
end
|
||||
|
||||
## Map
|
||||
Upb_Map_Begin = -1
|
||||
|
||||
## Encoding Status
|
||||
Upb_Status_MaxMessage = 511
|
||||
Upb_Encode_Deterministic = 1
|
||||
Upb_Encode_SkipUnknown = 2
|
||||
|
||||
## JSON Encoding options
|
||||
# When set, emits 0/default values. TODO: proto3 only?
|
||||
Upb_JsonEncode_EmitDefaults = 1
|
||||
# When set, use normal (snake_case) field names instead of JSON (camelCase) names.
|
||||
Upb_JsonEncode_UseProtoNames = 2
|
||||
# When set, emits enums as their integer values instead of as their names.
|
||||
Upb_JsonEncode_FormatEnumsAsIntegers = 4
|
||||
|
||||
## JSON Decoding options
|
||||
Upb_JsonDecode_IgnoreUnknown = 1
|
||||
|
||||
## JSON Decoding results
|
||||
Upb_JsonDecodeResult_Ok = 0
|
||||
Upb_JsonDecodeResult_Error = 2
|
||||
|
||||
typedef :pointer, :Array
|
||||
typedef :pointer, :DefPool
|
||||
typedef :pointer, :EnumValueDef
|
||||
typedef :pointer, :ExtensionRegistry
|
||||
typedef :pointer, :FieldDefPointer
|
||||
typedef :pointer, :FileDef
|
||||
typedef :pointer, :FileDescriptorProto
|
||||
typedef :pointer, :Map
|
||||
typedef :pointer, :Message # Instances of a message
|
||||
typedef :pointer, :OneofDefPointer
|
||||
typedef :pointer, :binary_string
|
||||
if ::FFI::Platform::ARCH == "aarch64"
|
||||
typedef :u_int8_t, :uint8_t
|
||||
typedef :u_int16_t, :uint16_t
|
||||
typedef :u_int32_t, :uint32_t
|
||||
typedef :u_int64_t, :uint64_t
|
||||
end
|
||||
|
||||
FieldType = enum(
|
||||
:double, 1,
|
||||
:float,
|
||||
:int64,
|
||||
:uint64,
|
||||
:int32,
|
||||
:fixed64,
|
||||
:fixed32,
|
||||
:bool,
|
||||
:string,
|
||||
:group,
|
||||
:message,
|
||||
:bytes,
|
||||
:uint32,
|
||||
:enum,
|
||||
:sfixed32,
|
||||
:sfixed64,
|
||||
:sint32,
|
||||
:sint64
|
||||
)
|
||||
|
||||
CType = enum(
|
||||
:bool, 1,
|
||||
:float,
|
||||
:int32,
|
||||
:uint32,
|
||||
:enum,
|
||||
:message,
|
||||
:double,
|
||||
:int64,
|
||||
:uint64,
|
||||
:string,
|
||||
:bytes
|
||||
)
|
||||
|
||||
Label = enum(
|
||||
:optional, 1,
|
||||
:required,
|
||||
:repeated
|
||||
)
|
||||
|
||||
# All the different kind of well known type messages. For simplicity of check,
|
||||
# number wrappers and string wrappers are grouped together. Make sure the
|
||||
# order and merber of these groups are not changed.
|
||||
|
||||
WellKnown = enum(
|
||||
:Unspecified,
|
||||
:Any,
|
||||
:FieldMask,
|
||||
:Duration,
|
||||
:Timestamp,
|
||||
# number wrappers
|
||||
:DoubleValue,
|
||||
:FloatValue,
|
||||
:Int64Value,
|
||||
:UInt64Value,
|
||||
:Int32Value,
|
||||
:UInt32Value,
|
||||
# string wrappers
|
||||
:StringValue,
|
||||
:BytesValue,
|
||||
:BoolValue,
|
||||
:Value,
|
||||
:ListValue,
|
||||
:Struct
|
||||
)
|
||||
|
||||
DecodeStatus = enum(
|
||||
:Ok,
|
||||
:Malformed, # Wire format was corrupt
|
||||
:OutOfMemory, # Arena alloc failed
|
||||
:BadUtf8, # String field had bad UTF-8
|
||||
:MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
|
||||
|
||||
# CheckRequired failed, but the parse otherwise succeeded.
|
||||
:MissingRequired,
|
||||
)
|
||||
|
||||
EncodeStatus = enum(
|
||||
:Ok,
|
||||
:OutOfMemory, # Arena alloc failed
|
||||
:MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
|
||||
|
||||
# CheckRequired failed, but the parse otherwise succeeded.
|
||||
:MissingRequired,
|
||||
)
|
||||
|
||||
class StringView < ::FFI::Struct
|
||||
layout :data, :pointer,
|
||||
:size, :size_t
|
||||
end
|
||||
|
||||
class MiniTable < ::FFI::Struct
|
||||
layout :fields, :pointer,
|
||||
:size, :uint16_t,
|
||||
:field_count, :uint16_t,
|
||||
:ext, :uint8_t, # upb_ExtMode, declared as uint8_t so sizeof(ext) == 1
|
||||
:dense_below, :uint8_t,
|
||||
:table_mask, :uint8_t,
|
||||
:required_count, :uint8_t # Required fields have the lowest hasbits.
|
||||
# To statically initialize the tables of variable length, we need a flexible
|
||||
# array member, and we need to compile in gnu99 mode (constant initialization
|
||||
# of flexible array members is a GNU extension, not in C99 unfortunately. */
|
||||
# _upb_FastTable_Entry fasttable[];
|
||||
end
|
||||
|
||||
class Status < ::FFI::Struct
|
||||
layout :ok, :bool,
|
||||
:msg, [:char, Upb_Status_MaxMessage]
|
||||
|
||||
def initialize
|
||||
super
|
||||
FFI.clear self
|
||||
end
|
||||
end
|
||||
|
||||
class MessageValue < ::FFI::Union
|
||||
layout :bool_val, :bool,
|
||||
:float_val, :float,
|
||||
:double_val, :double,
|
||||
:int32_val, :int32_t,
|
||||
:int64_val, :int64_t,
|
||||
:uint32_val, :uint32_t,
|
||||
:uint64_val,:uint64_t,
|
||||
:map_val, :pointer,
|
||||
:msg_val, :pointer,
|
||||
:array_val,:pointer,
|
||||
:str_val, StringView
|
||||
end
|
||||
|
||||
Upb_Message_Begin = -1
|
||||
|
||||
class MutableMessageValue < ::FFI::Union
|
||||
layout :map, :Map,
|
||||
:msg, :Message,
|
||||
:array, :Array
|
||||
end
|
||||
|
||||
# Status
|
||||
attach_function :clear, :upb_Status_Clear, [Status.by_ref], :void
|
||||
attach_function :error_message, :upb_Status_ErrorMessage, [Status.by_ref], :string
|
||||
|
||||
# Generic
|
||||
attach_function :memcmp, [:pointer, :pointer, :size_t], :int
|
||||
attach_function :memcpy, [:pointer, :pointer, :size_t], :int
|
||||
|
||||
# Alternatives to pre-processor macros
|
||||
def self.decode_max_depth(i)
|
||||
i << 16
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user