boolean resolve(final MethodWriter owner, final int position,
			final byte[] data) {
		boolean needUpdate = false;
		this.status |= RESOLVED;
		this.position = position;
		int i = 0;
		while (i < referenceCount) {
			int source = srcAndRefPositions[i++];
			int reference = srcAndRefPositions[i++];
			int offset;
			if (source >= 0) {
				offset = position - source;
				if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
					/*
					 * changes the opcode of the jump instruction, in order to
					 * be able to find it later (see resizeInstructions in
					 * MethodWriter). These temporary opcodes are similar to
					 * jump instruction opcodes, except that the 2 bytes offset
					 * is unsigned (and can therefore represent values from 0 to
					 * 65535, which is sufficient since the size of a method is
					 * limited to 65535 bytes).
					 */
					int opcode = data[reference - 1] & 0xFF;
					if (opcode <= Opcodes.JSR) {
						// changes IFEQ ... JSR to opcodes 202 to 217
						data[reference - 1] = (byte) (opcode + 49);
					} else {
						// changes IFNULL and IFNONNULL to opcodes 218 and 219
						data[reference - 1] = (byte) (opcode + 20);
					}
					needUpdate = true;
				}
				data[reference++] = (byte) (offset >>> 8);
				data[reference] = (byte) offset;
			} else {
				offset = position + source + 1;
				data[reference++] = (byte) (offset >>> 24);
				data[reference++] = (byte) (offset >>> 16);
				data[reference++] = (byte) (offset >>> 8);
				data[reference] = (byte) offset;
			}
		}
		return needUpdate;
	}