Skip to content

Commit 34bdd58

Browse files
committed
Refactor reading two bytes from the instruction stream into a inline function
1 parent eb24caf commit 34bdd58

File tree

2 files changed

+26
-50
lines changed

2 files changed

+26
-50
lines changed

bin/main

-792 Bytes
Binary file not shown.

src/runtime.c

Lines changed: 26 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ Object *Object_create(Class *class) {
169169
return obj;
170170
}
171171

172+
intern inline i16 read_immediate_i16(Frame *f) {
173+
u8 branchbyte1 = *(f->pc++);
174+
u8 branchbyte2 = *(f->pc++);
175+
return (i16)((branchbyte1 << 8) | branchbyte2);
176+
}
177+
172178
void execute(ClassLoader class_loader, Method *method) {
173179
assert(method);
174180

@@ -227,60 +233,49 @@ void execute(ClassLoader class_loader, Method *method) {
227233
// TODO: Macro ifCOND(op) ...
228234
case ifeq:
229235
{
230-
u8 branchbyte1 = *(f.pc++);
231-
u8 branchbyte2 = *(f.pc++);
236+
int offset = read_immediate_i16(&f);
232237

233238
f.sp -= 1;
234239
u32 value = *f.sp;
235240

236241
if (value == 0) { // Branch succeeds
237-
int offset = (i16)((branchbyte1 << 8) | branchbyte2);
238242
f.pc += offset - 3;
239243
}
240244
} break;
241245
case ifne:
242246
{
243-
u8 branchbyte1 = *(f.pc++);
244-
u8 branchbyte2 = *(f.pc++);
245-
246-
f.sp -= 1;
247-
u32 value = *f.sp;
247+
int offset = read_immediate_i16(&f);
248+
u32 value = f_pop(&f);
248249

249250
if (value != 0) { // Branch succeeds
250-
int offset = (i16)((branchbyte1 << 8) | branchbyte2);
251251
f.pc += offset - 3;
252252
}
253253
} break;
254254
case if_icmpgt:
255255
{
256-
u8 branchbyte1 = *(f.pc++);
257-
u8 branchbyte2 = *(f.pc++);
256+
int offset = read_immediate_i16(&f);
258257

259-
f.sp -= 1; u32 value2 = *f.sp;
260-
f.sp -= 1; u32 value1 = *f.sp;
258+
u32 value2 = f_pop(&f);
259+
u32 value1 = f_pop(&f);
261260

262261
if (value1 > value2) { // Branch succeeds
263-
int offset = (i16) ((branchbyte1 << 8) | branchbyte2);
264262
f.pc += offset - 3;
265263
}
266264
} break;
267265
case if_icmpne:
268266
{
269-
u8 branchbyte1 = *(f.pc++);
270-
u8 branchbyte2 = *(f.pc++);
267+
int offset = read_immediate_i16(&f);
271268

272-
f.sp -= 1; u32 value2 = *f.sp;
273-
f.sp -= 1; u32 value1 = *f.sp;
269+
u32 value2 = f_pop(&f);
270+
u32 value1 = f_pop(&f);
274271

275272
if (value1 != value2) { // Branch succeeds
276-
int offset = (i16) ((branchbyte1 << 8) | branchbyte2);
277273
f.pc += offset - 3;
278274
}
279275
} break;
280276
case ireturn:
281277
{
282-
f.sp -= 1;
283-
u32 value = *f.sp;
278+
u32 value = f_pop(&f);
284279
printf("Returning int %d\n", value);
285280
if (sb_is_empty(frames)) {
286281
goto exit;
@@ -293,8 +288,7 @@ void execute(ClassLoader class_loader, Method *method) {
293288
sb_pop(frames);
294289

295290
// push the return value
296-
*f.sp = value;
297-
f.sp++;
291+
f_push(&f, value);
298292
} break;
299293
case return_void:
300294
{
@@ -312,9 +306,7 @@ void execute(ClassLoader class_loader, Method *method) {
312306
} break;
313307
case getstatic:
314308
{
315-
u8 indexbyte1 = *(f.pc++);
316-
u8 indexbyte2 = *(f.pc++);
317-
u16 index = (indexbyte1 << 8) | indexbyte2;
309+
u16 index = read_immediate_i16(&f);
318310

319311
cp_info field_name;
320312
Class *class = load_class_and_field_name_from_field_ref(
@@ -332,9 +324,7 @@ void execute(ClassLoader class_loader, Method *method) {
332324
} break;
333325
case putstatic:
334326
{
335-
u8 indexbyte1 = *(f.pc++);
336-
u8 indexbyte2 = *(f.pc++);
337-
u16 index = (indexbyte1 << 8) | indexbyte2;
327+
u16 index = read_immediate_i16(&f);
338328

339329
u32 value = f_pop(&f);
340330

@@ -379,9 +369,7 @@ void execute(ClassLoader class_loader, Method *method) {
379369
} break;
380370
case invokestatic:
381371
{
382-
u8 indexbyte1 = *(f.pc++);
383-
u8 indexbyte2 = *(f.pc++);
384-
u16 index = (indexbyte1 << 8) | indexbyte2;
372+
u16 index = read_immediate_i16(&f);
385373

386374
u16 name_and_type_index =
387375
method->constant_pool[index-1].as.methodref_info.name_and_type_index;
@@ -439,17 +427,13 @@ void execute(ClassLoader class_loader, Method *method) {
439427
} break;
440428
case goto_instr:
441429
{
442-
u8 branchbyte1 = *(f.pc++);
443-
u8 branchbyte2 = *(f.pc++);
430+
int offset = read_immediate_i16(&f);
444431

445-
int offset = (i16)((branchbyte1 << 8) | branchbyte2);
446432
f.pc += offset - 3;
447433
} break;
448434
case getfield:
449435
{
450-
u8 indexbyte1 = *(f.pc++);
451-
u8 indexbyte2 = *(f.pc++);
452-
u16 index = (indexbyte1 << 8) | indexbyte2;
436+
u16 index = read_immediate_i16(&f);
453437

454438
Object *this_ptr = (Object *)f_pop(&f);
455439

@@ -470,9 +454,7 @@ void execute(ClassLoader class_loader, Method *method) {
470454
} break;
471455
case putfield:
472456
{
473-
u8 indexbyte1 = *(f.pc++);
474-
u8 indexbyte2 = *(f.pc++);
475-
u16 index = (indexbyte1 << 8) | indexbyte2;
457+
u16 index = read_immediate_i16(&f);
476458

477459
u64 value = f_pop(&f);
478460
Object *this_ptr = (Object *)f_pop(&f);
@@ -498,9 +480,7 @@ void execute(ClassLoader class_loader, Method *method) {
498480
{
499481
// https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.invokevirtual
500482
// TODO: copied from invokespecial => refactor
501-
u8 indexbyte1 = *(f.pc++);
502-
u8 indexbyte2 = *(f.pc++);
503-
u16 index = (indexbyte1 << 8) | indexbyte2;
483+
u16 index = read_immediate_i16(&f);
504484

505485
Object *this_ptr = (Object *)f_pop(&f);
506486

@@ -542,9 +522,7 @@ void execute(ClassLoader class_loader, Method *method) {
542522
} break;
543523
case invokespecial:
544524
{
545-
u8 indexbyte1 = *(f.pc++);
546-
u8 indexbyte2 = *(f.pc++);
547-
u16 index = (indexbyte1 << 8) | indexbyte2;
525+
u16 index = read_immediate_i16(&f);
548526

549527
Object *this_ptr = (Object *)f_pop(&f);
550528

@@ -586,9 +564,7 @@ void execute(ClassLoader class_loader, Method *method) {
586564
} break;
587565
case new:
588566
{
589-
u8 indexbyte1 = *(f.pc++);
590-
u8 indexbyte2 = *(f.pc++);
591-
u16 index = (indexbyte1 << 8) | indexbyte2;
567+
u16 index = read_immediate_i16(&f);
592568

593569
Class *class = load_class_from_constant_pool(class_loader, method->constant_pool, index);
594570
Object *obj = Object_create(class);

0 commit comments

Comments
 (0)