From 0930fef46d23d4b2894f3f05afb2c2807b2b354c Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 19 Mar 2018 18:21:34 -0700 Subject: [PATCH] Disable YogaNode cloning in Android Reviewed By: achen1 Differential Revision: D7313239 fbshipit-source-id: ecf905a22e04a2115ab968fd29f7582301f0f3c9 --- .../react/uimanager/ReactShadowNodeImpl.java | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java index 664dd0972..dddaf466c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java @@ -111,35 +111,32 @@ public class ReactShadowNodeImpl implements ReactShadowNode } } - public ReactShadowNodeImpl(ReactShadowNodeImpl original) { - try { - mReactTag = original.mReactTag; - mRootTag = original.mRootTag; - mViewClassName = original.mViewClassName; - mRootNode = original.mRootNode; - mThemedContext = original.mThemedContext; - mShouldNotifyOnLayout = original.mShouldNotifyOnLayout; - mNodeUpdated = original.mNodeUpdated; - mChildren = original.mChildren == null ? null : new ArrayList<>(original.mChildren); - mIsLayoutOnly = original.mIsLayoutOnly; - mTotalNativeChildren = original.mTotalNativeChildren; - mNativeParent = original.mNativeParent; - mNativeChildren = original.mNativeChildren == null ? null : new ArrayList<>(original.mNativeChildren); - mNativeParent = original.mNativeParent; - mScreenX = original.mScreenX; - mScreenY = original.mScreenY; - mScreenWidth = original.mScreenWidth; - mScreenHeight = original.mScreenHeight; - arraycopy(original.mPadding, 0, mPadding, 0, original.mPadding.length); - arraycopy(original.mPaddingIsPercent, 0, mPaddingIsPercent, 0, original.mPaddingIsPercent.length); - mYogaNode = original.mYogaNode.clone(); - mYogaNode.setData(this); - mParent = null; - mNewProps = null; - } catch (CloneNotSupportedException e) { - // it should never happen - throw new IllegalArgumentException(); - } + protected ReactShadowNodeImpl(ReactShadowNodeImpl original) { + mReactTag = original.mReactTag; + mRootTag = original.mRootTag; + mViewClassName = original.mViewClassName; + mRootNode = original.mRootNode; + mThemedContext = original.mThemedContext; + mShouldNotifyOnLayout = original.mShouldNotifyOnLayout; + mNodeUpdated = original.mNodeUpdated; + mIsLayoutOnly = original.mIsLayoutOnly; + mTotalNativeChildren = original.mTotalNativeChildren; + mNativeParent = original.mNativeParent; + mNativeParent = original.mNativeParent; + mScreenX = original.mScreenX; + mScreenY = original.mScreenY; + mScreenWidth = original.mScreenWidth; + mScreenHeight = original.mScreenHeight; + arraycopy(original.mPadding, 0, mPadding, 0, original.mPadding.length); + arraycopy(original.mPaddingIsPercent, 0, mPaddingIsPercent, 0, original.mPaddingIsPercent.length); + mNewProps = null; + mParent = null; + mYogaNode = original.mYogaNode; + // TODO: T26729293 clone YogaNode instead of reusing the same instance + //mYogaNode = original.mYogaNode.clone(); + mNativeChildren = original.mNativeChildren == null ? null : new ArrayList<>(original.mNativeChildren); + mChildren = original.mChildren == null ? null : new ArrayList<>(original.mChildren); + mYogaNode.setData(this); } @Override @@ -279,6 +276,16 @@ public class ReactShadowNodeImpl implements ReactShadowNode + toString() + "')"); } + // TODO: T26729293 This is a temporary code that will be replaced as part of T26729293. + YogaNode parent = childYogaNode.getParent(); + if (parent != null) { + for (int k = 0; k < parent.getChildCount(); k++) { + if (parent.getChildAt(k) == childYogaNode) { + parent.removeChildAt(k); + break; + } + } + } mYogaNode.addChildAt(childYogaNode, i); } markUpdated();