Skip to content

Commit

Permalink
Remove all of the old primitive code, and use now the same approach a…
Browse files Browse the repository at this point in the history
…s for safe prims

Signed-off-by: Stefan Marr <[email protected]>
  • Loading branch information
smarr committed Aug 11, 2024
1 parent 64613d1 commit 8882e31
Show file tree
Hide file tree
Showing 15 changed files with 89 additions and 205 deletions.
2 changes: 0 additions & 2 deletions SOM.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,6 @@
3F52032A0FA6624C00E75857 /* PrimitiveContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrimitiveContainer.h; sourceTree = "<group>"; };
3F52032B0FA6624C00E75857 /* PrimitiveLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrimitiveLoader.cpp; sourceTree = "<group>"; };
3F52032C0FA6624C00E75857 /* PrimitiveLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrimitiveLoader.h; sourceTree = "<group>"; };
3F52032E0FA6624C00E75857 /* Routine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Routine.h; sourceTree = "<group>"; };
3F5203300FA6624C00E75857 /* Shell.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shell.cpp; sourceTree = "<group>"; };
3F5203310FA6624C00E75857 /* Shell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shell.h; sourceTree = "<group>"; };
3F5203320FA6624C00E75857 /* Universe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Universe.cpp; sourceTree = "<group>"; };
Expand Down Expand Up @@ -618,7 +617,6 @@
3F52032A0FA6624C00E75857 /* PrimitiveContainer.h */,
3F52032B0FA6624C00E75857 /* PrimitiveLoader.cpp */,
3F52032C0FA6624C00E75857 /* PrimitiveLoader.h */,
3F52032E0FA6624C00E75857 /* Routine.h */,
0A5A7E932C5DA9A90011C783 /* Primitives.h */,
);
path = primitivesCore;
Expand Down
6 changes: 2 additions & 4 deletions src/primitives/Method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <cstddef>

#include "../primitivesCore/PrimitiveContainer.h"
#include "../primitivesCore/Routine.h"
#include "../vmobjects/ObjectFormats.h"
#include "../vmobjects/VMArray.h"
#include "../vmobjects/VMClass.h" // NOLINT(misc-include-cleaner) it's required to make the types complete
Expand All @@ -21,7 +20,7 @@ static vm_oop_t mSignature(vm_oop_t rcvr) {
return self->GetSignature();
}

void _Method::InvokeOn_With_(VMFrame* frame) {
void mInvokeOnWith(VMFrame* frame) {
// REM: this is a clone with _Primitive::InvokeOn_With_
VMArray* args = static_cast<VMArray*>(frame->Pop());
vm_oop_t rcvr = static_cast<vm_oop_t>(frame->Pop());
Expand All @@ -40,6 +39,5 @@ void _Method::InvokeOn_With_(VMFrame* frame) {
_Method::_Method() : PrimitiveContainer() {
Add("signature", &mSignature, false);
Add("holder", &mHolder, false);
SetPrimitive("invokeOn:with:",
new Routine<_Method>(this, &_Method::InvokeOn_With_, false));
Add("invokeOn:with:", &mInvokeOnWith, false);
}
25 changes: 9 additions & 16 deletions src/primitives/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <cstdint>

#include "../primitivesCore/PrimitiveContainer.h"
#include "../primitivesCore/Routine.h"
#include "../vm/Globals.h"
#include "../vm/Universe.h" // NOLINT(misc-include-cleaner) it's required to make the types complete
#include "../vmobjects/ObjectFormats.h"
Expand Down Expand Up @@ -66,7 +65,7 @@ vm_oop_t objHalt(vm_oop_t) {
return load_ptr(falseObject);
}

void _Object::Perform(VMFrame* frame) {
void objPerform(VMFrame* frame) {
VMSymbol* selector = (VMSymbol*)frame->Pop();
vm_oop_t self = frame->GetStackElement(0);

Expand All @@ -76,7 +75,7 @@ void _Object::Perform(VMFrame* frame) {
invokable->Invoke(frame);
}

void _Object::PerformInSuperclass(VMFrame* frame) {
void objPerformInSuperclass(VMFrame* frame) {
VMClass* clazz = (VMClass*)frame->Pop();
VMSymbol* selector = (VMSymbol*)frame->Pop();

Expand All @@ -85,7 +84,7 @@ void _Object::PerformInSuperclass(VMFrame* frame) {
invokable->Invoke(frame);
}

void _Object::PerformWithArguments(VMFrame* frame) {
void objPerformWithArguments(VMFrame* frame) {
VMArray* args = (VMArray*)frame->Pop();
VMSymbol* selector = (VMSymbol*)frame->Pop();
vm_oop_t self = frame->GetStackElement(0);
Expand All @@ -102,7 +101,7 @@ void _Object::PerformWithArguments(VMFrame* frame) {
invokable->Invoke(frame);
}

void _Object::PerformWithArgumentsInSuperclass(VMFrame* frame) {
void objPerformWithArgumentsInSuperclass(VMFrame* frame) {
VMClass* clazz = (VMClass*)frame->Pop();
VMArray* args = (VMArray*)frame->Pop();
VMSymbol* selector = (VMSymbol*)frame->Pop();
Expand Down Expand Up @@ -146,17 +145,11 @@ _Object::_Object() : PrimitiveContainer() {
Add("inspect", &objInspect, false);
Add("halt", &objHalt, false);

SetPrimitive("perform:",
new Routine<_Object>(this, &_Object::Perform, false));
SetPrimitive(
"perform:withArguments:",
new Routine<_Object>(this, &_Object::PerformWithArguments, false));
SetPrimitive(
"perform:inSuperclass:",
new Routine<_Object>(this, &_Object::PerformInSuperclass, false));
SetPrimitive("perform:withArguments:inSuperclass:",
new Routine<_Object>(
this, &_Object::PerformWithArgumentsInSuperclass, false));
Add("perform:", &objPerform, false);
Add("perform:withArguments:", &objPerformWithArguments, false);
Add("perform:inSuperclass:", &objPerformInSuperclass, false);
Add("perform:withArguments:inSuperclass:",
&objPerformWithArgumentsInSuperclass, false);

Add("instVarAt:", &objInstVarAt, false);
Add("instVarAt:put:", &objInstVarAtPut, false);
Expand Down
7 changes: 2 additions & 5 deletions src/primitives/Primitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <cstddef>

#include "../primitivesCore/PrimitiveContainer.h"
#include "../primitivesCore/Routine.h"
#include "../vmobjects/ObjectFormats.h"
#include "../vmobjects/VMClass.h" // NOLINT(misc-include-cleaner) it's required to make the types complete
#include "../vmobjects/VMFrame.h"
Expand All @@ -19,7 +18,7 @@ static vm_oop_t pSignature(vm_oop_t rcvr) {
return self->GetSignature();
}

void _Primitive::InvokeOn_With_(VMFrame* frame) {
void pInvokeOnWith(VMFrame* frame) {
// REM: this is a clone with _Primitive::InvokeOn_With_
VMArray* args = static_cast<VMArray*>(frame->Pop());
vm_oop_t rcvr = static_cast<vm_oop_t>(frame->Pop());
Expand All @@ -38,7 +37,5 @@ void _Primitive::InvokeOn_With_(VMFrame* frame) {
_Primitive::_Primitive() : PrimitiveContainer() {
Add("signature", &pSignature, false);
Add("holder", &pHolder, false);
SetPrimitive(
"invokeOn:with:",
new Routine<_Primitive>(this, &_Primitive::InvokeOn_With_, false));
Add("invokeOn:with:", &pInvokeOnWith, false);
}
6 changes: 2 additions & 4 deletions src/primitives/System.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
#include "../memory/Heap.h"
#include "../misc/defs.h"
#include "../primitivesCore/PrimitiveContainer.h"
#include "../primitivesCore/Routine.h"
#include "../vm/Globals.h"
#include "../vm/Print.h"
#include "../vm/Universe.h"
Expand Down Expand Up @@ -167,7 +166,7 @@ static vm_oop_t sysLoadFile_(vm_oop_t, vm_oop_t rightObj) {
}
}

void _System::PrintStackTrace(VMFrame* frame) {
void printStackTrace(VMFrame* frame) {
frame->PrintStackTrace();
}

Expand All @@ -188,8 +187,7 @@ _System::_System(void) : PrimitiveContainer() {
Add("fullGC", &sysFullGC, false);

Add("loadFile:", &sysLoadFile_, false);
SetPrimitive("printStackTrace",
new Routine<_System>(this, &_System::PrintStackTrace, false));
Add("printStackTrace", &printStackTrace, false);
}

_System::~_System() {}
28 changes: 10 additions & 18 deletions src/primitivesCore/PrimitiveContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,18 @@
#include <string>

#include "../vm/Symbols.h"
#include "../vmobjects/PrimitiveRoutine.h"
#include "../vmobjects/VMClass.h"
#include "../vmobjects/VMPrimitive.h"
#include "../vmobjects/VMSafePrimitive.h"
#include "../vmobjects/VMSymbol.h"
#include "Primitives.h"

void PrimitiveContainer::SetPrimitive(const char* name,
PrimitiveRoutine* routine) {
methods[std::string(name)] = routine;
void PrimitiveContainer::Add(const char* name,
FramePrimitiveRoutine routine,
bool classSide) {
assert(framePrims.find(name) == framePrims.end());
framePrims[std::string(name)] = {routine, classSide};
}

void PrimitiveContainer::Add(const char* name,
BinaryPrimitiveRoutine routine,
bool classSide) {
Expand All @@ -66,14 +66,6 @@ void PrimitiveContainer::Add(const char* name,
ternaryPrims[std::string(name)] = {routine, classSide};
}

PrimitiveRoutine* PrimitiveContainer::GetPrimitive(
const std::string& routineName) {
if (methods.find(routineName) != methods.end()) {
return methods[routineName];
}
return nullptr;
}

void PrimitiveContainer::InstallPrimitives(VMClass* clazz, bool classSide) {
for (auto const& p : unaryPrims) {
assert(p.second.IsValid());
Expand Down Expand Up @@ -120,15 +112,15 @@ void PrimitiveContainer::InstallPrimitives(VMClass* clazz, bool classSide) {
}
}

for (auto const& p : methods) {
if (classSide != p.second->isClassSide()) {
for (auto const& p : framePrims) {
assert(p.second.IsValid());
if (classSide != p.second.isClassSide) {
continue;
}

VMSymbol* sig = SymbolFor(p.first);
VMPrimitive* prim = VMPrimitive::GetEmptyPrimitive(sig, classSide);
prim->SetRoutine(p.second, false);
if (clazz->AddInstanceInvokable(prim)) {
if (clazz->AddInstanceInvokable(
VMPrimitive::GetFramePrim(sig, p.second))) {
cout << "Warn: Primitive " << p.first
<< " is not in class definition for class "
<< clazz->GetName()->GetStdString() << endl;
Expand Down
15 changes: 3 additions & 12 deletions src/primitivesCore/PrimitiveContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,32 +33,23 @@
#include "Primitives.h"

/// Base class for all container objects holding SOM++ primitives.
// Primitive container classes need to initialize a std::map<StdString,
// Primitive container classes need to initialize a std::map<std::string,
// PrimitiveRoutine*> in order to map smalltalk message names to the method
// to call.
class PrimitiveContainer {
public:
PrimitiveContainer() = default;
virtual ~PrimitiveContainer() = default;

/// Every derived Class must use this method to initialize the methods
// map with the mapping of a StdString with the smalltalk message
// name and the corresponding functor object. The abstract functor object
// class is defined in vmobjects/PrimitiveRoutine. Basically, the only
// requirement for those objects is to implement:
// virtual void operator()(VMObject*, VMFrame*)
void SetPrimitive(const char* name, PrimitiveRoutine* routine);

PrimitiveRoutine* GetPrimitive(const std::string& routineName);

void InstallPrimitives(VMClass* clazz, bool classSide);

void Add(const char* name, FramePrimitiveRoutine, bool classSide);
void Add(const char* name, UnaryPrimitiveRoutine, bool classSide);
void Add(const char* name, BinaryPrimitiveRoutine, bool classSide);
void Add(const char* name, TernaryPrimitiveRoutine, bool classSide);

private:
std::map<std::string, PrimitiveRoutine*> methods{};
std::map<std::string, FramePrim> framePrims{};
std::map<std::string, UnaryPrim> unaryPrims{};
std::map<std::string, BinaryPrim> binaryPrims{};
std::map<std::string, TernaryPrim> ternaryPrims{};
Expand Down
28 changes: 0 additions & 28 deletions src/primitivesCore/PrimitiveLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,7 @@
#include "../primitives/String.h"
#include "../primitives/Symbol.h"
#include "../primitives/System.h"
#include "../vm/Print.h"
#include "../vmobjects/ObjectFormats.h"
#include "../vmobjects/PrimitiveRoutine.h"
#include "PrimitiveContainer.h"

PrimitiveLoader PrimitiveLoader::loader;
Expand Down Expand Up @@ -80,12 +78,6 @@ bool PrimitiveLoader::SupportsClass(const std::string& name) {
return loader.supportsClass(name);
}

PrimitiveRoutine* PrimitiveLoader::GetPrimitiveRoutine(const std::string& cname,
const std::string& mname,
bool isPrimitive) {
return loader.getPrimitiveRoutine(cname, mname, isPrimitive);
}

void PrimitiveLoader::InstallPrimitives(const std::string& cname,
VMClass* clazz,
bool classSide) {
Expand All @@ -101,23 +93,3 @@ void PrimitiveLoader::installPrimitives(const std::string& cname,

primitiveObjects[cname]->InstallPrimitives(clazz, classSide);
}

PrimitiveRoutine* PrimitiveLoader::getPrimitiveRoutine(const std::string& cname,
const std::string& mname,
bool isPrimitive) {
if (primitiveObjects.find(cname) == primitiveObjects.end()) {
ErrorPrint("Primitive object not found for name: " + cname + "\n");
return nullptr;
}

PrimitiveContainer* primitive = primitiveObjects[cname];
PrimitiveRoutine* result = primitive->GetPrimitive(mname);
if (!result) {
if (isPrimitive) {
ErrorPrint("method " + mname + " not found in class " + cname +
"\n");
}
return nullptr;
}
return result;
}
6 changes: 0 additions & 6 deletions src/primitivesCore/PrimitiveLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ class PrimitiveLoader {
void AddPrimitiveObject(const std::string& name, PrimitiveContainer*);

static bool SupportsClass(const std::string& name);
static PrimitiveRoutine* GetPrimitiveRoutine(const std::string& cname,
const std::string& mname,
bool isPrimitive);

static void InstallPrimitives(const std::string& cname,
VMClass* clazz,
Expand All @@ -64,9 +61,6 @@ class PrimitiveLoader {
bool classSide);

bool supportsClass(const std::string& name);
PrimitiveRoutine* getPrimitiveRoutine(const std::string& cname,
const std::string& mname,
bool isPrimitive);

std::map<StdString, PrimitiveContainer*> primitiveObjects{};

Expand Down
Loading

0 comments on commit 8882e31

Please sign in to comment.