google-protobuf 3.25.0.rc.2 → 4.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/convert.c +7 -4
- data/ext/google/protobuf_c/defs.c +172 -24
- data/ext/google/protobuf_c/extconf.rb +1 -1
- data/ext/google/protobuf_c/glue.c +37 -2
- data/ext/google/protobuf_c/map.c +21 -8
- data/ext/google/protobuf_c/map.h +3 -0
- data/ext/google/protobuf_c/message.c +73 -71
- data/ext/google/protobuf_c/message.h +7 -0
- data/ext/google/protobuf_c/protobuf.c +19 -6
- data/ext/google/protobuf_c/repeated_field.c +14 -4
- data/ext/google/protobuf_c/repeated_field.h +3 -0
- data/ext/google/protobuf_c/ruby-upb.c +11788 -10795
- data/ext/google/protobuf_c/ruby-upb.h +5164 -4242
- data/ext/google/protobuf_c/shared_convert.c +5 -3
- data/ext/google/protobuf_c/shared_convert.h +2 -2
- data/ext/google/protobuf_c/shared_message.c +8 -6
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
- data/lib/google/protobuf/any_pb.rb +1 -22
- data/lib/google/protobuf/api_pb.rb +1 -24
- data/lib/google/protobuf/descriptor_pb.rb +2 -23
- data/lib/google/protobuf/duration_pb.rb +1 -22
- data/lib/google/protobuf/empty_pb.rb +1 -22
- data/lib/google/protobuf/ffi/descriptor.rb +11 -1
- data/lib/google/protobuf/ffi/descriptor_pool.rb +14 -9
- data/lib/google/protobuf/ffi/enum_descriptor.rb +11 -1
- data/lib/google/protobuf/ffi/ffi.rb +3 -1
- data/lib/google/protobuf/ffi/field_descriptor.rb +34 -15
- data/lib/google/protobuf/ffi/file_descriptor.rb +11 -12
- data/lib/google/protobuf/ffi/internal/convert.rb +7 -23
- data/lib/google/protobuf/ffi/map.rb +13 -0
- data/lib/google/protobuf/ffi/message.rb +20 -2
- data/lib/google/protobuf/ffi/object_cache.rb +3 -3
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +18 -11
- data/lib/google/protobuf/ffi/repeated_field.rb +15 -133
- data/lib/google/protobuf/field_mask_pb.rb +1 -22
- data/lib/google/protobuf/internal/object_cache.rb +99 -0
- data/lib/google/protobuf/plugin_pb.rb +2 -24
- data/lib/google/protobuf/repeated_field.rb +1 -2
- data/lib/google/protobuf/source_context_pb.rb +1 -22
- data/lib/google/protobuf/struct_pb.rb +1 -22
- data/lib/google/protobuf/timestamp_pb.rb +1 -22
- data/lib/google/protobuf/type_pb.rb +1 -24
- data/lib/google/protobuf/wrappers_pb.rb +1 -22
- data/lib/google/protobuf.rb +1 -1
- data/lib/google/protobuf_ffi.rb +1 -2
- data/lib/google/protobuf_native.rb +0 -1
- data/lib/google/tasks/ffi.rake +43 -37
- metadata +10 -13
- data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
- data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
- data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
- data/lib/google/protobuf/descriptor_dsl.rb +0 -465
- data/lib/google/protobuf/object_cache.rb +0 -97
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
# license that can be found in the LICENSE file or at
|
|
6
6
|
# https://developers.google.com/open-source/licenses/bsd
|
|
7
7
|
|
|
8
|
-
require 'forwardable'
|
|
9
|
-
|
|
10
8
|
#
|
|
11
9
|
# This class makes RepeatedField act (almost-) like a Ruby Array.
|
|
12
10
|
# It has convenience methods that extend the core C or Java based
|
|
@@ -15,7 +13,7 @@ require 'forwardable'
|
|
|
15
13
|
# This is a best-effort to mirror Array behavior. Two comments:
|
|
16
14
|
# 1) patches always welcome :)
|
|
17
15
|
# 2) if performance is an issue, feel free to rewrite the method
|
|
18
|
-
# in
|
|
16
|
+
# in C. The source code has plenty of examples
|
|
19
17
|
#
|
|
20
18
|
# KNOWN ISSUES
|
|
21
19
|
# - #[]= doesn't allow less used approaches such as `arr[1, 2] = 'fizz'`
|
|
@@ -35,19 +33,6 @@ module Google
|
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
class RepeatedField
|
|
38
|
-
extend Forwardable
|
|
39
|
-
# NOTE: using delegators rather than method_missing to make the
|
|
40
|
-
# relationship explicit instead of implicit
|
|
41
|
-
def_delegators :to_ary,
|
|
42
|
-
:&, :*, :-, :'<=>',
|
|
43
|
-
:assoc, :bsearch, :bsearch_index, :combination, :compact, :count,
|
|
44
|
-
:cycle, :dig, :drop, :drop_while, :eql?, :fetch, :find_index, :flatten,
|
|
45
|
-
:include?, :index, :inspect, :join,
|
|
46
|
-
:pack, :permutation, :product, :pretty_print, :pretty_print_cycle,
|
|
47
|
-
:rassoc, :repeated_combination, :repeated_permutation, :reverse,
|
|
48
|
-
:rindex, :rotate, :sample, :shuffle, :shelljoin,
|
|
49
|
-
:to_s, :transpose, :uniq, :|
|
|
50
|
-
|
|
51
36
|
include Enumerable
|
|
52
37
|
|
|
53
38
|
##
|
|
@@ -189,6 +174,18 @@ module Google
|
|
|
189
174
|
end
|
|
190
175
|
alias size :length
|
|
191
176
|
|
|
177
|
+
def freeze
|
|
178
|
+
return self if frozen?
|
|
179
|
+
super
|
|
180
|
+
@arena.pin self
|
|
181
|
+
if type == :message
|
|
182
|
+
each do |element|
|
|
183
|
+
element.freeze
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
self
|
|
187
|
+
end
|
|
188
|
+
|
|
192
189
|
def dup
|
|
193
190
|
instance = self.class.allocate
|
|
194
191
|
instance.send(:initialize, type, descriptor: descriptor, arena: arena)
|
|
@@ -262,123 +259,6 @@ module Google
|
|
|
262
259
|
push(*other.to_a)
|
|
263
260
|
end
|
|
264
261
|
|
|
265
|
-
def first(n=nil)
|
|
266
|
-
if n.nil?
|
|
267
|
-
return self[0]
|
|
268
|
-
elsif n < 0
|
|
269
|
-
raise ArgumentError, "negative array size"
|
|
270
|
-
else
|
|
271
|
-
return self[0...n]
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
def last(n=nil)
|
|
277
|
-
if n.nil?
|
|
278
|
-
return self[-1]
|
|
279
|
-
elsif n < 0
|
|
280
|
-
raise ArgumentError, "negative array size"
|
|
281
|
-
else
|
|
282
|
-
start = [self.size-n, 0].max
|
|
283
|
-
return self[start...self.size]
|
|
284
|
-
end
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
def pop(n=nil)
|
|
289
|
-
if n
|
|
290
|
-
results = []
|
|
291
|
-
n.times{ results << pop_one }
|
|
292
|
-
return results
|
|
293
|
-
else
|
|
294
|
-
return pop_one
|
|
295
|
-
end
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
def empty?
|
|
300
|
-
self.size == 0
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
# array aliases into enumerable
|
|
304
|
-
alias_method :each_index, :each_with_index
|
|
305
|
-
alias_method :slice, :[]
|
|
306
|
-
alias_method :values_at, :select
|
|
307
|
-
alias_method :map, :collect
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
class << self
|
|
311
|
-
def define_array_wrapper_method(method_name)
|
|
312
|
-
define_method(method_name) do |*args, &block|
|
|
313
|
-
arr = self.to_a
|
|
314
|
-
result = arr.send(method_name, *args)
|
|
315
|
-
self.replace(arr)
|
|
316
|
-
return result if result
|
|
317
|
-
return block ? block.call : result
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
private :define_array_wrapper_method
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
def define_array_wrapper_with_result_method(method_name)
|
|
324
|
-
define_method(method_name) do |*args, &block|
|
|
325
|
-
# result can be an Enumerator, Array, or nil
|
|
326
|
-
# Enumerator can sometimes be returned if a block is an optional argument and it is not passed in
|
|
327
|
-
# nil usually specifies that no change was made
|
|
328
|
-
result = self.to_a.send(method_name, *args, &block)
|
|
329
|
-
if result
|
|
330
|
-
new_arr = result.to_a
|
|
331
|
-
self.replace(new_arr)
|
|
332
|
-
if result.is_a?(Enumerator)
|
|
333
|
-
# generate a fresh enum; rewinding the exiting one, in Ruby 2.2, will
|
|
334
|
-
# reset the enum with the same length, but all the #next calls will
|
|
335
|
-
# return nil
|
|
336
|
-
result = new_arr.to_enum
|
|
337
|
-
# generate a wrapper enum so any changes which occur by a chained
|
|
338
|
-
# enum can be captured
|
|
339
|
-
ie = ProxyingEnumerator.new(self, result)
|
|
340
|
-
result = ie.to_enum
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
result
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
private :define_array_wrapper_with_result_method
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
%w(delete delete_at shift slice! unshift).each do |method_name|
|
|
351
|
-
define_array_wrapper_method(method_name)
|
|
352
|
-
end
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
%w(collect! compact! delete_if fill flatten! insert reverse!
|
|
356
|
-
rotate! select! shuffle! sort! sort_by! uniq!).each do |method_name|
|
|
357
|
-
define_array_wrapper_with_result_method(method_name)
|
|
358
|
-
end
|
|
359
|
-
alias_method :keep_if, :select!
|
|
360
|
-
alias_method :map!, :collect!
|
|
361
|
-
alias_method :reject!, :delete_if
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
# propagates changes made by user of enumerator back to the original repeated field.
|
|
365
|
-
# This only applies in cases where the calling function which created the enumerator,
|
|
366
|
-
# such as #sort!, modifies itself rather than a new array, such as #sort
|
|
367
|
-
class ProxyingEnumerator < Struct.new(:repeated_field, :external_enumerator)
|
|
368
|
-
def each(*args, &block)
|
|
369
|
-
results = []
|
|
370
|
-
external_enumerator.each_with_index do |val, i|
|
|
371
|
-
result = yield(val)
|
|
372
|
-
results << result
|
|
373
|
-
#nil means no change occurred from yield; usually occurs when #to_a is called
|
|
374
|
-
if result
|
|
375
|
-
repeated_field[i] = result if result != val
|
|
376
|
-
end
|
|
377
|
-
end
|
|
378
|
-
results
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
|
|
382
262
|
private
|
|
383
263
|
include Google::Protobuf::Internal::Convert
|
|
384
264
|
|
|
@@ -501,3 +381,5 @@ module Google
|
|
|
501
381
|
end
|
|
502
382
|
end
|
|
503
383
|
end
|
|
384
|
+
|
|
385
|
+
require 'google/protobuf/repeated_field'
|
|
@@ -8,28 +8,7 @@ require 'google/protobuf'
|
|
|
8
8
|
descriptor_data = "\n google/protobuf/field_mask.proto\x12\x0fgoogle.protobuf\"\x1a\n\tFieldMask\x12\r\n\x05paths\x18\x01 \x03(\tB\x85\x01\n\x13\x63om.google.protobufB\x0e\x46ieldMaskProtoP\x01Z2google.golang.org/protobuf/types/known/fieldmaskpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
9
9
|
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
|
14
|
-
rescue TypeError
|
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
18
|
-
parsed.clear_dependency
|
|
19
|
-
serialized = parsed.class.encode(parsed)
|
|
20
|
-
file = pool.add_serialized_file(serialized)
|
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
22
|
-
imports = [
|
|
23
|
-
]
|
|
24
|
-
imports.each do |type_name, expected_filename|
|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
26
|
-
if import_file.name != expected_filename
|
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
31
|
-
warn "This will become an error in the next major version."
|
|
32
|
-
end
|
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
|
33
12
|
|
|
34
13
|
module Google
|
|
35
14
|
module Protobuf
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Protocol Buffers - Google's data interchange format
|
|
2
|
+
# Copyright 2023 Google Inc. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Use of this source code is governed by a BSD-style
|
|
5
|
+
# license that can be found in the LICENSE file or at
|
|
6
|
+
# https://developers.google.com/open-source/licenses/bsd
|
|
7
|
+
|
|
8
|
+
module Google
|
|
9
|
+
module Protobuf
|
|
10
|
+
module Internal
|
|
11
|
+
# A pointer -> Ruby Object cache that keeps references to Ruby wrapper
|
|
12
|
+
# objects. This allows us to look up any Ruby wrapper object by the address
|
|
13
|
+
# of the object it is wrapping. That way we can avoid ever creating two
|
|
14
|
+
# different wrapper objects for the same C object, which saves memory and
|
|
15
|
+
# preserves object identity.
|
|
16
|
+
#
|
|
17
|
+
# We use WeakMap for the cache. If sizeof(long) > sizeof(VALUE), we also
|
|
18
|
+
# need a secondary Hash to store WeakMap keys, because our pointer keys may
|
|
19
|
+
# need to be stored as Bignum instead of Fixnum. Since WeakMap is weak for
|
|
20
|
+
# both keys and values, a Bignum key will cause the WeakMap entry to be
|
|
21
|
+
# collected immediately unless there is another reference to the Bignum.
|
|
22
|
+
# This happens on 64-bit Windows, on which pointers are 64 bits but longs
|
|
23
|
+
# are 32 bits. In this case, we enable the secondary Hash to hold the keys
|
|
24
|
+
# and prevent them from being collected.
|
|
25
|
+
class ObjectCache
|
|
26
|
+
def initialize
|
|
27
|
+
@map = ObjectSpace::WeakMap.new
|
|
28
|
+
@mutex = Mutex.new
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def get(key)
|
|
32
|
+
@map[key]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def try_add(key, value)
|
|
36
|
+
@map[key] || @mutex.synchronize do
|
|
37
|
+
@map[key] ||= value
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class LegacyObjectCache
|
|
43
|
+
def initialize
|
|
44
|
+
@secondary_map = {}
|
|
45
|
+
@map = ObjectSpace::WeakMap.new
|
|
46
|
+
@mutex = Mutex.new
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get(key)
|
|
50
|
+
value = if secondary_key = @secondary_map[key]
|
|
51
|
+
@map[secondary_key]
|
|
52
|
+
else
|
|
53
|
+
@mutex.synchronize do
|
|
54
|
+
@map[(@secondary_map[key] ||= Object.new)]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# GC if we could remove at least 2000 entries or 20% of the table size
|
|
59
|
+
# (whichever is greater). Since the cost of the GC pass is O(N), we
|
|
60
|
+
# want to make sure that we condition this on overall table size, to
|
|
61
|
+
# avoid O(N^2) CPU costs.
|
|
62
|
+
cutoff = (@secondary_map.size * 0.2).ceil
|
|
63
|
+
cutoff = 2_000 if cutoff < 2_000
|
|
64
|
+
if (@secondary_map.size - @map.size) > cutoff
|
|
65
|
+
purge
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
value
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def try_add(key, value)
|
|
72
|
+
if secondary_key = @secondary_map[key]
|
|
73
|
+
if old_value = @map[secondary_key]
|
|
74
|
+
return old_value
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
@mutex.synchronize do
|
|
79
|
+
secondary_key ||= (@secondary_map[key] ||= Object.new)
|
|
80
|
+
@map[secondary_key] ||= value
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def purge
|
|
87
|
+
@mutex.synchronize do
|
|
88
|
+
@secondary_map.each do |key, secondary_key|
|
|
89
|
+
unless @map.key?(secondary_key)
|
|
90
|
+
@secondary_map.delete(key)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
nil
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -7,32 +7,10 @@ require 'google/protobuf'
|
|
|
7
7
|
require 'google/protobuf/descriptor_pb'
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
descriptor_data = "\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"F\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x12\r\n\x05patch\x18\x03 \x01(\x05\x12\x0e\n\x06suffix\x18\x04 \x01(\t\"\x81\x02\n\x14\x43odeGeneratorRequest\x12\x18\n\x10\x66ile_to_generate\x18\x01 \x03(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\x38\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\x12\x45\n\x17source_file_descriptors\x18\x11 \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\x12;\n\x10\x63ompiler_version\x18\x03 \x01(\x0b\x32!.google.protobuf.compiler.Version\"\
|
|
10
|
+
descriptor_data = "\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"F\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x12\r\n\x05patch\x18\x03 \x01(\x05\x12\x0e\n\x06suffix\x18\x04 \x01(\t\"\x81\x02\n\x14\x43odeGeneratorRequest\x12\x18\n\x10\x66ile_to_generate\x18\x01 \x03(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\x38\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\x12\x45\n\x17source_file_descriptors\x18\x11 \x03(\x0b\x32$.google.protobuf.FileDescriptorProto\x12;\n\x10\x63ompiler_version\x18\x03 \x01(\x0b\x32!.google.protobuf.compiler.Version\"\x92\x03\n\x15\x43odeGeneratorResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\x12\x1a\n\x12supported_features\x18\x02 \x01(\x04\x12\x17\n\x0fminimum_edition\x18\x03 \x01(\x05\x12\x17\n\x0fmaximum_edition\x18\x04 \x01(\x05\x12\x42\n\x04\x66ile\x18\x0f \x03(\x0b\x32\x34.google.protobuf.compiler.CodeGeneratorResponse.File\x1a\x7f\n\x04\x46ile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0finsertion_point\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x0f \x01(\t\x12?\n\x13generated_code_info\x18\x10 \x01(\x0b\x32\".google.protobuf.GeneratedCodeInfo\"W\n\x07\x46\x65\x61ture\x12\x10\n\x0c\x46\x45\x41TURE_NONE\x10\x00\x12\x1b\n\x17\x46\x45\x41TURE_PROTO3_OPTIONAL\x10\x01\x12\x1d\n\x19\x46\x45\x41TURE_SUPPORTS_EDITIONS\x10\x02\x42r\n\x1c\x63om.google.protobuf.compilerB\x0cPluginProtosZ)google.golang.org/protobuf/types/pluginpb\xaa\x02\x18Google.Protobuf.Compiler"
|
|
11
11
|
|
|
12
12
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
13
|
-
|
|
14
|
-
begin
|
|
15
|
-
pool.add_serialized_file(descriptor_data)
|
|
16
|
-
rescue TypeError
|
|
17
|
-
# Compatibility code: will be removed in the next major version.
|
|
18
|
-
require 'google/protobuf/descriptor_pb'
|
|
19
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
20
|
-
parsed.clear_dependency
|
|
21
|
-
serialized = parsed.class.encode(parsed)
|
|
22
|
-
file = pool.add_serialized_file(serialized)
|
|
23
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
24
|
-
imports = [
|
|
25
|
-
["google.protobuf.FileDescriptorProto", "google/protobuf/descriptor.proto"],
|
|
26
|
-
]
|
|
27
|
-
imports.each do |type_name, expected_filename|
|
|
28
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
29
|
-
if import_file.name != expected_filename
|
|
30
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
34
|
-
warn "This will become an error in the next major version."
|
|
35
|
-
end
|
|
13
|
+
pool.add_serialized_file(descriptor_data)
|
|
36
14
|
|
|
37
15
|
module Google
|
|
38
16
|
module Protobuf
|
|
@@ -94,7 +94,6 @@ module Google
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
# array aliases into enumerable
|
|
97
|
-
alias_method :each_index, :each_with_index
|
|
98
97
|
alias_method :slice, :[]
|
|
99
98
|
alias_method :values_at, :select
|
|
100
99
|
alias_method :map, :collect
|
|
@@ -145,7 +144,7 @@ module Google
|
|
|
145
144
|
end
|
|
146
145
|
|
|
147
146
|
|
|
148
|
-
%w(collect! compact! delete_if fill flatten! insert reverse!
|
|
147
|
+
%w(collect! compact! delete_if each_index fill flatten! insert reverse!
|
|
149
148
|
rotate! select! shuffle! sort! sort_by! uniq!).each do |method_name|
|
|
150
149
|
define_array_wrapper_with_result_method(method_name)
|
|
151
150
|
end
|
|
@@ -8,28 +8,7 @@ require 'google/protobuf'
|
|
|
8
8
|
descriptor_data = "\n$google/protobuf/source_context.proto\x12\x0fgoogle.protobuf\"\"\n\rSourceContext\x12\x11\n\tfile_name\x18\x01 \x01(\tB\x8a\x01\n\x13\x63om.google.protobufB\x12SourceContextProtoP\x01Z6google.golang.org/protobuf/types/known/sourcecontextpb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
9
9
|
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
|
14
|
-
rescue TypeError
|
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
18
|
-
parsed.clear_dependency
|
|
19
|
-
serialized = parsed.class.encode(parsed)
|
|
20
|
-
file = pool.add_serialized_file(serialized)
|
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
22
|
-
imports = [
|
|
23
|
-
]
|
|
24
|
-
imports.each do |type_name, expected_filename|
|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
26
|
-
if import_file.name != expected_filename
|
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
31
|
-
warn "This will become an error in the next major version."
|
|
32
|
-
end
|
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
|
33
12
|
|
|
34
13
|
module Google
|
|
35
14
|
module Protobuf
|
|
@@ -8,28 +8,7 @@ require 'google/protobuf'
|
|
|
8
8
|
descriptor_data = "\n\x1cgoogle/protobuf/struct.proto\x12\x0fgoogle.protobuf\"\x84\x01\n\x06Struct\x12\x33\n\x06\x66ields\x18\x01 \x03(\x0b\x32#.google.protobuf.Struct.FieldsEntry\x1a\x45\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.google.protobuf.Value:\x02\x38\x01\"\xea\x01\n\x05Value\x12\x30\n\nnull_value\x18\x01 \x01(\x0e\x32\x1a.google.protobuf.NullValueH\x00\x12\x16\n\x0cnumber_value\x18\x02 \x01(\x01H\x00\x12\x16\n\x0cstring_value\x18\x03 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x04 \x01(\x08H\x00\x12/\n\x0cstruct_value\x18\x05 \x01(\x0b\x32\x17.google.protobuf.StructH\x00\x12\x30\n\nlist_value\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.ListValueH\x00\x42\x06\n\x04kind\"3\n\tListValue\x12&\n\x06values\x18\x01 \x03(\x0b\x32\x16.google.protobuf.Value*\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\x42\x7f\n\x13\x63om.google.protobufB\x0bStructProtoP\x01Z/google.golang.org/protobuf/types/known/structpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
9
9
|
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
|
14
|
-
rescue TypeError
|
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
18
|
-
parsed.clear_dependency
|
|
19
|
-
serialized = parsed.class.encode(parsed)
|
|
20
|
-
file = pool.add_serialized_file(serialized)
|
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
22
|
-
imports = [
|
|
23
|
-
]
|
|
24
|
-
imports.each do |type_name, expected_filename|
|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
26
|
-
if import_file.name != expected_filename
|
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
31
|
-
warn "This will become an error in the next major version."
|
|
32
|
-
end
|
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
|
33
12
|
|
|
34
13
|
module Google
|
|
35
14
|
module Protobuf
|
|
@@ -8,28 +8,7 @@ require 'google/protobuf'
|
|
|
8
8
|
descriptor_data = "\n\x1fgoogle/protobuf/timestamp.proto\x12\x0fgoogle.protobuf\"+\n\tTimestamp\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\x42\x85\x01\n\x13\x63om.google.protobufB\x0eTimestampProtoP\x01Z2google.golang.org/protobuf/types/known/timestamppb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
9
9
|
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
|
14
|
-
rescue TypeError
|
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
18
|
-
parsed.clear_dependency
|
|
19
|
-
serialized = parsed.class.encode(parsed)
|
|
20
|
-
file = pool.add_serialized_file(serialized)
|
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
22
|
-
imports = [
|
|
23
|
-
]
|
|
24
|
-
imports.each do |type_name, expected_filename|
|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
26
|
-
if import_file.name != expected_filename
|
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
31
|
-
warn "This will become an error in the next major version."
|
|
32
|
-
end
|
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
|
33
12
|
|
|
34
13
|
module Google
|
|
35
14
|
module Protobuf
|
|
@@ -11,30 +11,7 @@ require 'google/protobuf/source_context_pb'
|
|
|
11
11
|
descriptor_data = "\n\x1agoogle/protobuf/type.proto\x12\x0fgoogle.protobuf\x1a\x19google/protobuf/any.proto\x1a$google/protobuf/source_context.proto\"\xe8\x01\n\x04Type\x12\x0c\n\x04name\x18\x01 \x01(\t\x12&\n\x06\x66ields\x18\x02 \x03(\x0b\x32\x16.google.protobuf.Field\x12\x0e\n\x06oneofs\x18\x03 \x03(\t\x12(\n\x07options\x18\x04 \x03(\x0b\x32\x17.google.protobuf.Option\x12\x36\n\x0esource_context\x18\x05 \x01(\x0b\x32\x1e.google.protobuf.SourceContext\x12\'\n\x06syntax\x18\x06 \x01(\x0e\x32\x17.google.protobuf.Syntax\x12\x0f\n\x07\x65\x64ition\x18\x07 \x01(\t\"\xd5\x05\n\x05\x46ield\x12)\n\x04kind\x18\x01 \x01(\x0e\x32\x1b.google.protobuf.Field.Kind\x12\x37\n\x0b\x63\x61rdinality\x18\x02 \x01(\x0e\x32\".google.protobuf.Field.Cardinality\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x10\n\x08type_url\x18\x06 \x01(\t\x12\x13\n\x0boneof_index\x18\x07 \x01(\x05\x12\x0e\n\x06packed\x18\x08 \x01(\x08\x12(\n\x07options\x18\t \x03(\x0b\x32\x17.google.protobuf.Option\x12\x11\n\tjson_name\x18\n \x01(\t\x12\x15\n\rdefault_value\x18\x0b \x01(\t\"\xc8\x02\n\x04Kind\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"t\n\x0b\x43\x61rdinality\x12\x17\n\x13\x43\x41RDINALITY_UNKNOWN\x10\x00\x12\x18\n\x14\x43\x41RDINALITY_OPTIONAL\x10\x01\x12\x18\n\x14\x43\x41RDINALITY_REQUIRED\x10\x02\x12\x18\n\x14\x43\x41RDINALITY_REPEATED\x10\x03\"\xdf\x01\n\x04\x45num\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\tenumvalue\x18\x02 \x03(\x0b\x32\x1a.google.protobuf.EnumValue\x12(\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.Option\x12\x36\n\x0esource_context\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.SourceContext\x12\'\n\x06syntax\x18\x05 \x01(\x0e\x32\x17.google.protobuf.Syntax\x12\x0f\n\x07\x65\x64ition\x18\x06 \x01(\t\"S\n\tEnumValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12(\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.Option\";\n\x06Option\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any*C\n\x06Syntax\x12\x11\n\rSYNTAX_PROTO2\x10\x00\x12\x11\n\rSYNTAX_PROTO3\x10\x01\x12\x13\n\x0fSYNTAX_EDITIONS\x10\x02\x42{\n\x13\x63om.google.protobufB\tTypeProtoP\x01Z-google.golang.org/protobuf/types/known/typepb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
12
12
|
|
|
13
13
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
14
|
-
|
|
15
|
-
begin
|
|
16
|
-
pool.add_serialized_file(descriptor_data)
|
|
17
|
-
rescue TypeError
|
|
18
|
-
# Compatibility code: will be removed in the next major version.
|
|
19
|
-
require 'google/protobuf/descriptor_pb'
|
|
20
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
21
|
-
parsed.clear_dependency
|
|
22
|
-
serialized = parsed.class.encode(parsed)
|
|
23
|
-
file = pool.add_serialized_file(serialized)
|
|
24
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
25
|
-
imports = [
|
|
26
|
-
["google.protobuf.SourceContext", "google/protobuf/source_context.proto"],
|
|
27
|
-
["google.protobuf.Any", "google/protobuf/any.proto"],
|
|
28
|
-
]
|
|
29
|
-
imports.each do |type_name, expected_filename|
|
|
30
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
31
|
-
if import_file.name != expected_filename
|
|
32
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
36
|
-
warn "This will become an error in the next major version."
|
|
37
|
-
end
|
|
14
|
+
pool.add_serialized_file(descriptor_data)
|
|
38
15
|
|
|
39
16
|
module Google
|
|
40
17
|
module Protobuf
|
|
@@ -8,28 +8,7 @@ require 'google/protobuf'
|
|
|
8
8
|
descriptor_data = "\n\x1egoogle/protobuf/wrappers.proto\x12\x0fgoogle.protobuf\"\x1c\n\x0b\x44oubleValue\x12\r\n\x05value\x18\x01 \x01(\x01\"\x1b\n\nFloatValue\x12\r\n\x05value\x18\x01 \x01(\x02\"\x1b\n\nInt64Value\x12\r\n\x05value\x18\x01 \x01(\x03\"\x1c\n\x0bUInt64Value\x12\r\n\x05value\x18\x01 \x01(\x04\"\x1b\n\nInt32Value\x12\r\n\x05value\x18\x01 \x01(\x05\"\x1c\n\x0bUInt32Value\x12\r\n\x05value\x18\x01 \x01(\r\"\x1a\n\tBoolValue\x12\r\n\x05value\x18\x01 \x01(\x08\"\x1c\n\x0bStringValue\x12\r\n\x05value\x18\x01 \x01(\t\"\x1b\n\nBytesValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x42\x83\x01\n\x13\x63om.google.protobufB\rWrappersProtoP\x01Z1google.golang.org/protobuf/types/known/wrapperspb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
|
|
9
9
|
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
|
14
|
-
rescue TypeError
|
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
|
18
|
-
parsed.clear_dependency
|
|
19
|
-
serialized = parsed.class.encode(parsed)
|
|
20
|
-
file = pool.add_serialized_file(serialized)
|
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
|
22
|
-
imports = [
|
|
23
|
-
]
|
|
24
|
-
imports.each do |type_name, expected_filename|
|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
|
26
|
-
if import_file.name != expected_filename
|
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
|
31
|
-
warn "This will become an error in the next major version."
|
|
32
|
-
end
|
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
|
33
12
|
|
|
34
13
|
module Google
|
|
35
14
|
module Protobuf
|
data/lib/google/protobuf.rb
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
# require mixins before we hook them into the java & c code
|
|
9
9
|
require 'google/protobuf/message_exts'
|
|
10
|
-
require 'google/protobuf/object_cache'
|
|
10
|
+
require 'google/protobuf/internal/object_cache'
|
|
11
11
|
|
|
12
12
|
# We define these before requiring the platform-specific modules.
|
|
13
13
|
# That way the module init can grab references to these.
|
data/lib/google/protobuf_ffi.rb
CHANGED
|
@@ -21,7 +21,6 @@ require 'google/protobuf/ffi/map'
|
|
|
21
21
|
require 'google/protobuf/ffi/object_cache'
|
|
22
22
|
require 'google/protobuf/ffi/repeated_field'
|
|
23
23
|
require 'google/protobuf/ffi/message'
|
|
24
|
-
require 'google/protobuf/descriptor_dsl'
|
|
25
24
|
|
|
26
25
|
module Google
|
|
27
26
|
module Protobuf
|
|
@@ -47,4 +46,4 @@ module Google
|
|
|
47
46
|
nil
|
|
48
47
|
end
|
|
49
48
|
end
|
|
50
|
-
end
|
|
49
|
+
end
|
data/lib/google/tasks/ffi.rake
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
require "ffi-compiler/compile_task"
|
|
2
|
-
|
|
3
1
|
# # @param task [FFI::Compiler::CompileTask] task to configure
|
|
4
2
|
def configure_common_compile_task(task)
|
|
5
3
|
if FileUtils.pwd.include? 'ext'
|
|
@@ -49,46 +47,54 @@ def with_generated_files
|
|
|
49
47
|
end
|
|
50
48
|
end
|
|
51
49
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
c.
|
|
50
|
+
begin
|
|
51
|
+
require "ffi-compiler/compile_task"
|
|
52
|
+
|
|
53
|
+
desc "Compile Protobuf library for FFI"
|
|
54
|
+
namespace "ffi-protobuf" do
|
|
55
|
+
with_generated_files do
|
|
56
|
+
# Compile Ruby UPB separately in order to limit use of -DUPB_BUILD_API to one
|
|
57
|
+
# compilation unit.
|
|
58
|
+
desc "Compile UPB library for FFI"
|
|
59
|
+
namespace "ffi-upb" do
|
|
60
|
+
with_generated_files do
|
|
61
|
+
FFI::Compiler::CompileTask.new('ruby-upb') do |c|
|
|
62
|
+
configure_common_compile_task c
|
|
63
|
+
c.add_define "UPB_BUILD_API"
|
|
64
|
+
c.exclude << "/glue.c"
|
|
65
|
+
c.exclude << "/shared_message.c"
|
|
66
|
+
c.exclude << "/shared_convert.c"
|
|
67
|
+
if RbConfig::CONFIG['target_os'] =~ /darwin|linux/
|
|
68
|
+
c.cflags << "-fvisibility=hidden"
|
|
69
|
+
end
|
|
68
70
|
end
|
|
69
71
|
end
|
|
70
72
|
end
|
|
71
|
-
end
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
c.exclude << "/ruby-upb.c"
|
|
80
|
-
end
|
|
74
|
+
FFI::Compiler::CompileTask.new 'protobuf_c_ffi' do |c|
|
|
75
|
+
configure_common_compile_task c
|
|
76
|
+
# Ruby UPB was already compiled with different flags.
|
|
77
|
+
c.exclude << "/utf8_range.c"
|
|
78
|
+
c.exclude << "/ruby-upb.c"
|
|
79
|
+
end
|
|
81
80
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
# Setup dependencies so that the .o files generated by building ffi-upb are
|
|
82
|
+
# available to link here.
|
|
83
|
+
# TODO Can this be simplified? Can the single shared library be used
|
|
84
|
+
# instead of the object files?
|
|
85
|
+
protobuf_c_task = Rake::Task[:default]
|
|
86
|
+
protobuf_c_shared_lib_task = Rake::Task[protobuf_c_task.prereqs.last]
|
|
87
|
+
ruby_upb_shared_lib_task = Rake::Task[:"ffi-upb:default"].prereqs.first
|
|
88
|
+
Rake::Task[ruby_upb_shared_lib_task].prereqs.each do |dependency|
|
|
89
|
+
protobuf_c_shared_lib_task.prereqs.prepend dependency
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
rescue LoadError
|
|
94
|
+
desc "Compile Protobuf library for FFI"
|
|
95
|
+
namespace "ffi-protobuf" do
|
|
96
|
+
task :default do
|
|
97
|
+
warn "Skipping build of FFI; `gem install ffi-compiler` to enable."
|
|
91
98
|
end
|
|
92
99
|
end
|
|
93
100
|
end
|
|
94
|
-
|