○
Planned This feature is planned but not yet implemented.
Feature: Profile meta-type not implemented
Code
// ============================================================================
// Test 629: Profiler with nested loops
// Tests that the profiler correctly captures all transitions in nested loops
// Based on test 205 (nested labels)
// ============================================================================
const std = @import("std");
~[profile]import "$std/profiler"
// Outer counter event (counts outer iterations)
~event outer { x: i32, max_inner: i32 }
| next_outer { x: i32, max_inner: i32 }
| done_outer {}
~proc outer {
std.debug.print("Outer: {}\n", .{x});
if (x < 3) {
return .{ .next_outer = .{ .x = x, .max_inner = max_inner } };
} else {
return .{ .done_outer = .{} };
}
}
// Inner counter event (counts inner iterations)
~event inner { x: i32, y: i32, max_inner: i32 }
| next_inner { x: i32, y: i32, max_inner: i32 }
| done_inner { x: i32, max_inner: i32 }
~proc inner {
std.debug.print(" Inner: {}, {}\n", .{x, y});
if (y < max_inner) {
return .{ .next_inner = .{ .x = x, .y = y + 1, .max_inner = max_inner } };
} else {
return .{ .done_inner = .{ .x = x + 1, .max_inner = max_inner } };
}
}
// Start event
~event start {}
| ready {}
~proc start {
std.debug.print("Starting nested loops...\n", .{});
return .{ .ready = .{} };
}
// Flow with nested labels
// Both loops now have matching signatures (x: i32, max_inner: i32)
~start()
| ready |> #outer_loop outer(x: 1, max_inner: 2)
| next_outer o |> #inner_loop inner(x: o.x, y: 1, max_inner: o.max_inner)
| next_inner i |> @inner_loop(x: i.x, y: i.y, max_inner: i.max_inner)
| done_inner d |> @outer_loop(x: d.x, max_inner: d.max_inner)
| done_outer |> _
Test Configuration
MUST_RUN
Compiler Flags:
--profilePost-validation Script:
#!/bin/bash
# Post-execution validation for profiler loop test
# Verifies that Chrome Tracing JSON was created with multiple loop events
PROFILE_FILE="/tmp/koru_profile.json"
# Verify profile file was created
if [ ! -f "$PROFILE_FILE" ]; then
echo "ERROR: Profile file not created at $PROFILE_FILE"
exit 1
fi
# Verify JSON structure
if ! grep -q '"traceEvents"' "$PROFILE_FILE"; then
echo "ERROR: Invalid profile format - missing traceEvents"
cat "$PROFILE_FILE"
exit 1
fi
# Verify koru:start event exists
if ! grep -q '"koru:start"' "$PROFILE_FILE"; then
echo "ERROR: koru:start event missing"
cat "$PROFILE_FILE"
exit 1
fi
# Verify koru:end event exists
if ! grep -q '"koru:end"' "$PROFILE_FILE"; then
echo "ERROR: koru:end event missing"
cat "$PROFILE_FILE"
exit 1
fi
# Verify start event exists (with module qualification)
if ! grep -q '"input:start"' "$PROFILE_FILE"; then
echo "ERROR: input:start event missing"
cat "$PROFILE_FILE"
exit 1
fi
# Verify outer event exists (loop events with module qualification)
if ! grep -q '"input:outer"' "$PROFILE_FILE"; then
echo "ERROR: input:outer event missing"
cat "$PROFILE_FILE"
exit 1
fi
# NOTE: Nested inner loop events are not yet captured by the profiler
# TODO: Fix tap transform to wrap nested label_with_invocation continuations
# For now, skip the inner event check
# Count total events (should have multiple outer iterations at minimum)
EVENT_COUNT=$(grep -c '"name":' "$PROFILE_FILE")
if [ "$EVENT_COUNT" -lt 5 ]; then
echo "ERROR: Expected at least 5 events, found $EVENT_COUNT"
cat "$PROFILE_FILE"
exit 1
fi
# Verify JSON is well-formed (has both opening and closing)
if ! grep -q '^]}$' "$PROFILE_FILE"; then
echo "ERROR: JSON not properly closed"
cat "$PROFILE_FILE"
exit 1
fi
echo "✓ Profile generated at $PROFILE_FILE with $EVENT_COUNT events"
echo " Open chrome://tracing and load this file to view the execution trace!"
exit 0