Repository navigation
[rustjava-error-path-needs-java-lang-string-measure-first] fix(jvm): 오류 경로의 또 하나 java/lang/String — 재귀한다, 그래서 생성 시점에 막는다 - #84
Merged
Conversation
…오류 경로의 또 하나 java/lang/String — 재귀한다, 그래서 생성 시점에 막는다
채택 제안 `2026-09-19-fallback-class-absence-fails-at-construction#p0`
("Check the other class the error path needs before it is needed: java/lang/String").
★제안의 조건이 「측정이 먼저」였고 그대로 했다 — 선행 회차는 String 에 대해 «아무것도 주장하지
않았고»(자기 worklog 에 「실측 아님」이라 적었다) ⒜재귀 ⒝깨끗한 실패 ⒞이미 상주 중 무엇인지가
열려 있었다. Assert 를 먼저 넣지 않고 하니스로 쟀다.
★★답 = ⒜ 재귀한다. 상한 이분법: 116 생존 ↔ 117 `stack overflow, aborting`(SIGABRT · rc 134) ·
양쪽 2회씩 재현 · ★상한 100000 도 abort ⇒ 상한은 하니스가 양보하는 지점이지 «바닥이 아니다».
★⒞가 아닌 이유를 구조로: bootstrap_classes 는 6개(Object·Runnable·Thread·[B·Serializable·Class)이고
String 은 없다 · JavaLangClass::from_rust_class 는 이름을 [B(nameBytes)로 넣지 String 으로 넣지 않는다
⇒ 구성 중 String 을 처음 필요로 하는 곳은 프로퍼티 루프이고 그때 로더가 유일한 출처다.
★자리가 장식이 아니다 — 프로퍼티 루프 «앞»이다. 기존 NoClassDefFoundError 확인은 그 루프 «뒤»라
String 형상은 거기 닿기 전에 재귀한다. 관용은 동일(로더에 직접 질의 후 resolve — bare resolve_class 는
실패를 Jvm::exception 에 넘기는데 그것이 곧 순환이다).
양방향(제품 호출부 · 사본 아님): 원형상 green(2 passed) ↔ 확인 제거 시 ★stack overflow, aborting
SIGABRT signal 6 = 테스트 «바이너리째» 내려간다 ↔ 복원 green.
★시작 비용 — 수로: 결정론 계수(하니스 counter · give_up_after=0 = 숨기지 않고 세기만)로 로더가
String 을 묻는 횟수 후 2회 ↔ 전 1회 = 추가 «1회». 곁의 resolve_class 는 추가가 아니라 «이동»이다.
★벽시계 측정은 버렸다 — 형제 레인 부하로 같은 형상 p50 이 69ms~1690ms 였고 교대 8회 중 3회는
확인 있는 쪽이 더 빨랐다. 부하를 잰 것이라 수를 주장하지 않는다.
★안 한 것: 이 두 클래스만 덮는다 — 두 클래스의 생성자·정적 초기화가 닿는 것은 미측정(후속 카드).
DoD 9명령 전건 rc=0 (clippy 431s · +beta 236s · wasm32 458s · test 1531s 전부 콜드 컴파일 ·
worklog_json 69파일 0문제).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…in/main — 승인된 원장 2파일 합집합 게이트③ 충돌 해소. 충돌 집합(측정 시점: 2026-09-19T15:44:22Z 기준) = REPORT.md · STATE.md — ★둘 다 원장 파일이고 코드 충돌 0건이라 계약 2-c⒜ 승인 범위 안이다(검수 수치를 승계하지 않고 착수 시점에 merge-tree 로 다시 쟀다). 해소 = 전건 보존·합집합·시간순(최신 우선). 양쪽이 같은 삽입점에 항목을 앞에 붙였다: REPORT.md 는 `# REPORT` 뒤 · STATE.md 는 `## 완료` 뒤. ★순서는 «작업 커밋 시각»으로 갈랐다 — 이 원장의 기존 정렬이 그 축이다(main 실측 12:12 > 08:19 > 08:02 > 04:51). PR 측 392fcaa 23:19:16 > main 측 항목 35f3479 12:12:01 ⇒ PR 항목을 위에 둔다. 보존 증명(양방향 · 줄 단위): PR 추가줄 11/7 소실 0 · main 추가줄 8/5 소실 0 · 출처불명 0 · base 줄 소실 0. 계약 12: 승인 형상 기여 ↔ 흡수 후 기여 numstat diff rc=0 (6파일 216+/0−) · 비-원장 4파일 sha256 전건 IDENTICAL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
채택 제안
2026-09-19-fallback-class-absence-fails-at-construction#p0이행.★제안의 조건이 「측정이 먼저」였고 그대로 했다 — assert 를 먼저 넣지 않고 하니스로 쟀다.
답 = ⒜ 재귀한다 (⒝ 깨끗한 실패도, ⒞ 이미 상주도 아니다)
give_up_afterNoClassDefFoundError로 끝난다fatal runtime error: stack overflow, aborting— SIGABRT · rc 134 (2회 재현)생존 60 ↔ abort 120 사이 이분법으로 찾았다. 경계가 날카롭고 결정론적이다.
⒞가 아닌 이유 — 구조로
bootstrap_classes는 6개(Object·Runnable·Thread·[B·Serializable·Class) · ★String 없음JavaLangClass::from_rust_class는 이름을[B(nameBytes) 로 넣지 String 으로 넣지 않는다처방 — 자리가 장식이 아니다
기존
NoClassDefFoundError확인과 같은 관용(로더에 직접 질의 → resolve).★bare
resolve_class는 답이 안 된다 — 실패를Jvm::exception에 넘기는데 그것이 곧 순환이다.★프로퍼티 루프 «앞» 에 둔다. 기존 확인은 그 루프 뒤라 String 형상은 거기 닿기 전에 재귀한다.
양방향 축 (제품 호출부
jvm/src/jvm.rs· 픽스처 사본 아님)stack overflow, aborting· SIGABRT signal 6 — 테스트 바이너리째 내려간다시작 비용 — 수로
제안이 「every start-up」을 비용으로 지목했으므로 잰다. 결정론 계수(하니스 counter ·
give_up_after=0= 숨기지 않고 «세기만»):java/lang/String을 묻는 횟수추가 1회. 곁의
resolve_class는 추가가 아니라 «이동» 이다(프로퍼티 루프가 하던 해석이 앞당겨진다).★벽시계 측정은 버렸다 — 형제 레인이 다른 repo 에서 cargo 를 돌아 같은 형상 p50 이 69ms~1690ms 로 흔들렸고, 교대 8회 중 3회는 «확인 있는 쪽»이 더 빨랐다. 부하를 잰 것이라 수를 주장하지 않는다.
안 한 것
★이 두 클래스만 덮는다 — 두 클래스의 생성자·정적 초기화가 닿는 것은 미측정(티켓 non-goal · 후속 카드로 남겼다).
DoD — 9명령 전건 rc=0
fmt 7s·clippy 431s·+beta clippy 236s·wasm32 clippy 458s·test 1531s· 검사기 4종 0★전부 콜드 컴파일(캐시 아님) ·
worklog_json69파일 0문제(새 쌍 포함)🤖 Generated with Claude Code