23
23
#include "datatypes/class.h"
24
24
#include "datatypes/instance.h"
25
25
#include "datatypes/result/result.h"
26
+ #include "datatypes/enums.h"
26
27
#include "natives.h"
27
28
#include "../optionals/optionals.h"
28
29
@@ -120,6 +121,7 @@ DictuVM *dictuInitVM(bool repl, int argc, char **argv) {
120
121
initTable (& vm -> classMethods );
121
122
initTable (& vm -> instanceMethods );
122
123
initTable (& vm -> resultMethods );
124
+ initTable (& vm -> enumMethods );
123
125
124
126
vm -> frames = ALLOCATE (vm , CallFrame , vm -> frameCapacity );
125
127
vm -> initString = copyString (vm , "init" , 4 );
@@ -140,6 +142,7 @@ DictuVM *dictuInitVM(bool repl, int argc, char **argv) {
140
142
declareClassMethods (vm );
141
143
declareInstanceMethods (vm );
142
144
declareResultMethods (vm );
145
+ declareEnumMethods (vm );
143
146
144
147
if (vm -> repl ) {
145
148
vm -> replVar = copyString (vm , "_" , 1 );
@@ -168,6 +171,7 @@ void dictuFreeVM(DictuVM *vm) {
168
171
freeTable (vm , & vm -> classMethods );
169
172
freeTable (vm , & vm -> instanceMethods );
170
173
freeTable (vm , & vm -> resultMethods );
174
+ freeTable (vm , & vm -> enumMethods );
171
175
FREE_ARRAY (vm , CallFrame , vm -> frames , vm -> frameCapacity );
172
176
vm -> initString = NULL ;
173
177
vm -> replVar = NULL ;
@@ -647,14 +651,28 @@ static bool invoke(DictuVM *vm, ObjString *name, int argCount, bool unpack) {
647
651
}
648
652
649
653
case OBJ_ENUM : {
654
+ Value value ;
655
+ if (tableGet (& vm -> enumMethods , name , & value )) {
656
+ if (IS_NATIVE (value )) {
657
+ return callNativeMethod (vm , value , argCount );
658
+ }
659
+
660
+ push (vm , peek (vm , 0 ));
661
+
662
+ for (int i = 2 ; i <= argCount + 1 ; i ++ ) {
663
+ vm -> stackTop [- i ] = peek (vm , i );
664
+ }
665
+
666
+ return call (vm , AS_CLOSURE (value ), argCount + 1 );
667
+ }
668
+
650
669
ObjEnum * enumObj = AS_ENUM (receiver );
651
670
652
- Value value ;
653
671
if (tableGet (& enumObj -> values , name , & value )) {
654
672
return callValue (vm , value , argCount , false);
655
673
}
656
674
657
- runtimeError (vm , "'%s' enum has no value '%s'." , enumObj -> name -> chars , name -> chars );
675
+ runtimeError (vm , "Enum has no method '%s'." , name -> chars );
658
676
return false;
659
677
}
660
678
0 commit comments