1703 } |
1703 } |
1704 LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching); |
1704 LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching); |
1705 Value replacement = !needs_patching ? _memory->load(load) : load; |
1705 Value replacement = !needs_patching ? _memory->load(load) : load; |
1706 if (replacement != load) { |
1706 if (replacement != load) { |
1707 assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked"); |
1707 assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked"); |
|
1708 // Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing |
|
1709 // conversion. Emit an explicit conversion here to get the correct field value after the write. |
|
1710 BasicType bt = field->type()->basic_type(); |
|
1711 switch (bt) { |
|
1712 case T_BOOLEAN: |
|
1713 case T_BYTE: |
|
1714 replacement = append(new Convert(Bytecodes::_i2b, replacement, as_ValueType(bt))); |
|
1715 break; |
|
1716 case T_CHAR: |
|
1717 replacement = append(new Convert(Bytecodes::_i2c, replacement, as_ValueType(bt))); |
|
1718 break; |
|
1719 case T_SHORT: |
|
1720 replacement = append(new Convert(Bytecodes::_i2s, replacement, as_ValueType(bt))); |
|
1721 break; |
|
1722 default: |
|
1723 break; |
|
1724 } |
1708 push(type, replacement); |
1725 push(type, replacement); |
1709 } else { |
1726 } else { |
1710 push(type, append(load)); |
1727 push(type, append(load)); |
1711 } |
1728 } |
1712 } |
1729 } |