Skip to content

[rustjava-adopt-reject-duplicate-bootstrap-methods-p0] fix(classfile): 단일값 클래스 속성의 「개수 규칙」 — 진짜 JVM 이 거부하는 다섯에만 - #66

Merged
Jun025 merged 3 commits into
mainfrom
feat/rustjava-class-attribute-cardinality
Sep 17, 2026
Merged

Jun025 merged 3 commits into
mainfrom
feat/rustjava-class-attribute-cardinality

Conversation

@Jun025

@Jun025 Jun025 commented Sep 17, 2026

Copy link
Copy Markdown
Owner

채택 제안 2026-09-16-reject-duplicate-bootstrap-methods#p0 — 제목이 「Decide whether …」,
이 회차가 지는 것은 판정이다. 제안은 「아무도 읽지 않는 속성엔 답이 «아니오»일 수 있다」고 추측했다.

판정: 다섯에 «예». 그리고 제안의 값 전제가 거짓이었다

제안의 기준만으로는 «아니오»가 나온다 — 기존 검사가 적은 기준(「중복이 하류에서 임의의 선택을
관측 가능하게 만드는가」)에 해당하는 속성은 소비자 전수 실측상 BootstrapMethods 하나뿐이다.

판정을 바꾼 것은 진짜 JVM 이다. OpenJDK 26.0.1 에 한 속성씩 물었다(런처 메시지는 원인을 가리므로
Class.forName 으로 진단문을 받았다):

중복시킨 속성 major OpenJDK 26.0.1
SourceFile·InnerClasses·SourceDebugExtension·BootstrapMethods 52 ClassFormatError: Multiple … attributes
NestHost·NestMembers 55 ClassFormatError
★NestHost 52 로드된다 — 미정의라 무시(JVMS 4.7.1)
★Synthetic 52 로드된다 — 스펙은 at-most-one 인데 HotSpot 은 둘을 받는다

⇒ 「오늘 로드되는 파일을 더 거부한다」는 그 다섯에 «거짓» — 그 파일들은 진짜 JVM 에서도 안 열린다.

그래서 «표»이고 «버전 게이트»다

아래 두 줄이 통제군 픽스처로 고정돼 있다 — 버전 게이트를 빼면 NestHost@52 가, Synthetic 을 넣으면
그쪽이 red 가 된다(M1·M2).

양방향

M1 게이트 제거 → 통제군 red · M2 Synthetic 추가 → 통제군 red ·
M3 SourceFile 한 칸 제거 → 그 픽스처만 red · M4 호출부 원복 → 다섯 red · 복원 17/0.

대가

  • 제품 동작 변경: 그 다섯을 둘씩 가진 클래스가 로드되지 않는다.
  • 표는 수동 목록 — 속성이 늘어도 행을 더하기 전엔 안 덮이고 울어 주는 것이 없다.
  • Synthetic 배제는 JVM 하나의 행동에 걸려 있다.
  • ★**attribute.rs 를 만졌다**(제안 target 은 validation.rs 뿐): SourceDebugExtension 파싱 팔 한 줄로
    기존 dead variant 를 살렸다 — 없으면 중복이 Unknown 에 섞여 구별 불가다.

cargo test --all 578 → 579 / 0 failed / 1 ignored · 버전 표 +7행 · DoD 7명령 rc=0.

…: 단일값 클래스 속성의 «개수 규칙» — 진짜 JVM 이 거부하는 다섯에만, 버전 게이트로
jun0 added 2 commits September 18, 2026 01:49
…main 당김 — 원장 2파일 합집합 해소

충돌은 `STATE.md`·`REPORT.md` 상단 삽입 두 곳뿐(제품 코드 0). 양쪽 항목 전건 보존·시간순 합집합.
보존 증명: HEAD 추가 8/14줄 소실 0 · main 추가 11/11줄 소실 0 · 양측 삭제줄 부활 0 ·
기여 불변 `--numstat` 양방향 정확 일치(14/0·8/0 ↔ 11/0·11/0).
…이트③ 착지 기록 동봉 (PR #66 · --merge · 핀 1da1379)
@Jun025
Jun025 merged commit fe86be7 into main Sep 17, 2026
10 checks passed
@Jun025
Jun025 deleted the feat/rustjava-class-attribute-cardinality branch September 17, 2026 17:11
Jun025 pushed a commit that referenced this pull request Sep 17, 2026
…n 재당김 — 원장 2파일 합집합 해소(2회차)

PR #66 착지로 base 가 다시 낡아 같은 원장 2파일에서 재충돌(계약 2-c 가 「상시」로 규정한 형태).
충돌 = `STATE.md`·`REPORT.md` 상단 삽입뿐 · 제품 코드 0.
보존 증명: HEAD 추가 24/46줄 소실 0 · main 추가 12/14줄 소실 0 · 양측 삭제줄 부활 0 ·
기여 불변 `--numstat` 양방향 정확 일치. 동봉 고지는 재측값(범위 밖 픽스처 3 → 10장)으로 갱신.
Jun025 pushed a commit that referenced this pull request Sep 18, 2026
…— 코드 2파일을 «각자 한 일»로 합친다

게이트③ 계약 2-c⒝ 로 머지 회차가 풀 수 없던 충돌 4파일(원장 2 + 코드 2)을 해소한다.
base 뒤처짐 25 · 승인(pin acada3c)의 내용은 무접촉.

★충돌의 정체: 두 쪽이 «같은 함수에 각자 다른 일»을 했다.
· ours(#67) = validate_class 의 8항 || 사슬을 «규칙마다 if» 로 쪼개 사유를 달았다(호출부 재구성)
· theirs(#66, 착지) = 마지막 항의 술어 자체를 «일반화»했다
  (at_most_one_bootstrap_methods_attribute → at_most_one_of_each_single_class_attribute,
   BootstrapMethods 는 그 판별자 3번으로 «포함»된다)
⇒ 한쪽을 취하면 다른 쪽이 죽는다. ours 의 구조를 취하되 마지막 항을 theirs 의 일반화 술어로 바꿨다.
★사유 문면도 규칙에 맞췄다(「multiple BootstrapMethods attributes」 → 「a single-valued class
attribute appears more than once」) — 이 PR 자신의 교리 그대로다: 「규칙이 넓어지면 이름이 아니라
사유가 문면을 맞춘다」. 그 결과 ours 의 시험 단정도 같은 문면으로 따라갔다.

★tests/test_class_format.rs 는 theirs 판본에 ours 의 세 hunk(주석 2 + 새 시험 1)를 얹었다.
ours 의 새 시험이 원래 붙어 있던 앵커를 theirs 가 지웠기 때문에 git 이 꼬리를 접었다.
함수 22개 = base 16 − theirs 제거 2 + theirs 추가 7 + ours 추가 1.

★삭제줄은 «부모별로» 판정했다(일괄 계약 금지):
· theirs 에 있었는데 결과에 없는 것 = 두 파일 모두 «0»
· ours 쪽 3건은 전부 «의도»다 — at_most_one_bootstrap_methods_attribute 는 theirs 가 일반화해
  흡수했고, 지워진 시험 2개는 #61 회차가 «LambdaMetafactory 는 링크되지 않는다» 단언이 거짓이 되어
  일부러 없앤 것으로 이미 main 에 반영돼 있다.

원장 2파일은 양쪽 다 남기기(합집합) · 기여 불변 --numstat 양방향 정확 일치.
cargo test --all 584/0/1(해소 전 main 583 + 이 PR 의 새 시험 1) · 양측 핵심 시험 전건 ok.
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