Major enhancements to LLVM code generation and type handling: 1. String Operations: - Added StringBox length fast-path (length/len methods) - Converts i8* to handle when needed for len_h call - Consistent handle-based string operations 2. Array/Map Fast-paths: - ArrayBox: get/set/push/length operations - MapBox: get/set/has/size with handle-based keys - Optimized paths for common collection operations 3. Field Access: - getField/setField implementation with handle conversion - Proper i64 handle to pointer conversions 4. NewBox Improvements: - StringBox/IntegerBox pass-through optimizations - Fallback to env.box.new when type_id unavailable - Support for dynamic box creation 5. Documentation: - Added ARCHITECTURE.md for overall design - Added EXTERNCALL.md for external call specs - Added LOWERING_LLVM.md for LLVM lowering rules - Added PLUGIN_ABI.md for plugin interface 6. Type System: - Added UserBox type registration in nyash_box.toml - Consistent handle (i64) representation across system Results: More robust LLVM code generation with proper type handling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
26 lines
1.1 KiB
Markdown
26 lines
1.1 KiB
Markdown
# ExternCall Policy (Phase 15)
|
||
|
||
## Allowed Interfaces (minimal set)
|
||
- `env.console.{log,warn,error,readLine}`
|
||
- `env.debug.trace`
|
||
- `env.system.{exit,now}` (if present)
|
||
|
||
All other host interactions should go through BoxCall (NyRT or plugins).
|
||
|
||
## Argument‑type‑based selection
|
||
- For `env.console.{log,warn,error}` and `env.debug.trace`:
|
||
- If the single argument is `i8*` (C string), call the C‑string variant:
|
||
- `nyash.console.log(i8*)`, `nyash.console.warn(i8*)`, `nyash.console.error(i8*)`
|
||
- `nyash.debug.trace(i8*)`
|
||
- Otherwise convert to `i64` and call the handle variant:
|
||
- `nyash.console.log_handle(i64)`, `nyash.console.warn_handle(i64)`, `nyash.console.error_handle(i64)`
|
||
- `nyash.debug.trace_handle(i64)`
|
||
|
||
## Rationale
|
||
- Keeps the AOT string path fast and avoids accidental `inttoptr` of handles.
|
||
- Avoids adding broad implicit conversions in ExternCall; selection is local and explicit.
|
||
|
||
## Non‑LLVM Backends
|
||
- VM, Cranelift JIT/AOT, and the interpreter may not implement this policy yet (not MIR14‑ready). LLVM is authoritative; other backends will align after stabilization.
|
||
|