diff --git a/lib/protobuf/field/base_field.rb b/lib/protobuf/field/base_field.rb index 7ad4802b..05756bce 100644 --- a/lib/protobuf/field/base_field.rb +++ b/lib/protobuf/field/base_field.rb @@ -177,16 +177,19 @@ def fully_qualified_name_only! # def define_accessor(simple_field_name, fully_qualified_field_name) - message_class.class_eval do - define_method("#{simple_field_name}!") do - @values[fully_qualified_field_name] + message_class.class_eval <<-ruby, __FILE__, __LINE__ + def #{simple_field_name}! + @values[:"#{fully_qualified_field_name}"] end - end - message_class.class_eval do - define_method(simple_field_name) { self[fully_qualified_field_name] } - define_method("#{simple_field_name}=") { |v| self[fully_qualified_field_name] = v } - end + def #{simple_field_name} + self[:"#{fully_qualified_field_name}"] + end + + def #{simple_field_name}=(value) + self[:"#{fully_qualified_field_name}"] = value + end + ruby return unless deprecated? diff --git a/lib/protobuf/field/integer_field.rb b/lib/protobuf/field/integer_field.rb index 5eb3b064..4f6e4759 100644 --- a/lib/protobuf/field/integer_field.rb +++ b/lib/protobuf/field/integer_field.rb @@ -9,7 +9,7 @@ class IntegerField < VarintField # def decode(value) - value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero? + value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000) != 0 value end diff --git a/lib/protobuf/field/sfixed32_field.rb b/lib/protobuf/field/sfixed32_field.rb index 9f9b64e9..c8ca1f3a 100644 --- a/lib/protobuf/field/sfixed32_field.rb +++ b/lib/protobuf/field/sfixed32_field.rb @@ -10,7 +10,7 @@ class Sfixed32Field < Int32Field def decode(bytes) value = bytes.unpack('V').first - value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero? + value -= 0x1_0000_0000 if (value & 0x8000_0000) != 0 value end diff --git a/lib/protobuf/field/sfixed64_field.rb b/lib/protobuf/field/sfixed64_field.rb index fc296483..d7ab755e 100644 --- a/lib/protobuf/field/sfixed64_field.rb +++ b/lib/protobuf/field/sfixed64_field.rb @@ -11,7 +11,7 @@ class Sfixed64Field < Int64Field def decode(bytes) values = bytes.unpack('VV') # 'Q' is machine-dependent, don't use value = values[0] + (values[1] << 32) - value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero? + value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000) != 0 value end diff --git a/lib/protobuf/field/signed_integer_field.rb b/lib/protobuf/field/signed_integer_field.rb index 8945f771..3317f0a7 100644 --- a/lib/protobuf/field/signed_integer_field.rb +++ b/lib/protobuf/field/signed_integer_field.rb @@ -9,7 +9,7 @@ class SignedIntegerField < VarintField # def decode(value) - if (value & 1).zero? + if (value & 1) == 0 value >> 1 # positive value else ~value >> 1 # negative value diff --git a/lib/protobuf/varint_pure.rb b/lib/protobuf/varint_pure.rb index eeffbecc..6fe38aad 100644 --- a/lib/protobuf/varint_pure.rb +++ b/lib/protobuf/varint_pure.rb @@ -1,12 +1,12 @@ module Protobuf module VarintPure def decode(stream) - value = index = 0 + value = shift = 0 begin byte = stream.readbyte - value |= (byte & 0x7f) << (7 * index) - index += 1 - end while (byte & 0x80).nonzero? + value |= (byte & 127) << shift + shift += 7 + end while byte > 127 value end end diff --git a/protobuf.gemspec b/protobuf.gemspec index 1e84a09d..b0f039d2 100644 --- a/protobuf.gemspec +++ b/protobuf.gemspec @@ -24,6 +24,7 @@ require "protobuf/version" s.add_dependency 'thor' s.add_dependency 'thread_safe' + s.add_development_dependency 'benchmark-ips' s.add_development_dependency 'ffi-rzmq' s.add_development_dependency 'rake' s.add_development_dependency 'rspec', '>= 3.0'