summaryrefslogtreecommitdiff
path: root/core/java/android/os/Bundle.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/os/Bundle.java')
-rw-r--r--core/java/android/os/Bundle.java34
1 files changed, 24 insertions, 10 deletions
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index 32b1b60437ea..f47ac4e49750 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -33,6 +33,8 @@ public final class Bundle implements Parcelable, Cloneable {
private static final String LOG_TAG = "Bundle";
public static final Bundle EMPTY;
+ static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L'
+
static {
EMPTY = new Bundle();
EMPTY.mMap = ArrayMap.EMPTY;
@@ -1643,11 +1645,11 @@ public final class Bundle implements Parcelable, Cloneable {
if (mParcelledData != null) {
int length = mParcelledData.dataSize();
parcel.writeInt(length);
- parcel.writeInt(0x4C444E42); // 'B' 'N' 'D' 'L'
+ parcel.writeInt(BUNDLE_MAGIC);
parcel.appendFrom(mParcelledData, 0, length);
} else {
parcel.writeInt(-1); // dummy, will hold length
- parcel.writeInt(0x4C444E42); // 'B' 'N' 'D' 'L'
+ parcel.writeInt(BUNDLE_MAGIC);
int oldPos = parcel.dataPosition();
parcel.writeArrayMapInternal(mMap);
@@ -1679,11 +1681,10 @@ public final class Bundle implements Parcelable, Cloneable {
void readFromParcelInner(Parcel parcel, int length) {
int magic = parcel.readInt();
- if (magic != 0x4C444E42) {
+ if (magic != BUNDLE_MAGIC) {
//noinspection ThrowableInstanceNeverThrown
- String st = Log.getStackTraceString(new RuntimeException());
- Log.e("Bundle", "readBundle: bad magic number");
- Log.e("Bundle", "readBundle: trace = " + st);
+ throw new IllegalStateException("Bad magic number for Bundle: 0x"
+ + Integer.toHexString(magic));
}
// Advance within this Parcel
@@ -1694,10 +1695,23 @@ public final class Bundle implements Parcelable, Cloneable {
p.setDataPosition(0);
p.appendFrom(parcel, offset, length);
p.setDataPosition(0);
-
- mParcelledData = p;
- mHasFds = p.hasFileDescriptors();
- mFdsKnown = true;
+
+ if (mMap != null) {
+ // It is not allowed to have a Bundle with both a map and a parcel, so if we
+ // already have a map then we need to immediately unparcel into it. This also
+ // lets us know we need to go through the slow path of unparceling, since the
+ // map may already contains some data so the two need to be merged.
+ if (mFdsKnown) {
+ mHasFds |= p.hasFileDescriptors();
+ }
+ int N = p.readInt();
+ p.readArrayMapSafelyInternal(mMap, N, mClassLoader);
+ p.recycle();
+ } else {
+ mParcelledData = p;
+ mHasFds = p.hasFileDescriptors();
+ mFdsKnown = true;
+ }
}
@Override