From 4ce1f2187c79f92efda63095dc9b7bcf2c5b21be Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Sun, 11 Aug 2024 20:05:41 +0100 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20initialize=20arguments=20on=20f?= =?UTF-8?q?rame=20creation,=20only=20the=20stack=20and=20locals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Though, need to make sure I initialize the bootstrap frame arguments. Otherwise, we may run into uninitialized memory. Signed-off-by: Stefan Marr --- src/vm/Universe.cpp | 8 +++++++- src/vmobjects/VMFrame.h | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/vm/Universe.cpp b/src/vm/Universe.cpp index 0a16c583..e88c350b 100644 --- a/src/vm/Universe.cpp +++ b/src/vm/Universe.cpp @@ -302,6 +302,11 @@ vm_oop_t Universe::interpretMethod(VMObject* receiver, VMInvokable* initialize, VMMethod* bootstrapMethod = createBootstrapMethod(load_ptr(systemClass), 2); VMFrame* bootstrapFrame = Interpreter::PushNewFrame(bootstrapMethod); + for (size_t argIdx = 0; argIdx < bootstrapMethod->GetNumberOfArguments(); + argIdx += 1) { + bootstrapFrame->SetArgument((long)argIdx, (long)0, load_ptr(nilObject)); + } + bootstrapFrame->Push(receiver); if (argumentsArray != nullptr) { @@ -720,7 +725,8 @@ VMFrame* Universe::NewFrame(VMFrame* previousFrame, VMMethod* method) { method->GetMaximumNumberOfStackElements(); size_t additionalBytes = length * sizeof(VMObject*); - result = new (GetHeap(), additionalBytes) VMFrame(additionalBytes, method, previousFrame); + result = new (GetHeap(), additionalBytes) + VMFrame(additionalBytes, method, previousFrame); LOG_ALLOCATION("VMFrame", result->GetObjectSize()); return result; diff --git a/src/vmobjects/VMFrame.h b/src/vmobjects/VMFrame.h index 0a0e92b0..a6e853d9 100644 --- a/src/vmobjects/VMFrame.h +++ b/src/vmobjects/VMFrame.h @@ -54,8 +54,8 @@ class VMFrame : public VMObject { // --> until end of Frame gc_oop_t* end = (gc_oop_t*)SHIFTED_PTR(this, totalObjectSize); size_t i = 0; - while (arguments + i < end) { - arguments[i] = nilObject; + while (locals + i < end) { + locals[i] = nilObject; i++; } }