Class: JavaClass::ClassFile::ConstantPool

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#sizeObject (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

#dumpObject

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(*tags)
  items.find_all { |item| tags.include? item.tag }
end

#item_countObject

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

#itemsObject

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

#stringsObject

Return all string constants.



74
75
76
# File 'lib/javaclass/classfile/constant_pool.rb', line 74

def strings
  find(STRING_TAG)
end