Skip to content

Commit 30e6521

Browse files
committed
Core: add UndefinedObject class and normalize nil.class; tests: display Class names and add true/false/nil class cases (formatted)
1 parent da0ce6d commit 30e6521

File tree

5 files changed

+24
-3
lines changed

5 files changed

+24
-3
lines changed

src/cpp/include/smalltalk_class.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ Class *getIntegerClass();
236236
Class *getBooleanClass();
237237
Class *getTrueClass();
238238
Class *getFalseClass();
239+
Class *getUndefinedObjectClass();
239240
Class *getSymbolClass();
240241
Class *getStringClass();
241242
Class *getBlockClass();

src/cpp/src/smalltalk_class.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ struct CoreClasses {
267267
Class *booleanClass = nullptr;
268268
Class *trueClass = nullptr;
269269
Class *falseClass = nullptr;
270+
Class *undefinedObjectClass = nullptr;
270271
Class *symbolClass = nullptr;
271272
Class *stringClass = nullptr;
272273
Class *blockClass = nullptr;
@@ -338,6 +339,14 @@ void initializeCoreClasses() {
338339
core.falseClass->setClass(core.classClass);
339340
registry.registerClass("False", core.falseClass);
340341

342+
// Create UndefinedObject class (class of nil)
343+
core.undefinedObjectClass =
344+
new Class("UndefinedObject", core.objectClass, nullptr);
345+
core.undefinedObjectClass->setInstanceSize(0);
346+
core.undefinedObjectClass->setFormat(ObjectFormat::POINTER_OBJECTS);
347+
core.undefinedObjectClass->setClass(core.classClass);
348+
registry.registerClass("UndefinedObject", core.undefinedObjectClass);
349+
341350
// Create Symbol class
342351
core.symbolClass = new Class("Symbol", core.objectClass, nullptr);
343352
core.symbolClass->setInstanceSize(0); // Symbol data is managed internally
@@ -476,6 +485,9 @@ Class *getIntegerClass() { return CoreClasses::getInstance().integerClass; }
476485
Class *getBooleanClass() { return CoreClasses::getInstance().booleanClass; }
477486
Class *getTrueClass() { return CoreClasses::getInstance().trueClass; }
478487
Class *getFalseClass() { return CoreClasses::getInstance().falseClass; }
488+
Class *getUndefinedObjectClass() {
489+
return CoreClasses::getInstance().undefinedObjectClass;
490+
}
479491
Class *getSymbolClass() { return CoreClasses::getInstance().symbolClass; }
480492
Class *getStringClass() { return CoreClasses::getInstance().stringClass; }
481493
Class *getBlockClass() { return CoreClasses::getInstance().blockClass; }

src/cpp/src/tagged_value.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ Class *TaggedValue::getClass() const {
2727
return getBoolean() ? ClassUtils::getTrueClass()
2828
: ClassUtils::getFalseClass();
2929
} else if (isNil()) {
30-
// nil is a special case - it's the sole instance of UndefinedObject
31-
// For now, we'll return Object class
32-
return ClassUtils::getObjectClass();
30+
// nil's class is UndefinedObject
31+
return ClassUtils::getUndefinedObjectClass();
3332
} else if (isPointer()) {
3433
try {
3534
// Strings are byte-indexable and detected via utility

src/cpp/tests/all_expressions_test.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ void testExpressionWithExecuteMethod(const ExpressionTest &test) {
9191
Symbol *symbol = static_cast<Symbol *>(obj);
9292
resultStr = "Symbol(" + symbol->getName() + ")";
9393
}
94+
} else if (obj && obj->header.getType() == ObjectType::CLASS) {
95+
Class *cls = static_cast<Class *>(obj);
96+
resultStr = cls->getName();
9497
} else {
9598
// Debug: show actual object type
9699
resultStr = "Object(type=" +
@@ -545,6 +548,9 @@ aBlock value.
545548
{"false", "false", true, "literals"},
546549
{"nil", "nil", true, "literals"},
547550
{"#abc", "Symbol(abc)", true, "literals"},
551+
{"true class", "True", true, "literals"},
552+
{"false class", "False", true, "literals"},
553+
{"nil class", "UndefinedObject", true, "literals"},
548554

549555
// Variable assignment - SHOULD PASS (now implemented!)
550556
{"| x | x := 42. x", "42", true, "variables"},
@@ -726,6 +732,9 @@ aBlock value.
726732
if (obj && obj->header.getType() == ObjectType::SYMBOL) {
727733
Symbol *sym = static_cast<Symbol *>(obj);
728734
resultStr = sym->toString();
735+
} else if (obj && obj->header.getType() == ObjectType::CLASS) {
736+
Class *cls = static_cast<Class *>(obj);
737+
resultStr = cls->getName();
729738
} else if (obj && obj->header.getType() == ObjectType::ARRAY) {
730739
// Format array as <Array size: N>
731740
size_t arraySize = obj->header.size;
62.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)