Commit 8d96f3f
jun0
[rustjava-adopt-link-stringconcatfactory-p2-fix] fix(jvm-bytecode): 포획 «순서»를 값으로 잠그고 적재 시점 호스트 abort 를 없앤다
게이트② 반려 2건(F1·F2)을 받는다. 둘 다 검수자 실측이 옳았다.
F1 — 포획 순서가 전 스위트에 무관측이었다. 픽스처 전건이 포획 1개 이하라
`LambdaBody::call` 의 읽기 순서를 뒤집어도 576 green 이었다(검수자 RM4). 조용히 틀린 답이다.
⇒ LambdaKinds 에 포획 2개 람다 «둘»을 넣었다: (String,int) 는 a:7 로 순서가 «글자»에 보이고,
(int,int) 는 120 으로 «값»에만 보인다 — 후자는 어떤 타입 검사로도 못 잡는 축이다.
개악 대조: RM4 → a:7→7:a · 120→2001 로 red.
F2 — 적재 시점 «호스트 프로세스 abort»(jvm/src/type.rs:74 "Invalid type"). 게스트 예외가 아니다.
★고친 자리를 «골랐고 왜인지 적는다»: 검수자 제안(lambda.rs 2줄)만 하면 진단이
UnsupportedOperationException 이 되는데, ★OpenJDK 26 은 같은 파일을 ClassFormatError 로 거부한다
(Method "run" ... has illegal signature "I"). 즉 그 파일은 «미지원»이 아니라 «파손»이다.
근인은 JVMS 4.4.10 의 규칙이 «사용 지점»에 있다는 것이다 — NameAndType 자체는 필드/메서드
서술자 «둘 다» 적법해야 하고(Fieldref·Methodref 가 같은 항목을 쓴다), 어느 쪽인지는 그것을
«참조하는 태그»가 정한다. ⇒ validation.rs 의 일반 NameAndType 팔은 그대로 두고,
InvokeDynamic=메서드 서술자 · Dynamic=필드 서술자를 «그 팔에서» 요구한다.
비용을 먼저 쟀다: 커밋된 클래스 175개 · indy/condy 참조 44건 중 새로 위법이 되는 것은
이 회차가 만든 픽스처 «1건»뿐이다.
lambda.rs 의 try_parse 도 함께 넣었다 — 검증이 이미 막지만, 틀렸을 때의 대가가 게스트 예외가
아니라 «프로세스 죽음»이라 두 겹으로 둔다(verifier.rs 가 ldc 에 대해 쓴 그 문장).
덤으로 origin/main 의 선행 입구(string concat 의 extract_invoke_params 경로)도 같은 규칙에
막힌다 — 검수자가 「별 티켓 권장」이라 한 자리다. 넓힌 것이 아니라 규칙을 옳은 자리에 둔 결과다.1 parent e53b214 commit 8d96f3f
13 files changed
Lines changed: 117 additions & 7 deletions
File tree
- classfile/src
- jvm-bytecode/src
- test-data
- indy
- src/indy
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
231 | 231 | | |
232 | 232 | | |
233 | 233 | | |
234 | | - | |
235 | | - | |
236 | | - | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
237 | 257 | | |
238 | 258 | | |
239 | 259 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
106 | | - | |
107 | | - | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
108 | 116 | | |
109 | 117 | | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
110 | 122 | | |
111 | 123 | | |
112 | 124 | | |
| |||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
0 commit comments