diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts index 40192ab6dd055172b4534cbf55c0b132adcbbeb4..ac6a568071fdb00e062b0d9cf459a4d082a18cff 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts @@ -45,6 +45,7 @@ export class PeerNode extends IncrementalNode { } setId(id: int32) { + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this.id = id PeerNode.peerNodeMap.set(this.id, this) @@ -121,7 +122,22 @@ export class PeerNode extends IncrementalNode { private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } readonly name: string @@ -137,7 +153,7 @@ export class PeerNode extends IncrementalNode { super(derivedNodeType ?? PeerNodeType) this.id = id this.peer = NativePeerNode.create(this, peerPtr, flags) - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { // TODO: rework to avoid search let peer = findPeerNode(child) @@ -181,6 +197,7 @@ export class PeerNode extends IncrementalNode { (parent as PeerNode).peer.removeChild(this.peer.ptr) } this.peer.close() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this._reusePool?.forEach((pool: ReusablePool) => pool.dispose() diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts index 8b0cd2a5b0eea9a871fda439e2017152ea31741a..b10eebaecac8e19f1eeb110ec4e3539d02847238 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts @@ -39,6 +39,7 @@ export class PeerNode extends IncrementalNode { private _reusable: boolean = false setId(id: int32) { + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this.id = id PeerNode.peerNodeMap.set(this.id, this) @@ -99,7 +100,22 @@ export class PeerNode extends IncrementalNode { private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } readonly name: string @@ -115,7 +131,7 @@ export class PeerNode extends IncrementalNode { super(derivedNodeType ?? PeerNodeType) this.id = id this.peer = NativePeerNode.create(this, peerPtr, flags) - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { // TODO: rework to avoid search let peer = findPeerNode(child) @@ -158,6 +174,7 @@ export class PeerNode extends IncrementalNode { (parent as PeerNode).peer.removeChild(this.peer.ptr) } this.peer.close() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this._onRecycle = undefined this._onReuse = undefined diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts index 7f0a2c144c61ec70204671d04da2a387d2f13405..bf862aa657f4a6370378f6cb5c9895a68d2e09ea 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts @@ -259,7 +259,22 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { protected static currentId = initialId private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } @@ -276,7 +291,7 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { this.flags = flags this._name = name - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { let peer = findPeerNode(child)! if (peer) { @@ -589,6 +604,7 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { let parent = parentWithPeer(this) parent?.peer?.removeChild(this.peer) this.peer.dispose() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) super.dispose() } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts index ac791e5cd4961fcf2efb1b7b40ebafc0566750e7..d00499d55f2dccad6dfab59c5dfd45d502238f99 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts @@ -27,14 +27,14 @@ export interface Dependency { /** This class allows to store and update all dependencies. */ export class Dependencies { private frame = 0 - private dependencies: Set | undefined = undefined + private dependencies: Array | undefined = undefined private latest: Dependency | undefined = undefined /** Returns `true` if there are no dependencies to invalidate. */ get empty(): boolean { const dependencies = this.dependencies return dependencies - ? (dependencies.size == 0) + ? (dependencies.length == 0) : (this.latest === undefined) } @@ -43,13 +43,14 @@ export class Dependencies { if (dependency === undefined || dependency == this.latest || dependency.obsolete) return let dependencies = this.dependencies if (dependencies) { - dependencies.add(dependency) + // Array includes repeated elements, they will be processed in updateDependencies + dependencies.push(dependency) } else { const latest = this.latest if (latest) { - dependencies = new Set() - dependencies.add(latest) - dependencies.add(dependency) + dependencies = new Array() + dependencies.push(latest) + dependencies.push(dependency) this.dependencies = dependencies } } @@ -62,23 +63,15 @@ export class Dependencies { this.frame = 0 const dependencies = this.dependencies if (dependencies) { - let disposed: Array | undefined = undefined - const it = dependencies.values() - while (true) { - const result = it.next() - if (result.done) break - const dependency = result.value as Dependency - if (!updateDependency(invalidate, dependency)) { - if (disposed) { - disposed.push(dependency) - } else { - disposed = Array.of(dependency) + let dependenciesSet = new Set(dependencies); + this.dependencies = []; + const newDependencies = this.dependencies; + if (newDependencies) { + dependenciesSet.forEach((dependency: Dependency) => { + if (updateDependency(invalidate, dependency)) { + newDependencies.push(dependency); } - } - } - if (disposed) { - let index = disposed.length - while (0 < index--) dependencies.delete(disposed[index]) + }); } } else { const latest = this.latest diff --git a/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts b/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts index 7342ad5a2656d73954905ed97c869601da872456..22de06eabbfdba64ea0c40897ddd47e58b33a738 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts @@ -50,7 +50,29 @@ export class Tags { static OBJECT = 107 } -export function runtimeType(value: Object|String|number|undefined|null): int32 { +export function runtimeType(value: T): int32 { + if (value === undefined) + return RuntimeType.UNDEFINED; + + if (value === null) + return RuntimeType.OBJECT; + + if (value instanceof String) + return RuntimeType.STRING + + if (value instanceof Numeric) + return RuntimeType.NUMBER + + if (value instanceof Boolean) + return RuntimeType.BOOLEAN + + if (value instanceof BigInt) + return RuntimeType.BIGINT + + if (value instanceof Function) + return RuntimeType.FUNCTION + + let type = typeof value if (type == "number") return RuntimeType.NUMBER if (type == "string") return RuntimeType.STRING @@ -61,7 +83,7 @@ export function runtimeType(value: Object|String|number|undefined|null): int32 { if (type == "function") return RuntimeType.FUNCTION if (type == "symbol") return RuntimeType.SYMBOL - throw new Error(`bug: ${value} is ${type}`) + return RuntimeType.OBJECT } export function registerCallback(value: object): int32 {