53 lines
2.7 KiB
Markdown
53 lines
2.7 KiB
Markdown
AI State (for session restart)
|
|
|
|
Project: /home/sergeych/dev/ling_lib
|
|
Module focus: :lynglib
|
|
|
|
Current focus
|
|
- Enforce compile-time name/member resolution only; no runtime scope lookup or fallback.
|
|
- Bytecode uses memberId-based ops (CALL_MEMBER_SLOT/GET_MEMBER_SLOT/SET_MEMBER_SLOT).
|
|
- Fallbacks are forbidden and throw BytecodeFallbackException.
|
|
|
|
Key recent changes
|
|
- Added memberId storage and lookup on ObjClass/ObjInstance; compiler emits memberId ops.
|
|
- Removed GET_THIS_MEMBER/SET_THIS_MEMBER usage from bytecode.
|
|
- Added ObjIterable.iterator() abstract method to ensure methodId exists.
|
|
- Bytecode compiler now throws if receiver type is unknown for member calls.
|
|
- Added static receiver inference attempts (name/slot maps), but still failing for stdlib list usage.
|
|
- Compiler now wraps function bodies into BytecodeStatement when possible.
|
|
- VarDeclStatement now includes initializerObjClass (compile-time type hint).
|
|
|
|
Known failing test
|
|
- ScriptTest.testForInIterableUnknownTypeDisasm (jvmTest)
|
|
Failure: BytecodeFallbackException "Member call requires compile-time receiver type: add"
|
|
Location: stdlib root.lyng filter() -> "val result = []" then "result.add(item)"
|
|
Current debug shows LocalSlotRef(result) slotClass/nameClass/initClass all null.
|
|
|
|
Likely cause
|
|
- Initializer type inference for "val result = []" in stdlib is not reaching BytecodeCompiler:
|
|
- stdlib is generated at build time; initializer is wrapped in BytecodeStatement and losing ListLiteralRef info.
|
|
- Need a stable compile-time type hint from the compiler or a way to preserve list literal info.
|
|
|
|
Potential fixes to pursue
|
|
1) Preserve ObjRef for var initializers (e.g., store initializer ref/type in VarDeclStatement).
|
|
2) When initializer is BytecodeStatement, use its CmdFunction to detect list/range literal usage.
|
|
3) Ensure stdlib compilation sets initializerObjClass for list literals.
|
|
|
|
Files touched recently
|
|
- notes/type_system_spec.md (spec updated)
|
|
- AGENTS.md (type inference reminders)
|
|
- lynglib/src/commonMain/kotlin/net/sergeych/lyng/VarDeclStatement.kt
|
|
- lynglib/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt
|
|
- lynglib/src/commonMain/kotlin/net/sergeych/lyng/bytecode/BytecodeCompiler.kt
|
|
- lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjIterable.kt
|
|
- various bytecode runtime/disassembler files (memberId ops)
|
|
|
|
Last test run
|
|
- ./gradlew :lynglib:jvmTest --tests ScriptTest.testForInIterableUnknownTypeDisasm
|
|
|
|
Spec decisions (notes/type_system_spec.md)
|
|
- Nullability: Kotlin-style, T non-null, T? nullable, !! asserts non-null.
|
|
- void is singleton of class Void (syntax sugar).
|
|
- Untyped params default to Object (non-null); syntax sugar: fun foo(x?) and class X(a,b?).
|
|
- Object member access requires explicit cast; remove inspect, use toInspectString().
|