performance improvement in BERParser#read_ber,
replaced a lot of calls to Symbol#===.
This commit is contained in:
parent
91d5fff39c
commit
58f5db9716
|
@ -94,6 +94,8 @@ module Net
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=begin
|
||||||
|
Replaced this case with if/else because Symbol#=== profiled surprisingly hot.
|
||||||
obj = case objtype
|
obj = case objtype
|
||||||
when :boolean
|
when :boolean
|
||||||
newobj != "\000"
|
newobj != "\000"
|
||||||
|
@ -116,6 +118,29 @@ module Net
|
||||||
else
|
else
|
||||||
raise BerError.new( "unsupported object type: class=#{tagclass}, encoding=#{encoding}, tag=#{tag}" )
|
raise BerError.new( "unsupported object type: class=#{tagclass}, encoding=#{encoding}, tag=#{tag}" )
|
||||||
end
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
obj = if objtype == :boolean
|
||||||
|
newobj != "\000"
|
||||||
|
elsif objtype == :string
|
||||||
|
(newobj || "").dup
|
||||||
|
elsif objtype == :integer
|
||||||
|
j = 0
|
||||||
|
newobj.each_byte {|b| j = (j << 8) + b}
|
||||||
|
j
|
||||||
|
elsif objtype == :array
|
||||||
|
seq = []
|
||||||
|
sio = StringIO.new( newobj || "" )
|
||||||
|
# Interpret the subobject, but note how the loop
|
||||||
|
# is built: nil ends the loop, but false (a valid
|
||||||
|
# BER value) does not!
|
||||||
|
while (e = sio.read_ber(syntax)) != nil
|
||||||
|
seq << e
|
||||||
|
end
|
||||||
|
seq
|
||||||
|
else
|
||||||
|
raise BerError.new( "unsupported object type: class=#{tagclass}, encoding=#{encoding}, tag=#{tag}" )
|
||||||
|
end
|
||||||
|
|
||||||
# Add the identifier bits into the object if it's a String or an Array.
|
# Add the identifier bits into the object if it's a String or an Array.
|
||||||
# We can't add extra stuff to Fixnums and booleans, not that it makes much sense anyway.
|
# We can't add extra stuff to Fixnums and booleans, not that it makes much sense anyway.
|
||||||
|
|
Loading…
Reference in a new issue