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

View File

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

View File

@@ -17,7 +17,7 @@ var sieve = eratosthenes(10000000);
stone(sieve) stone(sieve)
var c = 0 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++ if (sieve.read_logical(i)) c++
log.console(c) log.console(c)

View File

@@ -126,7 +126,7 @@ function benchArrayOps() {
var iterateTime = measureTime(function() { var iterateTime = measureTime(function() {
var sum = 0; var sum = 0;
for (var j = 0; j < 1000; j++) { 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]; sum += arr[i];
} }
} }

View File

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

View File

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

View File

@@ -81,9 +81,9 @@ log.console("===================\n");
// We'll run each benchmark scenario in turn. // We'll run each benchmark scenario in turn.
for (var bench of benchmarks) { for (var bench of benchmarks) {
// We'll measure how long it takes to do 'iterations' *for each test value* // 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). // 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 // 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. // 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); var opsPerSec = (totalIterations / elapsedSec).toFixed(1);
log.console(`${bench.name}:`); 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(` Elapsed: ${elapsedSec.toFixed(3)} s`);
log.console(` Throughput: ${opsPerSec} encode+decode ops/sec\n`); log.console(` Throughput: ${opsPerSec} encode+decode ops/sec\n`);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

10
link.ce
View File

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

18
list.ce
View File

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

16
pack.ce
View File

@@ -14,7 +14,7 @@ var output_name = 'app'
var target_package = null var target_package = null
var buildtype = 'debug' var buildtype = 'debug'
if (args.length < 1) { if (length(args) < 1) {
log.error('Usage: cell pack <package> [options]') log.error('Usage: cell pack <package> [options]')
log.error('') log.error('')
log.error('Options:') log.error('Options:')
@@ -29,23 +29,23 @@ if (args.length < 1) {
target_package = args[0] 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 (args[i] == '-t' || args[i] == '--target') {
if (i + 1 < args.length) { if (i + 1 < length(args)) {
target = args[++i] target = args[++i]
} else { } else {
log.error('-t requires a target') log.error('-t requires a target')
$stop() $stop()
} }
} else if (args[i] == '-o' || args[i] == '--output') { } else if (args[i] == '-o' || args[i] == '--output') {
if (i + 1 < args.length) { if (i + 1 < length(args)) {
output_name = args[++i] output_name = args[++i]
} else { } else {
log.error('-o requires an output name') log.error('-o requires an output name')
$stop() $stop()
} }
} else if (args[i] == '-b' || args[i] == '--buildtype') { } else if (args[i] == '-b' || args[i] == '--buildtype') {
if (i + 1 < args.length) { if (i + 1 < length(args)) {
buildtype = args[++i] buildtype = args[++i]
if (buildtype != 'release' && buildtype != 'debug' && buildtype != 'minsize') { if (buildtype != 'release' && buildtype != 'debug' && buildtype != 'minsize') {
log.error('Invalid buildtype: ' + buildtype + '. Must be release, debug, or 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 packages = ['core']
var deps = pkg_tools.gather_dependencies(target_package) 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(deps[i])
} }
packages.push(target_package) packages.push(target_package)
@@ -95,7 +95,7 @@ packages.push(target_package)
// Remove duplicates // Remove duplicates
var unique_packages = [] var unique_packages = []
var seen = {} var seen = {}
for (var i = 0; i < packages.length; i++) { for (var i = 0; i < length(packages); i++) {
if (!seen[packages[i]]) { if (!seen[packages[i]]) {
seen[packages[i]] = true seen[packages[i]] = true
unique_packages.push(packages[i]) unique_packages.push(packages[i])
@@ -109,7 +109,7 @@ arrfor(packages, function(package) {
shop.extract(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 { try {
var result = build.build_static(packages, target, output_name, buildtype) 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) log.console("Created " + archive_path)
} }
if (!is_array(arg) || arg.length < 1) { if (!is_array(arg) || length(arg) < 1) {
print_usage() print_usage()
} else { } else {
if (arg[0] == "-l") { if (arg[0] == "-l") {
if (arg.length < 2) print_usage() if (length(arg) < 2) print_usage()
else list(arg[1]) else list(arg[1])
} else if (arg[0] == "-u") { } else if (arg[0] == "-u") {
if (arg.length < 2) print_usage() if (length(arg) < 2) print_usage()
else unpack(arg[1]) else unpack(arg[1])
} else { } else {
var sources = [] var sources = []
@@ -130,12 +130,12 @@ if (!is_array(arg) || arg.length < 1) {
i = 2 i = 2
} }
for (; i < arg.length - 1; i++) { for (; i < length(arg) - 1; i++) {
sources.push(arg[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() print_usage()
} else { } else {
pack(sources, archive, read_dir) pack(sources, archive, read_dir)

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
var shop = use('internal/shop') var shop = use('internal/shop')
var pkg = use('package') var pkg = use('package')
if (args.length < 1) { if (length(args) < 1) {
log.console("Usage: cell search <query>") log.console("Usage: cell search <query>")
log.console("Searches for packages, actors, or modules matching the query.") log.console("Searches for packages, actors, or modules matching the query.")
$stop() $stop()
@@ -46,7 +46,7 @@ arrfor(packages, function(package_name) {
}) })
// Print results // 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) { if (total == 0) {
log.console("No results found for '" + query + "'") 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("Found " + text(total) + " result(s) for '" + query + "':")
log.console("") log.console("")
if (found_packages.length > 0) { if (length(found_packages) > 0) {
log.console("Packages:") log.console("Packages:")
arrfor(found_packages, function(p) { arrfor(found_packages, function(p) {
log.console(" " + p) log.console(" " + p)
@@ -62,7 +62,7 @@ if (total == 0) {
log.console("") log.console("")
} }
if (found_modules.length > 0) { if (length(found_modules) > 0) {
log.console("Modules:") log.console("Modules:")
arrfor(found_modules, function(m) { arrfor(found_modules, function(m) {
log.console(" " + m) log.console(" " + m)
@@ -70,7 +70,7 @@ if (total == 0) {
log.console("") log.console("")
} }
if (found_actors.length > 0) { if (length(found_actors) > 0) {
log.console("Actors:") log.console("Actors:")
arrfor(found_actors, function(a) { arrfor(found_actors, function(a) {
log.console(" " + 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[] = { 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("concat", 1, js_string_concat),
JS_CFUNC_DEF("toString", 0, js_string_toString ), JS_CFUNC_DEF("toString", 0, js_string_toString ),
JS_CFUNC_DEF("valueOf", 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 // cell test package all - run all tests from all packages
function parse_args() { function parse_args() {
if (args.length == 0) { if (length(args) == 0) {
// cell test - run all tests for current package // cell test - run all tests for current package
if (!is_valid_package('.')) { if (!is_valid_package('.')) {
log.console('No cell.toml found in current directory') log.console('No cell.toml found in current directory')
@@ -64,7 +64,7 @@ function parse_args() {
} }
if (args[0] == 'package') { if (args[0] == 'package') {
if (args.length < 2) { if (length(args) < 2) {
log.console('Usage: cell test package <name> [test]') log.console('Usage: cell test package <name> [test]')
log.console(' cell test package all') log.console(' cell test package all')
return false return false
@@ -102,7 +102,7 @@ function parse_args() {
} }
} }
if (args.length >= 3) { if (length(args) >= 3) {
// cell test package <name> <test> // cell test package <name> <test>
target_test = args[2] target_test = args[2]
} }
@@ -146,7 +146,7 @@ function ensure_dir(path) {
var parts = array(path, '/') var parts = array(path, '/')
var current = starts_with(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 if (parts[i] == '') continue
current += parts[i] + '/' current += parts[i] + '/'
if (!fd.is_dir(current)) { 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 files = pkg.list_files(package_name)
var actor_tests = [] var actor_tests = []
for (var i = 0; i < files.length; i++) { for (var i = 0; i < length(files); i++) {
var f = files[i] var f = files[i]
// Check if file is in tests/ folder and is a .ce actor // Check if file is in tests/ folder and is a .ce actor
if (starts_with(f, "tests/") && ends_with(f, ".ce")) { 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 files = pkg.list_files(package_name)
var test_files = [] var test_files = []
for (var i = 0; i < files.length; i++) { for (var i = 0; i < length(files); i++) {
var f = files[i] var f = files[i]
// Check if file is in tests/ folder and is a .cm module (not .ce - those are actor tests) // 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")) { 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}`) if (package_name) log.console(`Running tests for ${package_name}`)
else log.console(`Running tests for local package`) 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 f = test_files[i]
var mod_path = text(f, 0, -3) // remove .cm 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}`) log.console(` ${f}`)
for (var j = 0; j < tests.length; j++) { for (var j = 0; j < length(tests); j++) {
var t = tests[j] var t = tests[j]
var test_entry = { var test_entry = {
package: pkg_result.package, package: pkg_result.package,
@@ -381,7 +381,7 @@ if (all_pkgs) {
// Then all packages in lock // Then all packages in lock
var packages = shop.list_packages() 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_results.push(run_tests(packages[i], null))
all_actor_tests = array(all_actor_tests, collect_actor_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 // Spawn actor tests if any
if (all_actor_tests.length > 0) { if (length(all_actor_tests) > 0) {
log.console(`Running ${all_actor_tests.length} actor test(s)...`) log.console(`Running ${length(all_actor_tests)} actor test(s)...`)
for (var i = 0; i < all_actor_tests.length; i++) { for (var i = 0; i < length(all_actor_tests); i++) {
spawn_actor_test(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) { function handle_actor_message(msg) {
var sender = msg.$sender var sender = msg.$sender
var found_idx = -1 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) { if (pending_actor_tests[i].actor == sender) {
found_idx = i found_idx = i
break break
@@ -426,12 +426,12 @@ function handle_actor_message(msg) {
results = [msg] results = [msg]
} }
for (var i = 0; i < results.length; i++) { for (var i = 0; i < length(results); i++) {
var res = results[i] || {} var res = results[i] || {}
var entry = { var entry = {
package: base_entry.package, package: base_entry.package,
file: base_entry.file, 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", status: "failed",
duration_ns: duration_ns duration_ns: duration_ns
} }
@@ -459,7 +459,7 @@ function check_timeouts() {
var now = time.number() var now = time.number()
var timed_out = [] 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 entry = pending_actor_tests[i]
var elapsed_ms = (now - entry.start_time) * 1000 var elapsed_ms = (now - entry.start_time) * 1000
if (elapsed_ms > ACTOR_TEST_TIMEOUT) { 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 idx = timed_out[i]
var entry = pending_actor_tests[idx] var entry = pending_actor_tests[idx]
pending_actor_tests.splice(idx, 1) pending_actor_tests.splice(idx, 1)
@@ -479,7 +479,7 @@ function check_timeouts() {
log.console(` TIMEOUT ${entry.test}`) log.console(` TIMEOUT ${entry.test}`)
} }
if (pending_actor_tests.length > 0) { if (length(pending_actor_tests) > 0) {
$delay(check_timeouts, 1000) $delay(check_timeouts, 1000)
} }
check_completion() check_completion()
@@ -489,7 +489,7 @@ function check_timeouts() {
var finalized = false var finalized = false
function check_completion() { function check_completion() {
if (finalized) return if (finalized) return
if (pending_actor_tests.length > 0) return if (length(pending_actor_tests) > 0) return
finalized = true finalized = true
finalize_results() finalize_results()
@@ -497,10 +497,10 @@ function check_completion() {
function finalize_results() { function finalize_results() {
// Add actor test results to all_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 r = actor_test_results[i]
var pkg_result = null 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) { if (all_results[j].package == r.package) {
pkg_result = all_results[j] pkg_result = all_results[j]
break break
@@ -512,7 +512,7 @@ function finalize_results() {
} }
var file_result = null 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) { if (pkg_result.files[j].name == r.file) {
file_result = pkg_result.files[j] file_result = pkg_result.files[j]
break break
@@ -536,7 +536,7 @@ function finalize_results() {
// Calculate totals // Calculate totals
var totals = { total: 0, passed: 0, failed: 0 } 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.total += all_results[i].total
totals.passed += all_results[i].passed totals.passed += all_results[i].passed
totals.failed += all_results[i].failed totals.failed += all_results[i].failed
@@ -551,9 +551,9 @@ function finalize_results() {
// If no actor tests, finalize immediately // If no actor tests, finalize immediately
var totals var totals
if (all_actor_tests.length == 0) { if (length(all_actor_tests) == 0) {
totals = { total: 0, passed: 0, failed: 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.total += all_results[i].total
totals.passed += all_results[i].passed totals.passed += all_results[i].passed
totals.failed += all_results[i].failed totals.failed += all_results[i].failed
@@ -577,24 +577,24 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
=== SUMMARY === === 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] var pkg_res = all_results[i]
if (pkg_res.total == 0) continue if (pkg_res.total == 0) continue
txt_report += `Package: ${pkg_res.package}\n` 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 f = pkg_res.files[j]
var status = f.failed == 0 ? "PASS" : "FAIL" 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` txt_report += `\n=== FAILURES ===\n`
var has_failures = false 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] 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] 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 t = f.tests[k]
if (t.status == "failed") { if (t.status == "failed") {
has_failures = true has_failures = true
@@ -613,13 +613,13 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
if (!has_failures) txt_report += `None\n` if (!has_failures) txt_report += `None\n`
txt_report += `\n=== DETAILED RESULTS ===\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] var pkg_res = all_results[i]
if (pkg_res.total == 0) continue 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] 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 t = f.tests[k]
var dur = `${t.duration_ns || 0}ns` var dur = `${t.duration_ns || 0}ns`
var status = t.status == "passed" ? "PASS" : "FAIL" 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`) log.console(`Report written to ${report_dir}/test.txt`)
// Generate JSON per package // 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] var pkg_res = all_results[i]
if (pkg_res.total == 0) continue if (pkg_res.total == 0) continue
var pkg_tests = [] 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] 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]) 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 no actor tests, generate reports and stop immediately
if (all_actor_tests.length == 0) { if (length(all_actor_tests) == 0) {
generate_reports(totals) generate_reports(totals)
$stop() $stop()
} else { } else {

View File

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

View File

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

View File

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

View File

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

8
why.ce
View File

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