2 Формат файла класса

2.1 - Формат
2.2 - Сигнатуры
2.3 - Константный пул
2.4 - Поля
2.5 - Методы
2.6 - Атрибуты


Эта глава описывает формат файла класса (.class) языка Ява.

Каждый файл класса содержит откомпилированную версию или класса языка Ява, или интерфейса языка Ява. Корректные интерпретаторы языка Ява должны быть способны иметь дело с любыми файлами класса, которые соответствуют нижеследующим спецификациям.

Файл класса языка Ява состоит из последовательности 8-битовых байт. Все 16-битные и 32-битные элементы конструируются в виде двух или четырех 8-битовых байт, соответственно. Байты соединяются вместе в порядке, принятом в сетях, когда старшие байты приходят первыми. Этот формат поддерживается в языке Ява интерфейсами java.io.DataInput и java.io.DataOutput и классами, такими как java.io.DataInputStream и java.io.DataOutputStream.

Формат файла классов описывается с использованием структурной нотации. Последующие поля структуры появляются во внешнем представлении без заполнения или выравнивания. Массивы переменного размера, чаще с элементами переменного размера называются таблицами и занимают общее место в таких структурах.

Типы u1, u2, and u4 обозначают беззнаковые одно-, двух- или четырех-байтовые величины, соответственно, которые читают с помощью метода readUnsignedByte,readUnsignedShort и readInt из интерфейса java.io.DataInput.

2.1 Формат

Следующая псевдо-структура дает высокоуровневое представление формата файла

класса:

ClassFile {
   u4 magic;    
   u2 minor_version;
   u2 major_version;
   u2 constant_pool_count;
   cp_info constant_pool[constant_pool_count - 1];
   u2 access_flags; u2 this_class; u2 super_class;
   u2 interfaces_count;
   u2 interfaces[interfaces_count];
   u2 fields_count; field_info fields[fields_count];
   u2 methods_count; method_info methods[methods_count];
   u2 attributes_count; attribute_info attributes[attribute_count];
}

magic

Это поле имеет значение 0xCAFEBABE.

minor_version, major_version

Эти поля указывают на номер версии компилятора языка Ява, которым был создан этот файл класса. Реализация виртуальной машины языка Ява будет совместима с номерами от 0 до n низшей версии из множества чисел высшей версии. Если номер низшей версии увеличивается, то старая виртуальная машина не сможет работать с ее новым кодом, но есть возможность создать новую виртуальную машину, которая будет работать с версиями вплоть до n+1.

{A change of the major version number indicates a major incompatible change, one that requires a different virtual machine that may not support the old

major version in any way.!

Номер текущей высшей версии 45, текущей низшей версии 3.

constant_pool_count;

Это поле означает число записей в константном пуле файла классов.

constant_pool

Константный пул - это таблица значений. Эти значения являются различными строковыми константами, именами классов, именами полей и другими, которые обозначены структурой класса или кодом.

constant_pool[0] никогда не используется компилятором, и может быть использован в некоторых целях реализацией.

Все элементы constant_pool вводят 1 через constant_pool_count-1 — это элемент переменной длины, имеющий формат, получаемый с помощью первого "tag" байта, который описывается в пункте 2.3.

access_flags

Это поле включает трафарет до 16 модификаций, используемых в описаниях классов, методов и полей. То же кодирование используется в подобных полях field_info и method_info, описанных выше. Представление:

Flag Name Значение Описание Где использовался
ACC_PUBLIC

0x0001

Видимый для всех Класс, Метод, Переменная
ACC_PRIVATE

0x0002

Видимый только для определяемого класса Метод, Переменная
ACC_PROTECTED

0x0004

Видимый для подклассов Метод, Переменная
ACC_STATIC

0x0008

Переменная или метод статические Метод, Переменная
ACC_FINAL

0x0010

Нет дальнейшей подкласификации, обхода или присваивания после инициализации Класс, Метод, Переменная
ACC_SYNCHRONIZED

0x0020

Использует возврат в блокировке монитора Метод
ACC_VOLATILE

0x0040

Не может помещать в кеш Переменная
ACC_TRANSIENT

0x0080

Не может боть написан или прочитан постоянным объектом управления Перемення
ACC_NATIVE

0x0100

Реализован в других языках Метод
ACC_INTERFACE

0x0200

интерфейс Класс
ACC_ABSTRACT

0x0400

Ничего не предусматривает Класс, Метод

this_class

Это поле-индекс в константном пуле; constant_pool[this_class] должен быть CONSTANT_class.

super_class

Это поле-индекс в константном пуле. Если значение super_class не равно нолю, то constant_pool[super_class] должен быть классом, и представляет индех суперкласса класса в константном пуле.

Если значение super_class равно нолю, то класс должен быть java.lang.Object, и он не имеет суперкласса.

interfaces_count

Это поле дает число интерфейсов, которые этот класс реализует.

interfaces

Каждое значение этой таблицы является индексом в константном пуле. Если табличное значение не равно нулю (interfaces[i] != 0, где 0 <= i < interfaces_count), то constant_pool[interfaces[i]] должен быть интерфейсом, который реализуется этим классом.

Вопрос: Может ли хоть одно из вхождений быть 0?

fields_count

Это поле содержит число переменных, как статических так и динамических, определяемых этим классом. Таблица полей включает только те переменные, которые четко определяются этим классом. Она не включает те тех переменных, которые доступны этому классу, но унаследованы из суперклассов.

fields

Каждое значение в таблице-полностью завершенное описание поля класса. Смотри пункт 2.4 для более полной информации о field_info структуре.

methods_count

Это поле показывает общее число методов, как статических так и динамических, определяемых этим классом. Эта таблица включает только те методы, которые определяются этим классом. Она не включает унаследованные методы.

methods

Каждое значение в таблице-завершенное описание метода в классе. Смотри пункт 2.5 для полной информации о method_info структуре.

attributes_count

Это поле показывает число дополнительных аттрибутов этого класса.

attributes

Класс может иметь несколько необязательных аттрибутов связанных с ним. Считается, что только аттрибут класса признается как атрибут "SourceFile" , который обозначает имя файла источника, из которого формируется этот файл класса. Смотри пункт 2.6 для более полной информации о attribute_info структуре.

2.2 Сигнатуры

Сигнатура — это строка, задающая тип метода, поля или массива.

Сигнатура поля определяет значение аргумента функции или значение переменной. Это последовательность байт, порождаемых следующей грамматикой:

< сигнатура_поля > ::= < тип_поля >

< тип_поля > ::= < базовый_тип >|< объектный_тип >|< тип_массив >

< базовый_тип > ::= B|C|D|F|I|J|S|Z

< объектный_тип > ::= L< полное имя класса>;

< тип массив > ::= [< необязательный_размер >< тип_поля >

< необязательный_размер > ::= [0-9]*

Обозначения базовых типов следующие:

B byte знаковый байт

C char символьный

D double вещественный двойной точности стандарта IEEE

F float вещественный обычной точности стандарта IEEE

I int целый

J long длинный целый

L<fullclassname>; ... объект данного класса

S short короткий целый со знаком

Z boolean true или false

[<field sig> ... Массив

Сигнатура возвращаемого типа представляет значение, возвращаемое методом. Это последовательность байт в следующей грамматике:

< сигнатура_возврата > ::= < тип_поля > | V

Буква V означает, что метод не возвращает значения. В противном случае, сигнатура указывает тип возвращаемого значения.

Сигнатура аргумента определяет аргумент вызываемого метода:

< сигнатура аргумента > ::= < тип_поля >

Сигнатура метода определяет аргументы этого метода, а также возвращаемое значение .

< сигнатура_метода > ::= (< сигнатура_аргументов >) < сигнатура_возврата >

< сигнатура_аргументов>: := < сигнатура_аргумента >*

2.3 Константный пул

Все элементы константного пула начинаются с байта тега.

Таблица, преставленная ниже, содержит перечень тегов и их значений:

Тип константы

Значение
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_Unicode 2

Каждый байт тега-это один или несколько следующих байт, дающих информацию о специфике констант.

CONSTANT_Class

CONSTANT_Class используется для представления класса или интерфейса.

CONSTANT_Class_info {

u1 tag;

u2 name_index;

}

tag

тег будет иметь значение CONSTANT_Class

name_index

constant_pool [name_index] это CONSTANT_Utf8, дающий строку имени класса.

Поскольку массивы – это объекты, операции anewarray и multianewarray могут ссылаться на “классы” массивов посредством элемента CONSTANT_Class в константном пуле. В этом случае, имя класса является сигнатурой. Например, имя класса

int[][]

это

[[I

 

Имя класса

Thread[]

это

"[Ljava.lang.Thread; "

CONSTANT_{Fieldref,Methodref,InterfaceMethodref}

Поля, методы и интерфейсные методы представляются следующей подобной структурой.

CONSTANT_Fieldref_info {

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

CONSTANT_Methodref_info {

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

CONSTANT_InterfaceMethodref_info {

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

tag

Тег будет иметь значение CONSTANT_Fieldref, CONSTANT_Methodref, или CONSTANT_InterfaceMethodref.

class_index

constant_pool [class_index] должна быть элементом типа CONSTANT_Class, дающей имя класса или интерфейса, содержащего поле или метод.

Для CONSTANT_Fieldref и CONSTANT_Methodref, CONSTANT_Class элемент должен быть фактическим классом. Для CONSTANT_InterfaceMethodref, элемент должен быть интерфейсом, который подразумевает реализацию метода.

name_and_type_index

constant_pool [name_and_type_index] должна быть CONSTANT_NameAndType. Эта составляющая константного пула указывает на имя и сигнатуру поля или метода.

CONSTANT_String

CONSTANT_String используется для представления объектов встроенного строкового типа (String)

CONSTANT_String_info {

u1 tag;

u2 string_index;

}

tag

Тег будет иметь значение СONSTANT

string_index

constant_pool [string_index] -это CONSTANT_Utf8 строка, дающая значение, которое инициализирует объект типа String.

CONSTANT_Integer and CONSTANT_Float

CONSTANT_Integer и CONSTANT_Float представляют собой четырехбайтовые константы.

CONSTANT_Integer_info {

u1 tag;

u4 bytes;

}

CONSTANT_Float_info {

u1 tag;

u4 bytes;

}

tag

тег будет иметь значение CONSTANT_Integer или CONSTANT_Float.

bytes

Для целых, четыре байта-целые значения. Для вещественных, в стандарте IEEE 754 они- число с плавающей точкой. Эти байты располагаются по возрастанию (первым старший байт ).

 

CONSTANT_Long и CONSTANT_Double

CONSTANT_Long и CONSTANT_Double представляют собой 8-байтовые константы.

CONSTANT_Long_info {

u1 tag;

u4 high_bytes;

u4 low_bytes;

}

CONSTANT_Double_info {

u1 tag;

u4 high_bytes;

u4 low_bytes;

}

Все 8-байтовые константы занимают по два места в константном пуле. Если это n-ый элемент константного пула, то следующий будет находиться на n+2 месте.

tag

Тег будет иметь значение CONSTANT_Long или CONSTANT_Double.

high_bytes, low_bytes

Для CONSTANT_Long, 64-битовое значение это есть - (high_bytes << 32) + low_bytes.

Для CONSTANT_Double, 64-битовое значение это есть high_bytes и low_bytes вместе представленые в стандарте IEEE 754, как двойные вещественные с плавающей точкой.

CONSTANT_NameAndType

CONSTANT_NameAndType используется для представления поля или метода без указания принадлежности классу.

CONSTANT_NameAndType_info {

u1 tag;

u2 name_index;

u2 signature_index;

}

tag

Тег будет принимать значение CONSTANT_NameAndType.

name_index

constant_pool [name_index] - это CONSTANT_Utf8 строка, дающая имя поля или метода.

signature_index

constant_pool [signature_index] - это CONSTANT_Utf8 строка, дающая значение сигнатуры поля или метода.

CONSTANT_Utf8 и CONSTANT_Unicode

CONSTANT_Utf8 и CONSTANT_Unicode используются для представления значений строковых констант

CONSTANT_Utf8-строки "кодируются" так, что строки, содержащие только

символы ASCII не null, могут быть представлены так, что на каждый символ приходится один байт, но могут быть представлены символы до 16 бит:

Все символы в диапазоне 0x0001 к 0x007F представлены единственным байтом:

+-+-+-+-+-+-+-+-+

|0|7 бит из данных|

+-+-+-+-+-+-+-+-+

Символ null (0x0000) и символы в диапазоне 0x0080 к 0x07FF представлены парой байт:

+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

|1|1|0|5 бит| |1|0|6 бит|

+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

Символы в диапазоне 0x0800 к 0xFFFF представлены тремя байтами:

+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

|1|1|1|0|4 бита| |1|0|6 бит| |1|0|6 бит|

+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

Имеются два различия между этим форматом и "стандартом" формата UTF-8. Во-первых, пустой байт 0x00 кодируется в двухбайтовый формат, больше чем однобайтовый, чтобы наши строки не имели вложенных null. Во-вторых, используются только однобайтовые, двухбайтовые и трехбайтовые форматы. Мы не рассматриваем более длинные форматы.

tag

Тег будет иметь значение CONSTANT_Utf8 или CONSTANT_Unicode.

length

Число байтов строки. Эти строки оканчиваются не на null.

bytes

Фактические байты строки.

2.4 Поля

Информация о каждом поле следует сразу за полем field_count в файле класса. Каждое поле описано структурой field_info переменной длины.

Формат этой структуры следующий:

field_info {

u2 access_flags;

u2 name_index;

u2 signature_index;

u2 attributes_count;

attribute_info attributes[attribute_count];

}

access_flags

Это - набор шестнадцати флагов, относящихся к классам, методам, и полям для описания различных свойств и какими методоми к ним можно обращаться из других классов. См. таблицу "Access Flags" на странице 12, которая указывает значение бит в этом поле.

Флаги, которые можно устанавливать для поля - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, и ACC_TRANSIENT.

В большинстве случаев один из ACC_PUBLIC, ACC_PROTECTED, и ACC_PRIVATE можно устанавливать для любого метода.

name_index

constant_pool [name_index] - это CONSTANT_Utf8 строка, которая является названием поля.

signature_index

constant_pool [signature_index] - это CONSTANT_Utf8 строка, которая является сигнатурой поля. См. секцию "Сигнатуры" для получения большей информации о сигнатурах.

attributes_count

Это значение указывает число дополнительных атрибутов этого поля.

attributes

Поле может иметь любое число необязательных атрибутов, связанных с ним. В настоящее время, единственно предусмотренный атрибут поля - "ConstantValues". Это атрибут, указывающий, что это поле - числовая константа и задает числовое значение этого поля.

Любые другие атрибуты пропускаются.

2.5 Методы

Информация для каждого метода следует сразу за полем method_count в файле поля. Каждый метод описан структурой method_info переменной длины. Эта структура имеет следующий формат:

method_info {

u2 access_flags;

u2 name_index;

u2 signature_index;

u2 attributes_count;

attribute_info attributes[attribute_count];

}

access_flags

Это набор шестнадцати флагов, используемых классами, методами, и полями для описания различных свойств и как они доступны методам из других классов. См. таблицу "Access Flags" на странице 12, на которой можно найти представление бит в этом поле.

Поля, которые можно устанавливать для метода - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, и ACC_ABSTRACT.

В случаях ACC_PUBLIC, ACC_PROTECTED, и ACC_PRIVATE можно устанавливать для любого метода.

name_index

constant_pool [name_index] - это CONSTANT_Utf8 строка, в которой указывается название метода.

signature_index

constant_pool [signature_index] - это CONSTANT_Utf8 строка, в которой указывается сигнатура поля. См. секцию "Сигнатуры" для получения большей информации о записях.

attributes_count

Это значение указывает число дополнительных признаков этого поля.

atributes

Поле может иметь любое число необязательных признаков, связанных с ним. Каждый признак имеет название, и другую дополнительную информацию. В настоящее время, распознаются атрибуты "Code" и "Exceptions", которые описывают байткоды, предназначенные для исполнения этого метода, и исключения Явы , которые могут возникать при выполнении метода, соответственно.

Любые другие признаки пропускаются.

2.6 Атрибуты

Атрибуты используются в нескольких различных местах в формате класса. Все атрибуты имеют следующий формат:

GenericAttribute_info {

u2 attribute_name;

u4 attribute_length;

u1 info[attribute_length];

}

attribute_name - 16-битный индекс в константном пуле класса; значение constant_pool [attribute_name] - CONSTANT_Utf8 строка, в которой указывается название атрибута. Поле attribute_length указывает длину последующей информации в байтах. Эта длина не включает в себя шесть байт attribute_name и attribute_length.

В следующем тексте всякий раз при упоминании атрибутов мы указываем название ao?eaooia, которые считаются понятыми. В дальнейшем, атрибуты будут добавлены. Предполагается, что читатели файла класса пропустят и игнорируют информацию любого атрибута, который они не понимают.

SourceFile

Атрибут "SourceFile" имеет следующий формат:

SourceFile_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 sourcefile_index;

}

attribute_name_index

constant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "SourceFile".

attribute_length

Длина SourceFile_attribute должна быть 2.

sourcefile_index

constant_pool [sourcefile_index] - это CONSTANT_Utf8 строка, указывающая первоначальный файл,из которого этот файл класса компилировался.

ConstantValue

Атрибут "ConstantValue" имеет следующий формат:

ConstantValue_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 constantvalue_index;

}

attribute_name_index

сonstant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "ConstantValue".

attribute_length

Длина ConstantValue_attribute должна быть 2.

сonstantvalue_index

сonstant_pool [constantvalue_index] дает значение константы для этого поля.

Элемент константного пула должен иметь тип, соответствующий полю, как показано в следующей таблице:

long CONSTANT_Long
float CONSTANT_Float
double CONSTANT_Double
int, short, char, byte, boolean CONSTANT_Integer

Code

Атрибут "Code" имеет следующий формат:

Code_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 max_stack;

u2 max_locals;

u4 code_length;

u1 code[code_length];

u2 exception_table_length;

{ u2 start_pc;

u2 end_pc;

u2 handler_pc;

u2 catch_type;

} exception_table[exception_table_length];

u2 attributes_count;

attribute_info attributes[attribute_count];

}

attribute_name_index

constant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "Code".

attribute_length

Это поле указывает общую длину атрибута "Code", исключая начальные шесть байтов.

max_stack

Максимальное число элементов стека операндов, используемых при выполнении этого метода. См. другие главы в этом описании для получения большей информации о стеке операндов.

max_locals

Число слотов локальных переменных, используемых этим методом. См. другие главы в этом описании для получения большего количества информации о локальных переменных.

code_length

Число байт в коде виртуальной машины для этого метода.

code

Это фактические байты кода виртуальной машины, которые реализуют метод. Если первый байт кода выровнен на кратную четырем границу, то при считывании в память элементы операций tableswitch и tablelookup будут выровнены; см. их описание для получения большей информации по выравниванию требований.

exception_table_length

Число элементов в следующей таблице исключений.

exception_table

Каждый элемент таблицы исключений описывает одну программу-обработчик исключений в коде.

start_pc, end_pc

Два поля start_pc и end_pc указывают диапазоны в коде, в которых обработчик исключений активен. Значения обоих полей - это смещения от начала кода. start_pc включается. end_pc не включается.

handler_pc

Это поле указывает начальный адрес обработчика исключений. Значение поля-это смещение от начала кода.

catch_type

Если catch_type отличен от нуля, тогда constant_pool [catch_type] будет классом исключений, которые этот обработчик исключений перехватывает. Этот обработчик исключений должен вызываться только в том случае, если сгенерированное исключение-это элемент данного класса.

Если catch_type - нуль, то этот обработчик исключений должен вызываться для всех исключений.

attributes_count

Это поле указывает число дополнительных атрибутов кода. Атрибут "Code" может иметь атрибуты.

attributes

Атрибут "Code" может иметь любое число необязательных атрибутов связанных с ним. Каждый атрибут имеет название и другую дополнительную информацию. В настоящее время, единственные определенные атрибуты кода - "LineNumberTable" и "LocalVariableTable", оба из которых содержат отлаженную информацию.

Таблица Исключений

Эта таблица используется компиляторами, которые указывают на то, какие исключения генерировать описываемым методом:

Exceptions_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 number_of_exceptions;

u2 exception_index_table[number_of_exceptions];

}

attribute_name_index

constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "Exceptions".

attribute_length

Это поле указывает общую длину Exceptions_attribute, за исключением начальных шести байтов.

number_of_exceptions

Это поле указывает число элементов в следующей таблице индексов исключений.

exception_index_table

Каждое значение в этой таблице - индекс в константном пуле. Для каждого элемента таблицы (exception_index_table [i]!= 0, где 0 < = i < number_of_exceptions), constant_pool [exception_index + table[i]] – это исключение, которое надо генерировать описываемым классом.

LineNumberTable

Этот атрибут используется отладчиками и обработчиком исключений, для определения того какая часть кода виртуальной машины соответствует данному местоположению в исходном тексте. LineNumberTable_attribute имеет следующий формат:

LineNumberTable_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 line_number_table_length;

{ u2 start_pc;

u2 line_number;

} line_number_table[line_number_table_length];

}

Attribute_name_index

constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "LineNumberTable".

attribute_length

Это поле указывает общую длину LineNumberTable_attribute, за исключением начальных шести байтов.

line_number_table_length

Это поле указывает число элементов в следующей таблице номеров строк.

line_number_table

Каждый элемент в таблице номеров строк указывает на то, что номер строки в исходном файле изменяется в данном месте кода.

start_pc

Это поле указывает место в коде с которого начинается код для новой строки в источнике начал. source_pc << <SHOULD THAT BE start_pc? >> - смещенным от начала кода.

line_number

Номер текущей строки, которая начинается с данной позиции в файле

LocalVariableTable

Этот атрибут используется отладчиками, чтобы определить значение данной локальной переменной в ходе динамического выполнения метода. Формат LocalVariableTable_attribute следующий:

LocalVariableTable_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 local_variable_table_length;

{ u2 start_pc;

u2 length;

u2 name_index;

u2 signature_index;

u2 slot;

} local_variable_table[local_variable_table_length];

}

attribute_name_index

constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "LocalVariableTable".

attribute_length

Это поле указывает общую длину LineNumberTable_attribute, за исключением начальных шести байтов.

local_variable_table_length

Это поле указывает число элементов в следующей таблице локальных переменных

local_variable_table

Каждый элемент в таблице локальных переменных указывает диапазон кода в течение которого локальная переменная имеет значение. Оно также указывает где на стеке может быть найдено значение этой переменной.

start_pc, length

Данная локальная переменная будет иметь значение в коде между start_pc и start_pc + length. Эти два значения являются смещениями от начала кода.

name_index, signature_index

constant_pool [name_index] и constant_pool [signature_index] - это CONSTANT_Utf8 строки, указывающие название и сигнатуру локальной переменной.

slot

Данная переменная будет ячейкой локальной переменной в структуре метода.