From 5024596a5de287ee283042dfbd1921b4f605b0b3 Mon Sep 17 00:00:00 2001 From: Aprup Kale Date: Sun, 6 Apr 2025 17:27:11 +0800 Subject: [PATCH 1/5] Modify JavaHelper.ts to read, compile and run multiple class files. --- src/commons/utils/JavaHelper.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/commons/utils/JavaHelper.ts b/src/commons/utils/JavaHelper.ts index fbb7199135..bd23d23269 100644 --- a/src/commons/utils/JavaHelper.ts +++ b/src/commons/utils/JavaHelper.ts @@ -18,7 +18,7 @@ export async function javaRun( isUsingCse: boolean, options?: { uploadIsActive?: boolean; uploads?: UploadResult } ) { - let compiled = {}; + let compiled: {[key: string]: string} = {}; const stderr = (type: 'TypeCheck' | 'Compile' | 'Runtime', msg: string) => { context.errors.push({ @@ -110,10 +110,12 @@ export async function javaRun( } try { - const classFile = compileFromSource(javaCode); - compiled = { - 'Main.class': Buffer.from(new BinaryWriter().generateBinary(classFile)).toString('base64') - }; + const binaryWriter = new BinaryWriter(); + const classes = compileFromSource(javaCode); + classes.forEach(c => { + compiled[c.className + '.class'] + = Buffer.from(binaryWriter.generateBinary(c.classFile)).toString('base64'); + }); } catch (e) { stderr('Compile', e); return Promise.resolve({ status: 'error' }); From b9d33a2bec3096468b5c69705d95601a18b998a2 Mon Sep 17 00:00:00 2001 From: Aprup Kale Date: Mon, 7 Apr 2025 12:25:06 +0800 Subject: [PATCH 2/5] Modify JavaHelper.ts and cseMachine/java/components/Control.tsx to be able to run conditional expressions on the CSEC machine --- src/commons/utils/JavaHelper.ts | 1 + src/features/cseMachine/java/components/Control.tsx | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/commons/utils/JavaHelper.ts b/src/commons/utils/JavaHelper.ts index bd23d23269..fe21d358ce 100644 --- a/src/commons/utils/JavaHelper.ts +++ b/src/commons/utils/JavaHelper.ts @@ -112,6 +112,7 @@ export async function javaRun( try { const binaryWriter = new BinaryWriter(); const classes = compileFromSource(javaCode); + console.debug(classes) classes.forEach(c => { compiled[c.className + '.class'] = Buffer.from(binaryWriter.generateBinary(c.classFile)).toString('base64'); diff --git a/src/features/cseMachine/java/components/Control.tsx b/src/features/cseMachine/java/components/Control.tsx index dcce409585..ac0c8e3420 100644 --- a/src/features/cseMachine/java/components/Control.tsx +++ b/src/features/cseMachine/java/components/Control.tsx @@ -128,6 +128,8 @@ export class Control extends Visible { return `res ${resInstr.name}`; case ECE.InstrType.DEREF: return 'deref'; + case ECE.InstrType.COND: + return `cond`; default: return 'INSTRUCTION'; } @@ -188,6 +190,8 @@ export class Control extends Visible { return `Resolve field ${resInstr.name} of most recently pushed value from stash`; case ECE.InstrType.DEREF: return 'Dereference most recently pushed value from stash'; + case ECE.InstrType.COND: + return 'Evaluate condition and push either consequent or alternative to stash'; default: return 'INSTRUCTION'; } From 2bd211ca6cc720fe0dc86195e1e3e3df7c702ce5 Mon Sep 17 00:00:00 2001 From: Aprup Kale Date: Mon, 7 Apr 2025 17:18:00 +0800 Subject: [PATCH 3/5] Modify JavaHelper.ts and cseMachine/java/components/Control.tsx to be able to run switch statements on the CSEC machine --- src/features/cseMachine/java/components/Control.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/features/cseMachine/java/components/Control.tsx b/src/features/cseMachine/java/components/Control.tsx index ac0c8e3420..6ef4363b6e 100644 --- a/src/features/cseMachine/java/components/Control.tsx +++ b/src/features/cseMachine/java/components/Control.tsx @@ -130,6 +130,8 @@ export class Control extends Visible { return 'deref'; case ECE.InstrType.COND: return `cond`; + case ECE.InstrType.SWITCH: + return `switch`; default: return 'INSTRUCTION'; } @@ -192,6 +194,9 @@ export class Control extends Visible { return 'Dereference most recently pushed value from stash'; case ECE.InstrType.COND: return 'Evaluate condition and push either consequent or alternative to stash'; + case ECE.InstrType.SWITCH: + const switchInstr = controlItem as ECE.SwitchInstr; + return `Switch on ${astToString(switchInstr.expr)} and push result of case to stash`; default: return 'INSTRUCTION'; } From 399eebeb16de9c89a4720a7ce56084d3311e4d21 Mon Sep 17 00:00:00 2001 From: AprupKale Date: Tue, 8 Apr 2025 10:58:55 +0800 Subject: [PATCH 4/5] Change the cond instruction to branch instruction --- src/features/cseMachine/java/components/Control.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/cseMachine/java/components/Control.tsx b/src/features/cseMachine/java/components/Control.tsx index 6ef4363b6e..24958d52a2 100644 --- a/src/features/cseMachine/java/components/Control.tsx +++ b/src/features/cseMachine/java/components/Control.tsx @@ -128,8 +128,8 @@ export class Control extends Visible { return `res ${resInstr.name}`; case ECE.InstrType.DEREF: return 'deref'; - case ECE.InstrType.COND: - return `cond`; + case ECE.InstrType.BRANCH: + return `branch`; case ECE.InstrType.SWITCH: return `switch`; default: @@ -192,7 +192,7 @@ export class Control extends Visible { return `Resolve field ${resInstr.name} of most recently pushed value from stash`; case ECE.InstrType.DEREF: return 'Dereference most recently pushed value from stash'; - case ECE.InstrType.COND: + case ECE.InstrType.BRANCH: return 'Evaluate condition and push either consequent or alternative to stash'; case ECE.InstrType.SWITCH: const switchInstr = controlItem as ECE.SwitchInstr; From 9d51e95abc28fe7c369e3952b2a7a4131a5824f6 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:22:36 +0800 Subject: [PATCH 5/5] chore: Reformat --- src/commons/utils/JavaHelper.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/commons/utils/JavaHelper.ts b/src/commons/utils/JavaHelper.ts index fe21d358ce..47abee2b7f 100644 --- a/src/commons/utils/JavaHelper.ts +++ b/src/commons/utils/JavaHelper.ts @@ -18,7 +18,7 @@ export async function javaRun( isUsingCse: boolean, options?: { uploadIsActive?: boolean; uploads?: UploadResult } ) { - let compiled: {[key: string]: string} = {}; + let compiled: { [key: string]: string } = {}; const stderr = (type: 'TypeCheck' | 'Compile' | 'Runtime', msg: string) => { context.errors.push({ @@ -112,10 +112,11 @@ export async function javaRun( try { const binaryWriter = new BinaryWriter(); const classes = compileFromSource(javaCode); - console.debug(classes) + console.debug(classes); classes.forEach(c => { - compiled[c.className + '.class'] - = Buffer.from(binaryWriter.generateBinary(c.classFile)).toString('base64'); + compiled[c.className + '.class'] = Buffer.from( + binaryWriter.generateBinary(c.classFile) + ).toString('base64'); }); } catch (e) { stderr('Compile', e);