Skip to content

Commit 977cbc5

Browse files
Set properties directly on data in nodefactory reducing set accessor megamorphism.
1 parent 14e032b commit 977cbc5

File tree

4 files changed

+1350
-1214
lines changed

4 files changed

+1350
-1214
lines changed

src/compiler/checker.ts

Lines changed: 97 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -5335,9 +5335,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
53355335

53365336
function createIntrinsicType(kind: TypeFlags, intrinsicName: string, objectFlags = ObjectFlags.None, debugIntrinsicName?: string): IntrinsicType {
53375337
checkIntrinsicName(intrinsicName, debugIntrinsicName);
5338-
const type = createType(kind) as IntrinsicType;
5339-
type.intrinsicName = intrinsicName;
5340-
type.debugIntrinsicName = debugIntrinsicName;
5338+
const type = createType(kind) as TypeWithData<IntrinsicType>;
5339+
type.data.intrinsicName = intrinsicName;
5340+
type.data.debugIntrinsicName = debugIntrinsicName;
53415341
type.objectFlags = objectFlags | ObjectFlags.CouldContainTypeVariablesComputed | ObjectFlags.IsGenericTypeComputed | ObjectFlags.IsUnknownLikeUnionComputed | ObjectFlags.IsNeverIntersectionComputed;
53425342
return type;
53435343
}
@@ -5349,15 +5349,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
53495349
}
53505350
seenIntrinsicNames.add(key);
53515351
}
5352-
5352+
type TypeWithData<T> = T & { data: Omit<T, "flags" | "objectFlags" | "symbol" | "id" | "checker">; };
53535353
function createObjectType(objectFlags: ObjectFlags, symbol?: Symbol): ObjectType {
5354-
const type = createTypeWithSymbol(TypeFlags.Object, symbol!) as ObjectType;
5354+
const type = createTypeWithSymbol(TypeFlags.Object, symbol!) as TypeWithData<ObjectType>;
53555355
type.objectFlags = objectFlags;
5356-
type.members = undefined;
5357-
type.properties = undefined;
5358-
type.callSignatures = undefined;
5359-
type.constructSignatures = undefined;
5360-
type.indexInfos = undefined;
5356+
type.data.members = undefined;
5357+
type.data.properties = undefined;
5358+
type.data.callSignatures = undefined;
5359+
type.data.constructSignatures = undefined;
5360+
type.data.indexInfos = undefined;
53615361
return type;
53625362
}
53635363

@@ -5402,14 +5402,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
54025402
}
54035403

54045404
function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: readonly Signature[], constructSignatures: readonly Signature[], indexInfos: readonly IndexInfo[]): ResolvedType {
5405-
const resolved = type as ResolvedType;
5406-
resolved.members = members;
5407-
resolved.properties = emptyArray;
5408-
resolved.callSignatures = callSignatures;
5409-
resolved.constructSignatures = constructSignatures;
5410-
resolved.indexInfos = indexInfos;
5405+
const resolved = type as TypeWithData<ResolvedType>;
5406+
resolved.data.members = members;
5407+
resolved.data.properties = emptyArray;
5408+
resolved.data.callSignatures = callSignatures;
5409+
resolved.data.constructSignatures = constructSignatures;
5410+
resolved.data.indexInfos = indexInfos;
54115411
// This can loop back to getPropertyOfType() which would crash if `callSignatures` & `constructSignatures` are not initialized.
5412-
if (members !== emptySymbols) resolved.properties = getNamedMembers(members);
5412+
if (members !== emptySymbols) resolved.data.properties = getNamedMembers(members);
54135413
return resolved;
54145414
}
54155415

@@ -13019,13 +13019,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1301913019
return links.declaredType;
1302013020
}
1302113021

13022-
function createComputedEnumType(symbol: Symbol) {
13023-
const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
13024-
const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
13025-
regularType.regularType = regularType;
13026-
regularType.freshType = freshType;
13027-
freshType.regularType = regularType;
13028-
freshType.freshType = freshType;
13022+
function createComputedEnumType(symbol: Symbol): EnumType {
13023+
const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as TypeWithData<EnumType>;
13024+
const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as TypeWithData<EnumType>;
13025+
regularType.data.regularType = regularType;
13026+
regularType.data.freshType = freshType;
13027+
freshType.data.regularType = regularType;
13028+
freshType.data.freshType = freshType;
1302913029
return regularType;
1303013030
}
1303113031

@@ -16258,22 +16258,22 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1625816258

1625916259
function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined): TypeReference {
1626016260
const id = getTypeListId(typeArguments);
16261-
let type = target.instantiations.get(id);
16261+
let type = target.instantiations.get(id) as TypeWithData<TypeReference>;
1626216262
if (!type) {
16263-
type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeReference;
16263+
type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeWithData<TypeReference>;
1626416264
target.instantiations.set(id, type);
1626516265
type.objectFlags |= typeArguments ? getPropagatingFlagsOfTypes(typeArguments) : 0;
16266-
type.target = target;
16267-
type.resolvedTypeArguments = typeArguments;
16266+
type.data.target = target;
16267+
type.data.resolvedTypeArguments = typeArguments;
1626816268
}
1626916269
return type;
1627016270
}
1627116271

1627216272
function cloneTypeReference(source: TypeReference): TypeReference {
16273-
const type = createTypeWithSymbol(source.flags, source.symbol) as TypeReference;
16273+
const type = createTypeWithSymbol(source.flags, source.symbol) as TypeWithData<TypeReference>;
1627416274
type.objectFlags = source.objectFlags;
16275-
type.target = source.target;
16276-
type.resolvedTypeArguments = source.resolvedTypeArguments;
16275+
type.data.target = source.target;
16276+
type.data.resolvedTypeArguments = source.resolvedTypeArguments;
1627716277
return type;
1627816278
}
1627916279

@@ -16283,12 +16283,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1628316283
const localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
1628416284
aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
1628516285
}
16286-
const type = createObjectType(ObjectFlags.Reference, target.symbol) as DeferredTypeReference;
16287-
type.target = target;
16288-
type.node = node;
16289-
type.mapper = mapper;
16290-
type.aliasSymbol = aliasSymbol;
16291-
type.aliasTypeArguments = aliasTypeArguments;
16286+
const type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeWithData<DeferredTypeReference>;
16287+
type.data.target = target;
16288+
type.data.node = node;
16289+
type.data.mapper = mapper;
16290+
type.data.aliasSymbol = aliasSymbol;
16291+
type.data.aliasTypeArguments = aliasTypeArguments;
1629216292
return type;
1629316293
}
1629416294

@@ -17206,28 +17206,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1720617206
lengthSymbol.links.type = getUnionType(literalTypes);
1720717207
}
1720817208
properties.push(lengthSymbol);
17209-
const type = createObjectType(ObjectFlags.Tuple | ObjectFlags.Reference) as TupleType & InterfaceTypeWithDeclaredMembers;
17210-
type.typeParameters = typeParameters;
17211-
type.outerTypeParameters = undefined;
17212-
type.localTypeParameters = typeParameters;
17213-
type.instantiations = new Map<string, TypeReference>();
17214-
type.instantiations.set(getTypeListId(type.typeParameters), type as GenericType);
17215-
type.target = type as GenericType;
17216-
type.resolvedTypeArguments = type.typeParameters;
17217-
type.thisType = createTypeParameter();
17218-
type.thisType.isThisType = true;
17219-
type.thisType.constraint = type;
17220-
type.declaredProperties = properties;
17221-
type.declaredCallSignatures = emptyArray;
17222-
type.declaredConstructSignatures = emptyArray;
17223-
type.declaredIndexInfos = emptyArray;
17224-
type.elementFlags = elementFlags;
17225-
type.minLength = minLength;
17226-
type.fixedLength = fixedLength;
17227-
type.hasRestElement = !!(combinedFlags & ElementFlags.Variable);
17228-
type.combinedFlags = combinedFlags;
17229-
type.readonly = readonly;
17230-
type.labeledElementDeclarations = namedMemberDeclarations;
17209+
const type = createObjectType(ObjectFlags.Tuple | ObjectFlags.Reference) as TypeWithData<TupleType & InterfaceTypeWithDeclaredMembers>;
17210+
type.data.typeParameters = typeParameters;
17211+
type.data.outerTypeParameters = undefined;
17212+
type.data.localTypeParameters = typeParameters;
17213+
type.data.instantiations = new Map<string, TypeReference>();
17214+
type.data.instantiations.set(getTypeListId(type.typeParameters), type as GenericType);
17215+
type.data.target = type as GenericType;
17216+
type.data.resolvedTypeArguments = type.typeParameters;
17217+
type.data.thisType = createTypeParameter();
17218+
type.data.thisType.isThisType = true;
17219+
type.data.thisType.constraint = type;
17220+
type.data.declaredProperties = properties;
17221+
type.data.declaredCallSignatures = emptyArray;
17222+
type.data.declaredConstructSignatures = emptyArray;
17223+
type.data.declaredIndexInfos = emptyArray;
17224+
type.data.elementFlags = elementFlags;
17225+
type.data.minLength = minLength;
17226+
type.data.fixedLength = fixedLength;
17227+
type.data.hasRestElement = !!(combinedFlags & ElementFlags.Variable);
17228+
type.data.combinedFlags = combinedFlags;
17229+
type.data.readonly = readonly;
17230+
type.data.labeledElementDeclarations = namedMemberDeclarations;
1723117231
return type;
1723217232
}
1723317233

@@ -17925,12 +17925,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1792517925
return true;
1792617926
}
1792717927

17928-
function createIntersectionType(types: Type[], objectFlags: ObjectFlags, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]) {
17929-
const result = createType(TypeFlags.Intersection) as IntersectionType;
17928+
function createIntersectionType(types: Type[], objectFlags: ObjectFlags, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): IntersectionType {
17929+
const result = createType(TypeFlags.Intersection) as TypeWithData<IntersectionType>;
1793017930
result.objectFlags = objectFlags | getPropagatingFlagsOfTypes(types, /*excludeKinds*/ TypeFlags.Nullable);
17931-
result.types = types;
17932-
result.aliasSymbol = aliasSymbol;
17933-
result.aliasTypeArguments = aliasTypeArguments;
17931+
result.data.types = types;
17932+
result.data.aliasSymbol = aliasSymbol;
17933+
result.data.aliasTypeArguments = aliasTypeArguments;
1793417934
return result;
1793517935
}
1793617936

@@ -18143,16 +18143,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1814318143
return links.resolvedType;
1814418144
}
1814518145

18146-
function createIndexType(type: InstantiableType | UnionOrIntersectionType, indexFlags: IndexFlags) {
18147-
const result = createType(TypeFlags.Index) as IndexType;
18148-
result.type = type;
18149-
result.indexFlags = indexFlags;
18146+
function createIndexType(type: InstantiableType | UnionOrIntersectionType, indexFlags: IndexFlags): IndexType {
18147+
const result = createType(TypeFlags.Index) as TypeWithData<IndexType>;
18148+
result.data.type = type;
18149+
result.data.indexFlags = indexFlags;
1815018150
return result;
1815118151
}
1815218152

18153-
function createOriginIndexType(type: InstantiableType | UnionOrIntersectionType) {
18154-
const result = createOriginType(TypeFlags.Index) as IndexType;
18155-
result.type = type;
18153+
function createOriginIndexType(type: InstantiableType | UnionOrIntersectionType): IndexType {
18154+
const result = createOriginType(TypeFlags.Index) as TypeWithData<IndexType>;
18155+
result.data.type = type;
1815618156
return result;
1815718157
}
1815818158

@@ -18413,10 +18413,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1841318413
undefined;
1841418414
}
1841518415

18416-
function createTemplateLiteralType(texts: readonly string[], types: readonly Type[]) {
18417-
const type = createType(TypeFlags.TemplateLiteral) as TemplateLiteralType;
18418-
type.texts = texts;
18419-
type.types = types;
18416+
function createTemplateLiteralType(texts: readonly string[], types: readonly Type[]): TemplateLiteralType {
18417+
const type = createType(TypeFlags.TemplateLiteral) as TypeWithData<TemplateLiteralType>;
18418+
type.data.texts = texts;
18419+
type.data.types = types;
1842018420
return type;
1842118421
}
1842218422

@@ -18469,19 +18469,19 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1846918469
return result;
1847018470
}
1847118471

18472-
function createStringMappingType(symbol: Symbol, type: Type) {
18473-
const result = createTypeWithSymbol(TypeFlags.StringMapping, symbol) as StringMappingType;
18474-
result.type = type;
18472+
function createStringMappingType(symbol: Symbol, type: Type): StringMappingType {
18473+
const result = createTypeWithSymbol(TypeFlags.StringMapping, symbol) as TypeWithData<StringMappingType>;
18474+
result.data.type = type;
1847518475
return result;
1847618476
}
1847718477

18478-
function createIndexedAccessType(objectType: Type, indexType: Type, accessFlags: AccessFlags, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined) {
18479-
const type = createType(TypeFlags.IndexedAccess) as IndexedAccessType;
18478+
function createIndexedAccessType(objectType: Type, indexType: Type, accessFlags: AccessFlags, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined): IndexedAccessType {
18479+
const type = createType(TypeFlags.IndexedAccess) as TypeWithData<IndexedAccessType>;
1848018480
type.objectType = objectType;
18481-
type.indexType = indexType;
18482-
type.accessFlags = accessFlags;
18483-
type.aliasSymbol = aliasSymbol;
18484-
type.aliasTypeArguments = aliasTypeArguments;
18481+
type.data.indexType = indexType;
18482+
type.data.accessFlags = accessFlags;
18483+
type.data.aliasSymbol = aliasSymbol;
18484+
type.data.aliasTypeArguments = aliasTypeArguments;
1848518485
return type;
1848618486
}
1848718487

@@ -19568,10 +19568,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1956819568
return info.isReadonly !== readonly ? createIndexInfo(info.keyType, info.type, readonly, info.declaration) : info;
1956919569
}
1957019570

19571-
function createLiteralType(flags: TypeFlags, value: string | number | PseudoBigInt, symbol?: Symbol, regularType?: LiteralType) {
19572-
const type = createTypeWithSymbol(flags, symbol!) as LiteralType;
19573-
type.value = value;
19574-
type.regularType = regularType || type;
19571+
function createLiteralType(flags: TypeFlags, value: string | number | PseudoBigInt, symbol?: Symbol, regularType?: LiteralType): LiteralType {
19572+
const type = createTypeWithSymbol(flags, symbol!) as TypeWithData<LiteralType>;
19573+
type.data.value = value;
19574+
type.data.regularType = regularType || type;
1957519575
return type;
1957619576
}
1957719577

@@ -19635,9 +19635,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1963519635
return links.resolvedType;
1963619636
}
1963719637

19638-
function createUniqueESSymbolType(symbol: Symbol) {
19639-
const type = createTypeWithSymbol(TypeFlags.UniqueESSymbol, symbol) as UniqueESSymbolType;
19640-
type.escapedName = `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
19638+
function createUniqueESSymbolType(symbol: Symbol): UniqueESSymbolType {
19639+
const type = createTypeWithSymbol(TypeFlags.UniqueESSymbol, symbol) as TypeWithData<UniqueESSymbolType>;
19640+
type.data.escapedName = `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
1964119641
return type;
1964219642
}
1964319643

@@ -25681,10 +25681,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2568125681
}
2568225682
// For all other object types we infer a new object type where the reverse mapping has been
2568325683
// applied to the type of each property.
25684-
const reversed = createObjectType(ObjectFlags.ReverseMapped | ObjectFlags.Anonymous, /*symbol*/ undefined) as ReverseMappedType;
25685-
reversed.source = source;
25686-
reversed.mappedType = target;
25687-
reversed.constraintType = constraint;
25684+
const reversed = createObjectType(ObjectFlags.ReverseMapped | ObjectFlags.Anonymous, /*symbol*/ undefined) as TypeWithData<ReverseMappedType>;
25685+
reversed.data.source = source;
25686+
reversed.data.mappedType = target;
25687+
reversed.data.constraintType = constraint;
2568825688
return reversed;
2568925689
}
2569025690

@@ -27807,8 +27807,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2780727807
// array types are ultimately converted into manifest array types (using getFinalArrayType)
2780827808
// and never escape the getFlowTypeOfReference function.
2780927809
function createEvolvingArrayType(elementType: Type): EvolvingArrayType {
27810-
const result = createObjectType(ObjectFlags.EvolvingArray) as EvolvingArrayType;
27811-
result.elementType = elementType;
27810+
const result = createObjectType(ObjectFlags.EvolvingArray) as TypeWithData<EvolvingArrayType>;
27811+
result.data.elementType = elementType;
2781227812
return result;
2781327813
}
2781427814

src/compiler/commandLineParser.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ import {
9797
ParsedCommandLine,
9898
parseJsonText,
9999
Path,
100-
PluginImport,
101100
PollingWatchKind,
102101
PrefixUnaryExpression,
103102
ProjectReference,

0 commit comments

Comments
 (0)