From dd8fbcf52100310f563de3fdd8f9c9789e538571 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 19 Jun 2025 03:21:40 +0300 Subject: [PATCH 1/2] ?. deoptimization to ? : for less segfaults with caching Signed-off-by: Alexander Gorshenev --- incremental/common/src/KoalaProfiler.ts | 4 ++-- incremental/common/src/MarkableQueue.ts | 6 ++++-- incremental/common/src/math.ts | 2 +- incremental/compat/src/arkts/observable.ts | 4 ++-- incremental/runtime/src/states/Disposable.ts | 8 +++++--- incremental/runtime/src/states/GlobalStateManager.ts | 2 +- incremental/runtime/src/states/Journal.ts | 7 ++++--- incremental/runtime/src/tree/IncrementalNode.ts | 4 ++-- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/incremental/common/src/KoalaProfiler.ts b/incremental/common/src/KoalaProfiler.ts index 3eba324d8..d7f31ea58 100644 --- a/incremental/common/src/KoalaProfiler.ts +++ b/incremental/common/src/KoalaProfiler.ts @@ -131,9 +131,9 @@ export class KoalaProfiler { `layouts: ${this.layouts}`, `FPS: ${this.lastFPS}`, ) - KoalaProfiler.map?.forEach((set:Set, kind:int32) => { + KoalaProfiler.map ? KoalaProfiler.map!.forEach((set:Set, kind:int32) => { if (set.size > 0) array.push(kind + ":" + set.size) - }) + }) : undefined return array.join("\n") } diff --git a/incremental/common/src/MarkableQueue.ts b/incremental/common/src/MarkableQueue.ts index 99adf2fbd..6f4090081 100644 --- a/incremental/common/src/MarkableQueue.ts +++ b/incremental/common/src/MarkableQueue.ts @@ -58,7 +58,8 @@ class DefaultQueue implements MarkableQueue { if (marker) { let block = this.first.getAndSet(marker) while (block !== marker) { - block.callback?.() + const callback = block.callback + if (callback != undefined) callback!() block = block.next.value! } } @@ -90,7 +91,8 @@ class ReversedQueue implements MarkableQueue { if (marker) { let block = marker.next.getAndSet(undefined) while (block) { - block!.callback?.() + const callback = block!.callback + if (callback != undefined) block!.callback!() block = block!.next.value } } diff --git a/incremental/common/src/math.ts b/incremental/common/src/math.ts index 8827d8d7b..bf657ce67 100644 --- a/incremental/common/src/math.ts +++ b/incremental/common/src/math.ts @@ -68,7 +68,7 @@ export function parseNumber(str: string, name: string = "number", verify: boolea const value = asFloat64(str) if (verify) { const reverseStr = asString(value) - if (reverseStr !== undefined && reverseStr?.length == str.length && reverseStr == str) { + if (reverseStr !== undefined && (reverseStr ? reverseStr!.length : undefined) == str.length && reverseStr == str) { return value } } diff --git a/incremental/compat/src/arkts/observable.ts b/incremental/compat/src/arkts/observable.ts index 7a6cd65b3..ae725fc22 100644 --- a/incremental/compat/src/arkts/observable.ts +++ b/incremental/compat/src/arkts/observable.ts @@ -58,7 +58,7 @@ export class ObservableHandler implements Observable { while (true) { const result = it.next() if (result.done) break - result.value?.onAccess() + result.value ? result.value!.onAccess() : undefined } } } @@ -73,7 +73,7 @@ export class ObservableHandler implements Observable { while (true) { const result = it.next() if (result.done) break - result.value?.onModify() + result.value ? result.value!.onModify() : undefined } } }) diff --git a/incremental/runtime/src/states/Disposable.ts b/incremental/runtime/src/states/Disposable.ts index 81bdb2c36..e29e41b33 100644 --- a/incremental/runtime/src/states/Disposable.ts +++ b/incremental/runtime/src/states/Disposable.ts @@ -34,7 +34,8 @@ export interface Disposable { export function disposeContentForward(array: ReadonlyArray) { const length = array.length for (let i = 0; i < length; i++) { - array[i]?.dispose() + const ith = array[i] + ith ? ith!.dispose() : undefined } } @@ -44,7 +45,8 @@ export function disposeContentForward(array: ReadonlyAr export function disposeContentBackward(array: ReadonlyArray) { let i = array.length while (0 < i--) { - array[i]?.dispose() + const ith = array[i] + ith ? ith!.dispose() : undefined } } @@ -55,6 +57,6 @@ export function disposeContent(it: IterableIterator>(state) if (change) return change.value - const copy = Array.from(find>(state, chunk.previous.value)?.value ?? array) + const found = find>(state, chunk.previous.value) + const copy = Array.from(found ? found!.value : array) chunk.map.set(state, new AtomicRef>(copy)) return copy } @@ -132,9 +133,9 @@ class Chunk { */ function find(state: Object, chunk?: Chunk): AtomicRef | undefined { while (chunk) { - const change = chunk?.get(state) + const change = chunk ? chunk!.get(state) : undefined if (change) return change - chunk = chunk?.previous.value + chunk = chunk ? chunk!.previous.value : undefined } return undefined } diff --git a/incremental/runtime/src/tree/IncrementalNode.ts b/incremental/runtime/src/tree/IncrementalNode.ts index 198c7073b..24e3c6ce3 100644 --- a/incremental/runtime/src/tree/IncrementalNode.ts +++ b/incremental/runtime/src/tree/IncrementalNode.ts @@ -121,7 +121,7 @@ export class IncrementalNode implements Disposable, ReadonlyTreeNode { if (parent._child === this) { parent._child = next } - parent.onChildRemoved?.(this) + parent.onChildRemoved ? parent.onChildRemoved(this) : undefined } } @@ -217,7 +217,7 @@ export class IncrementalNode implements Disposable, ReadonlyTreeNode { // TODO: this is to workaround ast dumper bug #24055 if (0) {} else {} - parent.onChildInserted?.(this) + parent.onChildInserted ? parent.onChildInserted!(this) : undefined } } } -- Gitee From dedc0992256927e40190081b707ba20d26b26bc0 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 19 Jun 2025 11:40:15 +0300 Subject: [PATCH 2/2] more Signed-off-by: Alexander Gorshenev --- incremental/runtime/src/tree/IncrementalNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/incremental/runtime/src/tree/IncrementalNode.ts b/incremental/runtime/src/tree/IncrementalNode.ts index 24e3c6ce3..1d03b3f87 100644 --- a/incremental/runtime/src/tree/IncrementalNode.ts +++ b/incremental/runtime/src/tree/IncrementalNode.ts @@ -121,7 +121,7 @@ export class IncrementalNode implements Disposable, ReadonlyTreeNode { if (parent._child === this) { parent._child = next } - parent.onChildRemoved ? parent.onChildRemoved(this) : undefined + parent.onChildRemoved ? parent.onChildRemoved!(this) : undefined } } -- Gitee