Skip to content

[rustjava-bound-bootstrap-method-attr-index] feat(classfile): bootstrap_method_attr_index 가 「실재하는」 부트스트랩 메서드를 가리키게 한다 - #47

Merged
Jun025 merged 2 commits into
mainfrom
feat/rustjava-bound-bsm-attr-index
Sep 16, 2026
Merged

Jun025 merged 2 commits into
mainfrom
feat/rustjava-bound-bsm-attr-index

Conversation

@Jun025

@Jun025 Jun025 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

무엇을

Dynamic/InvokeDynamic 상수의 bootstrap_method_attr_index 가 BootstrapMethods 테이블 안을 가리키는지 검사한다.

★두 축이 한 술어다 — 속성이 «아예 없는» 경우는 «항목 0개짜리 표»여서 어떤 인덱스도 못 가리킨다:

bootstrap_method_count.is_some_and(|count| (index as usize) < count)

근거

  • JVMS 4.4.10 — bootstrap_method_attr_index 는 BootstrapMethods 의 bootstrap_methods 배열에 대한 유효한 인덱스여야 한다.
  • JVMS 4.7.23 — Dynamic/InvokeDynamic 을 가진 클래스는 그 속성을 가져야 한다.
  • 참조 JVM — OpenJDK 26: ClassFormatError: Missing BootstrapMethods attribute.

대가 — 숨기지 않는다

★의도된 «거부 확대»다. 지금까지 UnsupportedOperationException(「이 런타임이 아직 못 한다」)로 조용히 넘어가던 파일이
★ClassFormatError(「이 파일이 깨졌다」)로 거부된다. 어떤 JVM 도 못 읽는 파일이라 그 전환이 이 회차의 산출물 자체다.
★새 에러 타입 0 — 기존 ClassFileError::InvalidFormat 에 접었다(호출부 변종 증가 0).

자리

validate_constant_pool 이 아니라 validate_class — 풀과 «클래스 속성»을 둘 다 쥔 유일한 자리이고,
그 교차가 이 검사가 여태 없던 이유였다. 그 자리의 낡은 주석이 스스로 그렇게 적고 「원하는 회차에 맡긴다」고 했다.

검증 — 네 축 + 개악 3종

축 픽스처 기대
⒜ 인덱스가 표 끝을 넘음 LdcDynamicBSMIndexPastEnd(신규) 거부
⒝ 정상 인덱스 LdcDynamic·Ldc2WDynamic·StringConcat·Lambda·ConstantKinds 통과
⒞ 속성 부재 LdcDynamicNoBSM 거부
⒟ 속성이 불요한 클래스 Hello·Switch·OddEven·Superclass … 통과
개악 red 덮는 축
전체 술어 → true 1 테스트 ⒜ ⒞
전체 술어 → false 24 테스트 ⒝ ⒟ 혼재
★내부 술어만 → false 8 테스트(전건 dynamic 보유) · test_hello 류 green ⒝ 단독

★셋째 개악이 필요한 이유: false 하나로는 「정상 인덱스가 통과한다」와 「속성 불요 클래스가 통과한다」가 동시에 red 라 갈리지 않는다.

cargo test --all 568 / 0 failed / 1 ignored — ★수 불변(테스트를 «치환»했다) ⇒ 수는 증거가 아니고 개악이 증거다.
★픽스처 재생성 멱등: 기존 10개 바이트 불변 · 신규 1개만 추가. DoD 7줄 전건 rc=0.

채택 제안

2026-09-16-bootstrap-methods-and-method-handle#p1 · 2026-09-16-ldc-tags-15-16-17#p0
(서로 다른 회차가 독립으로 같은 결함에 닿았다 · worklog json adoptedProposals 에 전건 기록)

남긴 것

BootstrapMethods 중복 선언은 여전히 거부하지 않는다(JVMS 4.7.23 은 «최대 1개» · find_map 이 첫 것만 본다) — 후속 추천에 적었다.

jun0 added 2 commits September 16, 2026 14:45
…ap_method_attr_index 가 «실재하는» 부트스트랩 메서드를 가리키게 한다

JVMS 4.4.10·4.7.23. 두 축이 한 술어다 — 속성 부재는 «0항목 표»라 어떤 인덱스도 못 가리킨다.
- validate_class 의 bootstrap_method_indices_resolve(풀과 클래스 속성을 둘 다 쥔 유일한 자리)
- 새 에러 타입 0(기존 ClassFileError::InvalidFormat 에 접었다)
- 픽스처 +1 LdcDynamicBSMIndexPastEnd(1항목 표에 인덱스 1)
- 진단 전환: UnsupportedOperationException -> ClassFormatError(의도된 거부 확대)
@Jun025
Jun025 merged commit d9f45eb into main Sep 16, 2026
10 checks passed
@Jun025
Jun025 deleted the feat/rustjava-bound-bsm-attr-index branch September 16, 2026 07:28
Jun025 pushed a commit that referenced this pull request Sep 16, 2026
…/main — 형제 #47 착지분과의 충돌 2파일 합집합 해소

충돌은 REPORT.md·STATE.md 의 «맨 위 새 항목» 두 건뿐이고(측정 2026-09-16T09:03:56Z),
코드 파일 tests/test_class_format.rs 는 자동 병합됐다 — 양방향 hunk 동일성으로 확인.
해소는 전건 보존·합집합·시간순(eb8b4eb 16:20 > 3b3667d 14:45).
Jun025 pushed a commit that referenced this pull request Sep 16, 2026
…gin/main — 형제 #47·#49 착지분과의 충돌 2파일 시간순 합집합 해소

충돌은 REPORT.md·STATE.md 의 «맨 위 새 항목»뿐이고(측정 2026-09-16T10:12:58Z),
main 쪽이 이미 두 항목(#49 16:20 · #47 14:45)을 갖고 있어 이 회차(15:46)를 그 «사이»에 끼웠다.
코드 파일 tests/test_class_format.rs 는 자동 병합 — 양측 델타 보존을 줄 단위로 확인했다.
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