Fixes os.ReadDir segfault caused by package path mismatch between llgo overlay packages and canonical standard library paths. The issue occurred in: os.ReadDir → sort.Slice → reflectlite.Swapper where internal/reflectlite.Type interface has private methods common() and uncommon(). Using mPkg.Path() returned the overlay path 'github.com/goplus/llgo/runtime/internal/lib/internal/reflectlite' instead of the canonical 'internal/reflectlite', causing runtime to only fill public methods and leave private method pointers NULL. Changed to use abi.PathOf() which returns the correct canonical package path for matching, ensuring all interface methods (both public and private) are properly filled in the interface table. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
414 lines
17 KiB
Plaintext
414 lines
17 KiB
Plaintext
# Historical Comments and Reviews
|
||
|
||
## Discussion Comments
|
||
|
||
**@codecov** (Oct 27, 03:46)
|
||
## [Codecov](https://app.codecov.io/gh/goplus/llgo/pull/1371?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=goplus) Report
|
||
:white_check_mark: All modified and coverable lines are covered by tests.
|
||
:white_check_mark: Project coverage is 90.98%. Comparing base ([`d2a2225`](https://app.codecov.io/gh/goplus/llgo/commit/d2a22252c2ff6c1a1f1a044bd28e7d4a3ab33d7e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=goplus)) to head ([`0ee2530`](https://app.codecov.io/gh/goplus/llgo/commit/0ee2530c2e863dc8ee6f84f2c9911c3576b956c6?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=goplus)).
|
||
:warning: Report is 28 commits behind head on main.
|
||
|
||
<details><summary>Additional details and impacted files</summary>
|
||
|
||
|
||
|
||
```diff
|
||
@@ Coverage Diff @@
|
||
## main #1371 +/- ##
|
||
==========================================
|
||
+ Coverage 90.18% 90.98% +0.79%
|
||
==========================================
|
||
Files 43 43
|
||
Lines 12752 11293 -1459
|
||
==========================================
|
||
- Hits 11501 10275 -1226
|
||
+ Misses 1092 859 -233
|
||
Partials 159 159
|
||
```
|
||
</details>
|
||
|
||
[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/goplus/llgo/pull/1371?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=goplus).
|
||
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=goplus).
|
||
<details><summary> :rocket: New features to boost your workflow: </summary>
|
||
|
||
- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
|
||
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
|
||
</details>
|
||
|
||
---
|
||
|
||
**@luoliwoshang** (Oct 27, 06:59)
|
||
@xgopilot add the regression for https://github.com/goplus/llgo/issues/1370's three case!
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 06:59)
|
||
### Regression tests added successfully! ✅
|
||
|
||
I've added three regression test cases for issue #1370 to the `_cmptest/` directory:
|
||
|
||
#### Test Cases Added
|
||
|
||
1. **`_cmptest/issue1370_gotypes/`** - Tests `go/types.Object` interface
|
||
- Uses `Scope.Insert()` which calls the private `setParent()` method
|
||
- Verifies the standard library interface works correctly across package boundaries
|
||
|
||
2. **`_cmptest/issue1370_goast/`** - Tests `go/ast.Expr` interface
|
||
- Converts `ast.Ident` to `ast.Expr` interface and calls `Pos()`
|
||
- Tests another standard library interface with private `exprNode()` method
|
||
|
||
3. **`_cmptest/issue1370_geometry/`** - Tests custom interface with private methods
|
||
- Defines `geometry.Shape` interface with private methods (`validate()`, `setID()`)
|
||
- Implements cross-package interface conversion where concrete type is returned
|
||
- Calls private method `setID()` from main package
|
||
|
||
#### Verification
|
||
|
||
- ✅ All code formatted with `go fmt ./...`
|
||
- ✅ Tests compile and run (only cgofull failed as expected per CLAUDE.md)
|
||
- ✅ Changes committed and pushed to PR branch
|
||
|
||
These tests ensure the fix in `ssa/abitype.go` correctly handles interface metadata's `PkgPath` for interfaces with private methods, preventing segmentation faults that occurred before the fix.
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 07:09)
|
||
### Regression tests moved to _demo folder! ✅
|
||
|
||
I've successfully moved all three regression tests from `_cmptest/` to `_demo/` as requested.
|
||
|
||
#### Changes Made
|
||
|
||
**Moved directories:**
|
||
1. `_cmptest/issue1370_gotypes/` → `_demo/issue1370_gotypes/`
|
||
2. `_cmptest/issue1370_goast/` → `_demo/issue1370_goast/`
|
||
3. `_cmptest/issue1370_geometry/` → `_demo/issue1370_geometry/`
|
||
|
||
**Updated import path:**
|
||
- Changed `github.com/goplus/llgo/_cmptest/issue1370_geometry/geometry` to `github.com/goplus/llgo/_demo/issue1370_geometry/geometry` in `_demo/issue1370_geometry/geometry.go`
|
||
|
||
#### Verification
|
||
|
||
- ✅ Used `git mv` to preserve git history
|
||
- ✅ Updated import paths to reflect new location
|
||
- ✅ Ran `go fmt ./...`
|
||
- ✅ Changes committed and pushed to PR branch
|
||
|
||
All regression tests are now in the `_demo/` folder where they can serve as both tests and examples of the fix for issue #1370.
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 07:23)
|
||
<!-- codeagent-review-id: pr-1371 -->
|
||
|
||
### Code Review Complete ✅
|
||
|
||
I've completed a comprehensive review of PR #1371 and moved the regression tests to `_demo/go/` as requested in the comment history.
|
||
|
||
---
|
||
|
||
### Changes Summary
|
||
|
||
#### 1. File Moves Completed
|
||
- ✅ Moved `_demo/issue1370_*` → `_demo/go/issue1370_*`
|
||
- ✅ Updated import path in geometry test
|
||
- ✅ Committed and pushed changes
|
||
|
||
#### 2. Core Fix Analysis (`ssa/abitype.go:180-213`)
|
||
|
||
The fix correctly addresses the root cause of issue #1370. Here's what it does:
|
||
|
||
**Before the fix:**
|
||
```go
|
||
return b.Call(fn, b.Str(pkg.Path()), methodSlice)
|
||
```
|
||
This always used the current compilation package path, causing the runtime to reject private methods when checking visibility.
|
||
|
||
**After the fix:**
|
||
```go
|
||
pkgPath := ""
|
||
for i := 0; i < n; i++ {
|
||
m := t.Method(i)
|
||
mName := m.Name()
|
||
if !token.IsExported(mName) {
|
||
if pkgPath == "" {
|
||
if mPkg := m.Pkg(); mPkg != nil {
|
||
pkgPath = mPkg.Path()
|
||
}
|
||
}
|
||
mName = abi.FullName(m.Pkg(), mName)
|
||
}
|
||
methods[i] = b.abiImethodOf(mName, typs[i])
|
||
}
|
||
if pkgPath == "" {
|
||
pkgPath = pkg.Path()
|
||
}
|
||
return b.Call(fn, b.Str(pkgPath), methodSlice)
|
||
```
|
||
|
||
This extracts the package path from the first private method found, ensuring the runtime receives the correct package for visibility checks.
|
||
|
||
---
|
||
|
||
### Review Assessment
|
||
|
||
**Strengths:**
|
||
1. ✅ **Correct root cause fix** - Properly sets `PkgPath` to interface definition package instead of compilation package
|
||
2. ✅ **Minimal changes** - Only 11 lines added, focused and targeted
|
||
3. ✅ **Backward compatible** - Falls back to current package path if all methods are exported
|
||
4. ✅ **Well-tested** - Three comprehensive regression tests covering standard library and custom interfaces
|
||
5. ✅ **Good test coverage** - Tests moved to `_demo/go/` where they serve as both tests and examples
|
||
|
||
**Logic Correctness:**
|
||
- The fix correctly handles the case where an interface has both exported and private methods
|
||
- It extracts `pkgPath` from the **first private method** encountered
|
||
- Falls back to `pkg.Path()` only when all methods are exported
|
||
- This ensures runtime can properly fill private method slots in itab
|
||
|
||
**No issues found** - The implementation is clean, correct, and solves the segmentation fault problem effectively.
|
||
|
||
---
|
||
|
||
### Test Coverage
|
||
|
||
The three regression tests adequately cover the problem space:
|
||
|
||
1. **`issue1370_gotypes`** - Tests `go/types.Object` with `Scope.Insert()` calling private `setParent()`
|
||
2. **`issue1370_goast`** - Tests `go/ast.Expr` interface conversion with private `exprNode()`
|
||
3. **`issue1370_geometry`** - Tests custom cross-package interface with private methods `validate()` and `setID()`
|
||
|
||
These tests verify the fix works for both standard library interfaces and user-defined interfaces.
|
||
|
||
---
|
||
|
||
### Recommendation
|
||
|
||
**Approve and merge** - This PR successfully fixes a critical segmentation fault bug with a minimal, well-tested solution.
|
||
|
||
---
|
||
|
||
👉 **Want me to re-run this review?** Just type `/review` in the comments! For more usage examples, visit [CodeAgent GitHub Repository](https://github.com/qiniu/codeagent).
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 07:58)
|
||
### Test case restructure completed! ✅
|
||
|
||
I've successfully restructured the issue #1370 geometry test case as requested.
|
||
|
||
### Changes Made
|
||
|
||
**1. Created simplified test structure following `cl/_testgo/interface` pattern:**
|
||
- ✅ Moved geometry package to `cl/_testdata/geometry1370/geometry.go`
|
||
- ✅ Created simplified test in `cl/_testgo/interface1370/in.go`
|
||
- ✅ Generated `.ll` file with llgen (333 lines)
|
||
|
||
**2. Test verification:**
|
||
The generated `.ll` file correctly shows the fix:
|
||
```llvm
|
||
call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Interface"(
|
||
%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 48 }, ...)
|
||
```
|
||
Where `@0` points to `"github.com/goplus/llgo/cl/_testdata/geometry1370"` - the interface definition package, not the compilation package. This proves the fix works correctly.
|
||
|
||
**3. Cleanup:**
|
||
- ✅ Removed old demo files: `issue1370_geometry`, `issue1370_goast`, `issue1370_gotypes`
|
||
- ✅ Removed `.tmp-comment` log files
|
||
- ✅ Test passes: `go test -run TestFromTestgo/interface1370 -v ./cl`
|
||
|
||
**4. Committed and pushed:**
|
||
- Commit: `refactor(test): move issue #1370 geometry test to cl/_testgo/interface1370`
|
||
- Pushed to branch: `xgopilot/claude/issue-1370-1761210824`
|
||
|
||
The new test structure is simpler, more focused, and follows the existing testing patterns in the codebase.
|
||
|
||
---
|
||
|
||
**@luoliwoshang** (Oct 27, 08:46)
|
||
@xgopilot -codex check this demo why got fail!
|
||
```bash
|
||
56/57 tests passed
|
||
:bangbang: Failed demo cases:
|
||
|
||
* :x: ./_demo/go/readdir
|
||
```
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 08:46)
|
||
<!-- codeagent-review-id: pr-xx -->
|
||
|
||
### Summary
|
||
- `_demo/go/readdir` fails because it reads `os.ReadDir("../")`, which depends on the current working directory. When run from the repo root (e.g., `llgo run ./_demo/go/readdir`), `"../"` resolves to the parent of the repo and does not contain `go.mod`/`go.sum`, triggering the panic.
|
||
- LLGo’s `ReadDir` implementation appears correct; the issue is path-relative behavior in the demo, not directory-reading semantics.
|
||
|
||
### Fix Options
|
||
- Use `LLGO_ROOT` to construct an absolute path: `filepath.Join(os.Getenv("LLGO_ROOT"), "_demo/go")`.
|
||
- Or, if running from repo root, read `os.ReadDir("_demo/go")` instead of `"../"`.
|
||
- Alternatively, `chdir` into `_demo/go/readdir` before execution.
|
||
|
||
### References
|
||
- `_demo/go/readdir/main.go:9`
|
||
- `runtime/internal/lib/os/dir.go:71`
|
||
- `runtime/internal/lib/os/dir.go:121`
|
||
- `runtime/internal/lib/os/dir.go:166`
|
||
|
||
Note: Local run here is blocked due to Go toolchain mismatch (`go 1.23.0` and `toolchain` directive), but the diagnosis is based on code inspection and repo layout.
|
||
|
||
👉 **Want me to re-run this review?** Just type `/review` in the comments! For more usage examples, visit [CodeAgent GitHub Repository](https://github.com/qiniu/codeagent).
|
||
|
||
---
|
||
|
||
**@luoliwoshang** (Oct 27, 08:59)
|
||
@xgopilot check this question! at the demo test! fail at [.github/workflows/llgo.yml](https://github.com/goplus/llgo/blob/b3d123e23503e87a62311a9eaa3bca82d71f5828/.github/workflows/llgo.yml) 's `Test demos` step!
|
||
```bash
|
||
Testing ./_demo/go/readdir
|
||
signal: segmentation fault (core dumped)
|
||
```
|
||
|
||
---
|
||
|
||
**@xgopilot** (Oct 27, 08:59)
|
||
codeagent is processing your request, please wait a moment...
|
||
|
||
---
|
||
|
||
## Code Review Comments
|
||
|
||
### Thread 1: ssa/abitype.go
|
||
|
||
**@luoliwoshang** (Oct 23, 10:38)
|
||
@xgopilot need add testing for `go/types` `Scope.Insert` use , add to _demo folder
|
||
|
||
↳ *Reply:*
|
||
**@xgopilot** (Oct 23, 10:38)
|
||
### Demo added successfully! ✅
|
||
|
||
I've added a demo program at `_demo/go/gotypesissue/main.go` that tests the fix for cross-package interface private method calls using `go/types.Scope.Insert`.
|
||
|
||
**What the demo does:**
|
||
- Creates a `types.Package` and gets its `Scope`
|
||
- Uses `Scope.Insert()` to add a variable to the scope (this method has private methods in the `go/types` package)
|
||
- Uses `Scope.Lookup()` to verify the insertion worked correctly
|
||
- This demonstrates that the interface conversion with private methods now works correctly across package boundaries
|
||
|
||
**Testing results:**
|
||
- ✅ Demo runs successfully with llgo: `SUCCESS: Scope.Insert and Lookup work correctly`
|
||
- ✅ All code formatted with `go fmt`
|
||
- ✅ Changes committed and pushed to the PR branch
|
||
|
||
The demo specifically tests the bug fix in this PR by using `go/types` standard library interfaces that have private methods, ensuring the runtime correctly fills in the private method slots in the itab.
|
||
|
||
↳ *Reply:*
|
||
**@luoliwoshang** (Oct 23, 10:49)
|
||
@xgopilot and you also need up the .ll file at test case
|
||
|
||
↳ *Reply:*
|
||
**@xgopilot** (Oct 23, 10:49)
|
||
### Test case .ll file added successfully! ✅
|
||
|
||
I've added the LLVM IR test case for the go/types Scope.Insert demo as requested.
|
||
|
||
**What was added:**
|
||
- `cl/_testdata/gotypesissue/in.go` - Test input file (Go source code)
|
||
- `cl/_testdata/gotypesissue/out.ll` - Expected LLVM IR output (2,920 lines)
|
||
|
||
**Test verification:**
|
||
- ✅ Test passes: `go test -run TestFromTestdata/gotypesissue -v ./cl`
|
||
- ✅ The generated LLVM IR correctly includes the package path for interface metadata
|
||
- ✅ Code formatted with `go fmt`
|
||
- ✅ Changes committed and pushed to PR branch
|
||
|
||
The test case verifies that the fix in this PR correctly handles cross-package interface conversions with private methods by checking the generated LLVM IR includes the proper package path (`go/types`) for interface metadata, allowing the runtime to correctly fill in private method slots in the itab.
|
||
|
||
↳ *Reply:*
|
||
**@luoliwoshang** (Oct 23, 12:26)
|
||
@xgopilot update other test case's expect .ll by `llgen` and remove the `go/types` test at `cl/_testdata`
|
||
|
||
↳ *Reply:*
|
||
**@xgopilot** (Oct 23, 12:26)
|
||
### Test cases updated and go/types test removed! ✅
|
||
|
||
I've successfully regenerated all test case .ll files and removed the go/types test as requested.
|
||
|
||
**What was done:**
|
||
- ✅ Regenerated all .ll files in `cl/_testdata/` using llgen (18 test cases)
|
||
- ✅ Updated `cl/_testdata/debug/out.ll` which was previously a placeholder (`;`) - now properly generated with 2,392 lines
|
||
- ✅ Removed `cl/_testdata/gotypesissue/` directory and all its files
|
||
- ✅ Removed `_demo/go/gotypesissue/` demo directory
|
||
- ✅ All cl tests pass: `go test -run TestFromTestdata -v ./cl`
|
||
- ✅ Code formatted with `go fmt ./...`
|
||
- ✅ Changes committed and pushed to PR branch
|
||
|
||
**Test results:**
|
||
All 18 test cases in `cl/_testdata/` pass successfully:
|
||
- apkg, cpkg, cpkgimp, debug, fncall, foo, importpkg, llgotag, method, print, printf, printval, ptrmthd, uint, untyped, utf8, vargs, varinit
|
||
|
||
The regenerated .ll files now correctly reflect the interface metadata package path fix from this PR.
|
||
|
||
↳ *Reply:*
|
||
**@luoliwoshang** (Oct 23, 13:08)
|
||
@xgopilot `TestFromTestgo` got fail message like `cltest.go:122: llgen.GenFrom: unexpect result`, you need reinsall `llgen` to update test case!
|
||
|
||
↳ *Reply:*
|
||
**@xgopilot** (Oct 23, 13:08)
|
||
### Test cases updated successfully! ✅
|
||
|
||
I've successfully fixed the `TestFromTestgo` failure by reinstalling `llgen` and regenerating the affected test cases.
|
||
|
||
**What was done:**
|
||
1. ✅ Reinstalled the `llgen` tool to get the updated version with the interface metadata fix
|
||
2. ✅ Regenerated all test cases in `cl/_testgo/` with `LLGO_ROOT` properly set
|
||
3. ✅ Verified tests pass (only cgofull fails due to missing Python dependencies, as expected per CLAUDE.md)
|
||
4. ✅ Ran `go fmt ./...` to format code
|
||
5. ✅ Committed and pushed changes
|
||
|
||
**Test results:**
|
||
- ✅ All relevant tests pass including: `alias`, `interface`, `invoke`, `defer`, `chan`, `closure`, `reflect`, etc.
|
||
- ⚠️ `cgofull` test fails due to missing Python dependencies (expected per CLAUDE.md)
|
||
|
||
**Changes committed:**
|
||
- `cl/_testgo/interface/out.ll` - Updated to reflect the correct interface metadata package path
|
||
- The generated LLVM IR now correctly uses `ptr @2, i64 39` (interface definition package) instead of `ptr @0, i64 43` (compilation package)
|
||
|
||
The test case now properly validates the fix in this PR for cross-package interface conversions with private methods.
|
||
|
||
---
|
||
|
||
### Thread 2: cl/_testdata/geometry1370/geometry.go
|
||
|
||
**@luoliwoshang** (Oct 27, 08:44)
|
||
@xgopilot check!
|
||
```bash
|
||
[Go / test (macos-latest, 19) (pull_request)](https://github.com/goplus/llgo/actions/runs/18833958196/job/53730659839?pr=1371)
|
||
Go / test (macos-latest, 19) (pull_request)Failing after 6m
|
||
[Go / test (ubuntu-latest, 19) (pull_request)](https://github.com/goplus/llgo/actions/runs/18833958196/job/53730659835?pr=1371)
|
||
Go / test (ubuntu-latest, 19) (pull_request)Failing after 6m
|
||
```
|
||
```bash
|
||
--- FAIL: TestFromTestdata/geometry1370 (0.42s)
|
||
util.go:60: len(dst) = 4023, len(src) = 0
|
||
dst = "; ModuleID = 'github.com/goplus/llgo/cl/_testdata/geometry1370'\nsource_filename = \"github.com/goplus/llgo/cl/_")\n"
|
||
// ignore some output
|
||
src = ""
|
||
cltest.go:122: llgen.GenFrom: unexpect result
|
||
```
|
||
|
||
↳ *Reply:*
|
||
**@xgopilot** (Oct 27, 08:44)
|
||
### ✅ CI Test Failures Fixed
|
||
|
||
**Root cause**: The `geometry1370` test directory was added with `geometry.go` but was missing the required `out.ll` file that contains the expected LLVM IR output for test validation.
|
||
|
||
**Fix applied**: Generated the missing `out.ll` file (90 lines) using the llgen tool with the corrected PkgPath logic from the PR.
|
||
|
||
**Verification**:
|
||
- ✅ `go fmt ./...` - passed
|
||
- ✅ `go test ./cl -run TestFromTestdata/geometry1370` - passed
|
||
- ✅ `go test ./cl -run TestFromTestdata` - all tests passed
|
||
|
||
**Changes committed**: Added `cl/_testdata/geometry1370/out.ll` and pushed to the PR branch. The CI should now pass on both macOS and Ubuntu.
|
||
|
||
---
|
||
|