From ca0fb6b54d69fc47a857e6cf915fc910a813f673 Mon Sep 17 00:00:00 2001 From: Thakee Nathees Date: Tue, 7 Jun 2022 00:08:12 +0530 Subject: [PATCH] static attribute to class added --- scripts/static_check.py | 4 ++-- src/core/core.c | 11 ++++++++++- src/core/value.c | 2 ++ src/core/value.h | 3 +++ src/libs/libs.c | 6 ++---- src/libs/{ext_term.c => std_term.c} | 0 src/libs/{ext_term.pk => std_term.pk} | 0 tests/lang/class.pk | 14 ++++++++++++++ 8 files changed, 33 insertions(+), 7 deletions(-) rename src/libs/{ext_term.c => std_term.c} (100%) rename src/libs/{ext_term.pk => std_term.pk} (100%) diff --git a/scripts/static_check.py b/scripts/static_check.py index 6742439..c25e29a 100644 --- a/scripts/static_check.py +++ b/scripts/static_check.py @@ -36,9 +36,9 @@ IGNORE_FILES = ( "cli/argparse.h", ## FIXME: collect all thirdparty files. ## Contain longer lines. I shoule add something like static-check-off, ## static-check-on like clang or just use clang. - "src/libs/ext_term.c", + "src/libs/std_term.c", ## Contain extendedted ascii characters that raise UnicodeDecodeError. - "src/libs/ext_term.pk", + "src/libs/std_term.pk", ) ## A list of directory, contains C source files to perform static checks. diff --git a/src/core/core.c b/src/core/core.c index c50cb24..2dfaaab 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -125,6 +125,7 @@ static inline bool validateCond(PKVM* vm, bool condition, const char* err) { VALIDATE_ARG_OBJ(Closure, OBJ_CLOSURE, "closure") VALIDATE_ARG_OBJ(Fiber, OBJ_FIBER, "fiber") VALIDATE_ARG_OBJ(Class, OBJ_CLASS, "class") + VALIDATE_ARG_OBJ(Module, OBJ_MODULE, "module") /*****************************************************************************/ /* SHARED FUNCTIONS */ @@ -147,7 +148,6 @@ void initializeModule(PKVM* vm, Module* module, bool is_main) { if (is_main) { // TODO: consider static string "@main" stored in PKVM. to reduce // allocations everytime here. - ASSERT(module->name == NULL, OOPS); name = newString(vm, "@main"); module->name = name; vmPushTempRef(vm, &name->_super); // _main. @@ -2112,6 +2112,9 @@ Var varGetAttrib(PKVM* vm, Var on, String* attrib) { } } + Var value = mapGet(cls->static_attribs, VAR_OBJ(attrib)); + if (!IS_UNDEF(value)) return value; + for (int i = 0; i < (int)cls->methods.count; i++) { Closure* method_ = cls->methods.data[i]; ASSERT(method_->fn->is_method, OOPS); @@ -2187,6 +2190,12 @@ void varSetAttrib(PKVM* vm, Var on, String* attrib, Var value) { UNREACHABLE(); // Functions aren't first class objects. break; + case OBJ_CLASS: { + Class* cls = (Class*) obj; + mapSet(vm, cls->static_attribs, VAR_OBJ(attrib), value); + return; + } + case OBJ_INST: { Instance* inst = (Instance*)obj; diff --git a/src/core/value.c b/src/core/value.c index afa6d7a..8c94551 100644 --- a/src/core/value.c +++ b/src/core/value.c @@ -246,6 +246,7 @@ static void popMarkedObjectsInternal(Object* obj, PKVM* vm) { markObject(vm, &cls->owner->_super); markObject(vm, &cls->ctor->_super); markObject(vm, &cls->name->_super); + markObject(vm, &cls->static_attribs->_super); markClosureBuffer(vm, &cls->methods); vm->bytes_allocated += sizeof(Closure) * cls->methods.capacity; @@ -520,6 +521,7 @@ Class* newClass(PKVM* vm, const char* name, int length, vmPushTempRef(vm, &cls->_super); // class. pkClosureBufferInit(&cls->methods); + cls->static_attribs = newMap(vm); cls->class_of = PK_INSTANCE; cls->super_class = super; diff --git a/src/core/value.h b/src/core/value.h index ffb12c9..177ad89 100644 --- a/src/core/value.h +++ b/src/core/value.h @@ -543,6 +543,9 @@ struct Class { // A buffer of methods of the class. pkClosureBuffer methods; + // Static attributes of the class. + Map* static_attribs; + // Allocater and de-allocator functions for native types. // For script/ builtin types it'll be NULL. pkNewInstanceFn new_fn; diff --git a/src/libs/libs.c b/src/libs/libs.c index 9060538..6457b74 100644 --- a/src/libs/libs.c +++ b/src/libs/libs.c @@ -18,10 +18,8 @@ void registerModulePath(PKVM* vm); void registerModuleOS(PKVM* vm); void registerModuleJson(PKVM* vm); void registerModuleDummy(PKVM* vm); - -// Extra libraries. - void registerModuleTerm(PKVM* vm); + void cleanupModuleTerm(PKVM* vm); // Registers the modules. @@ -34,8 +32,8 @@ void registerLibs(PKVM* vm) { registerModuleOS(vm); registerModuleJson(vm); registerModuleDummy(vm); - registerModuleTerm(vm); + } // Cleanup the modules. diff --git a/src/libs/ext_term.c b/src/libs/std_term.c similarity index 100% rename from src/libs/ext_term.c rename to src/libs/std_term.c diff --git a/src/libs/ext_term.pk b/src/libs/std_term.pk similarity index 100% rename from src/libs/ext_term.pk rename to src/libs/std_term.pk diff --git a/tests/lang/class.pk b/tests/lang/class.pk index a394712..043703c 100644 --- a/tests/lang/class.pk +++ b/tests/lang/class.pk @@ -5,6 +5,20 @@ ## TODO: write some tests here. +## No enums supports (yet?) +class Day end +Day.SUNDAY = 0 +Day.MONDAY = 1 +Day.TUESDAY = 2 +Day.WEDNESDAY = 3 +Day.THURSDAY = 4 +Day.FRIDAY = 5 +Day.SATURDAY = 6 + +assert(Day.SUNDAY == 0) +assert(Day.FRIDAY == 5) + + ############################################################################### ## INHERITANCE ###############################################################################