switch to length fn

This commit is contained in:
2026-01-18 10:35:05 -06:00
parent e695810e64
commit 98cb2c3239
31 changed files with 184 additions and 185 deletions

4
add.ce
View File

@@ -14,7 +14,7 @@ var fd = use('fd')
var locator = null
var alias = null
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell add <locator> [alias]")
log.console("")
@@ -51,7 +51,7 @@ if (locator == '.' || starts_with(locator, './') || starts_with(locator, '../')
if (!alias) {
// Use the last component of the locator as alias
var parts = array(locator, '/')
alias = parts[parts.length - 1]
alias = parts[length(parts) - 1]
// Remove any version suffix
if (search(alias, '@') != null) {
alias = array(alias, '@')[0]

View File

@@ -24,44 +24,44 @@ def MAX_BATCH_SIZE = 100000000 // 100M iterations max per batch
// Statistical functions
function median(arr) {
if (arr.length == 0) return 0
if (length(arr) == 0) return 0
var sorted = sort(arr)
var mid = floor(arr.length / 2)
if (arr.length % 2 == 0) {
var mid = floor(length(arr) / 2)
if (length(arr) % 2 == 0) {
return (sorted[mid - 1] + sorted[mid]) / 2
}
return sorted[mid]
}
function mean(arr) {
if (arr.length == 0) return 0
if (length(arr) == 0) return 0
var sum = 0
arrfor(arr, function(val) {
sum += val
})
return sum / arr.length
return sum / length(arr)
}
function stddev(arr, mean_val) {
if (arr.length < 2) return 0
if (length(arr) < 2) return 0
var sum_sq_diff = 0
arrfor(arr, function(val) {
var diff = val - mean_val
sum_sq_diff += diff * diff
})
return math.sqrt(sum_sq_diff / (arr.length - 1))
return math.sqrt(sum_sq_diff / (length(arr) - 1))
}
function percentile(arr, p) {
if (arr.length == 0) return 0
if (length(arr) == 0) return 0
var sorted = sort(arr)
var idx = floor(arr.length * p / 100)
if (idx >= arr.length) idx = arr.length - 1
var idx = floor(arr) * p / 100)
if (idx >= length(arr)) idx = length(arr) - 1
return sorted[idx]
}
function min_val(arr) {
if (arr.length == 0) return 0
if (length(arr) == 0) return 0
var m = arr[0]
arrfor(slice(arr, 1), function(val) {
if (val < m) m = val
@@ -70,7 +70,7 @@ function min_val(arr) {
}
function max_val(arr) {
if (arr.length == 0) return 0
if (length(arr) == 0) return 0
var m = arr[0]
arrfor(slice(arr, 1), function(val) {
if (val > m) m = val
@@ -80,7 +80,7 @@ function max_val(arr) {
// Parse arguments similar to test.ce
function parse_args() {
if (args.length == 0) {
if (length(args) == 0) {
if (!testlib.is_valid_package('.')) {
log.console('No cell.toml found in current directory')
return false
@@ -99,7 +99,7 @@ function parse_args() {
}
if (args[0] == 'package') {
if (args.length < 2) {
if (length(args) < 2) {
log.console('Usage: cell bench package <name> [bench]')
log.console(' cell bench package all')
return false
@@ -132,7 +132,7 @@ function parse_args() {
}
}
if (args.length >= 3) {
if (length(args) >= 3) {
target_bench = args[2]
}
@@ -419,7 +419,7 @@ function run_benchmarks(package_name, specific_bench) {
total: 0
}
if (bench_files.length == 0) return pkg_result
if (length(bench_files) == 0) return pkg_result
if (package_name) log.console(`Running benchmarks for ${package_name}`)
else log.console(`Running benchmarks for local package`)
@@ -448,7 +448,7 @@ function run_benchmarks(package_name, specific_bench) {
}
}
if (benches.length > 0) {
if (length(benches) > 0) {
log.console(` ${f}`)
arrfor(benches, function(b) {
try {
@@ -487,7 +487,7 @@ function run_benchmarks(package_name, specific_bench) {
pkg_result.total++
}
if (file_result.benchmarks.length > 0) {
if (length(file_result.benchmarks) > 0) {
pkg_result.files.push(file_result)
}
}

View File

@@ -17,7 +17,7 @@ var sieve = eratosthenes(10000000);
stone(sieve)
var c = 0
for (var i = 0; i < sieve.length; i++)
for (var i = 0; i < length(sieve); i++)
if (sieve.read_logical(i)) c++
log.console(c)

View File

@@ -126,7 +126,7 @@ function benchArrayOps() {
var iterateTime = measureTime(function() {
var sum = 0;
for (var j = 0; j < 1000; j++) {
for (var i = 0; i < arr.length; i++) {
for (var i = 0; i < length(arr); i++) {
sum += arr[i];
}
}

View File

@@ -70,7 +70,7 @@ function offsetMomentum() {
var px = 0;
var py = 0;
var pz = 0;
var size = bodies.length;
var size = length(bodies);
for (var i = 0; i < size; i++) {
var body = bodies[i];
var mass = body.mass;
@@ -86,7 +86,7 @@ function offsetMomentum() {
}
function advance(dt) {
var size = bodies.length;
var size = length(bodies);
for (var i = 0; i < size; i++) {
var bodyi = bodies[i];
@@ -127,7 +127,7 @@ function advance(dt) {
function energy() {
var e = 0;
var size = bodies.length;
var size = length(bodies);
for (var i = 0; i < size; i++) {
var bodyi = bodies[i];

View File

@@ -5,9 +5,9 @@ function A(i,j) {
}
function Au(u,v) {
for (var i=0; i<u.length; ++i) {
for (var i=0; i<length(u); ++i) {
var t = 0;
for (var j=0; j<u.length; ++j)
for (var j=0; j<length(u); ++j)
t += A(i,j) * u[j];
v[i] = t;
@@ -15,9 +15,9 @@ function Au(u,v) {
}
function Atu(u,v) {
for (var i=0; i<u.length; ++i) {
for (var i=0; i<length(u); ++i) {
var t = 0;
for (var j=0; j<u.length; ++j)
for (var j=0; j<length(u); ++j)
t += A(j,i) * u[j];
v[i] = t;

View File

@@ -81,9 +81,9 @@ log.console("===================\n");
// We'll run each benchmark scenario in turn.
for (var bench of benchmarks) {
// We'll measure how long it takes to do 'iterations' *for each test value*
// in bench.data. The total loop count is `bench.iterations * bench.data.length`.
// in bench.data. The total loop count is `bench.iterations * bench.data)`.
// Then we compute an overall encode+decode throughput (ops/s).
var totalIterations = bench.iterations * bench.data.length;
var totalIterations = bench.iterations * bench.data);
// We'll define a function that does a roundTrip for *each* data item in bench.data
// to measure in one loop iteration. Then we multiply by bench.iterations.
@@ -97,7 +97,7 @@ for (var bench of benchmarks) {
var opsPerSec = (totalIterations / elapsedSec).toFixed(1);
log.console(`${bench.name}:`);
log.console(` Iterations: ${bench.iterations} × ${bench.data.length} data items = ${totalIterations}`);
log.console(` Iterations: ${bench.iterations} × ${length(bench.data)} data items = ${totalIterations}`);
log.console(` Elapsed: ${elapsedSec.toFixed(3)} s`);
log.console(` Throughput: ${opsPerSec} encode+decode ops/sec\n`);
}

View File

@@ -13,7 +13,7 @@
//
// Parse command line arguments
if (arg.length != 2) {
if (length(arg) != 2) {
log.console('Usage: cell benchmark_wota_nota_json.ce <LibraryName> <ScenarioName>');
$stop()
}
@@ -32,7 +32,7 @@ def libraries = [
decode: wota.decode,
// wota produces an ArrayBuffer. We'll count `buffer.byteLength` as size.
getSize(encoded) {
return encoded.length;
return length(encoded);
}
},
{
@@ -41,7 +41,7 @@ def libraries = [
decode: nota.decode,
// nota also produces an ArrayBuffer:
getSize(encoded) {
return encoded.length;
return length(encoded);
}
},
{
@@ -52,7 +52,7 @@ def libraries = [
// as a rough "size". Alternatively, you could convert to UTF-8 for
// a more accurate byte size. Here we just use `string.length`.
getSize(encodedStr) {
return encodedStr.length;
return length(encodedStr);
}
}
];
@@ -135,7 +135,7 @@ function runBenchmarkForLibrary(lib, bench) {
var encodeTime = measureTime(() => {
for (var i = 0; i < bench.iterations; i++) {
// For each data item, encode it
for (var j = 0; j < bench.data.length; j++) {
for (var j = 0; j < length(bench.data); j++) {
var e = lib.encode(bench.data[j]);
// store only in the very first iteration, so we can decode them later
// but do not store them every iteration or we blow up memory.
@@ -185,7 +185,7 @@ if (!bench) {
var { encodeTime, decodeTime, totalSize } = runBenchmarkForLibrary(lib, bench);
// Output json for easy parsing by hyperfine or other tools
var totalOps = bench.iterations * bench.data.length;
var totalOps = bench.iterations * length(bench.data);
var result = {
lib: lib_name,
scenario: scenario_name,

View File

@@ -18,9 +18,9 @@ var buildtype = 'release'
var force_rebuild = false
var dry_run = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '-t' || args[i] == '--target') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target = args[++i]
} else {
log.error('-t requires a target')
@@ -28,14 +28,14 @@ for (var i = 0; i < args.length; i++) {
}
} else if (args[i] == '-p' || args[i] == '--package') {
// Legacy support for -p flag
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target_package = args[++i]
} else {
log.error('-p requires a package name')
$stop()
}
} else if (args[i] == '-b' || args[i] == '--buildtype') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
buildtype = args[++i]
if (buildtype != 'release' && buildtype != 'debug' && buildtype != 'minsize') {
log.error('Invalid buildtype: ' + buildtype + '. Must be release, debug, or minsize')
@@ -52,7 +52,7 @@ for (var i = 0; i < args.length; i++) {
} else if (args[i] == '--list-targets') {
log.console('Available targets:')
var targets = build.list_targets()
for (var t = 0; t < targets.length; t++) {
for (var t = 0; t < length(targets); t++) {
log.console(' ' + targets[t])
}
$stop()
@@ -110,7 +110,7 @@ if (target_package) {
var success = 0
var failed = 0
for (var i = 0; i < results.length; i++) {
for (var i = 0; i < length(results); i++) {
if (results[i].library) {
success++
} else if (results[i].error) {

View File

@@ -24,7 +24,7 @@ var clean_fetch = false
var deep = false
var dry_run = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--build') {
clean_build = true
} else if (args[i] == '--fetch') {
@@ -170,7 +170,7 @@ if (clean_fetch) {
// Execute or report
if (dry_run) {
log.console("Would delete:")
if (files_to_delete.length == 0 && dirs_to_delete.length == 0) {
if (length(files_to_delete) == 0 && length(dirs_to_delete) == 0) {
log.console(" (nothing to clean)")
} else {
arrfor(files_to_delete, function(f) {

View File

@@ -7,7 +7,7 @@ var fd = use('fd')
var http = use('http')
var miniz = use('miniz')
if (args.length < 2) {
if (length(args) < 2) {
log.console("Usage: cell clone <origin> <path>")
log.console("Clones a cell package to a local path and links it.")
$stop()
@@ -93,7 +93,7 @@ try {
if (zip.is_directory(i)) continue
var filename = zip.get_filename(i)
var parts = array(filename, '/')
if (parts.length <= 1) continue
if (length(parts) <= 1) continue
// Skip the first directory (repo-commit prefix)
parts.shift()

View File

@@ -47,14 +47,14 @@ function get_nested(obj, path) {
// Set a value in nested object using path
function set_nested(obj, path, value) {
var current = obj
for (var i = 0; i < path.length - 1; i++) {
for (var i = 0; i < length(path) - 1; i++) {
var segment = path[i]
if (is_null(current[segment]) || !is_object(current[segment])) {
current[segment] = {}
}
current = current[segment]
}
current[path[path.length - 1]] = value
current[path[length(path) - 1]] = value
}
// Parse value string into appropriate type
@@ -96,7 +96,7 @@ function print_config(obj, prefix = '') {
}
// Main command handling
if (args.length == 0) {
if (length(args) == 0) {
print_help()
$stop()
return
@@ -125,7 +125,7 @@ switch (command) {
break
case 'get':
if (args.length < 2) {
if (length(args) < 2) {
log.error("Usage: cell config get <key>")
$stop()
return
@@ -145,7 +145,7 @@ switch (command) {
break
case 'set':
if (args.length < 3) {
if (length(args) < 3) {
log.error("Usage: cell config set <key> <value>")
$stop()
return
@@ -175,7 +175,7 @@ switch (command) {
case 'actor':
// Handle actor-specific configuration
if (args.length < 3) {
if (length(args) < 3) {
log.error("Usage: cell config actor <name> <command> [options]")
$stop()
return
@@ -190,7 +190,7 @@ switch (command) {
switch (actor_cmd) {
case 'list':
if (array(config.actors[actor_name]).length == 0) {
if (length(array(config.actors[actor_name])) == 0) {
log.console("No configuration for actor: " + actor_name)
} else {
log.console("# Configuration for actor: " + actor_name)
@@ -200,7 +200,7 @@ switch (command) {
break
case 'get':
if (args.length < 4) {
if (length(args) < 4) {
log.error("Usage: cell config actor <name> get <key>")
$stop()
return
@@ -217,7 +217,7 @@ switch (command) {
break
case 'set':
if (args.length < 5) {
if (length(args) < 5) {
log.error("Usage: cell config actor <name> set <key> <value>")
$stop()
return

View File

@@ -13,7 +13,7 @@ var shop = use('internal/shop')
// Parse arguments
var target_pkg = null
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell fetch [package]")
log.console("Fetch package zips from remote sources.")
@@ -83,7 +83,7 @@ var parts = []
if (downloaded_count > 0) parts.push(`${text(downloaded_count)} downloaded`)
if (cached_count > 0) parts.push(`${text(cached_count)} cached`)
if (fail_count > 0) parts.push(`${text(fail_count)} failed`)
if (parts.length == 0) parts.push("nothing to fetch")
if (length(parts) == 0) parts.push("nothing to fetch")
log.console("Fetch complete: " + text(parts, ", "))
$stop()

View File

@@ -23,9 +23,9 @@ var format = 'tree'
var show_locked = false
var show_world = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--format' || args[i] == '-f') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
format = args[++i]
if (format != 'tree' && format != 'dot' && format != 'json') {
log.error('Invalid format: ' + format + '. Must be tree, dot, or json')
@@ -163,13 +163,13 @@ if (format == 'tree') {
}
})
for (var i = 0; i < children.length; i++) {
for (var i = 0; i < length(children); i++) {
var child_prefix = prefix + (is_last ? " " : "| ")
print_tree(children[i].to, child_prefix, i == children.length - 1, visited)
print_tree(children[i].to, child_prefix, i == length(children) - 1, visited)
}
}
for (var i = 0; i < roots.length; i++) {
for (var i = 0; i < length(roots); i++) {
log.console(roots[i])
var children = []
@@ -179,11 +179,11 @@ if (format == 'tree') {
}
})
for (var j = 0; j < children.length; j++) {
print_tree(children[j].to, "", j == children.length - 1, {})
for (var j = 0; j < length(children); j++) {
print_tree(children[j].to, "", j == length(children) - 1, {})
}
if (i < roots.length - 1) log.console("")
if (i < length(roots) - 1) log.console("")
}
} else if (format == 'dot') {

View File

@@ -2,7 +2,7 @@
var fd = use('fd')
var command = args.length > 0 ? args[0] : null
var command = length(args) > 0 ? args[0] : null
// Display specific command help
if (command) {

View File

@@ -14,7 +14,7 @@ var build = use('build')
var pkg = use('package')
var fd = use('fd')
if (args.length < 1) {
if (length(args) < 1) {
log.console("Usage: cell install <locator> [options]")
log.console("")
log.console("Options:")
@@ -29,9 +29,9 @@ var target_triple = null
var refresh = false
var dry_run = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
@@ -142,7 +142,7 @@ if (dry_run) {
var exists = lock[p] != null
log.console(" " + p + (exists ? " (already installed)" : ""))
})
if (skipped_packages.length > 0) {
if (length(skipped_packages) > 0) {
log.console("")
log.console("Would skip (missing local paths):")
arrfor(skipped_packages, function(p) {
@@ -176,9 +176,9 @@ arrfor(packages_to_install, function(p) {
install_package(p)
})
var summary = "Installed " + text(packages_to_install.length) + " package(s)."
if (skipped_packages.length > 0) {
summary += " Skipped " + text(skipped_packages.length) + " missing local path(s)."
var summary = "Installed " + text(length(packages_to_install)) + " package(s)."
if (length(skipped_packages) > 0) {
summary += " Skipped " + text(length(skipped_packages)) + " missing local path(s)."
}
log.console(summary)

10
link.ce
View File

@@ -17,7 +17,7 @@ var shop = use('internal/shop')
var fd = use('fd')
var toml = use('toml')
if (args.length < 1) {
if (length(args) < 1) {
log.console("Usage: link <command> [args] or link [package] <target>")
log.console("Commands:")
log.console(" list List all active links")
@@ -45,15 +45,15 @@ if (cmd == 'list') {
log.console("Syncing links...")
var result = link.sync_all(shop)
log.console("Synced " + result.synced + " link(s)")
if (result.errors.length > 0) {
if (length(result.errors) > 0) {
log.console("Errors:")
for (var i = 0; i < result.errors.length; i++) {
for (var i = 0; i < length(result.errors); i++) {
log.console(" " + result.errors[i])
}
}
} else if (cmd == 'delete' || cmd == 'rm') {
if (args.length < 2) {
if (length(args) < 2) {
log.console("Usage: link delete <package>")
$stop()
return
@@ -92,7 +92,7 @@ if (cmd == 'list') {
}
var arg1 = args[start_idx]
var arg2 = (args.length > start_idx + 1) ? args[start_idx + 1] : null
var arg2 = (length(args) > start_idx + 1) ? args[start_idx + 1] : null
if (!arg1) {
log.console("Error: target or package required")

18
list.ce
View File

@@ -13,7 +13,7 @@ var fd = use('fd')
var mode = 'local'
var target_pkg = null
if (args && args.length > 0) {
if (args && length(args) > 0) {
if (args[0] == 'shop') {
mode = 'shop'
} else if (args[0] == '--help' || args[0] == '-h') {
@@ -62,12 +62,12 @@ function print_deps(ctx, indent) {
for (var k in deps) aliases.push(k)
aliases = sort(aliases)
if (aliases.length == 0) {
if (length(aliases) == 0) {
log.console(indent + " (none)")
return
}
for (var i = 0; i < aliases.length; i++) {
for (var i = 0; i < length(aliases); i++) {
var alias = aliases[i]
var locator = deps[alias]
var link_target = links[locator]
@@ -93,7 +93,7 @@ function print_deps(ctx, indent) {
status.push("not installed")
}
if (status.length > 0) {
if (length(status) > 0) {
line += " [" + text(status, ", ") + "]"
}
@@ -112,7 +112,7 @@ if (mode == 'local') {
log.console("")
var packages = shop.list_packages()
if (packages.length == 0) {
if (length(packages) == 0) {
log.console(" (none)")
} else {
packages = sort(packages)
@@ -136,7 +136,7 @@ if (mode == 'local') {
}
})
if (linked_pkgs.length > 0) {
if (length(linked_pkgs) > 0) {
log.console("Linked packages:")
arrfor(linked_pkgs, function(p) {
var target = links[p]
@@ -145,7 +145,7 @@ if (mode == 'local') {
log.console("")
}
if (local_pkgs.length > 0) {
if (length(local_pkgs) > 0) {
log.console("Local packages:")
arrfor(local_pkgs, function(p) {
log.console(" " + p)
@@ -153,7 +153,7 @@ if (mode == 'local') {
log.console("")
}
if (remote_pkgs.length > 0) {
if (length(remote_pkgs) > 0) {
log.console("Remote packages:")
arrfor(remote_pkgs, function(p) {
var lock_entry = lock[p]
@@ -163,7 +163,7 @@ if (mode == 'local') {
log.console("")
}
log.console("Total: " + text(packages.length) + " package(s)")
log.console("Total: " + text(length(packages)) + " package(s)")
}
}

8
ls.ce
View File

@@ -12,10 +12,10 @@ var programs = package.list_programs(pkg)
log.console("Modules in " + pkg + ":")
modules = sort(modules)
if (modules.length == 0) {
if (length(modules) == 0) {
log.console(" (none)")
} else {
for (var i = 0; i < modules.length; i++) {
for (var i = 0; i < length(modules); i++) {
log.console(" " + modules[i])
}
}
@@ -23,10 +23,10 @@ if (modules.length == 0) {
log.console("")
log.console("Programs in " + pkg + ":")
programs = sort(programs)
if (programs.length == 0) {
if (length(programs) == 0) {
log.console(" (none)")
} else {
for (var i = 0; i < programs.length; i++) {
for (var i = 0; i < length(programs); i++) {
log.console(" " + programs[i])
}
}

16
pack.ce
View File

@@ -14,7 +14,7 @@ var output_name = 'app'
var target_package = null
var buildtype = 'debug'
if (args.length < 1) {
if (length(args) < 1) {
log.error('Usage: cell pack <package> [options]')
log.error('')
log.error('Options:')
@@ -29,23 +29,23 @@ if (args.length < 1) {
target_package = args[0]
for (var i = 1; i < args.length; i++) {
for (var i = 1; i < length(args); i++) {
if (args[i] == '-t' || args[i] == '--target') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target = args[++i]
} else {
log.error('-t requires a target')
$stop()
}
} else if (args[i] == '-o' || args[i] == '--output') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
output_name = args[++i]
} else {
log.error('-o requires an output name')
$stop()
}
} else if (args[i] == '-b' || args[i] == '--buildtype') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
buildtype = args[++i]
if (buildtype != 'release' && buildtype != 'debug' && buildtype != 'minsize') {
log.error('Invalid buildtype: ' + buildtype + '. Must be release, debug, or minsize')
@@ -87,7 +87,7 @@ if (target && !build.has_target(target)) {
var packages = ['core']
var deps = pkg_tools.gather_dependencies(target_package)
for (var i = 0; i < deps.length; i++) {
for (var i = 0; i < length(deps); i++) {
packages.push(deps[i])
}
packages.push(target_package)
@@ -95,7 +95,7 @@ packages.push(target_package)
// Remove duplicates
var unique_packages = []
var seen = {}
for (var i = 0; i < packages.length; i++) {
for (var i = 0; i < length(packages); i++) {
if (!seen[packages[i]]) {
seen[packages[i]] = true
unique_packages.push(packages[i])
@@ -109,7 +109,7 @@ arrfor(packages, function(package) {
shop.extract(package)
})
log.console('Building static binary from ' + text(packages.length) + ' packages: ' + text(packages, ', '))
log.console('Building static binary from ' + text(length(packages)) + ' packages: ' + text(packages, ', '))
try {
var result = build.build_static(packages, target, output_name, buildtype)

View File

@@ -111,14 +111,14 @@ function pack(sources, archive_path, read_dir) {
log.console("Created " + archive_path)
}
if (!is_array(arg) || arg.length < 1) {
if (!is_array(arg) || length(arg) < 1) {
print_usage()
} else {
if (arg[0] == "-l") {
if (arg.length < 2) print_usage()
if (length(arg) < 2) print_usage()
else list(arg[1])
} else if (arg[0] == "-u") {
if (arg.length < 2) print_usage()
if (length(arg) < 2) print_usage()
else unpack(arg[1])
} else {
var sources = []
@@ -130,12 +130,12 @@ if (!is_array(arg) || arg.length < 1) {
i = 2
}
for (; i < arg.length - 1; i++) {
for (; i < length(arg) - 1; i++) {
sources.push(arg[i])
}
archive = arg[arg.length - 1]
archive = arg[length(arg) - 1]
if (sources.length == 0) {
if (length(sources) == 0) {
print_usage()
} else {
pack(sources, archive, read_dir)

View File

@@ -17,7 +17,7 @@ var target_pkg = null
var prune = false
var dry_run = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--prune') {
prune = true
} else if (args[i] == '--dry-run') {
@@ -99,7 +99,7 @@ if (dry_run) {
shop.remove(p)
})
log.console("Removed " + text(packages_to_remove.length) + " package(s).")
log.console("Removed " + text(length(packages_to_remove)) + " package(s).")
}
$stop()

View File

@@ -21,9 +21,9 @@ var target_triple = null
var show_locked = false
var refresh_first = false
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
@@ -118,7 +118,7 @@ for (var locator in all_deps) {
sorted = sort(sorted, "locator")
sorted = sort(sorted, "depth")
for (var i = 0; i < sorted.length; i++) {
for (var i = 0; i < length(sorted); i++) {
var locator = sorted[i].locator
var depth = sorted[i].depth
@@ -168,7 +168,7 @@ for (var i = 0; i < sorted.length; i++) {
line += " -> " + link_target
}
if (status_parts.length > 0) {
if (length(status_parts) > 0) {
line += " [" + text(status_parts, ", ") + "]"
}
@@ -179,12 +179,12 @@ for (var i = 0; i < sorted.length; i++) {
try {
var cflags = pkg.get_flags(locator, 'CFLAGS', target_triple)
var ldflags = pkg.get_flags(locator, 'LDFLAGS', target_triple)
if (cflags.length > 0 || ldflags.length > 0) {
if (length(cflags) > 0 || length(ldflags) > 0) {
log.console(indent + " Compilation inputs:")
if (cflags.length > 0) {
if (length(cflags) > 0) {
log.console(indent + " CFLAGS: " + text(cflags, ' '))
}
if (ldflags.length > 0) {
if (length(ldflags) > 0) {
log.console(indent + " LDFLAGS: " + text(ldflags, ' '))
}
}
@@ -195,6 +195,6 @@ for (var i = 0; i < sorted.length; i++) {
}
log.console("")
log.console("Total: " + text(sorted.length) + " package(s)")
log.console("Total: " + text(length(sorted)) + " package(s)")
$stop()

View File

@@ -4,7 +4,7 @@
var shop = use('internal/shop')
var pkg = use('package')
if (args.length < 1) {
if (length(args) < 1) {
log.console("Usage: cell search <query>")
log.console("Searches for packages, actors, or modules matching the query.")
$stop()
@@ -46,7 +46,7 @@ arrfor(packages, function(package_name) {
})
// Print results
var total = found_packages.length + found_modules.length + found_actors.length
var total = length(found_packages) + length(found_modules) + length(found_actors)
if (total == 0) {
log.console("No results found for '" + query + "'")
@@ -54,7 +54,7 @@ if (total == 0) {
log.console("Found " + text(total) + " result(s) for '" + query + "':")
log.console("")
if (found_packages.length > 0) {
if (length(found_packages) > 0) {
log.console("Packages:")
arrfor(found_packages, function(p) {
log.console(" " + p)
@@ -62,7 +62,7 @@ if (total == 0) {
log.console("")
}
if (found_modules.length > 0) {
if (length(found_modules) > 0) {
log.console("Modules:")
arrfor(found_modules, function(m) {
log.console(" " + m)
@@ -70,7 +70,7 @@ if (total == 0) {
log.console("")
}
if (found_actors.length > 0) {
if (length(found_actors) > 0) {
log.console("Actors:")
arrfor(found_actors, function(a) {
log.console(" " + a)

View File

@@ -30474,7 +30474,6 @@ static JSValue js_string_concat(JSContext *ctx, JSValueConst this_val,
}
static const JSCFunctionListEntry js_string_proto_funcs[] = {
JS_PROP_INT32_DEF("length", 0, JS_PROP_CONFIGURABLE ),
JS_CFUNC_DEF("concat", 1, js_string_concat),
JS_CFUNC_DEF("toString", 0, js_string_toString ),
JS_CFUNC_DEF("valueOf", 0, js_string_toString ),

80
test.ce
View File

@@ -43,7 +43,7 @@ function get_current_package_name() {
// cell test package all - run all tests from all packages
function parse_args() {
if (args.length == 0) {
if (length(args) == 0) {
// cell test - run all tests for current package
if (!is_valid_package('.')) {
log.console('No cell.toml found in current directory')
@@ -64,7 +64,7 @@ function parse_args() {
}
if (args[0] == 'package') {
if (args.length < 2) {
if (length(args) < 2) {
log.console('Usage: cell test package <name> [test]')
log.console(' cell test package all')
return false
@@ -102,7 +102,7 @@ function parse_args() {
}
}
if (args.length >= 3) {
if (length(args) >= 3) {
// cell test package <name> <test>
target_test = args[2]
}
@@ -146,7 +146,7 @@ function ensure_dir(path) {
var parts = array(path, '/')
var current = starts_with(path, '/') ? '/' : ''
for (var i = 0; i < parts.length; i++) {
for (var i = 0; i < length(parts); i++) {
if (parts[i] == '') continue
current += parts[i] + '/'
if (!fd.is_dir(current)) {
@@ -176,7 +176,7 @@ function collect_actor_tests(package_name, specific_test) {
var files = pkg.list_files(package_name)
var actor_tests = []
for (var i = 0; i < files.length; i++) {
for (var i = 0; i < length(files); i++) {
var f = files[i]
// Check if file is in tests/ folder and is a .ce actor
if (starts_with(f, "tests/") && ends_with(f, ".ce")) {
@@ -247,7 +247,7 @@ function run_tests(package_name, specific_test) {
var files = pkg.list_files(package_name)
var test_files = []
for (var i = 0; i < files.length; i++) {
for (var i = 0; i < length(files); i++) {
var f = files[i]
// Check if file is in tests/ folder and is a .cm module (not .ce - those are actor tests)
if (starts_with(f, "tests/") && ends_with(f, ".cm")) {
@@ -264,12 +264,12 @@ function run_tests(package_name, specific_test) {
}
}
if (test_files.length > 0) {
if (length(test_files) > 0) {
if (package_name) log.console(`Running tests for ${package_name}`)
else log.console(`Running tests for local package`)
}
for (var i = 0; i < test_files.length; i++) {
for (var i = 0; i < length(test_files); i++) {
var f = test_files[i]
var mod_path = text(f, 0, -3) // remove .cm
@@ -297,9 +297,9 @@ function run_tests(package_name, specific_test) {
}
}
if (tests.length > 0) {
if (length(tests) > 0) {
log.console(` ${f}`)
for (var j = 0; j < tests.length; j++) {
for (var j = 0; j < length(tests); j++) {
var t = tests[j]
var test_entry = {
package: pkg_result.package,
@@ -381,7 +381,7 @@ if (all_pkgs) {
// Then all packages in lock
var packages = shop.list_packages()
for (var i = 0; i < packages.length; i++) {
for (var i = 0; i < length(packages); i++) {
all_results.push(run_tests(packages[i], null))
all_actor_tests = array(all_actor_tests, collect_actor_tests(packages[i], null))
}
@@ -391,9 +391,9 @@ if (all_pkgs) {
}
// Spawn actor tests if any
if (all_actor_tests.length > 0) {
log.console(`Running ${all_actor_tests.length} actor test(s)...`)
for (var i = 0; i < all_actor_tests.length; i++) {
if (length(all_actor_tests) > 0) {
log.console(`Running ${length(all_actor_tests)} actor test(s)...`)
for (var i = 0; i < length(all_actor_tests); i++) {
spawn_actor_test(all_actor_tests[i])
}
}
@@ -402,7 +402,7 @@ if (all_actor_tests.length > 0) {
function handle_actor_message(msg) {
var sender = msg.$sender
var found_idx = -1
for (var i = 0; i < pending_actor_tests.length; i++) {
for (var i = 0; i < length(pending_actor_tests); i++) {
if (pending_actor_tests[i].actor == sender) {
found_idx = i
break
@@ -426,12 +426,12 @@ function handle_actor_message(msg) {
results = [msg]
}
for (var i = 0; i < results.length; i++) {
for (var i = 0; i < length(results); i++) {
var res = results[i] || {}
var entry = {
package: base_entry.package,
file: base_entry.file,
test: res.test || base_entry.test + (results.length > 1 ? `#${i+1}` : ""),
test: res.test || base_entry.test + (length(results) > 1 ? `#${i+1}` : ""),
status: "failed",
duration_ns: duration_ns
}
@@ -459,7 +459,7 @@ function check_timeouts() {
var now = time.number()
var timed_out = []
for (var i = pending_actor_tests.length - 1; i >= 0; i--) {
for (var i = length(pending_actor_tests) - 1; i >= 0; i--) {
var entry = pending_actor_tests[i]
var elapsed_ms = (now - entry.start_time) * 1000
if (elapsed_ms > ACTOR_TEST_TIMEOUT) {
@@ -467,7 +467,7 @@ function check_timeouts() {
}
}
for (var i = 0; i < timed_out.length; i++) {
for (var i = 0; i < length(timed_out); i++) {
var idx = timed_out[i]
var entry = pending_actor_tests[idx]
pending_actor_tests.splice(idx, 1)
@@ -479,7 +479,7 @@ function check_timeouts() {
log.console(` TIMEOUT ${entry.test}`)
}
if (pending_actor_tests.length > 0) {
if (length(pending_actor_tests) > 0) {
$delay(check_timeouts, 1000)
}
check_completion()
@@ -489,7 +489,7 @@ function check_timeouts() {
var finalized = false
function check_completion() {
if (finalized) return
if (pending_actor_tests.length > 0) return
if (length(pending_actor_tests) > 0) return
finalized = true
finalize_results()
@@ -497,10 +497,10 @@ function check_completion() {
function finalize_results() {
// Add actor test results to all_results
for (var i = 0; i < actor_test_results.length; i++) {
for (var i = 0; i < length(actor_test_results); i++) {
var r = actor_test_results[i]
var pkg_result = null
for (var j = 0; j < all_results.length; j++) {
for (var j = 0; j < length(all_results); j++) {
if (all_results[j].package == r.package) {
pkg_result = all_results[j]
break
@@ -512,7 +512,7 @@ function finalize_results() {
}
var file_result = null
for (var j = 0; j < pkg_result.files.length; j++) {
for (var j = 0; j < length(pkg_result.files); j++) {
if (pkg_result.files[j].name == r.file) {
file_result = pkg_result.files[j]
break
@@ -536,7 +536,7 @@ function finalize_results() {
// Calculate totals
var totals = { total: 0, passed: 0, failed: 0 }
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
totals.total += all_results[i].total
totals.passed += all_results[i].passed
totals.failed += all_results[i].failed
@@ -551,9 +551,9 @@ function finalize_results() {
// If no actor tests, finalize immediately
var totals
if (all_actor_tests.length == 0) {
if (length(all_actor_tests) == 0) {
totals = { total: 0, passed: 0, failed: 0 }
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
totals.total += all_results[i].total
totals.passed += all_results[i].passed
totals.failed += all_results[i].failed
@@ -577,24 +577,24 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
=== SUMMARY ===
`
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
var pkg_res = all_results[i]
if (pkg_res.total == 0) continue
txt_report += `Package: ${pkg_res.package}\n`
for (var j = 0; j < pkg_res.files.length; j++) {
for (var j = 0; j < length(pkg_res.files); j++) {
var f = pkg_res.files[j]
var status = f.failed == 0 ? "PASS" : "FAIL"
txt_report += ` [${status}] ${f.name} (${f.passed}/${f.tests.length})\n`
txt_report += ` [${status}] ${f.name} (${f.passed}/${length(f.tests)})\n`
}
}
txt_report += `\n=== FAILURES ===\n`
var has_failures = false
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
var pkg_res = all_results[i]
for (var j = 0; j < pkg_res.files.length; j++) {
for (var j = 0; j < length(pkg_res.files); j++) {
var f = pkg_res.files[j]
for (var k = 0; k < f.tests.length; k++) {
for (var k = 0; k < length(f.tests); k++) {
var t = f.tests[k]
if (t.status == "failed") {
has_failures = true
@@ -613,13 +613,13 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
if (!has_failures) txt_report += `None\n`
txt_report += `\n=== DETAILED RESULTS ===\n`
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
var pkg_res = all_results[i]
if (pkg_res.total == 0) continue
for (var j = 0; j < pkg_res.files.length; j++) {
for (var j = 0; j < length(pkg_res.files); j++) {
var f = pkg_res.files[j]
for (var k = 0; k < f.tests.length; k++) {
for (var k = 0; k < length(f.tests); k++) {
var t = f.tests[k]
var dur = `${t.duration_ns || 0}ns`
var status = t.status == "passed" ? "PASS" : "FAIL"
@@ -632,14 +632,14 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
log.console(`Report written to ${report_dir}/test.txt`)
// Generate JSON per package
for (var i = 0; i < all_results.length; i++) {
for (var i = 0; i < length(all_results); i++) {
var pkg_res = all_results[i]
if (pkg_res.total == 0) continue
var pkg_tests = []
for (var j = 0; j < pkg_res.files.length; j++) {
for (var j = 0; j < length(pkg_res.files); j++) {
var f = pkg_res.files[j]
for (var k = 0; k < f.tests.length; k++) {
for (var k = 0; k < length(f.tests); k++) {
pkg_tests.push(f.tests[k])
}
}
@@ -650,7 +650,7 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
}
// If no actor tests, generate reports and stop immediately
if (all_actor_tests.length == 0) {
if (length(all_actor_tests) == 0) {
generate_reports(totals)
$stop()
} else {

View File

@@ -4,7 +4,7 @@
var link = use('link')
var shop = use('internal/shop')
if (args.length < 1) {
if (length(args) < 1) {
log.console("Usage: cell unlink <origin>")
log.console("Removes a link and restores the original package.")
$stop()

View File

@@ -20,7 +20,7 @@ var target_triple = null
var follow_links = false
// Parse arguments
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell update [<locator>] [options]")
log.console("")
@@ -34,7 +34,7 @@ for (var i = 0; i < args.length; i++) {
} else if (args[i] == '--build') {
run_build = true
} else if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
@@ -107,10 +107,10 @@ if (target_pkg) {
}
} else {
var packages = shop.list_packages()
var pkg_count = packages.length
var pkg_count = length(packages)
log.console("Checking for updates (" + text(pkg_count) + " package" + (pkg_count == 1 ? "" : "s") + ")...")
for (var i = 0; i < packages.length; i++) {
for (var i = 0; i < length(packages); i++) {
var pkg = packages[i]
if (pkg == 'core') continue
@@ -120,15 +120,15 @@ if (target_pkg) {
}
}
if (updated_packages.length > 0) {
log.console("Updated " + text(updated_packages.length) + " package" + (updated_packages.length == 1 ? "" : "s") + ".")
if (length(updated_packages)) > 0) {
log.console("Updated " + text(length(updated_packages)) + " package" + (length(updated_packages) == 1 ? "" : "s") + ".")
} else {
log.console("All packages are up to date.")
}
}
// Run build if requested
if (run_build && updated_packages.length > 0) {
if (run_build && length(updated_packages) > 0) {
log.console("")
log.console("Building updated packages...")

View File

@@ -1,10 +1,10 @@
var shop = use('internal/shop')
var fd = use('fd')
var cmd = args.length > 0 ? args[0] : null
var cmd = length(args) > 0 ? args[0] : null
if (cmd == 'link') {
if (args.length < 2) {
if (length(args) < 2) {
log.console("Usage: cell upgrade link <core_dir>")
return
}

View File

@@ -21,11 +21,11 @@ var scope = null
var deep = false
var target_triple = null
for (var i = 0; i < args.length; i++) {
for (var i = 0; i < length(args); i++) {
if (args[i] == '--deep') {
deep = true
} else if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < args.length) {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
@@ -139,7 +139,7 @@ function verify_package(locator) {
// Only check for builds if package has C files
try {
var c_files = pkg.get_c_files(locator, target_triple, true)
if (c_files && c_files.length > 0) {
if (c_files && length(c_files) > 0) {
if (!fd.is_file(lib_path)) {
add_warning(locator + ": library not built at " + lib_path)
}
@@ -221,7 +221,7 @@ if (scope == 'shop') {
}
}
log.console("Verifying " + text(packages_to_verify.length) + " package(s)...")
log.console("Verifying " + text(length(packages_to_verify)) + " package(s)...")
log.console("")
// Run verification
@@ -234,7 +234,7 @@ arrfor(packages_to_verify, function(p) {
})
// Print results
if (warnings.length > 0) {
if (length(warnings) > 0) {
log.console("Warnings:")
arrfor(warnings, function(w) {
log.console(" " + w)
@@ -242,16 +242,16 @@ if (warnings.length > 0) {
log.console("")
}
if (errors.length > 0) {
if (length(errors) > 0) {
log.console("Errors:")
arrfor(errors, function(e) {
log.console(" " + e)
})
log.console("")
log.console("Verification FAILED: " + text(errors.length) + " error(s), " + text(warnings.length) + " warning(s)")
log.console("Verification FAILED: " + text(length(errors)) + " error(s), " + text(length(warnings)) + " warning(s)")
// Note: would use process.exit(1) if available
} else {
log.console("Verification PASSED: " + text(checked) + " package(s) checked, " + text(warnings.length) + " warning(s)")
log.console("Verification PASSED: " + text(checked) + " package(s) checked, " + text(length(warnings)) + " warning(s)")
}
$stop()

8
why.ce
View File

@@ -1,7 +1,7 @@
var shop = use('internal/shop')
var pkg = use('package')
if (!args || args.length < 1) {
if (!args || length(args) < 1) {
log.console("Usage: cell why <package>")
$stop()
return
@@ -25,7 +25,7 @@ function search(current_pkg, stack) {
// Sort for consistent output
var aliases = sort(array(deps))
for (var i = 0; i < aliases.length; i++) {
for (var i = 0; i < length(aliases); i++) {
var alias = aliases[i]
var locator = deps[alias]
var parsed = shop.parse_package(locator)
@@ -60,7 +60,7 @@ function search(current_pkg, stack) {
// Recurse if not seen in current stack (cycle detection)
var cycle = false
for (var j = 0; j < stack.length; j++) {
for (var j = 0; j < length(stack); j++) {
if (stack[j].pkg == canon) {
cycle = true
break
@@ -78,7 +78,7 @@ function print_stack(stack) {
var output = "project"
log.console(output)
for (var i = 0; i < stack.length; i++) {
for (var i = 0; i < length(stack); i++) {
var node = stack[i]
var indent = ""
for (var j = 0; j <= i; j++) indent += " "