Class: JavaClass::ClassFile::ConstantPool
- Defined in:
- lib/javaclass/classfile/constant_pool.rb
Overview
Container of the constant pool’s constants.
- Author
-
Peter Kofler
Constant Summary collapse
- CONSTANT_TYPE_TAGS =
Types of constants by their
tag
. { CLASS_TAG = 7 => Constants::ConstantClass, FIELD_TAG = 9 => Constants::ConstantField, METHOD_TAG = 10 => Constants::ConstantMethod, INTERFACE_METHOD_TAG = 11 => Constants::ConstantInterfaceMethod, STRING_TAG = 8 => Constants::ConstantString, INT_TAG = 3 => Constants::ConstantInt, FLOAT_TAG = 4 => Constants::ConstantFloat, LONG_TAG = 5 => Constants::ConstantLong, DOUBLE_TAG = 6 => Constants::ConstantDouble, NAME_AND_TYPE_TAG = 12 => Constants::ConstantNameAndType, ASCIZ_TAG = 1 => Constants::ConstantAsciz, }
Instance Attribute Summary collapse
-
#size ⇒ Object
readonly
Size of the whole constant pool in bytes.
Instance Method Summary collapse
-
#[](index) ⇒ Object
Return the index’th pool item.
-
#class_item(index) ⇒ Object
Return the constant class from index’th pool item.
-
#dump ⇒ Object
Return a debug output of the whole pool.
-
#field_item(index) ⇒ Object
Return the constant field from index’th pool item.
-
#find(*tags) ⇒ Object
Return an array of all constants of the given tags types.
-
#initialize(data, start = 8) ⇒ ConstantPool
constructor
Parse the constant pool from the bytes data beginning at position start (which is usually 8).
-
#item_count ⇒ Object
Return the number of pool items.
-
#items ⇒ Object
Return an array of the ordered list of constants.
-
#method_item(index) ⇒ Object
Return the constant method from index’th pool item.
-
#strings ⇒ Object
Return all string constants.
Constructor Details
#initialize(data, start = 8) ⇒ ConstantPool
Parse the constant pool from the bytes data beginning at position start (which is usually 8).
34 35 36 37 38 39 40 41 42 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 34 def initialize(data, start=8) creator = PoolCreator.new(data, start) creator.create! @pool = creator.pool # cnt (Fixnum) => constant class @item_count = creator.item_count @size = @pool.values.inject(0) { |sum, constant| sum + constant.size } + 2 end |
Instance Attribute Details
#size ⇒ Object (readonly)
Size of the whole constant pool in bytes.
31 32 33 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 31 def size @size end |
Instance Method Details
#[](index) ⇒ Object
Return the index’th pool item. index is the real index in the pool which may skip numbers.
51 52 53 54 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 51 def[](index) check_index(index) @pool[index] end |
#class_item(index) ⇒ Object
Return the constant class from index’th pool item.
84 85 86 87 88 89 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 84 def class_item(index) if self[index] && !self[index].const_class? raise ClassFormatError, "inconsistent constant pool entry #{index} for class, should be Constant Class" end self[index] end |
#dump ⇒ Object
Return a debug output of the whole pool.
79 80 81 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 79 def dump [" Constant pool:"] + @pool.keys.sort.collect { |k| "const ##{k} = #{self[k].dump}"} end |
#field_item(index) ⇒ Object
Return the constant field from index’th pool item.
92 93 94 95 96 97 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 92 def field_item(index) if self[index] && !self[index].const_field? raise ClassFormatError, "inconsistent constant pool entry #{index} for field, should be Constant Field" end self[index] end |
#find(*tags) ⇒ Object
Return an array of all constants of the given tags types.
69 70 71 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 69 def find(*) items.find_all { |item| .include? item.tag } end |
#item_count ⇒ Object
Return the number of pool items. This number might be larger than items
available, because long
and double
constants take two slots.
46 47 48 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 46 def item_count @item_count - 1 end |
#items ⇒ Object
Return an array of the ordered list of constants.
64 65 66 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 64 def items @pool.keys.sort.collect { |k| self[k] } end |
#method_item(index) ⇒ Object
Return the constant method from index’th pool item.
100 101 102 103 104 105 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 100 def method_item(index) if self[index] && !self[index].const_method? raise ClassFormatError, "inconsistent constant pool entry #{index} for method, should be Constant Method" end self[index] end |
#strings ⇒ Object
Return all string constants.
74 75 76 |
# File 'lib/javaclass/classfile/constant_pool.rb', line 74 def strings find(STRING_TAG) end |