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; }
440474Class *getMetaclassClass () { return CoreClasses::getInstance ().metaclassClass ; }
441475Class *getIntegerClass () { return CoreClasses::getInstance ().integerClass ; }
442476Class *getBooleanClass () { return CoreClasses::getInstance ().booleanClass ; }
477+ Class *getTrueClass () { return CoreClasses::getInstance ().trueClass ; }
478+ Class *getFalseClass () { return CoreClasses::getInstance ().falseClass ; }
443479Class *getSymbolClass () { return CoreClasses::getInstance ().symbolClass ; }
444480Class *getStringClass () { return CoreClasses::getInstance ().stringClass ; }
445481Class *getBlockClass () { return CoreClasses::getInstance ().blockClass ; }
0 commit comments