Files
hakorune/docs/EXTERNCALL.md
Selfhosting Dev 89e6fbf010 feat(llvm): Comprehensive LLVM backend improvements by ChatGPT
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>
2025-09-11 22:30:26 +09:00

26 lines
1.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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).
## Argumenttypebased selection
- For `env.console.{log,warn,error}` and `env.debug.trace`:
- If the single argument is `i8*` (C string), call the Cstring 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.
## NonLLVM Backends
- VM, Cranelift JIT/AOT, and the interpreter may not implement this policy yet (not MIR14ready). LLVM is authoritative; other backends will align after stabilization.