mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
* feat!: add Rego Virtual Machine (RVM) implementation This commit introduces a register-based virtual machine for executing Rego policies with bytecode-style instructions. Unlike the existing tree-walking interpreter, the RVM compiles policies into instruction sequences that operate on virtual registers, offering better performance and optimization potential. Core Components: Instruction Set Architecture: - Define instruction types for data operations, control flow, and builtins - Implement instruction parameter encoding and display formatting - Add instruction parser with comprehensive test coverage Virtual Machine Engine: - Register-based execution model with program counter management - Loop execution supporting iterators, comprehensions, and quantifiers - Function call handling with argument evaluation and context management - Rule evaluation with default value resolution and virtual data support - Arithmetic and comparison operation implementations Program Representation: - Program listing builder with instruction sequencing - Rule tree construction for organizing policy rules - Binary and JSON serialization for compiled programs - Recompilation support for program modification Testing Infrastructure: - Extensive YAML test suites covering all VM features - Rust unit tests for VM execution and instruction parsing - Test suites for loops, comprehensions, builtins, and control flow BREAKING CHANGE: Introduces new VM execution path alongside interpreter Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> * docs: add detailed RVM architecture references Introduce architecture.md explaining program artifacts, serialization, and runtime subsystems. Document the full opcode catalog in instruction-set.md, including operands, parameter tables, and outcomes. Walk through execution flow, stacks, and operational guidance in vm-runtime.md, tying the runtime to the new architecture docs. Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> --------- Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
5.9 KiB
5.9 KiB
Regorus VM Test Suites
This directory hosts YAML-driven regression suites for the Regorus virtual machine. Each YAML file is converted into parameterised Rust tests by src/rvm/tests/vm.rs, so the contents here define the end-to-end VM coverage.
Prerequisites
- Enable the
rvmfeature (it pulls instdand the VM runtime) whenever you run these tests:cargo test --features rvm run_vm_test_filecargo test --features rvm run_loop_test_file
- Append
-- --nocaptureto surface per-test diagnostics when a failure occurs. - Individual generated tests follow the pattern
run_vm_test_file_tests_rvm_vm_suites_<suite>_yaml, so you can use that fragment withcargo testto run a single suite.
Layout
suites/*.yaml— primary instruction, control-flow, and integration suites.suites/loops/*.yaml— dedicated loop/comprehension suites.- Mirror the comment headers inside each suite when adding new files; the descriptions are surfaced in this README for quick reference.
Main Suites (suites/*.yaml)
| Suite | Focus |
|---|---|
arithmetic_operations.yaml |
Arithmetic opcodes (Add, Sub, Mul, Div, Mod) and simple expressions. |
assertions.yaml |
AssertCondition semantics, including success/failure and loop control interactions. |
basic_instructions.yaml |
Core load/move/return instructions that underpin every program. |
boolean_literals.yaml |
LoadBool, LoadTrue, LoadFalse, and their interaction with logical operators. |
builtin_functions.yaml |
Builtin dispatch covering argument marshalling, return handling, and error cases. |
call_rule.yaml |
CallRule execution, rule caches, defaults, and fallbacks. |
comparison_operations.yaml |
Relational operators plus logical combining (Eq, Ne, Lt, Le, Gt, Ge, And, Or, Not). |
complex.yaml |
Deeply nested hybrid loops, comprehensions, and rule calls that stress the scheduler. |
constructed_collections.yaml |
ArrayCreate/SetCreate success paths, undefined propagation, and deduplication. |
control_flow.yaml |
Conditional branching patterns, nested assertions, and selection logic. |
core_semantics.yaml |
Broad regression coverage for arithmetic, comparisons, loops, assertions, and collection helpers. |
data_structures.yaml |
Array/object/set creation, access, and mutation instructions. |
deep_nesting.yaml |
Three-plus levels of mixed loop modes validating register pressure and control flow correctness. |
default_rules.yaml |
Complete rule execution with default literals and failure fallbacks. |
destructuring_rules.yaml |
Destructuring metadata handling, success/early-exit semantics. |
function_calls.yaml |
User function invocation plumbing, argument passing, and returns. |
halt.yaml |
Halt instruction returning register 0 and stopping execution. |
host_await.yaml |
Successful HostAwait responses across execution modes and run-to-completion flows. |
host_await_failures.yaml |
Error signalling and ignore-flag behaviour for HostAwait. |
indexed_access.yaml |
Literal/register indexing, chained accesses, and undefined propagation. |
integration_scenarios.yaml |
Real-world policy shapes (RBAC, filtering, transforms, workflows). |
interpreter_operator_compatibility.yaml |
Ensures VM operators match interpreter behaviour on edge cases. |
invalid_collection_ops.yaml |
Error paths for object/set/array mutations with incorrect types. |
load_data_input.yaml |
LoadData and LoadInput instructions across nested/empty/undefined sources. |
loop_invalid_iteration.yaml |
Loop errors for non-iterables plus instruction-limit enforcement. |
null_undefined_handling.yaml |
Null/undefined behaviour across arithmetic, comparisons, indexing, loops, and comprehensions. |
object_operations.yaml |
Advanced object templates, dynamic keys, collisions, and validation. |
predefined.yaml |
Global data and input bindings, including nested access patterns. |
resource_limits.yaml |
Instruction counts, recursion depth, and other resource exhaustion scenarios. |
serialization.yaml |
Round-trip binary serialization for compiled programs covering all instruction families. |
set_operations.yaml |
Set creation, deduplication, membership checks, and nested values. |
type_errors.yaml |
Graceful error reporting for cross-family type mismatches. |
virtual_data_lookup.yaml |
VirtualDataDocumentLookup with base data, rule overrides, and invalid indices. |
Loop Suites (suites/loops/*.yaml)
| Suite | Focus |
|---|---|
array_comprehensions.yaml |
Mapping, filtering, and edge cases for array comprehensions. |
empty.yaml |
Behaviour of every loop mode over empty collections (vacuous truth/falsehood). |
existential.yaml |
some-style (Any) quantification including early exits and complex predicates. |
loop_comprehension_interactions.yaml |
Interplay between nested loops and comprehensions emitting structured data. |
nested.yaml |
Mixed nesting patterns for loops and comprehensions with varying depth. |
nested_fixed.yaml |
Placeholder for future fixed-nesting scenarios (no cases yet). |
object_comprehensions.yaml |
Key/value emission, collision handling, and filtering in object comprehensions. |
set_comprehensions.yaml |
Deduplication and uniqueness guarantees in set comprehensions. |
universal.yaml |
every-style (Every) quantification, early failure, and vacuous truth cases. |
Adding or Updating Suites
- Place the new YAML file under
suites/(or the relevantsuites/loops/subdirectory). - Add a concise comment block at the top describing the intent and scenarios.
- Update the tables above so the catalog stays accurate.
- Run
cargo test --features rvm run_vm_test_fileto ensure the suite loads and all cases pass.
Keeping this README current makes it easier to discover coverage gaps and reason about the generated tests.