use of com.oracle.truffle.espresso.classfile.constantpool.PoolConstant in project graal by oracle.
the class BytecodeNode method putPoolConstant.
private void putPoolConstant(VirtualFrame frame, int top, char cpi, int opcode) {
assert opcode == LDC || opcode == LDC_W || opcode == LDC2_W;
RuntimeConstantPool pool = getConstantPool();
PoolConstant constant = pool.at(cpi);
if (constant instanceof IntegerConstant) {
assert opcode == LDC || opcode == LDC_W;
putInt(frame, top, ((IntegerConstant) constant).value());
} else if (constant instanceof LongConstant) {
assert opcode == LDC2_W;
putLong(frame, top, ((LongConstant) constant).value());
} else if (constant instanceof DoubleConstant) {
assert opcode == LDC2_W;
putDouble(frame, top, ((DoubleConstant) constant).value());
} else if (constant instanceof FloatConstant) {
assert opcode == LDC || opcode == LDC_W;
putFloat(frame, top, ((FloatConstant) constant).value());
} else if (constant instanceof StringConstant) {
assert opcode == LDC || opcode == LDC_W;
StaticObject internedString = pool.resolvedStringAt(cpi);
putObject(frame, top, internedString);
} else if (constant instanceof ClassConstant) {
assert opcode == LDC || opcode == LDC_W;
Klass klass = pool.resolvedKlassAt(getDeclaringKlass(), cpi);
putObject(frame, top, klass.mirror());
} else if (constant instanceof MethodHandleConstant) {
assert opcode == LDC || opcode == LDC_W;
StaticObject methodHandle = pool.resolvedMethodHandleAt(getDeclaringKlass(), cpi);
putObject(frame, top, methodHandle);
} else if (constant instanceof MethodTypeConstant) {
assert opcode == LDC || opcode == LDC_W;
StaticObject methodType = pool.resolvedMethodTypeAt(getDeclaringKlass(), cpi);
putObject(frame, top, methodType);
} else if (constant instanceof DynamicConstant) {
DynamicConstant.Resolved dynamicConstant = pool.resolvedDynamicConstantAt(getDeclaringKlass(), cpi);
dynamicConstant.putResolved(frame, top, this);
} else {
CompilerDirectives.transferToInterpreter();
throw EspressoError.unimplemented(constant.toString());
}
}
use of com.oracle.truffle.espresso.classfile.constantpool.PoolConstant in project graal by oracle.
the class ConstantPoolImpl method getRawBytes.
@Override
public byte[] getRawBytes() {
byte[] bytes = new byte[totalPoolBytes];
ByteBuffer bb = ByteBuffer.wrap(bytes);
for (PoolConstant pc : constants) {
pc.dumpBytes(bb);
}
return bytes;
}
use of com.oracle.truffle.espresso.classfile.constantpool.PoolConstant in project graal by oracle.
the class MethodVerifier method verifyPutField.
private void verifyPutField(int bci, OperandStack stack, int curOpcode) {
// Check CP validity
PoolConstant pc = poolAt(code.readCPI(bci));
verifyGuarantee(pc.tag() == ConstantPool.Tag.FIELD_REF, "Invalid CP constant for PUTFIELD: " + pc.toString());
pc.validate(pool);
// Obtain field info
FieldRefConstant frc = (FieldRefConstant) pc;
assert Validation.validFieldDescriptor(frc.getType(pool));
Symbol<Type> fieldDesc = frc.getType(pool);
Operand toPut = stack.pop(kindToOperand(fieldDesc));
checkInit(toPut);
if (curOpcode == PUTFIELD) {
// Pop and check verifier
assert Validation.validClassNameEntry(frc.getHolderKlassName(pool));
Symbol<Type> fieldHolderType = getTypes().fromName(frc.getHolderKlassName(pool));
Operand fieldHolder = kindToOperand(fieldHolderType);
Operand receiver = checkInitAccess(stack.popRef(fieldHolder), fieldHolder);
verifyGuarantee(!receiver.isArrayType(), "Trying to access field of an array type: " + receiver);
if (!receiver.isUninitThis()) {
checkProtectedMember(receiver, fieldHolderType, frc, false);
}
}
}
use of com.oracle.truffle.espresso.classfile.constantpool.PoolConstant in project graal by oracle.
the class MethodVerifier method getTypeFromPool.
private Symbol<Type> getTypeFromPool(int c, String s) {
PoolConstant pc = poolAt(c);
verifyGuarantee(pc.tag() == CLASS, s + pc.toString());
pc.validate(pool);
ClassConstant cc = (ClassConstant) pc;
assert Validation.validClassNameEntry(cc.getName(pool));
Symbol<Type> type = getTypes().fromName(cc.getName(pool));
return type;
}
use of com.oracle.truffle.espresso.classfile.constantpool.PoolConstant in project graal by oracle.
the class MethodVerifier method verifyGetField.
private void verifyGetField(int bci, OperandStack stack, int curOpcode) {
// Check CP validity
PoolConstant pc = poolAt(code.readCPI(bci));
verifyGuarantee(pc.tag() == ConstantPool.Tag.FIELD_REF, "Invalid CP constant for GETFIELD: " + pc.toString());
pc.validate(pool);
// Obtain field info
FieldRefConstant frc = (FieldRefConstant) pc;
assert Validation.validFieldDescriptor(frc.getType(pool));
Symbol<Type> type = frc.getType(pool);
if (curOpcode == GETFIELD) {
// Pop and check receiver
assert Validation.validClassNameEntry(frc.getHolderKlassName(pool));
Symbol<Type> fieldHolderType = getTypes().fromName(frc.getHolderKlassName(pool));
Operand fieldHolder = kindToOperand(fieldHolderType);
Operand receiver = checkInitAccess(stack.popRef(fieldHolder), fieldHolder);
checkProtectedMember(receiver, fieldHolderType, frc, false);
verifyGuarantee(!receiver.isArrayType(), "Trying to access field of an array type: " + receiver);
}
// push result
Operand op = kindToOperand(type);
stack.push(op);
}
Aggregations