[rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1-fix] [rustjava-adopt-link-stringconcatfactory-p1-fix2] - #60
Merged
Conversation
added 2 commits
September 17, 2026 07:17
…콜사이트의 불일치를 「합의 검사」로 앞당긴다
제안은 「현재의 런타임 검사는 싸고 옳다, 문제는 진단의 «자리»뿐」이라고 했다. 재 보니 둘 다 틀렸다.
⑴ java/lang/BootstrapMethodError 가 이 런타임에 «없다». 그 가지는 예외를 던지는 대신
jvm.rs 의 unwrap 에서 NoClassDefFoundError 로 «패닉»한다 — 픽스처가 하나도 없어 아무도
밟은 적이 없는 가지였다. 그래서 클래스를 추가했다(LinkageError 의 자식 · JDK 계보 그대로).
⑵ 검사가 «부족분»만 봤다. 레시피가 콜사이트보다 «짧으면» 남는 인자를 조용히 버리고
틀린 문자열을 돌려준다 — 루프 안에서 인자가 떨어질 때만 우는 가드로는 볼 수 없는 방향이다.
⇒ 부등호가 아니라 «상등»으로 바꾸고, 인자·상수 두 축을 변환 «전»에 한 번에 비교한다.
제안의 처방(classfile/validation.rs 로 옮겨 ClassFormatError)은 기각한다. OpenJDK 26 실측:
세 형상 전건이 BootstrapMethodError(원인 StringConcatException)이고 «링크 시점»이다 —
ClassFormatError 가 아니다. 여기엔 CallSite 가 없어 링크가 첫 실행에 접히므로, 그 순서에
가장 가까운 것이 「무엇도 변환하기 전에 잰다」이고 그렇게 했다. 먼저 변환하면 String.valueOf
를 통해 사용자 toString 이 돌고, 그 예외가 이 진단을 덮을 수 있다.
픽스처 3종(RecipeWants{MoreArguments,FewerArguments,AConstant})은 javac 이 낼 수 없는 형상이라
손으로 조립했고, 셋 다 OpenJDK 26 에 실제로 돌려 위 판정을 얻었다.
…klog 쌍 · 제안 #p1 채택 기록
added 2 commits
September 17, 2026 10:19
…동봉 (PR #60 · --merge)
…코드 충돌 1건을 «합집합»으로 해소한다 게이트③ 머지 회차가 계약 2-c⒝ 로 «옳게» 막힌 자리를 푼다(그 회차는 코드 충돌을 만지지 않았다). 충돌 3파일. make_indy_fixtures.py 는 «의미 충돌이 아니라 텍스트 충돌»임을 먼저 재서 확인했다: 공유부(Pool · near_miss_call_site 본문 35줄 · FIXTURES)가 «바이트 동일»이고, 양쪽이 더한 것이 서로 겹치지 않는다 — 이쪽 recipe_arity_call_site+RECIPE_ARITY / main(#59) make_concat_call_site +MAKECONCAT_DESCRIPTOR+LINKED. ⇒ 한쪽 채택이 아니라 합집합이 답이다. 6구역을 hunk 로 깁지 않고 «두 부모 판본에서 구조로» 재구성했고, ★재생성 후 기존 픽스처 바이트 변동 0 으로 검증했다(한쪽을 삼키지 않았다는 증거). 원장 2파일은 합집합·시간순(이 회차 07:28 > main 최신 06:52 ⇒ 위). 진행중 절은 양쪽이 다시 썼고 새것(이쪽)이 이긴다 — 그 한 줄이 «소실»로 보이는 이유를 회신에 적는다.
added 3 commits
September 17, 2026 18:20
… 원장 2파일 충돌 합집합 해소(코드 충돌 0)
…e 당김이 만든 버전 표 3행을 등재한다
…· worklog 쌍 — 전제 반증과 base 당김
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-16-link-stringconcatfactory#p1— 「레시피의 arity 가 콜사이트와 어긋날 때 무엇을 할지 정하라」.제안의 처방은 기각한다 — 실측이 근거다
제안은 「
classfile/validation.rs로 옮겨ClassFormatError」를 물었다. 픽스처 3종을 손으로 조립해OpenJDK 26.0.1 에 직접 돌렸다: 전건
BootstrapMethodError(원인StringConcatException)이고프레임이
linkCallSite= 링크 시점이다.ClassFormatError가 아니다 — 파일은 파싱되고, 부트스트랩정적 인자의 «의미»는 클래스파일 형식의 소관이 아니다. 제안이 스스로 적은 비용(「검증 단계에서
부트스트랩 인자를 걷는 것 =
attribute.rs가 일부러 피한 해결」)도 함께 면했다.제안의 전제 「현 런타임 검사는 싸고 «옳다»」는 두 겹으로 거짓이었다
java/lang/BootstrapMethodError가 이 런타임에 없다. 그래서jvm.rs:948의 unwrap 에서 NoClassDefFoundError 로 패닉한다. 이 형상의 픽스처가 하나도 없어아무도 밟은 적이 없는 가지였다. ⇒ 클래스를 추가했다(
LinkageError의 자식 · JDK 계보 그대로).조용히 버리고 틀린 문자열(
a)을 돌려주고 rc=0. ⇒ 상등 비교로 바꾸고 인자·상수 두 축을변환 전에 한 번 잰다(
String.valueOf가 사용자toString()을 돌리므로, 먼저 변환하면 그예외가 이 진단을 덮는다).
개악 대조 — 4종 전건 red (정상 574 green)
!=→>(부족분만)RecipeWantsFewerArguments가a를 찍는다RecipeWantsAConstant가a를 찍는다loader.rs에서 클래스 등록 제거jvm.rs:948패닉이 되살아난다cargo test --all573 → 574 passed / 0 failed / 1 ignored(기준선은origin/main워크트리 실측) ·DoD 7명령 rc=0 · 인디 픽스처 재생성 멱등(기존 4개 바이트 불변).
착지 순서
jvm-bytecode/·rustjava-runtime/은 열린 PR 과 겹침 0.tests/test_class_format.rs(#56·#59) ·test-data/src/indy/make_indy_fixtures.py(#59) 가 겹치며 전부 append 형이라 합집합 해소다.⇒ #56·#59 를 먼저 착지시키고 이 PR 을 나중에 두는 것이 맞다.