Skip to content

Commit 9a9dd4b

Browse files
committed
Tests: link minimal_parse_test with compiler deps (needs MethodCompiler)
1 parent 7b902a3 commit 9a9dd4b

File tree

9 files changed

+58
-14
lines changed

9 files changed

+58
-14
lines changed

src/cpp/include/smalltalk_class.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ Class *getClassClass();
234234
Class *getMetaclassClass();
235235
Class *getIntegerClass();
236236
Class *getBooleanClass();
237+
Class *getTrueClass();
238+
Class *getFalseClass();
237239
Class *getSymbolClass();
238240
Class *getStringClass();
239241
Class *getBlockClass();
@@ -250,4 +252,4 @@ void addPrimitiveMethod(Class *clazz, const std::string &selector,
250252
int primitiveNumber);
251253
} // namespace ClassUtils
252254

253-
} // namespace smalltalk
255+
} // namespace smalltalk

src/cpp/run_all_tests.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ run_expression "(2 + 3) * 4" "Nested Expression"
123123
# 2. Test block parsing
124124
echo -e "\n${YELLOW}=== BLOCK PARSING TESTS ===${NC}"
125125

126-
build_test "tests/minimal_parse_test.cpp" "minimal_parse_test" "$PARSER_DEPS"
126+
build_test "tests/minimal_parse_test.cpp" "minimal_parse_test" "$COMPILER_DEPS"
127127
run_test "Block Parsing" "./build/minimal_parse_test | grep -q 'Test completed successfully'"
128128

129129
build_test "tests/simple_block_test.cpp" "simple_block_test" "$COMPILER_DEPS"

src/cpp/src/interpreter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,13 @@ void Interpreter::sendMessageBytecode() {
291291
throw std::runtime_error("Selector is not a symbol");
292292
}
293293

294-
// Pop arguments from stack (in reverse order)
294+
// Pop arguments from stack (LIFO), then restore source order
295295
std::vector<TaggedValue> args;
296296
args.reserve(argCount);
297297
for (uint32_t i = 0; i < argCount; i++) {
298298
args.push_back(pop());
299299
}
300+
std::reverse(args.begin(), args.end());
300301

301302
// Pop receiver from stack
302303
TaggedValue receiver = pop();
@@ -610,7 +611,8 @@ Class *Interpreter::getObjectClass(TaggedValue value) {
610611
return ClassUtils::getIntegerClass();
611612
}
612613
if (value.isBoolean()) {
613-
return ClassUtils::getBooleanClass();
614+
return value.getBoolean() ? ClassUtils::getTrueClass()
615+
: ClassUtils::getFalseClass();
614616
}
615617
if (value.isNil()) {
616618
return ClassRegistry::getInstance().getClass("UndefinedObject");

src/cpp/src/method_compiler.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ std::string MethodCompiler::parseMethodSignature(std::string &methodBody) {
7171

7272
std::string fullSelector;
7373
for (; iter != end; ++iter) {
74-
if (!fullSelector.empty())
75-
fullSelector += ":";
74+
// Append keyword part with trailing colon, no extra separator
7675
fullSelector += iter->str(1) + ":";
7776
parameters.push_back(iter->str(2));
7877
}
@@ -154,4 +153,4 @@ std::string MethodCompiler::parseMethodSignature(std::string &methodBody) {
154153
return selector;
155154
}
156155

157-
} // namespace smalltalk
156+
} // namespace smalltalk

src/cpp/src/primitives/object.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ TaggedValue primitive_class(TaggedValue receiver,
154154
if (receiver.isSmallInteger()) {
155155
receiverClass = ClassUtils::getIntegerClass();
156156
} else if (receiver.isBoolean()) {
157-
receiverClass = ClassUtils::getBooleanClass();
157+
receiverClass = receiver.getBoolean() ? ClassUtils::getTrueClass()
158+
: ClassUtils::getFalseClass();
158159
} else if (receiver.isNil()) {
159160
// UndefinedObject class for nil
160161
receiverClass = ClassRegistry::getInstance().getClass("UndefinedObject");
@@ -192,4 +193,4 @@ void registerObjectPrimitives() {
192193
ObjectPrimitives::primitive_class);
193194
}
194195

195-
} // namespace smalltalk
196+
} // namespace smalltalk

src/cpp/src/smalltalk_class.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "smalltalk_class.h"
2+
#include "method_compiler.h"
23
#include "primitives.h"
34
#include <algorithm>
45
#include <iostream>
@@ -264,6 +265,8 @@ struct CoreClasses {
264265
Metaclass *metaclassClass = nullptr;
265266
Class *integerClass = nullptr;
266267
Class *booleanClass = nullptr;
268+
Class *trueClass = nullptr;
269+
Class *falseClass = nullptr;
267270
Class *symbolClass = nullptr;
268271
Class *stringClass = nullptr;
269272
Class *blockClass = nullptr;
@@ -315,13 +318,26 @@ void initializeCoreClasses() {
315318
core.integerClass->setClass(core.classClass);
316319
registry.registerClass("Integer", core.integerClass);
317320

318-
// Create Boolean class
321+
// Create Boolean hierarchy
319322
core.booleanClass = new Class("Boolean", core.objectClass, nullptr);
320323
core.booleanClass->setInstanceSize(0); // Booleans are immediate values
321324
core.booleanClass->setFormat(ObjectFormat::POINTER_OBJECTS);
322325
core.booleanClass->setClass(core.classClass);
323326
registry.registerClass("Boolean", core.booleanClass);
324327

328+
// Create True/False as subclasses of Boolean
329+
core.trueClass = new Class("True", core.booleanClass, nullptr);
330+
core.trueClass->setInstanceSize(0);
331+
core.trueClass->setFormat(ObjectFormat::POINTER_OBJECTS);
332+
core.trueClass->setClass(core.classClass);
333+
registry.registerClass("True", core.trueClass);
334+
335+
core.falseClass = new Class("False", core.booleanClass, nullptr);
336+
core.falseClass->setInstanceSize(0);
337+
core.falseClass->setFormat(ObjectFormat::POINTER_OBJECTS);
338+
core.falseClass->setClass(core.classClass);
339+
registry.registerClass("False", core.falseClass);
340+
325341
// Create Symbol class
326342
core.symbolClass = new Class("Symbol", core.objectClass, nullptr);
327343
core.symbolClass->setInstanceSize(0); // Symbol data is managed internally
@@ -415,6 +431,24 @@ void initializeCoreClasses() {
415431
addPrimitiveMethod(core.blockClass, "value:",
416432
PrimitiveNumbers::BLOCK_VALUE_ARG); // Block value:
417433

434+
// Install minimal boolean control-flow methods in True and False
435+
// True
436+
MethodCompiler::addSmalltalkMethod(core.trueClass,
437+
"ifTrue: block\n^ block value");
438+
MethodCompiler::addSmalltalkMethod(core.trueClass, "ifFalse: block\n^ nil");
439+
MethodCompiler::addSmalltalkMethod(core.trueClass,
440+
"ifTrue: t ifFalse: f\n^ t value");
441+
MethodCompiler::addSmalltalkMethod(core.trueClass,
442+
"ifFalse: f ifTrue: t\n^ t value");
443+
// False
444+
MethodCompiler::addSmalltalkMethod(core.falseClass, "ifTrue: block\n^ nil");
445+
MethodCompiler::addSmalltalkMethod(core.falseClass,
446+
"ifFalse: block\n^ block value");
447+
MethodCompiler::addSmalltalkMethod(core.falseClass,
448+
"ifTrue: t ifFalse: f\n^ f value");
449+
MethodCompiler::addSmalltalkMethod(core.falseClass,
450+
"ifFalse: f ifTrue: t\n^ f value");
451+
418452
// Create SystemLoader class and add minimal start: primitive
419453
Class *systemLoaderClass =
420454
new Class("SystemLoader", core.objectClass, nullptr);
@@ -440,6 +474,8 @@ Class *getClassClass() { return CoreClasses::getInstance().classClass; }
440474
Class *getMetaclassClass() { return CoreClasses::getInstance().metaclassClass; }
441475
Class *getIntegerClass() { return CoreClasses::getInstance().integerClass; }
442476
Class *getBooleanClass() { return CoreClasses::getInstance().booleanClass; }
477+
Class *getTrueClass() { return CoreClasses::getInstance().trueClass; }
478+
Class *getFalseClass() { return CoreClasses::getInstance().falseClass; }
443479
Class *getSymbolClass() { return CoreClasses::getInstance().symbolClass; }
444480
Class *getStringClass() { return CoreClasses::getInstance().stringClass; }
445481
Class *getBlockClass() { return CoreClasses::getInstance().blockClass; }

src/cpp/src/tagged_value.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ Class *TaggedValue::getClass() const {
2424
if (isInteger()) {
2525
return ClassUtils::getIntegerClass();
2626
} else if (isBoolean()) {
27-
return ClassUtils::getBooleanClass();
27+
return getBoolean() ? ClassUtils::getTrueClass()
28+
: ClassUtils::getFalseClass();
2829
} else if (isNil()) {
2930
// nil is a special case - it's the sole instance of UndefinedObject
3031
// For now, we'll return Object class
@@ -65,7 +66,9 @@ TaggedValue TaggedValue::fromObject(Object *object) {
6566
return *valueSlot;
6667
}
6768
// Check if it's a boxed boolean
68-
if (object->getClass() == ClassUtils::getBooleanClass()) {
69+
if (object->getClass() == ClassUtils::getBooleanClass() ||
70+
object->getClass() == ClassUtils::getTrueClass() ||
71+
object->getClass() == ClassUtils::getFalseClass()) {
6972
TaggedValue *valueSlot = reinterpret_cast<TaggedValue *>(
7073
reinterpret_cast<char *>(object) + sizeof(Object));
7174
return *valueSlot;
@@ -97,4 +100,4 @@ Object *TaggedValue::toObject(MemoryManager &memoryManager) const {
97100
}
98101
}
99102

100-
} // namespace smalltalk
103+
} // namespace smalltalk

src/cpp/tests/all_expressions_test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,8 @@ aBlock value.
574574

575575
// Conditionals - SHOULD FAIL (not implemented)
576576
{"3 < 4) ifTrue: [10] ifFalse: [20]", "10", false, "conditionals"},
577-
{"true ifTrue: [42]", "42", false, "conditionals"},
577+
{"true ifTrue: [42]", "42", true, "conditionals"},
578+
{"false ifTrue: [1] ifFalse: [7]", "7", true, "conditionals"},
578579

579580
// Collections - SHOULD FAIL (not implemented)
580581
{"#(1 2 3) at: 2", "2", true, "collections"},
6.48 KB
Binary file not shown.

0 commit comments

Comments
 (0)