From 5901eedb8b686a0c05bdb97ba966dd887b91487b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 30 Jul 2022 09:07:06 +0300 Subject: [PATCH 1/7] refactor uniqueMap. Add mergeMaps --- src/compiler.ts | 22 ++++++++++----------- src/flow.ts | 4 ++-- src/resolver.ts | 42 ++++++++++++++++++++--------------------- src/util/collections.ts | 42 +++++++++++++++++++++++++---------------- 4 files changed, 60 insertions(+), 50 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 618d4636e3..fcfeaec0ce 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -195,7 +195,7 @@ import { writeF32, writeF64, writeV128, - uniqueMap, + cloneMap, isPowerOf2, v128_zero, readI32, @@ -2980,7 +2980,7 @@ export class Compiler extends DiagnosticEmitter { type = resolver.resolveType( // reports typeNode, flow.actualFunction, - uniqueMap(flow.contextualTypeArguments) + cloneMap(flow.contextualTypeArguments) ); if (!type) continue; this.checkTypeSupported(type, typeNode); @@ -3758,7 +3758,7 @@ export class Compiler extends DiagnosticEmitter { let toType = this.resolver.resolveType( // reports assert(expression.toType), flow.actualFunction, - uniqueMap(flow.contextualTypeArguments) + cloneMap(flow.contextualTypeArguments) ); if (!toType) return this.module.unreachable(); return this.compileExpression(expression.expression, toType, inheritedConstraints | Constraints.CONV_EXPLICIT); @@ -6551,7 +6551,7 @@ export class Compiler extends DiagnosticEmitter { assert(typeParameterNodes), typeArgumentNodes, this.currentFlow.actualFunction.parent, - uniqueMap(this.currentFlow.contextualTypeArguments), // don't update + cloneMap(this.currentFlow.contextualTypeArguments), // don't update expression ); } @@ -7465,7 +7465,7 @@ export class Compiler extends DiagnosticEmitter { DecoratorFlags.NONE ); var instance: Function | null; - var contextualTypeArguments = uniqueMap(flow.contextualTypeArguments); + var contextualTypeArguments = cloneMap(flow.contextualTypeArguments); var module = this.module; // compile according to context. this differs from a normal function in that omitted parameter @@ -7847,7 +7847,7 @@ export class Compiler extends DiagnosticEmitter { let functionInstance = this.resolver.resolveFunction( functionPrototype, null, - uniqueMap(flow.contextualTypeArguments) + cloneMap(flow.contextualTypeArguments) ); if (!functionInstance || !this.compileFunction(functionInstance)) return module.unreachable(); if (functionInstance.hasDecorator(DecoratorFlags.BUILTIN)) { @@ -7902,7 +7902,7 @@ export class Compiler extends DiagnosticEmitter { var expectedType = this.resolver.resolveType( expression.isType, flow.actualFunction, - uniqueMap(flow.contextualTypeArguments) + cloneMap(flow.contextualTypeArguments) ); if (!expectedType) { this.currentType = Type.bool; @@ -8280,7 +8280,7 @@ export class Compiler extends DiagnosticEmitter { let instance = this.resolver.resolveFunction( target, null, - uniqueMap(), + cloneMap(), ReportMode.SWALLOW ); if (!instance) break; @@ -8866,14 +8866,14 @@ export class Compiler extends DiagnosticEmitter { classInstance = this.resolver.resolveClass( classPrototype, classReference.typeArguments, - uniqueMap(flow.contextualTypeArguments) + cloneMap(flow.contextualTypeArguments) ); } else { classInstance = this.resolver.resolveClassInclTypeArguments( classPrototype, typeArguments, flow.actualFunction.parent, // relative to caller - uniqueMap(flow.contextualTypeArguments), + cloneMap(flow.contextualTypeArguments), expression ); } @@ -8905,7 +8905,7 @@ export class Compiler extends DiagnosticEmitter { // clone base constructor if a derived class. note that we cannot just // call the base ctor since the derived class may have additional fields. let baseClass = classInstance.base; - let contextualTypeArguments = uniqueMap(classInstance.contextualTypeArguments); + let contextualTypeArguments = cloneMap(classInstance.contextualTypeArguments); if (baseClass) { let baseCtor = this.ensureConstructor(baseClass, reportNode); this.checkFieldInitialization(baseClass, reportNode); diff --git a/src/flow.ts b/src/flow.ts index 2ab9e4b4dc..6214f026c4 100644 --- a/src/flow.ts +++ b/src/flow.ts @@ -85,7 +85,7 @@ import { import { BitSet, - uniqueMap + cloneMap } from "./util"; import { @@ -314,7 +314,7 @@ export class Flow { branch.localFlags = this.localFlags.slice(); if (this.actualFunction.is(CommonFlags.CONSTRUCTOR)) { let thisFieldFlags = assert(this.thisFieldFlags); - branch.thisFieldFlags = uniqueMap(thisFieldFlags); + branch.thisFieldFlags = cloneMap(thisFieldFlags); } else { assert(!this.thisFieldFlags); } diff --git a/src/resolver.ts b/src/resolver.ts index 7c7aac2fa9..c421223eed 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -95,7 +95,7 @@ import { } from "./common"; import { - uniqueMap, + cloneMap, isPowerOf2 } from "./util"; @@ -255,7 +255,7 @@ export class Resolver extends DiagnosticEmitter { element, typeArgumentNodes, ctxElement, - uniqueMap(ctxTypes), // don't inherit + cloneMap(ctxTypes), // don't inherit node, reportMode ); @@ -309,7 +309,7 @@ export class Resolver extends DiagnosticEmitter { typeParameterNodes, typeArgumentNodes, ctxElement, - ctxTypes = uniqueMap(ctxTypes), // update + ctxTypes = cloneMap(ctxTypes), // update node, reportMode ); @@ -626,7 +626,7 @@ export class Resolver extends DiagnosticEmitter { /** Contextual element. */ ctxElement: Element, /** Contextual types, i.e. `T`. Updated in place with the new set of contextual types. */ - ctxTypes: Map = uniqueMap(), + ctxTypes: Map = cloneMap(), /** Alternative report node in case of empty type arguments. */ alternativeReportNode: Node | null = null, /** How to proceed with eventual diagnostics. */ @@ -656,7 +656,7 @@ export class Resolver extends DiagnosticEmitter { return null; } var typeArguments = new Array(maxParameterCount); - var oldCtxTypes = uniqueMap(ctxTypes); + var oldCtxTypes = cloneMap(ctxTypes); ctxTypes.clear(); for (let i = 0; i < maxParameterCount; ++i) { let type = i < argumentCount @@ -669,7 +669,7 @@ export class Resolver extends DiagnosticEmitter { : this.resolveType( // reports assert(typeParameters[i].defaultType), ctxElement, - uniqueMap(ctxTypes), // don't update + cloneMap(ctxTypes), // don't update reportMode ); if (!type) return null; @@ -704,7 +704,7 @@ export class Resolver extends DiagnosticEmitter { prototype, typeArguments, ctxFlow.actualFunction, - uniqueMap(ctxFlow.contextualTypeArguments), // don't inherit + cloneMap(ctxFlow.contextualTypeArguments), // don't inherit node, reportMode ); @@ -712,7 +712,7 @@ export class Resolver extends DiagnosticEmitter { // infer generic call if type arguments have been omitted if (prototype.is(CommonFlags.GENERIC)) { - let contextualTypeArguments = uniqueMap(ctxFlow.contextualTypeArguments); + let contextualTypeArguments = cloneMap(ctxFlow.contextualTypeArguments); // fill up contextual types with auto for each generic component let typeParameterNodes = assert(prototype.typeParameterNodes); @@ -780,13 +780,13 @@ export class Resolver extends DiagnosticEmitter { return this.resolveFunction( prototype, resolvedTypeArguments, - uniqueMap(ctxFlow.contextualTypeArguments), + cloneMap(ctxFlow.contextualTypeArguments), reportMode ); } // otherwise resolve the non-generic call as usual - return this.resolveFunction(prototype, null, uniqueMap(), reportMode); + return this.resolveFunction(prototype, null, cloneMap(), reportMode); } /** Updates contextual types with a possibly encapsulated inferred type. */ @@ -1220,7 +1220,7 @@ export class Resolver extends DiagnosticEmitter { var element = this.lookupIdentifierExpression(node, ctxFlow, ctxElement, reportMode); if (!element) return null; if (element.kind == ElementKind.FUNCTION_PROTOTYPE) { - let instance = this.resolveFunction(element, null, uniqueMap(), reportMode); + let instance = this.resolveFunction(element, null, cloneMap(), reportMode); if (!instance) return null; element = instance; } @@ -1357,7 +1357,7 @@ export class Resolver extends DiagnosticEmitter { // Inherit from 'Function' if not overridden, i.e. fn.call let ownMember = target.getMember(propertyName); if (!ownMember) { - let functionInstance = this.resolveFunction(target, null, uniqueMap(), ReportMode.SWALLOW); + let functionInstance = this.resolveFunction(target, null, cloneMap(), ReportMode.SWALLOW); if (functionInstance) { let wrapper = functionInstance.type.getClassOrWrapper(this.program); if (wrapper) target = wrapper; @@ -2538,7 +2538,7 @@ export class Resolver extends DiagnosticEmitter { element, node.typeArguments, ctxFlow.actualFunction, - uniqueMap(ctxFlow.contextualTypeArguments), + cloneMap(ctxFlow.contextualTypeArguments), node, reportMode ); @@ -2625,7 +2625,7 @@ export class Resolver extends DiagnosticEmitter { /** Type arguments provided. */ typeArguments: Type[] | null, /** Contextual types, i.e. `T`. */ - ctxTypes: Map = uniqueMap(), + ctxTypes: Map = cloneMap(), /** How to proceed with eventual diagnostics. */ reportMode: ReportMode = ReportMode.REPORT ): Function | null { @@ -2927,7 +2927,7 @@ export class Resolver extends DiagnosticEmitter { /** Type arguments provided. */ typeArguments: Type[] | null, /** Contextual types, i.e. `T`. */ - ctxTypes: Map = uniqueMap(), + ctxTypes: Map = cloneMap(), /** How to proceed with eventual diagnostics. */ reportMode: ReportMode = ReportMode.REPORT ): Class | null { @@ -2988,7 +2988,7 @@ export class Resolver extends DiagnosticEmitter { basePrototype, extendsNode.typeArguments, prototype.parent, // relative to derived class - uniqueMap(ctxTypes), // don't inherit + cloneMap(ctxTypes), // don't inherit extendsNode, reportMode ); @@ -3024,7 +3024,7 @@ export class Resolver extends DiagnosticEmitter { interfacePrototype, implementsNode.typeArguments, prototype.parent, - uniqueMap(ctxTypes), + cloneMap(ctxTypes), implementsNode, reportMode ); @@ -3346,14 +3346,14 @@ export class Resolver extends DiagnosticEmitter { operatorInstance = this.resolveFunction( boundPrototype, null, - uniqueMap(), + cloneMap(), reportMode ); } else { operatorInstance = this.resolveFunction( overloadPrototype, null, - uniqueMap(), + cloneMap(), reportMode ); } @@ -3491,7 +3491,7 @@ export class Resolver extends DiagnosticEmitter { let getterInstance = this.resolveFunction( getterPrototype, null, - uniqueMap(), + cloneMap(), reportMode ); if (getterInstance) { @@ -3504,7 +3504,7 @@ export class Resolver extends DiagnosticEmitter { let setterInstance = this.resolveFunction( setterPrototype, null, - uniqueMap(), + cloneMap(), reportMode ); if (setterInstance) { diff --git a/src/util/collections.ts b/src/util/collections.ts index 134ea073b0..d192f4f765 100644 --- a/src/util/collections.ts +++ b/src/util/collections.ts @@ -3,26 +3,36 @@ * @license Apache-2.0 */ -/** Makes a unique map. Typically used to track contextual type arguemnts. */ -export function uniqueMap(original: Map | null = null, overrides: Map | null = null): Map { - var cloned = new Map(); - if (original) { - // TODO: for (let [k, v] of original) { - for (let _keys = Map_keys(original), i = 0, k = _keys.length; i < k; ++i) { +/** Clone map. Typically used to track contextual type arguments. */ +export function cloneMap(map: Map | null = null): Map { + var out = new Map(); + if (map) { + // TODO: for (let [k, v] of map) { + for (let _keys = Map_keys(map), i = 0, k = _keys.length; i < k; ++i) { let k = unchecked(_keys[i]); - let v = assert(original.get(k)); - cloned.set(k, v); + let v = assert(map.get(k)); + out.set(k, v); } } - if (overrides) { - // TODO: for (let [k, v] of overrides) { - for (let _keys = Map_keys(overrides), i = 0, k = _keys.length; i < k; ++i) { - let k = unchecked(_keys[i]); - let v = assert(overrides.get(k)); - cloned.set(k, v); - } + return out; +} + +/** Merge two maps in into new one. */ +export function mergeMaps(map1: Map, map2: Map): Map { + var out = new Map(); + // TODO: for (let [k, v] of map1) { + for (let _keys = Map_keys(map1), i = 0, k = _keys.length; i < k; ++i) { + let k = unchecked(_keys[i]); + let v = assert(map1.get(k)); + out.set(k, v); + } + // TODO: for (let [k, v] of map2) { + for (let _keys = Map_keys(map2), i = 0, k = _keys.length; i < k; ++i) { + let k = unchecked(_keys[i]); + let v = assert(map2.get(k)); + out.set(k, v); } - return cloned; + return out; } /** BitSet represent growable sequence of N bits. It's faster alternative of Set when elements From 9d7a7b36c3dd27b03e19d1c9ea89314a92eb2234 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 30 Jul 2022 09:17:45 +0300 Subject: [PATCH 2/7] more --- src/compiler.ts | 2 +- src/resolver.ts | 20 ++++++++++---------- src/util/collections.ts | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index fcfeaec0ce..3b12551eee 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8280,7 +8280,7 @@ export class Compiler extends DiagnosticEmitter { let instance = this.resolver.resolveFunction( target, null, - cloneMap(), + new Map(), ReportMode.SWALLOW ); if (!instance) break; diff --git a/src/resolver.ts b/src/resolver.ts index c421223eed..b22c565e37 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -626,7 +626,7 @@ export class Resolver extends DiagnosticEmitter { /** Contextual element. */ ctxElement: Element, /** Contextual types, i.e. `T`. Updated in place with the new set of contextual types. */ - ctxTypes: Map = cloneMap(), + ctxTypes: Map = new Map(), /** Alternative report node in case of empty type arguments. */ alternativeReportNode: Node | null = null, /** How to proceed with eventual diagnostics. */ @@ -786,7 +786,7 @@ export class Resolver extends DiagnosticEmitter { } // otherwise resolve the non-generic call as usual - return this.resolveFunction(prototype, null, cloneMap(), reportMode); + return this.resolveFunction(prototype, null, new Map(), reportMode); } /** Updates contextual types with a possibly encapsulated inferred type. */ @@ -1220,7 +1220,7 @@ export class Resolver extends DiagnosticEmitter { var element = this.lookupIdentifierExpression(node, ctxFlow, ctxElement, reportMode); if (!element) return null; if (element.kind == ElementKind.FUNCTION_PROTOTYPE) { - let instance = this.resolveFunction(element, null, cloneMap(), reportMode); + let instance = this.resolveFunction(element, null, new Map(), reportMode); if (!instance) return null; element = instance; } @@ -1357,7 +1357,7 @@ export class Resolver extends DiagnosticEmitter { // Inherit from 'Function' if not overridden, i.e. fn.call let ownMember = target.getMember(propertyName); if (!ownMember) { - let functionInstance = this.resolveFunction(target, null, cloneMap(), ReportMode.SWALLOW); + let functionInstance = this.resolveFunction(target, null, new Map(), ReportMode.SWALLOW); if (functionInstance) { let wrapper = functionInstance.type.getClassOrWrapper(this.program); if (wrapper) target = wrapper; @@ -2625,7 +2625,7 @@ export class Resolver extends DiagnosticEmitter { /** Type arguments provided. */ typeArguments: Type[] | null, /** Contextual types, i.e. `T`. */ - ctxTypes: Map = cloneMap(), + ctxTypes: Map = new Map(), /** How to proceed with eventual diagnostics. */ reportMode: ReportMode = ReportMode.REPORT ): Function | null { @@ -2927,7 +2927,7 @@ export class Resolver extends DiagnosticEmitter { /** Type arguments provided. */ typeArguments: Type[] | null, /** Contextual types, i.e. `T`. */ - ctxTypes: Map = cloneMap(), + ctxTypes: Map = new Map(), /** How to proceed with eventual diagnostics. */ reportMode: ReportMode = ReportMode.REPORT ): Class | null { @@ -3346,14 +3346,14 @@ export class Resolver extends DiagnosticEmitter { operatorInstance = this.resolveFunction( boundPrototype, null, - cloneMap(), + new Map(), reportMode ); } else { operatorInstance = this.resolveFunction( overloadPrototype, null, - cloneMap(), + new Map(), reportMode ); } @@ -3491,7 +3491,7 @@ export class Resolver extends DiagnosticEmitter { let getterInstance = this.resolveFunction( getterPrototype, null, - cloneMap(), + new Map(), reportMode ); if (getterInstance) { @@ -3504,7 +3504,7 @@ export class Resolver extends DiagnosticEmitter { let setterInstance = this.resolveFunction( setterPrototype, null, - cloneMap(), + new Map(), reportMode ); if (setterInstance) { diff --git a/src/util/collections.ts b/src/util/collections.ts index d192f4f765..c865863b75 100644 --- a/src/util/collections.ts +++ b/src/util/collections.ts @@ -4,7 +4,7 @@ */ /** Clone map. Typically used to track contextual type arguments. */ -export function cloneMap(map: Map | null = null): Map { +export function cloneMap(map: Map | null): Map { var out = new Map(); if (map) { // TODO: for (let [k, v] of map) { From ef545ab57d5b651548dcf7644c9b40534d86c80b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 30 Jul 2022 09:26:15 +0300 Subject: [PATCH 3/7] use fast path for JS targets --- src/util/collections.ts | 53 +++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/src/util/collections.ts b/src/util/collections.ts index c865863b75..e7f23638d4 100644 --- a/src/util/collections.ts +++ b/src/util/collections.ts @@ -5,34 +5,45 @@ /** Clone map. Typically used to track contextual type arguments. */ export function cloneMap(map: Map | null): Map { - var out = new Map(); - if (map) { - // TODO: for (let [k, v] of map) { - for (let _keys = Map_keys(map), i = 0, k = _keys.length; i < k; ++i) { - let k = unchecked(_keys[i]); - let v = assert(map.get(k)); - out.set(k, v); + if (!ASC_TARGET) { // JS + // fast path for js target + return new Map(map); + } else { + let out = new Map(); + if (map) { + // TODO: for (let [k, v] of map) { + for (let _keys = Map_keys(map), i = 0, k = _keys.length; i < k; ++i) { + let k = unchecked(_keys[i]); + let v = assert(map.get(k)); + out.set(k, v); + } } + return out; } - return out; } /** Merge two maps in into new one. */ export function mergeMaps(map1: Map, map2: Map): Map { - var out = new Map(); - // TODO: for (let [k, v] of map1) { - for (let _keys = Map_keys(map1), i = 0, k = _keys.length; i < k; ++i) { - let k = unchecked(_keys[i]); - let v = assert(map1.get(k)); - out.set(k, v); - } - // TODO: for (let [k, v] of map2) { - for (let _keys = Map_keys(map2), i = 0, k = _keys.length; i < k; ++i) { - let k = unchecked(_keys[i]); - let v = assert(map2.get(k)); - out.set(k, v); + if (!ASC_TARGET) { // JS + let out = new Map(map1); + map2.forEach((v, k) => out.set(k, v)); + return out; + } else { + let out = new Map(); + // TODO: for (let [k, v] of map1) { + for (let _keys = Map_keys(map1), i = 0, k = _keys.length; i < k; ++i) { + let k = unchecked(_keys[i]); + let v = assert(map1.get(k)); + out.set(k, v); + } + // TODO: for (let [k, v] of map2) { + for (let _keys = Map_keys(map2), i = 0, k = _keys.length; i < k; ++i) { + let k = unchecked(_keys[i]); + let v = assert(map2.get(k)); + out.set(k, v); + } + return out; } - return out; } /** BitSet represent growable sequence of N bits. It's faster alternative of Set when elements From 88260d28b72ae7be1528aaab1922424cb65d2784 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 30 Jul 2022 12:37:08 +0300 Subject: [PATCH 4/7] unchecked in lookupInUnicodeMap --- src/util/text.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/text.ts b/src/util/text.ts index d76d9a2408..6e046ed01a 100644 --- a/src/util/text.ts +++ b/src/util/text.ts @@ -420,8 +420,8 @@ function lookupInUnicodeMap(code: u16, map: u16[]): bool { while (lo + 1 < hi) { mid = lo + ((hi - lo) >>> 1); mid -= (mid & 1); - midVal = map[mid]; - if (midVal <= code && code <= map[mid + 1]) { + midVal = unchecked(map[mid]); + if (midVal <= code && code <= unchecked(map[mid + 1])) { return true; } if (code < midVal) { From 1355a05f4a5451b9b8975fdefd2ec72c14cc5ac1 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 30 Jul 2022 16:14:40 +0300 Subject: [PATCH 5/7] remove space --- src/util/collections.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/collections.ts b/src/util/collections.ts index e7f23638d4..1a296b1292 100644 --- a/src/util/collections.ts +++ b/src/util/collections.ts @@ -7,7 +7,7 @@ export function cloneMap(map: Map | null): Map { if (!ASC_TARGET) { // JS // fast path for js target - return new Map(map); + return new Map(map); } else { let out = new Map(); if (map) { From bf34dc8078f4bb11fea35ed5b8e3310a981cb0e8 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 31 Jul 2022 14:43:22 +0300 Subject: [PATCH 6/7] use type inferring for Maps --- src/compiler.ts | 2 +- src/resolver.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 3b12551eee..c20fe727b2 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8280,7 +8280,7 @@ export class Compiler extends DiagnosticEmitter { let instance = this.resolver.resolveFunction( target, null, - new Map(), + new Map(), ReportMode.SWALLOW ); if (!instance) break; diff --git a/src/resolver.ts b/src/resolver.ts index b22c565e37..46d5d16570 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -786,7 +786,7 @@ export class Resolver extends DiagnosticEmitter { } // otherwise resolve the non-generic call as usual - return this.resolveFunction(prototype, null, new Map(), reportMode); + return this.resolveFunction(prototype, null, new Map(), reportMode); } /** Updates contextual types with a possibly encapsulated inferred type. */ @@ -1220,7 +1220,7 @@ export class Resolver extends DiagnosticEmitter { var element = this.lookupIdentifierExpression(node, ctxFlow, ctxElement, reportMode); if (!element) return null; if (element.kind == ElementKind.FUNCTION_PROTOTYPE) { - let instance = this.resolveFunction(element, null, new Map(), reportMode); + let instance = this.resolveFunction(element, null, new Map(), reportMode); if (!instance) return null; element = instance; } @@ -1357,7 +1357,7 @@ export class Resolver extends DiagnosticEmitter { // Inherit from 'Function' if not overridden, i.e. fn.call let ownMember = target.getMember(propertyName); if (!ownMember) { - let functionInstance = this.resolveFunction(target, null, new Map(), ReportMode.SWALLOW); + let functionInstance = this.resolveFunction(target, null, new Map(), ReportMode.SWALLOW); if (functionInstance) { let wrapper = functionInstance.type.getClassOrWrapper(this.program); if (wrapper) target = wrapper; @@ -3346,14 +3346,14 @@ export class Resolver extends DiagnosticEmitter { operatorInstance = this.resolveFunction( boundPrototype, null, - new Map(), + new Map(), reportMode ); } else { operatorInstance = this.resolveFunction( overloadPrototype, null, - new Map(), + new Map(), reportMode ); } @@ -3491,7 +3491,7 @@ export class Resolver extends DiagnosticEmitter { let getterInstance = this.resolveFunction( getterPrototype, null, - new Map(), + new Map(), reportMode ); if (getterInstance) { @@ -3504,7 +3504,7 @@ export class Resolver extends DiagnosticEmitter { let setterInstance = this.resolveFunction( setterPrototype, null, - new Map(), + new Map(), reportMode ); if (setterInstance) { From 4fa555a25e56b8f46dff32e20148f6022461e324 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 6 Aug 2022 14:12:01 +0300 Subject: [PATCH 7/7] remove unchecked in lookupInUnicodeMap --- src/util/text.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/text.ts b/src/util/text.ts index ceaf63fc2b..2c25418f03 100644 --- a/src/util/text.ts +++ b/src/util/text.ts @@ -420,8 +420,8 @@ function lookupInUnicodeMap(code: u16, map: u16[]): bool { while (lo + 1 < hi) { mid = lo + ((hi - lo) >>> 1); mid -= (mid & 1); - midVal = unchecked(map[mid]); - if (midVal <= code && code <= unchecked(map[mid + 1])) { + midVal = map[mid]; + if (midVal <= code && code <= map[mid + 1]) { return true; } if (code < midVal) {