Mark Birger
83ce8c3580
Fix RVM evaluation of default-only rules ( #664 )
...
Default-only rules (e.g., `default deny := true` with no conditional body)
returned Undefined in the RVM instead of the default value.
Compiler:
- compute_rule_type: return Complete when rule exists only in default_rules map
- compile_worklist_rule: emit register slots and data-tree entries for
default-only rules (else branch)
VM:
- execute_call_rule_common + execute_call_rule_suspendable: check
default_literal_index before returning Undefined when definitions is empty
Tests:
- 3 new RVM cases (default_rules.yaml): bool, object, entry-point
- 3 new interpreter cases (default/basic.yaml): matching coverage
Co-authored-by: Mark Birger <markbirger@microsoft.com >
2026-04-07 11:38:50 -05:00
Anand Krishnamoorthi
a3a20a1235
feat!: Rego -> RVM Compiler and extensive testsuite ( #506 )
...
# RVM compiler test cases
Coverage:
- arithmetic
- arrays
- chained lookups
- comparisons
- comprehensions
- default rules
- destructuring
- function rules
- loops/quantifiers
- multiple entrypoints
- objects/sets
- variables
- negative/edge scenarios such as data/rule conflicts
- virtual data lookups
- etc
# Modify interpreter and compiled policy for RVM Compilation
- Interpreter::eval_default_rule_for_compiler:
evaluates a named default rule in isolation - allows compiler to emit a constant value instead of instructions
for the default value
# feat: Rego Compiler Scaffolding
- Introduce the rego::compiler module surface and entry point wiring
- Add the core compiler concepts:
- register allocator
- scope tracking
- literal/builtin tables
- rule worklists
- instruction emit helpers
- compiler-specific error types
- context structs for rules, comprehensions, and loops to support later lowering passes.
# feat: Compile Rules/Queries
- add compiler::compile_from_policy workflow plus rule worklist, entry-point wiring, and recursion checks
- implement query lowering:
- scheduling-aware statement ordering
- loop hoisting
- “every/some” semantics
- context yields
- literal assertions
- finalize Program construction
# feat: Expression Lowering
- add compile_rego_expr and helpers to translate every AST expression into RVM instructions,
- interop with binding plans, comprehensions, and membership checks.
- implement collection literal builders (ArrayCreate, SetCreate, ObjectCreate)
- dedupe literal keys and handle mixed literal/dynamic fields via instruction data blocks.
- operations:
- arithmetic/boolean/bin operators
- membership
- unary minus
- set unions/intersections
- etc
- user-defined and builtin function calls
- reference handling
- analyse chained refs
- distinguishe data/input/local roots
- perform rule dispatch or virtual document lookups
- emits optimized Index/ChainedIndex instructions.
# feat: Comprehensions & Loops
- shared comprehension emitter
- wraps array/set/object comprehensions with ComprehensionBegin/End
- context management
- loop lowering utilities
- read hoisting metadata
- emit LoopStart/LoopNext
- some in lowering
- every quantifiers
- index iteration
- propagate binding plans into stored registers so downstream statements see bound variables.
# feat: Destructuring Lowering
- destructuring planner integration
- assignment/parameter/loop bindings use hoisted plans instead of re-walking ASTs.
- handle :=, =, wildcard matches, and equality
- evaluate RHS
- applying destructuring plans
- emit assert condition as needed
- support nested array/object destructuring, dynamic keys, and some ... in forms
# test: Shared Testing + RVM Suites
- move YAML test helpers into test_utils.rs and re-export via common.rs for use by interpreter and vm test suites
- comprehensive compiler test suite
- compiles policies with the new Rego→RVM compiler
- runs them through RegoVM
- compares against interpreter behavior
- supports multiple entry points
- provides assembly listings
- filterable YAML suites.
Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com >
2025-11-24 12:08:37 -06:00