Skip to content

[rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1-fix] [rustjava-adopt-link-stringconcatfactory-p1-fix2] - #60

Merged
Jun025 merged 8 commits into
mainfrom
fix/rustjava-string-concat-recipe-arity
Sep 17, 2026

Conversation

@Jun025

@Jun025 Jun025 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

채택 제안 2026-09-16-link-stringconcatfactory#p1 — 「레시피의 arity 가 콜사이트와 어긋날 때 무엇을 할지 정하라」.

제안의 처방은 기각한다 — 실측이 근거다

제안은 「classfile/validation.rs 로 옮겨 ClassFormatError」를 물었다. 픽스처 3종을 손으로 조립해
OpenJDK 26.0.1 에 직접 돌렸다: 전건 BootstrapMethodError(원인 StringConcatException)이고
프레임이 linkCallSite = 링크 시점이다. ClassFormatError 가 아니다 — 파일은 파싱되고, 부트스트랩
정적 인자의 «의미»는 클래스파일 형식의 소관이 아니다. 제안이 스스로 적은 비용(「검증 단계에서
부트스트랩 인자를 걷는 것 = attribute.rs 가 일부러 피한 해결」)도 함께 면했다.

제안의 전제 「현 런타임 검사는 싸고 «옳다»」는 두 겹으로 거짓이었다

  1. 그 가지는 던지지 못했다. java/lang/BootstrapMethodError 가 이 런타임에 없다. 그래서
    jvm.rs:948 의 unwrap 에서 NoClassDefFoundError 로 패닉한다. 이 형상의 픽스처가 하나도 없어
    아무도 밟은 적이 없는 가지였다. ⇒ 클래스를 추가했다(LinkageError 의 자식 · JDK 계보 그대로).
  2. 검사가 «부족분»만 봤다. 레시피가 콜사이트보다 짧으면 루프는 남는 인자를 묻지도 않는다 ⇒
    조용히 버리고 틀린 문자열(a)을 돌려주고 rc=0. ⇒ 상등 비교로 바꾸고 인자·상수 두 축을
    변환 전에 한 번 잰다(String.valueOf 가 사용자 toString() 을 돌리므로, 먼저 변환하면 그
    예외가 이 진단을 덮는다).

개악 대조 — 4종 전건 red (정상 574 green)

개악 결과
M1 합의 검사 삭제 red — 세 픽스처가 그냥 실행돼 출력한다
M2 != → >(부족분만) red — RecipeWantsFewerArguments 가 a 를 찍는다
M3 상수 축 조건 제거 red — RecipeWantsAConstant 가 a 를 찍는다
M4 loader.rs 에서 클래스 등록 제거 red — jvm.rs:948 패닉이 되살아난다

cargo test --all 573 → 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 을 나중에 두는 것이 맞다.

jun0 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 에 실제로 돌려 위 판정을 얻었다.
jun0 added 2 commits September 17, 2026 10:19
…코드 충돌 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 ⇒ 위). 진행중 절은 양쪽이 다시 썼고
새것(이쪽)이 이긴다 — 그 한 줄이 «소실»로 보이는 이유를 회신에 적는다.
@Jun025 Jun025 changed the title [rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1-fix] Sep 17, 2026
jun0 added 3 commits September 17, 2026 18:20
… 원장 2파일 충돌 합집합 해소(코드 충돌 0)
…e 당김이 만든 버전 표 3행을 등재한다
…· worklog 쌍 — 전제 반증과 base 당김
@Jun025 Jun025 changed the title [rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1-fix] [rustjava-adopt-link-stringconcatfactory-p1] fix(jvm-bytecode): 레시피와 콜사이트의 불일치를 「합의 검사」로 앞당긴다 [rustjava-adopt-link-stringconcatfactory-p1-fix] [rustjava-adopt-link-stringconcatfactory-p1-fix2] Sep 17, 2026
@Jun025
Jun025 merged commit e94cfe9 into main Sep 17, 2026
10 checks passed
@Jun025
Jun025 deleted the fix/rustjava-string-concat-recipe-arity branch September 17, 2026 11:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant