diff --git a/arkoala/arkui-common/package.json b/arkoala/arkui-common/package.json index 639dd54683148a6ae730135aa9df6966535b12fe..8582a4fc16ac983014ae1ad9082c87a49d61ec10 100644 --- a/arkoala/arkui-common/package.json +++ b/arkoala/arkui-common/package.json @@ -27,7 +27,7 @@ "scripts": { "docs": "typedoc", "compile": "npm run ohos-sdk && tsc -b .", - "compile:arkts": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig.json", + "compile:arkts": "bash ../../incremental/tools/panda/arkts/arktsc --arktsconfig arktsconfig.json", "clean": "rimraf build dist ; npm run ets:clean", "ohos-sdk:download": "node scripts/download-oh-sdk.mjs", "ohos-sdk:patch": "node scripts/patch-oh-sdk.mjs", diff --git a/arkoala/arkui/package.json b/arkoala/arkui/package.json index e09428f0629496f1242786365eea361ab7379fba..9d75821ab4d75c423aa0b720dc7055426fb5fa35 100644 --- a/arkoala/arkui/package.json +++ b/arkoala/arkui/package.json @@ -26,7 +26,7 @@ "scripts": { "docs": "typedoc", "compile": "npm run ohos-sdk --prefix ../arkui-common && tsc -b .", - "compile:arkts": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig.json", + "compile:arkts": "bash ../../incremental/tools/panda/arkts/arktsc --arktsconfig arktsconfig.json", "clean": "rimraf build dist ; npm run ets:clean", "ets:test": "cd test/ets; ../../../node_modules/ohos-typescript/bin/tsc", "test-gen": "npm run compile && npm run ets:test && mocha --gen-golden=$npm_config_gdir", diff --git a/arkoala/framework/arktsconfig.json b/arkoala/framework/arktsconfig.json index c22b593ae06ce247ee908ef2c23c95f57f6bf082..83df37acebe63c02ab6f649960e6a4876c032db5 100644 --- a/arkoala/framework/arktsconfig.json +++ b/arkoala/framework/arktsconfig.json @@ -3,7 +3,7 @@ "baseUrl": ".", "outDir": "build/abc", "paths": { - "@koalaui/compat": ["../../incremental/compat/arkts"], + "@koalaui/compat": ["../../incremental/compat/src/arkts"], "@koalaui/common": ["../../incremental/common/src"], "@koalaui/runtime": ["../../incremental/runtime/src"], "@koalaui/interop": ["../../interop/src"] diff --git a/incremental/demo-playground/package.json b/incremental/demo-playground/package.json index c43217fd298fa9d834f4cae57ed1b2d32484f608..a3d696974d0774b5d57853992e2a42bc6036f106 100644 --- a/incremental/demo-playground/package.json +++ b/incremental/demo-playground/package.json @@ -20,7 +20,9 @@ "compile:run-unmemoized": "npm run compile -- --env tsconfig=tsconfig-run-unmemoized.json --env unmemoized=unmemoized", "compile:unmemoizing": "npm run compile:unmemoize && npm run compile:run-unmemoized", "compile:arkts": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig.json", - "compile:arkts:unmemoizing": "npm run compile:unmemoize && bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json", + "compile:arkts:unmemoize": "tsc -b tsconfig-unmemoize.json", + "compile:arkts:unmemoized": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json", + "compile:arkts:unmemoizing": "npm run compile:unmemoize && npm run compile:arkts:unmemoized", "run": "npm run compile && node lib/js/app.js", "run:unmemoizing": "npm run compile:unmemoizing && node lib/unmemoized/js/app.js", "run:panda": "bash ../tools/panda/arkts/ark build/abc/src/index.abc --ark-boot-files $(find ../compat/build/abc ../common/build/abc/ ../runtime/build/abc/ -name '*.abc' | paste -sd ':' -)", diff --git a/incremental/demo-playground/src/index.ts b/incremental/demo-playground/src/index.ts index 4caea538d759efa44dc382cb13f2b1e14ff08ff8..266e0ffe0f2df36efaa0fce6816c00b08a00a9bb 100644 --- a/incremental/demo-playground/src/index.ts +++ b/incremental/demo-playground/src/index.ts @@ -59,16 +59,80 @@ function demo(node: StringerNode): void { console.log(scope?.toHierarchy()) } -// memoRoot is the entry point here. -// It initializes the incremental runtime and computes the first frame. -// Have a look at its implementation. -const root = memoRoot(new StringerNode(0), demo) -console.log(root.value.toHierarchy()) // dump ui subtree +function main() { + // memoRoot is the entry point here. + // It initializes the incremental runtime and computes the first frame. + // Have a look at its implementation. + const root = memoRoot(new StringerNode(0), demo) + console.log(root.value.toHierarchy()) // dump ui subtree -updateStateManager() // Compute next frame. -console.log(root.value.toHierarchy()) + updateStateManager() // Compute next frame. + console.log(root.value.toHierarchy()) -state.value = 19 + state.value = 19 -updateStateManager() // Compute the next frame. -console.log(root.value.toHierarchy()) + updateStateManager() // Compute the next frame. + console.log(root.value.toHierarchy()) +} + +/** @memo */ +function Stringer_perf( + arg: string, + /** @memo */ + content?: () => void +): void { + NodeAttach(() => new StringerNode(5), (node: StringerNode): void => { + node.data = arg + content?.() + }) +} + +/** @memo */ +function demo_perf(node: StringerNode): void { + Stringer_perf("First", (): void => { + Stringer_perf(`Second ${state.value}`, (): void => { + Stringer_perf("Third") + }) + Stringer_perf("Fourth", (): void => { + Stringer_perf("5th") + }) + }) + + // This is to dump the complete managed incremental scope tree + const scope = contextLocalValue(CONTEXT_ROOT_SCOPE) +} + +function testTickComputable(root: ComputableState, withCallbacks: boolean = true) { + testTick(root as State, withCallbacks) +} + +export function main_perf() { + const ITERATIONS = 100000; + const root = memoRoot(new StringerNode(3), demo_perf) + + let start1 = Date.now(); + for (let i = 0; i < ITERATIONS; i++) { + testTickComputable(root) // Compute next frame. + } + let time1 = Date.now() - start1; + console.log("Compute next frame: " + time1 + " ms"); + + state.value = 19 + let start2 = Date.now(); + for (let i = 0; i < ITERATIONS; i++) { + state.value = 19; + testTickComputable(root) // Compute the next frame. + } + let time2 = Date.now() - start2; + console.log("Compute next frame with state.value = 19: " + time2 + " ms"); + + let start3 = Date.now(); + for (let i = 0; i < ITERATIONS; i++) { + state.value = i; + testTickComputable(root) // Compute the next frame. + } + let time3 = Date.now() - start3; + console.log("Compute next frame with state.value = i: " + time3 + " ms"); +} + +main() \ No newline at end of file diff --git a/incremental/runtime/package.json b/incremental/runtime/package.json index f72d929167212a49c25a696db35b52bfb2b8e49e..9df4271e68cedee76930bff43ba5508340dc19d7 100644 --- a/incremental/runtime/package.json +++ b/incremental/runtime/package.json @@ -20,7 +20,8 @@ "panda:sdk:install": "cd ../tools/panda && npm run panda:sdk:install", "compile:arkts": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig.json --ets-module", "compile:arkts:unmemoize": "../node_modules/typescript/bin/tsc -b arktsconfig-unmemoize.json", - "compile:arkts:unmemoizing": "npm run compile:arkts:unmemoize && bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json --ets-module", + "compile:arkts:unmemoized": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-run-unmemoized.json --ets-module", + "compile:arkts:unmemoizing": "npm run compile:arkts:unmemoize && npm run compile:arkts:unmemoized", "arkts:compile:test:lib": "bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-test-lib.json --ets-module", "arkts:compile:test:app": "find unmemoized/test-arkts -name '*.test.ts' -exec mkdir -p build/test/app/{} \\; -exec bash ../tools/panda/arkts/arktsc --arktsconfig arktsconfig-test-app.json --output build/test/app/{}/test.abc {} \\;", "arkts:run:test:harness": "find build/test/app -name test.abc -exec bash ../tools/panda/arkts/ark --ark-boot-files $(find ../compat/build/abc ../common/build/abc ./build/test/lib -name '*.abc' | paste -sd ':' -) {} \\;", diff --git a/incremental/tools/panda/arkts/ark.js b/incremental/tools/panda/arkts/ark.js index 19db415cb01bfa5c667c10ef2d7867a63a8d6bae..523fb109a3fdd16f60c329b2c2acb788c0d6495e 100644 --- a/incremental/tools/panda/arkts/ark.js +++ b/incremental/tools/panda/arkts/ark.js @@ -43,6 +43,12 @@ const ARGS_SPEC = [ domain: 'string', default: '' }, + { + flag: '--ark-entry-point', + help: 'Entry point function in format like `ETSGLOBAL::main`', + domain: 'string', + default: 'ETSGLOBAL::main' + }, ...DEFAULT_DRIVER_FLAGS, ] const USAGE = getUsage("This runs ark to load and run panda bytecode", ARGS_SPEC) @@ -62,7 +68,7 @@ let cmd = [ '--boot-panda-files', args.flag('--ark-ets-stdlib') + ':' + arkBootFiles, ...rest, - 'ETSGLOBAL::main', + args.flag('--ark-entry-point'), ] if (args.flag('--driver-log') === 'info') { console.log(formatCommand(cmd.join(' '), process.cwd())) @@ -82,3 +88,9 @@ child.on('close', (code) => { process.exit(code) } }) +child.on('exit', (code, signal) => { + if (signal) { + console.log(`Received signal: ${signal} from '${formatCommand(cmd.join(' '), process.cwd())}'`) + process.exit(1) + } +})