ldc_w <value><value> is an int, a float, or a quoted string.
Stack Before
Description After ... <value> ...
ldc_w pushes a one-word constant onto the operand stack. ldc_w takes a single parameter, <value>, which is the value to push. The following Java types can be pushed using ldc_w:
int
float
String
Pushing a String causes a reference to a java.lang.String object to be constructed and pushed onto the stack. Pusing an int or a float causes a primitive value to be pushed onto the stack.
ldc_w is identical to ldc except that, in bytecode, ldc_w uses a 16-bit index rather than an 8-bit index.
Exceptions
OutOfMemoryError - not enough memory to allocate a reference to a String
Bytecode
In bytecode, the ldc_w opcode is followed by a 16-bit unsigned integer. This integer is the index of an entry in the constant pool of the current class. The entry is tagged as a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String entry. The data field of the entry contains <value> (in the case of a CONSTANT_String, the entry identifies a CONSTANT_Utf8 entry that contains the characters of the string).
Type | Description |
u1 | ldc_w opcode = 0x13 (19) |
u2 | index |
bipush, sipush, ldc, ldc2_w, aconst_null, iconst_m1, iconst_<n>, lconst_<l>, fconst_<f>, dconst_<d>
Notes
1. Where possible, its more efficient to use one of bipush, sipush, or one of the const instructions instead of ldc_w.
2. If the same string constant (i.e. a string with the same sequence of characters) appears in several different class files, only one String instance is built for that constant. The String.intern() method can be used to retrieve the instance used for a given sequence of characters.
3. The Jasmin assembler automatically determines whether to use ldc or ldc_w, so in Jasmin assembly files these two instructions are synonymous.