Skip to content

Commit 1273486

Browse files
committed
VM (new pixeltower): inline execution loop
1 parent 6e9cbc3 commit 1273486

5 files changed

Lines changed: 31 additions & 27 deletions

File tree

include/openminecraft/vm/pixeltower/v0/om_pixeltower_interpreter.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ class OMInterpreter
2020
private:
2121
void callDynamic(OMMethod *met);
2222
void popLastFrame();
23+
void loop() {
24+
jint result = 0;
25+
while (!result)
26+
{
27+
result = execute();
28+
}
29+
30+
if (result == 2)
31+
{
32+
return;
33+
}
34+
else
35+
{
36+
logger.error("function exited with code {}", result);
37+
throw result;
38+
}
39+
}
2340

2441
log::OMLogger logger;
2542
OMPixelTower *tower;

include/openminecraft/vm/pixeltower/v1/om_pixeltower_debugger.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ class OMDebugger
6666
}
6767

6868
logger.debug("{}: {} {}", currentData,
69-
fmt::styled(fmt::format("{:#018x}", (size_t)*static_cast<void **>(currentData)), style), desc);
69+
fmt::styled(fmt::format(sizeof(void *) == 8 ? "{:#018x}" : "{:#010x}",
70+
(size_t)*static_cast<void **>(currentData)),
71+
style),
72+
desc);
7073

7174
currentData = (uint8_t *)currentData + sizeof(void *);
7275
if (currentData == v0::currentThread.stack)

src/vm/pixeltower/v0/om_pixeltower.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,6 @@ void OMPixelTower::boot(OMMethod *method)
3636

3737
void OMPixelTower::mainLoop()
3838
{
39-
jint result = 0;
40-
while (!result)
41-
{
42-
result = interpreter->execute();
43-
}
4439
}
4540

4641
void OMPixelTower::init(std::string basePath)
@@ -100,4 +95,4 @@ void OMPixelTower::destroyCurrentThread()
10095
mem::allocator::tracedFreeVMData(currentThread.stackEnd);
10196
}
10297
}
103-
} // namespace openminecraft::vm::pixeltower::v0
98+
} // namespace openminecraft::vm::pixeltower::v0

src/vm/pixeltower/v0/om_pixeltower_interpreter.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ void OMInterpreter::call(OMMethod *met)
4848
{
4949
*localAccess<void *>(i) = nullptr;
5050
}
51+
loop();
5152
return;
5253
}
5354

@@ -79,6 +80,8 @@ void OMInterpreter::call(OMMethod *met)
7980
currentThread.currentFrame = nextframe;
8081
stackPush();
8182
currentThread.pc = met->code;
83+
84+
loop();
8285
}
8386

8487
void OMInterpreter::callDynamic(OMMethod *met)
@@ -100,6 +103,7 @@ void OMInterpreter::callDynamic(OMMethod *met)
100103
stackPop();
101104
}
102105

106+
// dynamic linking!
103107
OMMethod *codetarget = met;
104108
auto cls = static_cast<OMOOPDesc *>(args[0])->klass;
105109
while (cls != nullptr)
@@ -134,7 +138,8 @@ void OMInterpreter::callDynamic(OMMethod *met)
134138
currentThread.stackPointer = (jbyte *)nextframe - nextframe->method->maxLocals * sizeof(void *);
135139
currentThread.currentFrame = nextframe;
136140
stackPush();
137-
currentThread.pc = codetarget->code;
141+
currentThread.pc = nextframe->method->code;
142+
loop();
138143
}
139144

140145
void OMInterpreter::popLastFrame()
@@ -294,18 +299,17 @@ jint OMInterpreter::execute()
294299
auto ret = stackTopAccess<jint>();
295300
popLastFrame();
296301
stackPushAccess<jint>(ret);
297-
return 0;
302+
return 2;
298303
}
299304
case op_lreturn: {
300305
auto ret = stackTopAccessW<jlong>();
301306
popLastFrame();
302307
stackPushAccessW<jlong>(ret);
303-
return 0;
308+
return 2;
304309
}
305310
case op_return: {
306-
bool isClinit = strcmp("<clinit>", currentThread.currentFrame->method->name) == 0;
307311
popLastFrame();
308-
return isClinit ? 2 : 0;
312+
return 2;
309313
}
310314
case op_putstatic: {
311315
auto n = *static_cast<OMField **>(static_cast<void *>(

src/vm/pixeltower/v0/om_pixeltower_klassloader.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -340,21 +340,6 @@ void OMKlassLoader::classInit(OMKlass *klass)
340340
logger.info("clinit found for {}, executing", klass->name);
341341

342342
interpreter->call(me);
343-
jint result = 0;
344-
while (!result)
345-
{
346-
result = interpreter->execute();
347-
}
348-
349-
if (result == 2) // clinit finish
350-
{
351-
break;
352-
}
353-
else
354-
{
355-
throw err::OMValidationError{
356-
err::ClassLoader, fmt::format("class clinit executing failed with code {}", result), klass->name};
357-
}
358343
}
359344
me = me->next;
360345
}

0 commit comments

Comments
 (0)