Skip to content

Commit 42c6a76

Browse files
committed
Use shared/assign instead of Object.assign in code
This is so that we have one cached local instance in the bundle. Ideally we should have a compile do this for us but we already follow this pattern with hasOwnProperty, isArray, Object.is etc.
1 parent 38623ae commit 42c6a76

18 files changed

+64
-30
lines changed

packages/react-debug-tools/src/ReactDebugHooks.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {
2020
} from 'react-reconciler/src/ReactInternalTypes';
2121

2222
import ErrorStackParser from 'error-stack-parser';
23+
import assign from 'shared/assign';
2324
import ReactSharedInternals from 'shared/ReactSharedInternals';
2425
import {
2526
FunctionComponent,
@@ -720,7 +721,7 @@ function inspectHooksOfForwardRef<Props, Ref>(
720721
function resolveDefaultProps(Component, baseProps) {
721722
if (Component && Component.defaultProps) {
722723
// Resolve default props. Taken from ReactElement
723-
const props = Object.assign({}, baseProps);
724+
const props = assign({}, baseProps);
724725
const defaultProps = Component.defaultProps;
725726
for (const propName in defaultProps) {
726727
if (props[propName] === undefined) {

packages/react-dom/src/client/ReactDOMInput.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {getToStringValue, toString} from './ToStringValue';
1616
import {checkControlledValueProps} from '../shared/ReactControlledValuePropTypes';
1717
import {updateValueIfChanged} from './inputValueTracking';
1818
import getActiveElement from './getActiveElement';
19+
import assign from 'shared/assign';
1920
import {disableInputAttributeSyncing} from 'shared/ReactFeatureFlags';
2021
import {checkAttributeStringCoercion} from 'shared/CheckStringCoercion';
2122

@@ -62,7 +63,7 @@ export function getHostProps(element: Element, props: Object) {
6263
const node = ((element: any): InputWithWrapperState);
6364
const checked = props.checked;
6465

65-
const hostProps = Object.assign({}, props, {
66+
const hostProps = assign({}, props, {
6667
defaultChecked: undefined,
6768
defaultValue: undefined,
6869
value: undefined,

packages/react-dom/src/client/ReactDOMSelect.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {getCurrentFiberOwnerNameInDevOrNull} from 'react-reconciler/src/ReactCur
1212

1313
import {checkControlledValueProps} from '../shared/ReactControlledValuePropTypes';
1414
import {getToStringValue, toString} from './ToStringValue';
15+
import assign from 'shared/assign';
1516
import isArray from 'shared/isArray';
1617

1718
let didWarnValueDefaultValue;
@@ -134,7 +135,7 @@ function updateOptions(
134135
*/
135136

136137
export function getHostProps(element: Element, props: Object) {
137-
return Object.assign({}, props, {
138+
return assign({}, props, {
138139
value: undefined,
139140
});
140141
}

packages/react-dom/src/events/SyntheticEvent.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
/* eslint valid-typeof: 0 */
1111

12+
import assign from 'shared/assign';
1213
import getEventCharCode from './getEventCharCode';
1314

1415
type EventInterfaceType = {
@@ -78,7 +79,7 @@ function createSyntheticEvent(Interface: EventInterfaceType) {
7879
return this;
7980
}
8081

81-
Object.assign(SyntheticBaseEvent.prototype, {
82+
assign(SyntheticBaseEvent.prototype, {
8283
preventDefault: function() {
8384
this.defaultPrevented = true;
8485
const event = this.nativeEvent;

packages/react-dom/src/server/ReactPartialRenderer.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import warnValidStyle from '../shared/warnValidStyle';
8080
import {validateProperties as validateARIAProperties} from '../shared/ReactDOMInvalidARIAHook';
8181
import {validateProperties as validateInputProperties} from '../shared/ReactDOMNullInputValuePropHook';
8282
import {validateProperties as validateUnknownProperties} from '../shared/ReactDOMUnknownPropertyHook';
83+
import assign from 'shared/assign';
8384
import hasOwnProperty from 'shared/hasOwnProperty';
8485

8586
// Based on reading the React.Children implementation. TODO: type this somewhere?
@@ -563,7 +564,7 @@ function resolve(
563564
}
564565

565566
if (partialState != null) {
566-
inst.state = Object.assign({}, inst.state, partialState);
567+
inst.state = assign({}, inst.state, partialState);
567568
}
568569
}
569570
} else {
@@ -695,9 +696,9 @@ function resolve(
695696
if (partialState != null) {
696697
if (dontMutate) {
697698
dontMutate = false;
698-
nextState = Object.assign({}, nextState, partialState);
699+
nextState = assign({}, nextState, partialState);
699700
} else {
700-
Object.assign(nextState, partialState);
701+
assign(nextState, partialState);
701702
}
702703
}
703704
}
@@ -745,7 +746,7 @@ function resolve(
745746
}
746747
}
747748
if (childContext) {
748-
context = Object.assign({}, context, childContext);
749+
context = assign({}, context, childContext);
749750
}
750751
}
751752
}
@@ -1192,7 +1193,7 @@ class ReactDOMServerRenderer {
11921193
const nextChildren = [
11931194
React.createElement(
11941195
elementType.type,
1195-
Object.assign({ref: element.ref}, element.props),
1196+
assign({ref: element.ref}, element.props),
11961197
),
11971198
];
11981199
const frame: Frame = {
@@ -1291,7 +1292,7 @@ class ReactDOMServerRenderer {
12911292
const nextChildren = [
12921293
React.createElement(
12931294
result,
1294-
Object.assign({ref: element.ref}, element.props),
1295+
assign({ref: element.ref}, element.props),
12951296
),
12961297
];
12971298
const frame: Frame = {
@@ -1413,7 +1414,7 @@ class ReactDOMServerRenderer {
14131414
}
14141415
}
14151416

1416-
props = Object.assign(
1417+
props = assign(
14171418
{
14181419
type: undefined,
14191420
},
@@ -1485,7 +1486,7 @@ class ReactDOMServerRenderer {
14851486
if (__DEV__) {
14861487
checkFormFieldValueStringCoercion(initialValue);
14871488
}
1488-
props = Object.assign({}, props, {
1489+
props = assign({}, props, {
14891490
value: undefined,
14901491
children: '' + initialValue,
14911492
});
@@ -1531,7 +1532,7 @@ class ReactDOMServerRenderer {
15311532
}
15321533
this.currentSelectValue =
15331534
props.value != null ? props.value : props.defaultValue;
1534-
props = Object.assign({}, props, {
1535+
props = assign({}, props, {
15351536
value: undefined,
15361537
});
15371538
} else if (tag === 'option') {
@@ -1577,7 +1578,7 @@ class ReactDOMServerRenderer {
15771578
selected = '' + selectValue === value;
15781579
}
15791580

1580-
props = Object.assign(
1581+
props = assign(
15811582
{
15821583
selected: undefined,
15831584
},

packages/react-dom/src/test-utils/ReactTestUtils.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
rethrowCaughtError,
2222
invokeGuardedCallbackAndCatchFirstError,
2323
} from 'shared/ReactErrorUtils';
24+
import assign from 'shared/assign';
2425
import isArray from 'shared/isArray';
2526

2627
// Keep in sync with ReactDOM.js:
@@ -596,7 +597,7 @@ function makeSimulator(eventType) {
596597
// Since we aren't using pooling, always persist the event. This will make
597598
// sure it's marked and won't warn when setting additional properties.
598599
event.persist();
599-
Object.assign(event, eventData);
600+
assign(event, eventData);
600601

601602
if (directDispatchEventTypes.has(eventType)) {
602603
accumulateDirectDispatchesSingle(event);

packages/react-native-renderer/src/legacy-events/SyntheticEvent.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
/* eslint valid-typeof: 0 */
99

10+
import assign from 'shared/assign';
11+
1012
const EVENT_POOL_SIZE = 10;
1113

1214
/**
@@ -110,7 +112,7 @@ function SyntheticEvent(
110112
return this;
111113
}
112114

113-
Object.assign(SyntheticEvent.prototype, {
115+
assign(SyntheticEvent.prototype, {
114116
preventDefault: function() {
115117
this.defaultPrevented = true;
116118
const event = this.nativeEvent;
@@ -236,11 +238,11 @@ SyntheticEvent.extend = function(Interface) {
236238
function Class() {
237239
return Super.apply(this, arguments);
238240
}
239-
Object.assign(prototype, Class.prototype);
241+
assign(prototype, Class.prototype);
240242
Class.prototype = prototype;
241243
Class.prototype.constructor = Class;
242244

243-
Class.Interface = Object.assign({}, Super.Interface, Interface);
245+
Class.Interface = assign({}, Super.Interface, Interface);
244246
Class.extend = Super.extend;
245247
addEventPoolingTo(Class);
246248

packages/react-reconciler/src/ReactFiberClassComponent.new.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
3535
import shallowEqual from 'shared/shallowEqual';
3636
import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
3737
import getComponentNameFromType from 'shared/getComponentNameFromType';
38+
import assign from 'shared/assign';
3839
import isArray from 'shared/isArray';
3940
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
4041

@@ -186,7 +187,7 @@ function applyDerivedStateFromProps(
186187
const memoizedState =
187188
partialState === null || partialState === undefined
188189
? prevState
189-
: Object.assign({}, prevState, partialState);
190+
: assign({}, prevState, partialState);
190191
workInProgress.memoizedState = memoizedState;
191192

192193
// Once the update queue is empty, persist the derived state onto the

packages/react-reconciler/src/ReactFiberClassComponent.old.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
3535
import shallowEqual from 'shared/shallowEqual';
3636
import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
3737
import getComponentNameFromType from 'shared/getComponentNameFromType';
38+
import assign from 'shared/assign';
3839
import isArray from 'shared/isArray';
3940
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
4041

@@ -186,7 +187,7 @@ function applyDerivedStateFromProps(
186187
const memoizedState =
187188
partialState === null || partialState === undefined
188189
? prevState
189-
: Object.assign({}, prevState, partialState);
190+
: assign({}, prevState, partialState);
190191
workInProgress.memoizedState = memoizedState;
191192

192193
// Once the update queue is empty, persist the derived state onto the

packages/react-reconciler/src/ReactFiberLazyComponent.new.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
* @flow
88
*/
99

10+
import assign from 'shared/assign';
11+
1012
export function resolveDefaultProps(Component: any, baseProps: Object): Object {
1113
if (Component && Component.defaultProps) {
1214
// Resolve default props. Taken from ReactElement
13-
const props = Object.assign({}, baseProps);
15+
const props = assign({}, baseProps);
1416
const defaultProps = Component.defaultProps;
1517
for (const propName in defaultProps) {
1618
if (props[propName] === undefined) {

packages/react-reconciler/src/ReactFiberLazyComponent.old.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
* @flow
88
*/
99

10+
import assign from 'shared/assign';
11+
1012
export function resolveDefaultProps(Component: any, baseProps: Object): Object {
1113
if (Component && Component.defaultProps) {
1214
// Resolve default props. Taken from ReactElement
13-
const props = Object.assign({}, baseProps);
15+
const props = assign({}, baseProps);
1416
const defaultProps = Component.defaultProps;
1517
for (const propName in defaultProps) {
1618
if (props[propName] === undefined) {

packages/react-reconciler/src/ReactUpdateQueue.new.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ import {
112112
import {pushInterleavedQueue} from './ReactFiberInterleavedUpdates.new';
113113
import {setIsStrictModeForDevtools} from './ReactFiberDevToolsHook.new';
114114

115+
import assign from 'shared/assign';
116+
115117
export type Update<State> = {|
116118
// TODO: Temporary field. Will remove this by storing a map of
117119
// transition -> event time on the root.
@@ -442,7 +444,7 @@ function getStateFromUpdate<State>(
442444
return prevState;
443445
}
444446
// Merge the partial state and the previous state.
445-
return Object.assign({}, prevState, partialState);
447+
return assign({}, prevState, partialState);
446448
}
447449
case ForceUpdate: {
448450
hasForceUpdate = true;

packages/react-reconciler/src/ReactUpdateQueue.old.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ import {
112112
import {pushInterleavedQueue} from './ReactFiberInterleavedUpdates.old';
113113
import {setIsStrictModeForDevtools} from './ReactFiberDevToolsHook.old';
114114

115+
import assign from 'shared/assign';
116+
115117
export type Update<State> = {|
116118
// TODO: Temporary field. Will remove this by storing a map of
117119
// transition -> event time on the root.
@@ -442,7 +444,7 @@ function getStateFromUpdate<State>(
442444
return prevState;
443445
}
444446
// Merge the partial state and the previous state.
445-
return Object.assign({}, prevState, partialState);
447+
return assign({}, prevState, partialState);
446448
}
447449
case ForceUpdate: {
448450
hasForceUpdate = true;

packages/react-server/src/ReactFizzClassComponent.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
1818
import getComponentNameFromType from 'shared/getComponentNameFromType';
1919
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
20+
import assign from 'shared/assign';
2021
import isArray from 'shared/isArray';
2122

2223
const didWarnAboutNoopUpdateForComponent = {};
@@ -161,7 +162,7 @@ function applyDerivedStateFromProps(
161162
const newState =
162163
partialState === null || partialState === undefined
163164
? prevState
164-
: Object.assign({}, prevState, partialState);
165+
: assign({}, prevState, partialState);
165166
return newState;
166167
}
167168

@@ -602,9 +603,9 @@ function processUpdateQueue(
602603
if (partialState != null) {
603604
if (dontMutate) {
604605
dontMutate = false;
605-
nextState = Object.assign({}, nextState, partialState);
606+
nextState = assign({}, nextState, partialState);
606607
} else {
607-
Object.assign(nextState, partialState);
608+
assign(nextState, partialState);
608609
}
609610
}
610611
}

packages/react-server/src/ReactFizzServer.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ import {
117117
enableSuspenseAvoidThisFallbackFizz,
118118
} from 'shared/ReactFeatureFlags';
119119

120+
import assign from 'shared/assign';
120121
import getComponentNameFromType from 'shared/getComponentNameFromType';
121122
import isArray from 'shared/isArray';
122123

@@ -837,7 +838,7 @@ function validateFunctionComponentInDev(Component: any): void {
837838
function resolveDefaultProps(Component: any, baseProps: Object): Object {
838839
if (Component && Component.defaultProps) {
839840
// Resolve default props. Taken from ReactElement
840-
const props = Object.assign({}, baseProps);
841+
const props = assign({}, baseProps);
841842
const defaultProps = Component.defaultProps;
842843
for (const propName in defaultProps) {
843844
if (props[propName] === undefined) {

packages/react/src/ReactBaseClasses.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import ReactNoopUpdateQueue from './ReactNoopUpdateQueue';
9+
import assign from 'shared/assign';
910

1011
const emptyObject = {};
1112
if (__DEV__) {
@@ -139,7 +140,7 @@ function PureComponent(props, context, updater) {
139140
const pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());
140141
pureComponentPrototype.constructor = PureComponent;
141142
// Avoid an extra prototype jump for these methods.
142-
Object.assign(pureComponentPrototype, Component.prototype);
143+
assign(pureComponentPrototype, Component.prototype);
143144
pureComponentPrototype.isPureReactComponent = true;
144145

145146
export {Component, PureComponent};

packages/react/src/ReactElement.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import getComponentNameFromType from 'shared/getComponentNameFromType';
99
import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols';
10+
import assign from 'shared/assign';
1011
import hasOwnProperty from 'shared/hasOwnProperty';
1112
import {checkKeyStringCoercion} from 'shared/CheckStringCoercion';
1213

@@ -492,7 +493,7 @@ export function cloneElement(element, config, children) {
492493
let propName;
493494

494495
// Original props are copied
495-
const props = Object.assign({}, element.props);
496+
const props = assign({}, element.props);
496497

497498
// Reserved names are extracted
498499
let key = element.key;

packages/shared/assign.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
const assign = Object.assign;
11+
12+
export default assign;

0 commit comments

Comments
 (0)