Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions AGENTS.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,3 +83,6 @@ print('open cards:',p-a)"
- Keep `java_runtime/tests/classes` limited to Java standard library class and API behavior.
- Test JVM and interpreter semantics, including class initialization, bytecode execution, and monitor behavior, with compiled Java fixtures under `test_data/src` and expected output under `test_data`, executed by `tests/test_class.rs`.
- Do not place JVM core behavior tests in the `java_runtime` standard library test tree.

## Compatibility Sources
- Implement Java compatibility from public specifications, Javadocs, and observable behavior tests. Do not consult or reproduce OpenJDK or other Java runtime implementation source code; keep the implementation independent to avoid licensing and provenance concerns.
39 changes: 17 additions & 22 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion README.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
# RustJava

Embeddable jvm and java runtime implementation, targetting running on webassembly, java 1.2
Embeddable jvm and java runtime implementation, targetting running on webassembly
29 changes: 29 additions & 0 deletions REPORT.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
# REPORT

## [2026-09-04] upstream 동기 S6 — 컷 `95ebc5c` 머지 (rustjava-upstream-sync-s6-cut-95ebc5c)
- 무엇을: upstream `95ebc5c`(**11커밋** · 142파일 +17,593/−483)을 `--merge` 로 흡수하고 충돌 **1건**을 해소했다.
★**`merge-base origin/main upstream/main` `c4665b0` → `95ebc5c`** · behind **24 → 13** · 머지커밋 **부모 2개**.
- 왜: 운영자 채택 제안 `2026-09-04-upstream-sync-s5#p0`. ★**「새 충돌 0」을 «전제»로 쓰지 않고 다시 쟀다.**
★★**그 0 은 «델타»였다 — 「풀 것이 없다」가 아니다.** 옛 base `8c1238b` 에서 누적 3 → 3(새로 나타난 파일 0)이고,
새 base `a0b5d3c`(merge-base `c4665b0`)에서 **누적 1**이다. 둘 다 참이다.
`string.rs` 는 S5 의 설계 판단으로 우리 분기(**+8/−28**)가 남아 upstream 이 그 파일을 만지는 한
(이 구간 **+402/−121**) 계속 열린다. ⇒ ★**§5 에 한 줄 보탰다: base 와 «함께» «델타/누적»도 밝혀라.**
- 사용자 영향: **`java.util.regex`(Pattern·Matcher)·`Formatter`·`Locale`** 이 들어온다 —
`String.format`·정규식 API 가 처음으로 동작한다. ★**우리 자산 변경 0**(charset 4종 · `setProperty` 서술자 ·
수동 span · `ClassFormatError` 분류 · 픽스처 전건 생존).
- 검증: stable 4종 rc=0 · ★**beta 2종 rc=0**(S5 가 물린 자리를 미리 확인) ·
`cargo test --all` ★**554 passed / 0 failed / 1 ignored**(S5 427 → **+127** · 새 red 0) · beta 도 **554 동수** ·
「해소분 0」 = **`95ebc5c` 대비 삭제 파일 0** · 다른 파일 **50건 전수가 우리 fork 고유 자산**.
- ★**해소**: `string.rs` 충돌면은 **import 한 곳**뿐이라 **합집합**으로 풀었다 —
우리 `charset::Charset` + upstream 의 재구조화 `classes::java::{lang, util::{Formatter, Locale, regex}}`.
`Charset` 라우팅 **4곳 생존** · ★**S5 가 버린 `decode_str`/`encode_str` 재유입 0**.
- ★★**계약4⒝ 정독이 「충돌 0으로 들어온」 파손 1건을 «테스트를 돌리기 전에» 잡았다 — 이 형태 «세 번째»다.**
upstream 이 이 구간에 **새로** 넣은 `java/util/regex/test_pattern_syntax_exception.rs` 가
`System.setProperty` 를 `)Ljava/lang/Object;` 로 **3곳** 부른다(우리는 PR #5 에서 JDK 규격대로 `String`).
★**신규 파일이라 충돌이 «날 수가 없다»** — `merge-tree` 가 원리적으로 못 보는 자리다.
서술자만 맞췄다(S5 가 5곳에 적용한 확립된 처분). ★**전례: S3 3건 → S5 5곳 → S6 3곳.**
- ★**`Cargo.lock`**: S5 를 문 자리를 먼저 봤다 — ★**내려간 크레이트 0건**(`async-trait` **0.1.92 유지**) ·
올라간 3 · 추가 `regex` · 제거 2.
- 후속 추천: ⑴**게이트③은 반드시 `--merge`**(`merge_strategy: merge` 필수 — 등재 repo).
⑵**S7**(컷 `ba5797b` · `95ebc5c..ba5797b` **1커밋**) — 같은 base 에서 누적 **2건**(`string.rs`·`thread.rs`)이나
★**S6 착지로 base 가 또 바뀌므로 착수 시 다시 재라.**
⑶★**「충돌 목록에 없는 파손」 축을 계약에 넣을지 판정하라 — 이제 3회째다**(S5 워크로그 `proposals[1]`).

## [2026-09-04] upstream 동기 S5 — 컷 `c4665b0` 머지 (rustjava-upstream-sync-s5-with-remeasured-conflicts)
- 무엇을: upstream `c4665b0`(#190 Java 1.2 runtime API 확장) 까지 **6커밋**(171파일 +33,138/−1,058)을 머지했다.
재측정된 충돌 **3** 해소 — `Cargo.lock` **재생성** · `string.rs` ★**설계 판단** · `test_timer.rs` **upstream 채택**.
Expand Down
17 changes: 17 additions & 0 deletions STATE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,23 @@
(25번째 run, 앞선 24건 전부 red). **PR 대기 — 게이트③ 미착지.**

## 완료
- [rustjava-upstream-sync-s6-cut-95ebc5c] ★**upstream 컷 `95ebc5c`(regex·Formatter·Locale · 11커밋) 머지 —
충돌 1 해소.** ★**`merge-base` `c4665b0` → `95ebc5c` · behind 24 → 13 · 머지커밋 부모 2개**(계보 보존).
`cargo test --all` **554 passed / 0 failed / 1 ignored**(S5 427 → **+127**) · stable 4종 + ★**beta 2종** rc=0.
★★**「S6 새 충돌 0」 예측은 «델타»였다 — 「풀 것이 없다」가 아니다.** 그 0 은 옛 base `8c1238b` 에서 잰
«새로 나타난 파일 수»(누적 3 → 3)이고, 착수 재측정은 새 base `a0b5d3c`(merge-base `c4665b0`)에서 ★**누적 1**이다.
`string.rs` 는 S5 의 설계 판단으로 우리 분기(**+8/−28**)가 남아 upstream 이 만질 때마다(**+402/−121**) 계속 열린다.
⇒ ★**§5 에 한 줄 보탰다: base 와 «함께» «델타인가 누적인가»도 밝혀라.**
해소 = import 블록 **합집합**(우리 `charset::Charset` + upstream `Formatter`·`Locale`·`regex`) ·
`Charset` 라우팅 4곳 생존 · `decode_str`/`encode_str` 재유입 **0**.
★★**계약4⒝ 정독이 «충돌 0으로 들어온» 파손 1건을 «테스트 전에» 잡았다 — 이 형태 «세 번째»**:
upstream 신규 파일 `java/util/regex/test_pattern_syntax_exception.rs` 가 `System.setProperty` 를
`)Ljava/lang/Object;` 로 **3곳** 부른다 ⇒ 서술자만 `String` 으로(S5 의 확립된 처분과 동일).
★**전례 S3 3건 → S5 5곳 → S6 3곳** — 매 회차 «새 파일»로 재유입된다.
★게이트③ 완료: PR #22 — ★★**`--merge` 착지**(★`--squash` 아님 · 등재 repo). 머지커밋 sha 는 회신 `merged:` 참조.
★**착지로 base 가 또 바뀌었다 ⇒ §5 의 「S7 새 충돌 1(`thread.rs`)」은 «다시 재야 한다»**(base·델타/누적 병기).
★**남은 구멍(검수자 지적)**: §5 «상시 규칙» 절의 정본 서식(`:268`)은 아직 `<수>(base · merge-base)` 뿐이고,
«델타/누적» 축은 S6 착지 기록(`:444`) 안에만 있다 — ★**다음 §5 갱신 회차가 정본 서식에 한 줄 올려야 한다.**
- [rustjava-upstream-sync-s5-with-remeasured-conflicts] ★**upstream 컷 `c4665b0`(#190 Java 1.2 API 확장) 머지 —
충돌 3 해소.** ★**`merge-base` `3296139c` → `c4665b0` · behind 30 → 24 · 머지커밋 부모 2개**(계보 보존).
`cargo test --all` **427 passed / 0 failed / 1 ignored**(S4 261 → **+166**) · green 4종 rc=0.
Expand Down
44 changes: 44 additions & 0 deletions docs/upstream-sync-approach.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -426,6 +426,50 @@ upstream 신규 io 테스트 **3파일 5곳**이 `System.setProperty` 를 **`)Lj
> ★**개명 충돌은 내용 충돌보다 위험하다** — 3-way 가 rename 을 놓치면 우리 픽스처가 «삭제 대 수정»으로 나타나 **조용히 사라질 수 있다.**
> ⇒ S8 은 「물량」이 아니라 **별도 판정 회차**로 잡아라(발권 전 `--find-renames` 로 대응관계를 먼저 고정).

### ★★[2026-09-04] S6 착지 기록 — ★**「새 충돌 0」은 «델타»였다. 「풀 것이 없다」가 아니다**

**착수 시 재측정**(★§5 상시 규칙 · base 병기): base = `origin/main` **`a0b5d3c`** · `merge-base` **`c4665b0`**
⇒ 컷 `95ebc5c` 충돌 ★**1건** — `java_runtime/src/classes/java/lang/string.rs`.

★★**예측(0)과 어긋난 것이 «아니다» — 축이 다르다. 이 구별을 여기 못박는다**:

| 무엇을 잰 수인가 | base | 값 |
|---|---|---|
| 2026-09-03 재측정의 「S6 새 충돌 **0**」 = ★**델타**(새로 «나타난» 파일 수) | `8c1238b`(merge-base `3296139c`) | 누적 `c4665b0` **3** → `95ebc5c` **3** ⇒ 델타 **0** |
| 이번 착수 재측정 = ★**누적**(그 base 에서 실제로 열리는 파일 수) | `a0b5d3c`(merge-base `c4665b0`) | ★**1** |

⇒ ★★**둘 다 참이다.** `string.rs` 는 S5 에서 «이미» 충돌 집합에 있었으므로 S6 에서 «새로» 나타나지 않았고(델타 0),
S5 착지로 base 가 옮겨간 뒤에도 **우리 쪽 분기가 남아 있어**(`c4665b0`→`origin/main` **+8/−28** = S5 의 설계 판단 산물)
upstream 이 그 파일을 만지는 한(이 구간 **+402/−121**) **계속 열린다**.
★★**§5 상시 규칙에 한 줄 보탠다 — 충돌 수를 적을 때는 base 와 «함께» ★«델타인가 누적인가»도 밝혀라.**
base 만 병기하면 「0」이 「풀 것이 없다」로 읽힌다 — 이번이 정확히 그 형태였다.

**해소 — `string.rs` import 블록 «합집합»**(충돌면은 import 한 곳뿐):
우리 `charset::Charset` **유지** + upstream 의 재구조화 `classes::java::{lang::{Object, System},
util::{Formatter, Locale, regex::{Matcher, Pattern}}}` **채택**.
검증: `Charset::from_name`·`Charset::resolve` 호출부 **4곳 생존** · ★**S5 가 버린 `decode_str`/`encode_str` 재유입 0**.

★★**계약4⒝ 정독이 「충돌 0으로 들어온」 파손 1건을 «테스트를 돌리기 전에» 잡았다 — 이 형태는 이번이 «세 번째»다.**
upstream 이 이 구간에 **새로** 넣은 `java_runtime/tests/classes/java/util/regex/test_pattern_syntax_exception.rs` 가
`System.setProperty` 를 **`)Ljava/lang/Object;`** 로 **3곳** 부른다(우리는 PR #5 에서 JDK 규격대로 `String`).
★**신규 파일이라 충돌이 «날 수가 없다»** — `merge-tree` 가 원리적으로 못 보는 자리다.
⇒ 서술자만 `String` 으로 맞췄다(S5 가 5곳에 적용한 **확립된 처분**과 같다 · `Properties.setProperty` 의 `Object` 는 JDK 규격상 옳아 **무접촉**).
★**전례**: S3 `tests/test_class_format.rs` 3건 → S5 io 테스트 5곳 → ★**S6 regex 테스트 3곳.**
⇒ ★**「우리가 JDK 규격에 맞춘 것 ↔ upstream 이 안 맞춘 것」이 매 회차 새 파일로 재유입된다.**

**계약4⒞ `Cargo.lock` — S5 를 문 자리를 먼저 봤다**: ★**내려간 크레이트 0건**(`async-trait` **0.1.92 유지** ·
upstream `95ebc5c` 의 lock 도 이미 0.1.92) · 올라간 3(`event-listener` 5.4.1→5.4.2 · `regex-automata` 0.4.14→0.4.16 ·
`regex-syntax` 0.8.10→0.8.11) · 추가 `regex` · 제거 `concurrent-queue`·`crossbeam-utils`.

**착지 실측**: `merge-base origin/main upstream/main` ★**`c4665b0` → `95ebc5c`** · behind **24 → 13** ·
머지커밋 **부모 2개**(`a0b5d3c` + `95ebc5c`) · `95ebc5c` 대비 **삭제 파일 0** ·
`cargo test --all` ★**554 passed / 0 failed / 1 ignored**(S5 427 → **+127**) · stable 4종 + ★**beta 2종 전건 rc=0** ·
`git grep 'tracing::instrument'` 실사용 **0**(주석 1) · `charset.rs` 실재 · 픽스처 4파일 · `test_class_format.rs` **4/4**.

★**S7 참고(이 회차는 «안 했다»)**: 같은 base 에서 `ba5797b` 누적 충돌 = **2건**(`string.rs` · `thread.rs`) ·
구간 `95ebc5c..ba5797b` **1커밋**. ★**그 수도 S6 착지로 base 가 또 바뀌므로 S7 착수 시 다시 재라.**


★**S1~S3 이 이 동기화의 «전부»다** — 세 회차가 판단을 다 쓰고, 각각 **한 축씩만** 다룬다.
검수자가 한 회차에서 읽어야 하는 것은 **우리 해소분**이지 upstream 원본 diff 가 아니다:

Expand Down
Loading