From 79f749fb6b3c9c7a2d2b1500ae41dd78b5223106 Mon Sep 17 00:00:00 2001 From: iizuka Date: Thu, 6 Nov 2025 12:56:47 +0800 Subject: [PATCH 01/11] Reserved Classes and Generics --- src_db/base/UnicodeString.cpp | 6 +- src_db/base/exceptions.cpp | 20 +++ src_db/base/exceptions.h | 10 ++ src_smartcontract/engine/sc/CodeElement.cpp | 20 ++- src_smartcontract/engine/sc/CodeElement.h | 31 ++-- .../engine/sc/CompilationUnit.cpp | 2 +- src_smartcontract/engine/sc/SmartContract.cpp | 4 +- .../engine/sc_analyze/PackageSpace.cpp | 10 ++ .../engine/sc_analyze/TypeResolver.cpp | 8 +- .../lang/sc_declare/AccessControlDeclare.cpp | 4 + .../lang/sc_declare/AccessControlDeclare.h | 1 + .../lang/sc_declare/ClassDeclare.cpp | 50 ++++--- .../lang/sc_declare/ClassDeclare.h | 6 +- .../lang/sc_declare/GenericsClassDeclare.cpp | 6 +- .../lang/sc_declare/GenericsClassDeclare.h | 3 +- .../lang/sc_declare/MethodDeclare.cpp | 53 ++++--- .../lang/sc_declare/MethodDeclare.h | 22 ++- .../lang/sc_declare/PackageNameDeclare.cpp | 3 +- .../lang/sc_declare_types/DomType.cpp | 2 +- .../lang/sc_declare_types/DomType.h | 2 +- .../sc_declare_types/GenericsObjectType.cpp | 4 +- .../sc_declare_types/GenericsObjectType.h | 2 +- .../lang/sc_declare_types/IntType.cpp | 2 +- .../lang/sc_declare_types/IntType.h | 2 +- .../lang/sc_declare_types/LongType.cpp | 2 +- .../lang/sc_declare_types/LongType.h | 2 +- .../lang/sc_declare_types/ObjectType.cpp | 7 +- .../lang/sc_declare_types/ObjectType.h | 4 +- .../lang/sc_declare_types/ShortType.cpp | 2 +- .../lang/sc_declare_types/ShortType.h | 2 +- .../lang/sc_declare_types/StringType.cpp | 2 +- .../lang/sc_declare_types/StringType.h | 2 +- .../lang/sc_declare_types/VoidType.cpp | 2 +- .../lang/sc_declare_types/VoidType.h | 2 +- .../lang/sc_expression/ConstructorCall.cpp | 5 +- .../DatabaseExceptionClassDeclare.cpp | 10 +- .../DatabaseExceptionClassDeclare.h | 3 - src_smartcontract_vm/CMakeLists.txt | 4 + .../ext_binary/ExtClassObject.cpp | 5 + .../ext_binary/ExtClassObject.h | 1 + .../instance/VmInstanceTypesConst.h | 1 - .../ArrayOutOfBoundsExceptionClassDeclare.cpp | 10 +- .../ArrayOutOfBoundsExceptionClassDeclare.h | 3 - .../NullPointerExceptionClassDeclare.cpp | 10 +- .../NullPointerExceptionClassDeclare.h | 3 - .../TypeCastExceptionClassDeclare.cpp | 10 +- .../TypeCastExceptionClassDeclare.h | 3 - .../ZeroDivisionExceptionClassDeclare.cpp | 10 +- .../ZeroDivisionExceptionClassDeclare.h | 3 - .../AbstractExceptionClassDeclare.cpp | 10 ++ .../AbstractExceptionClassDeclare.h | 4 + .../ExceptionClassDeclare.cpp | 10 +- .../ExceptionClassDeclare.h | 3 - .../instance/instance_gc/ReferenceStatus.h | 2 +- .../instance/instance_ref/ObjectReference.cpp | 14 +- .../instance/instance_ref/ObjectReference.h | 2 + .../instance_string/VmStringInstance.h | 2 + .../AbstractReservedClassDeclare.cpp | 140 ++++++++++++++++-- .../AbstractReservedClassDeclare.h | 8 +- .../AbstractReservedMethodDeclare.cpp | 134 +++++++++++++++++ .../AbstractReservedMethodDeclare.h | 42 ++++++ .../AbstractVmReservedInstance.cpp | 26 ++++ .../AbstractVmReservedInstance.h | 24 +++ .../instance/reserved_classes/CMakeLists.txt | 2 + .../ReservedClassRegistory.cpp | 45 +++++- .../reserved_classes/ReservedClassRegistory.h | 5 +- .../reserved_classes/bigint/CMakeLists.txt | 7 + .../reserved_classes/list/CMakeLists.txt | 7 + .../list/ListClassDeclare.cpp | 21 +++ .../reserved_classes/list/ListClassDeclare.h | 23 +++ .../reserved_classes/object/CMakeLists.txt | 10 ++ .../object/ObjectClassDeclare.cpp | 69 +++++++++ .../object/ObjectClassDeclare.h | 44 ++++++ .../object/ObjectClassInstanceFactory.cpp | 34 +++++ .../object/ObjectClassInstanceFactory.h | 28 ++++ .../object/ObjectObjectMethod.cpp | 50 +++++++ .../object/ObjectObjectMethod.h | 29 ++++ .../object/VmObjectClassInstance.cpp | 22 +++ .../object/VmObjectClassInstance.h | 28 ++++ .../StringClassDeclare.cpp | 14 +- .../StringClassDeclare.h | 5 +- .../AbstractReservedGenericsClassDeclare.cpp | 43 ++++++ .../AbstractReservedGenericsClassDeclare.h | 29 ++++ .../instance/reserved_generics/CMakeLists.txt | 7 + src_test/db/db_base/test_exceptions.cpp | 1 + .../reserved_classes/CMakeLists.txt | 2 + .../resources/object/case01/main.alns | 16 ++ .../resources/string/base01/main.alns | 3 +- .../reserved_classes/test_generic_list.cpp | 25 ++++ .../reserved_classes/test_object_class.cpp | 40 +++++ .../reserved_classes/test_string_class.cpp | 1 + 91 files changed, 1210 insertions(+), 202 deletions(-) create mode 100644 src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/CMakeLists.txt create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.h create mode 100644 src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h create mode 100644 src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt create mode 100644 src_test/smartcontract_vm/reserved_classes/resources/object/case01/main.alns create mode 100644 src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp create mode 100644 src_test/smartcontract_vm/reserved_classes/test_object_class.cpp diff --git a/src_db/base/UnicodeString.cpp b/src_db/base/UnicodeString.cpp index c854b1c..ac68930 100644 --- a/src_db/base/UnicodeString.cpp +++ b/src_db/base/UnicodeString.cpp @@ -549,13 +549,13 @@ ArrayList* UnicodeString::split(const UnicodeString* regex, bool std::wsregex_token_iterator it(str.begin(), str.end(), wreg, -1), end; for (; it != end; ++it) { - const std::wstring res = *it;//(it->first, it->second); + const std::wstring partres = *it;//(it->first, it->second); // @suppress("Invalid arguments") - int len = res.length(); + int len = partres.length(); if(!addBlankString && len == 0){ continue; } - const wchar_t *cwstr = res.c_str(); + const wchar_t *cwstr = partres.c_str(); UnicodeString* result = new UnicodeString(cwstr); list->addElement(result); diff --git a/src_db/base/exceptions.cpp b/src_db/base/exceptions.cpp index cd34f8d..c978297 100644 --- a/src_db/base/exceptions.cpp +++ b/src_db/base/exceptions.cpp @@ -51,4 +51,24 @@ IllegalArgumentException::IllegalArgumentException(const wchar_t* message, Excep IllegalArgumentException::~IllegalArgumentException() { } +const wchar_t* UnsupportedFunctionException::defaultMessage = L"Unsupported Function is called. "; + +UnsupportedFunctionException::UnsupportedFunctionException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +UnsupportedFunctionException::UnsupportedFunctionException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +UnsupportedFunctionException::UnsupportedFunctionException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +UnsupportedFunctionException::UnsupportedFunctionException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +UnsupportedFunctionException::~UnsupportedFunctionException() { +} + + } /* namespace alinous */ diff --git a/src_db/base/exceptions.h b/src_db/base/exceptions.h index 6418606..cf97d55 100644 --- a/src_db/base/exceptions.h +++ b/src_db/base/exceptions.h @@ -32,6 +32,16 @@ class IllegalArgumentException : public Exception{ static const wchar_t* defaultMessage; }; +class UnsupportedFunctionException : public Exception{ +public: + UnsupportedFunctionException(const char* srcfile, int srcline) noexcept; + UnsupportedFunctionException(Exception* cause, const char* srcfile, int srcline) noexcept; + UnsupportedFunctionException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + UnsupportedFunctionException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; + virtual ~UnsupportedFunctionException(); + static const wchar_t* defaultMessage; +}; + } /* namespace alinous */ #endif /* BASE_EXCEPTIONS_H_ */ diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index 7d34db0..5fc95f8 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -167,6 +167,9 @@ #include "lang_sql/sql_expression/SQLDistinctArgument.h" #include "instance/reserved_classes/AbstractReservedClassDeclare.h" +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +#include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" namespace alinous { @@ -300,7 +303,12 @@ CodeElement* CodeElement::createFromBinary(ByteBuffer* in) { case RESERVED_CLASS_DECLARE: element = AbstractReservedClassDeclare::createFromBinary(in); break; - + case RESERVED_METHOD_DECLARE: + element = AbstractReservedMethodDeclare::createMethodFromBinary(in); + break; + case RESERVED_GENERICS_CLASS_DECLARE: + element =AbstractReservedGenericsClassDeclare::createFromBinary(in); + break; case TYPE_BOOL: element = new BoolType(); @@ -801,10 +809,20 @@ short CodeElement::getKind() const noexcept { } ClassDeclare* CodeElement::getClassDeclare() const { + if(this->kind == CodeElement::CLASS_DECLARE || this->kind == CodeElement::GENERICS_CLASS_DECLARE || + this->kind == CodeElement::RESERVED_CLASS_DECLARE || + this->kind == CodeElement::RESERVED_GENERICS_CLASS_DECLARE || + this->kind == CodeElement::GENERICS_GENERATED_CLASS_DECLARE + ){ + CodeElement* element = const_cast(this); + return dynamic_cast(element); + } + CodeElement* element = this->parent; while(element != nullptr && (element->kind != CodeElement::CLASS_DECLARE && element->kind != CodeElement::GENERICS_CLASS_DECLARE && element->kind != CodeElement::RESERVED_CLASS_DECLARE + && element->kind != CodeElement::RESERVED_GENERICS_CLASS_DECLARE && element->kind != CodeElement::GENERICS_GENERATED_CLASS_DECLARE)){ element = element->getParent(); } diff --git a/src_smartcontract/engine/sc/CodeElement.h b/src_smartcontract/engine/sc/CodeElement.h index 7ee8c45..ff13a26 100644 --- a/src_smartcontract/engine/sc/CodeElement.h +++ b/src_smartcontract/engine/sc/CodeElement.h @@ -45,19 +45,21 @@ class CodeElement { static const constexpr short GENERICS_PARAM{16}; static const constexpr short GENERICS_GENERATED_CLASS_DECLARE{17}; static const constexpr short RESERVED_CLASS_DECLARE{18}; - - - static const constexpr short TYPE_BOOL{20}; - static const constexpr short TYPE_BYTE{21}; - static const constexpr short TYPE_CHAR{22}; - static const constexpr short TYPE_SHORT{23}; - static const constexpr short TYPE_INT{24}; - static const constexpr short TYPE_LONG{25}; - static const constexpr short TYPE_STRING{26}; - static const constexpr short TYPE_VOID{27}; - static const constexpr short TYPE_OBJECT{28}; - static const constexpr short TYPE_DOM{29}; - static const constexpr short TYPE_GENERICS_OBJECT{30}; + static const constexpr short RESERVED_METHOD_DECLARE{19}; + static const constexpr short RESERVED_GENERICS_CLASS_DECLARE{20}; + + + static const constexpr short TYPE_BOOL{30}; + static const constexpr short TYPE_BYTE{31}; + static const constexpr short TYPE_CHAR{32}; + static const constexpr short TYPE_SHORT{33}; + static const constexpr short TYPE_INT{34}; + static const constexpr short TYPE_LONG{35}; + static const constexpr short TYPE_STRING{36}; + static const constexpr short TYPE_VOID{37}; + static const constexpr short TYPE_OBJECT{38}; + static const constexpr short TYPE_DOM{39}; + static const constexpr short TYPE_GENERICS_OBJECT{40}; static const constexpr short STMT_BLOCK{50}; static const constexpr short STMT_VARIABLE_DECLARE{51}; @@ -224,7 +226,8 @@ class CodeElement { CompilationUnit* getCompilationUnit() const; ClassDeclare* getClassDeclare() const; - const UnicodeString* getPackageName() const noexcept; + + virtual const UnicodeString* getPackageName() const noexcept; void copyCodePositions(const CodeElement* other) noexcept; diff --git a/src_smartcontract/engine/sc/CompilationUnit.cpp b/src_smartcontract/engine/sc/CompilationUnit.cpp index 18f1254..5a02bfc 100644 --- a/src_smartcontract/engine/sc/CompilationUnit.cpp +++ b/src_smartcontract/engine/sc/CompilationUnit.cpp @@ -185,7 +185,7 @@ CompilationUnit* CompilationUnit::generateGenericsImplement(HashMapclasses.size(); for(int i = 0; i != maxLoop; ++i){ ClassDeclare* clazz = this->classes.get(i); - ClassDeclare* copied = clazz->generateClassDeclare(input); + ClassDeclare* copied = clazz->generateGenericsImplement(input); inst->addClassDeclare(copied); } diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index 6d7be10..1e5eb1d 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -109,7 +109,6 @@ void SmartContract::addCompilationUnit(File* file, const File* base) { void SmartContract::analyze(VirtualMachine* vm) { const ArrayList* list = this->reservedClassRegistory->getReservedClassesList(); - CompilationUnit* reservedUnit = this->reservedClassRegistory->getUnit(); this->actx = new AnalyzeContext(this); this->actx->setVm(vm); @@ -126,6 +125,9 @@ void SmartContract::analyze(VirtualMachine* vm) { AnalyzedClass* cls = list->get(i); ClassDeclare* dec = cls->getClassDeclare(); + const UnicodeString* packageName = dec->getPackageName(); + CompilationUnit* reservedUnit = this->reservedClassRegistory->makeCompilantUnit(packageName); + dec->setParent(reservedUnit); dec->preAnalyze(actx); } diff --git a/src_smartcontract/engine/sc_analyze/PackageSpace.cpp b/src_smartcontract/engine/sc_analyze/PackageSpace.cpp index 5319612..62ea21d 100644 --- a/src_smartcontract/engine/sc_analyze/PackageSpace.cpp +++ b/src_smartcontract/engine/sc_analyze/PackageSpace.cpp @@ -47,12 +47,22 @@ PackageSpace::~PackageSpace() { } void PackageSpace::addClassDeclare(ClassDeclare* clazz) noexcept { +#ifdef __DEBUG__ + AnalyzedClass* ac = this->classes->get(clazz->getName()); + assert(ac == nullptr); +#endif + AnalyzedClass* aclazz = new AnalyzedClass(clazz); this->classes->put(clazz->getName(), aclazz); } void PackageSpace::addClassDeclare(AnalyzedClass* clazz) noexcept { +#ifdef __DEBUG__ + AnalyzedClass* ac = this->classes->get(clazz->getClassDeclare()->getName()); + assert(ac == nullptr); +#endif + this->classes->put(clazz->getClassDeclare()->getName(), clazz); } diff --git a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp index c25f769..2b1c34d 100644 --- a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp +++ b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp @@ -26,6 +26,7 @@ #include "base/StackRelease.h" #include "base/ArrayList.h" +#include "instance/reserved_classes/object/ObjectClassDeclare.h" namespace alinous { @@ -110,7 +111,7 @@ AnalyzedType* TypeResolver::resolveType(CodeElement* element, AbstractType* type } AnalyzedType* TypeResolver::resolveClassType(CodeElement* element, ObjectType* type) const { - PackageNameDeclare* pkg = type->getPackageName(); + PackageNameDeclare* pkg = type->getPackageNameDeclare(); const UnicodeString* name = type->getClassName(); // generics type @@ -172,6 +173,11 @@ AnalyzedType* TypeResolver::findClassType(const CodeElement* element, const Unic CompilationUnit* unit = element->getCompilationUnit(); ClassDeclare* clazz = element->getClassDeclare(); + // is Object + if(name->equals(&ObjectClassDeclare::NAME)){ + return findClassType(&ObjectClassDeclare::PACKAGE, &ObjectClassDeclare::NAME); + } + // find from generitics params, like T if(clazz->isGenerics()) { GenericsClassDeclare* gclazz = dynamic_cast(clazz); diff --git a/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp b/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp index f8d3e20..19489c1 100644 --- a/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp @@ -9,6 +9,10 @@ namespace alinous { +AccessControlDeclare::AccessControlDeclare(char accessCtrl) : CodeElement(CodeElement::ACCESS_CONTROL_DECLARE) { + this->accessCtrl = accessCtrl; +} + AccessControlDeclare::AccessControlDeclare() : CodeElement(CodeElement::ACCESS_CONTROL_DECLARE) { this->accessCtrl = 0; } diff --git a/src_smartcontract/lang/sc_declare/AccessControlDeclare.h b/src_smartcontract/lang/sc_declare/AccessControlDeclare.h index 6224c66..a06f26e 100644 --- a/src_smartcontract/lang/sc_declare/AccessControlDeclare.h +++ b/src_smartcontract/lang/sc_declare/AccessControlDeclare.h @@ -22,6 +22,7 @@ class AccessControlDeclare : public CodeElement { static const constexpr char PROTECTED{2}; static const constexpr char PRIVATE{3}; + explicit AccessControlDeclare(char accessCtrl); AccessControlDeclare(); virtual ~AccessControlDeclare(); diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp index cbeba6f..41f6068 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp @@ -222,6 +222,8 @@ int ClassDeclare::binarySize() const { int total = sizeof(uint16_t); + total += sizeof(uint8_t); + total += stringSize(this->name); total += sizeof(uint8_t); if(this->block != nullptr){ @@ -257,6 +259,8 @@ void ClassDeclare::toBinaryHead(ByteBuffer *out) const { } void ClassDeclare::toBinaryBody(ByteBuffer *out) const { + out->put(this->interface ? 1 : 0); + putString(out, this->name); out->put(this->block != nullptr ? (uint8_t)1 : (uint8_t)0); @@ -275,27 +279,9 @@ void ClassDeclare::toBinaryBody(ByteBuffer *out) const { } } -void ClassDeclare::setExtends(ClassExtends* extends) noexcept { - this->extends = extends; -} - -ClassExtends* ClassDeclare::getExtends() const noexcept { - return this->extends; -} - -void ClassDeclare::setImplements(ClassImplements* implements) noexcept { - this->implements = implements; -} - -void ClassDeclare::setInterface(bool interface) noexcept { - this->interface = interface; -} - -bool ClassDeclare::isInterface() const noexcept { - return this->interface; -} - void ClassDeclare::fromBinary(ByteBuffer* in) { + this->interface = (in->get() > 0 ? 1 : 0); + this->name = getString(in); uint8_t bl = in->get(); @@ -320,6 +306,26 @@ void ClassDeclare::fromBinary(ByteBuffer* in) { } } +void ClassDeclare::setExtends(ClassExtends* extends) noexcept { + this->extends = extends; +} + +ClassExtends* ClassDeclare::getExtends() const noexcept { + return this->extends; +} + +void ClassDeclare::setImplements(ClassImplements* implements) noexcept { + this->implements = implements; +} + +void ClassDeclare::setInterface(bool interface) noexcept { + this->interface = interface; +} + +bool ClassDeclare::isInterface() const noexcept { + return this->interface; +} + ClassDeclare* ClassDeclare::getBaseClass() const noexcept { if(this->extends == nullptr){ return nullptr; @@ -346,11 +352,11 @@ ArrayList* ClassDeclare::getMemberVariables() noexcept { return this->block->getMemberVariables(); } -IVmInstanceFactory* alinous::ClassDeclare::getFactory() const noexcept { +IVmInstanceFactory* ClassDeclare::getFactory() const noexcept { return nullptr; } -ClassDeclare* ClassDeclare::generateClassDeclare(HashMap *input) { +ClassDeclare* ClassDeclare::generateGenericsImplement(HashMap *input) { ClassDeclare* clazz = new ClassDeclare(); clazz->copyCodePositions(this); diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.h b/src_smartcontract/lang/sc_declare/ClassDeclare.h index 9ed12c2..49854de 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.h @@ -57,15 +57,13 @@ class ClassDeclare : public CodeElement { ClassExtends* getExtends() const noexcept; - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; virtual const UnicodeString* getConstructorName() const noexcept; virtual int binarySize() const; virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); - virtual ClassDeclare* generateClassDeclare(HashMap* input); + virtual ClassDeclare* generateGenericsImplement(HashMap* input); protected: @@ -78,6 +76,8 @@ class ClassDeclare : public CodeElement { int getInheritIndex() const noexcept; void setInheritIndex(int inheritIndex) noexcept; + virtual const UnicodeString* getName() const noexcept; + virtual const UnicodeString* getFullQualifiedName() noexcept; virtual ArrayList* getMethods() noexcept; virtual ArrayList* getMemberVariables() noexcept; diff --git a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.cpp b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.cpp index 2f46feb..8b2e31e 100644 --- a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.cpp @@ -27,6 +27,10 @@ namespace alinous { +GenericsClassDeclare::GenericsClassDeclare(short kind) : ClassDeclare(kind) { + this->genericsParams = new ArrayList(); +} + // GENERICS_CLASS_DECLARE GenericsClassDeclare::GenericsClassDeclare() : ClassDeclare(GENERICS_CLASS_DECLARE) { this->genericsParams = new ArrayList(); @@ -142,7 +146,7 @@ const GenericsParameter* GenericsClassDeclare::findGenericsType(const UnicodeStr return retParam; } -ClassDeclare* GenericsClassDeclare::generateClassDeclare(HashMap* input) { +ClassDeclare* GenericsClassDeclare::generateGenericsImplement(HashMap* input) { GenericsGeneratedClassDeclare* clazz = new GenericsGeneratedClassDeclare(); clazz->copyCodePositions(this); clazz->setGenericsClassDeclare(this); diff --git a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h index 6bc7005..c4ecadb 100644 --- a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h @@ -21,6 +21,7 @@ class AbstractType; class GenericsClassDeclare : public ClassDeclare { public: + GenericsClassDeclare(short kind); GenericsClassDeclare(); virtual ~GenericsClassDeclare(); @@ -44,7 +45,7 @@ class GenericsClassDeclare : public ClassDeclare { return this->genericsParams; } - virtual ClassDeclare* generateClassDeclare(HashMap* input); + virtual ClassDeclare* generateGenericsImplement(HashMap* input); virtual void init(VirtualMachine* vm); diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index f993008..0165ca2 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -30,6 +30,19 @@ namespace alinous { +MethodDeclare::MethodDeclare(short kind) : CodeElement(kind) { + this->_static = false; + this->name = nullptr; + this->ctrl = nullptr; + this->type = nullptr; + this->args = nullptr; + this->block = nullptr; + this->atype = nullptr; + this->callSig = nullptr; + this->fqn = nullptr; + this->strName = nullptr; +} + MethodDeclare::MethodDeclare() : CodeElement(CodeElement::METHOD_DECLARE) { this->_static = false; this->name = nullptr; @@ -63,6 +76,12 @@ void MethodDeclare::preAnalyze(AnalyzeContext* actx) { this->args->setParent(this); this->args->preAnalyze(actx); + if(this->type != nullptr){ + this->type->preAnalyze(actx); + this->type->setParent(this); + actx->detectGenericsType(this->type); + } + if(this->block != nullptr){ this->block->setParent(this); this->block->preAnalyze(actx); @@ -71,17 +90,23 @@ void MethodDeclare::preAnalyze(AnalyzeContext* actx) { this->block->adjustDecalutConstructorCall(actx); } } - - if(this->type != nullptr){ - this->type->preAnalyze(actx); - this->type->setParent(this); - actx->detectGenericsType(this->type); - } } void MethodDeclare::analyzeTypeRef(AnalyzeContext* actx) { TypeResolver* typeResolver = actx->getTypeResolver(); + analyzeTypeRefBody(actx, typeResolver); + + if(this->block != nullptr){ + // set this pointer on analysis phase + AnalyzedClass* aclass = actx->getAnalyzedClass(this); + AnalyzedThisClassStackPopper thisStack(actx, aclass); + + this->block->analyzeTypeRef(actx); + } +} + +void MethodDeclare::analyzeTypeRefBody(AnalyzeContext *actx, TypeResolver* typeResolver) { if(!isConstructor()){ if(this->type == nullptr){ actx->addValidationError(ValidationError::CODE_NO_RETURN_METHOD_VALUE, this, L"Return type of method '{0}()' does not exists.", {this->name}); @@ -96,14 +121,6 @@ void MethodDeclare::analyzeTypeRef(AnalyzeContext* actx) { this->args->analyzeTypeRef(actx); - if(this->block != nullptr){ - // set this pointer on analysis phase - AnalyzedClass* aclass = actx->getAnalyzedClass(this); - AnalyzedThisClassStackPopper thisStack(actx, aclass); - - this->block->analyzeTypeRef(actx); - } - if(this->type != nullptr){ this->type->analyzeTypeRef(actx); } @@ -115,13 +132,13 @@ void MethodDeclare::analyze(AnalyzeContext* actx) { AnalyzedClass* aclass = actx->getAnalyzedClass(this); AnalyzedThisClassStackPopper thisStack(actx, aclass); - if(this->block != nullptr){ - this->block->analyze(actx); - } - if(this->type != nullptr){ this->type->analyze(actx); } + + if(this->block != nullptr){ + this->block->analyze(actx); + } } void MethodDeclare::setStatic(bool s) noexcept { diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.h b/src_smartcontract/lang/sc_declare/MethodDeclare.h index 5156d09..f9f0b37 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.h +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.h @@ -24,15 +24,18 @@ class FunctionArguments; class VirtualMachine; class AbstractVmInstance; class AbstractType; +class TypeResolver; + class MethodDeclare : public CodeElement { public: + explicit MethodDeclare(short kind); MethodDeclare(); virtual ~MethodDeclare(); - void preAnalyze(AnalyzeContext* actx); - void analyzeTypeRef(AnalyzeContext* actx); - void analyze(AnalyzeContext* actx); + virtual void preAnalyze(AnalyzeContext* actx); + virtual void analyzeTypeRef(AnalyzeContext* actx); + virtual void analyze(AnalyzeContext* actx); void setAccessControl(AccessControlDeclare* ctrl) noexcept; void setType(AbstractType* type) noexcept; @@ -55,14 +58,17 @@ class MethodDeclare : public CodeElement { virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); - void init(VirtualMachine* vm); - void interpret(FunctionArguments* args, VirtualMachine* vm); + virtual void init(VirtualMachine* vm); + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); + + virtual const UnicodeString* toString(); - const UnicodeString* toString(); + virtual MethodDeclare* generateGenericsImplement(HashMap *input) const; - MethodDeclare* generateGenericsImplement(HashMap *input) const; +protected: + void analyzeTypeRefBody(AnalyzeContext* actx, TypeResolver* typeResolver); -private: +protected: AccessControlDeclare* ctrl; AbstractType* type; UnicodeString* name; diff --git a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp index cd0c858..a9910bc 100644 --- a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp @@ -62,8 +62,7 @@ int PackageNameDeclare::binarySize() const { int maxLoop = this->list.size(); for(int i = 0; i != maxLoop; ++i){ UnicodeString* str = this->list.get(i); - total += sizeof(uint32_t); - total += str->length() * sizeof(uint16_t); + total += stringSize(str); } return total; diff --git a/src_smartcontract/lang/sc_declare_types/DomType.cpp b/src_smartcontract/lang/sc_declare_types/DomType.cpp index a871b1d..2cb044e 100644 --- a/src_smartcontract/lang/sc_declare_types/DomType.cpp +++ b/src_smartcontract/lang/sc_declare_types/DomType.cpp @@ -30,7 +30,7 @@ int DomType::binarySize() const { return total; } -void DomType::toBinary(ByteBuffer* out) { +void DomType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_DOM); AbstractType::toBinary(out); } diff --git a/src_smartcontract/lang/sc_declare_types/DomType.h b/src_smartcontract/lang/sc_declare_types/DomType.h index f62fbc3..71fdb0f 100644 --- a/src_smartcontract/lang/sc_declare_types/DomType.h +++ b/src_smartcontract/lang/sc_declare_types/DomType.h @@ -20,7 +20,7 @@ class DomType : public AbstractType { virtual ~DomType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/GenericsObjectType.cpp b/src_smartcontract/lang/sc_declare_types/GenericsObjectType.cpp index 4791779..ff245b1 100644 --- a/src_smartcontract/lang/sc_declare_types/GenericsObjectType.cpp +++ b/src_smartcontract/lang/sc_declare_types/GenericsObjectType.cpp @@ -40,7 +40,7 @@ GenericsObjectType::GenericsObjectType() : ObjectType(TYPE_GENERICS_OBJECT) { } GenericsObjectType::GenericsObjectType(const ObjectType *objectType) : ObjectType(TYPE_GENERICS_OBJECT) { - const PackageNameDeclare* package = objectType->getPackageName(); + const PackageNameDeclare* package = objectType->getPackageNameDeclare(); this->packageName = package != nullptr ? new PackageNameDeclare(*package) : nullptr; this->className = new UnicodeString(objectType->getClassName()); @@ -70,7 +70,7 @@ int GenericsObjectType::binarySize() const { return total; } -void GenericsObjectType::toBinary(ByteBuffer *out) { +void GenericsObjectType::toBinary(ByteBuffer *out) const { ObjectType::toBinary(out); int maxLoop = this->genericsType->size(); diff --git a/src_smartcontract/lang/sc_declare_types/GenericsObjectType.h b/src_smartcontract/lang/sc_declare_types/GenericsObjectType.h index 8733f7e..956ba70 100644 --- a/src_smartcontract/lang/sc_declare_types/GenericsObjectType.h +++ b/src_smartcontract/lang/sc_declare_types/GenericsObjectType.h @@ -24,7 +24,7 @@ class GenericsObjectType : public ObjectType { virtual ~GenericsObjectType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); void addGenericsType(AbstractType* type) noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/IntType.cpp b/src_smartcontract/lang/sc_declare_types/IntType.cpp index f363901..9d7b5bd 100644 --- a/src_smartcontract/lang/sc_declare_types/IntType.cpp +++ b/src_smartcontract/lang/sc_declare_types/IntType.cpp @@ -30,7 +30,7 @@ int IntType::binarySize() const { return total; } -void IntType::toBinary(ByteBuffer* out) { +void IntType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_INT); AbstractType::toBinary(out); } diff --git a/src_smartcontract/lang/sc_declare_types/IntType.h b/src_smartcontract/lang/sc_declare_types/IntType.h index 8d7dc77..5eb7a99 100644 --- a/src_smartcontract/lang/sc_declare_types/IntType.h +++ b/src_smartcontract/lang/sc_declare_types/IntType.h @@ -20,7 +20,7 @@ class IntType : public AbstractPrimitiveType { virtual ~IntType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/LongType.cpp b/src_smartcontract/lang/sc_declare_types/LongType.cpp index e27bb56..1d2e226 100644 --- a/src_smartcontract/lang/sc_declare_types/LongType.cpp +++ b/src_smartcontract/lang/sc_declare_types/LongType.cpp @@ -28,7 +28,7 @@ int LongType::binarySize() const { return total; } -void LongType::toBinary(ByteBuffer* out) { +void LongType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_LONG); AbstractType::toBinary(out); } diff --git a/src_smartcontract/lang/sc_declare_types/LongType.h b/src_smartcontract/lang/sc_declare_types/LongType.h index 0198372..2447601 100644 --- a/src_smartcontract/lang/sc_declare_types/LongType.h +++ b/src_smartcontract/lang/sc_declare_types/LongType.h @@ -20,7 +20,7 @@ class LongType : public AbstractPrimitiveType { virtual ~LongType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/ObjectType.cpp b/src_smartcontract/lang/sc_declare_types/ObjectType.cpp index 964593b..7f33fc6 100644 --- a/src_smartcontract/lang/sc_declare_types/ObjectType.cpp +++ b/src_smartcontract/lang/sc_declare_types/ObjectType.cpp @@ -39,7 +39,6 @@ void ObjectType::setPackageName(PackageNameDeclare* packageName) noexcept { int ObjectType::binarySize() const { int total = sizeof(uint16_t); - total += AbstractType::binarySize(); total += sizeof(uint8_t); if(this->packageName != nullptr){ @@ -48,10 +47,12 @@ int ObjectType::binarySize() const { total += stringSize(this->className); + total += AbstractType::binarySize(); + return total; } -void ObjectType::toBinary(ByteBuffer* out) { +void ObjectType::toBinary(ByteBuffer* out) const { out->putShort(this->kind); bool bl = this->packageName != nullptr; @@ -94,7 +95,7 @@ void ObjectType::setName(UnicodeString* className) noexcept { this->className = className; } -PackageNameDeclare* ObjectType::getPackageName() const noexcept { +PackageNameDeclare* ObjectType::getPackageNameDeclare() const noexcept { return this->packageName; } diff --git a/src_smartcontract/lang/sc_declare_types/ObjectType.h b/src_smartcontract/lang/sc_declare_types/ObjectType.h index b799693..69aad9b 100644 --- a/src_smartcontract/lang/sc_declare_types/ObjectType.h +++ b/src_smartcontract/lang/sc_declare_types/ObjectType.h @@ -22,7 +22,7 @@ class ObjectType : public AbstractType { virtual ~ObjectType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; @@ -31,7 +31,7 @@ class ObjectType : public AbstractType { void setPackageName(PackageNameDeclare* packageName) noexcept; void setName(UnicodeString* className) noexcept; - PackageNameDeclare* getPackageName() const noexcept; + PackageNameDeclare* getPackageNameDeclare() const noexcept; virtual const UnicodeString* getClassName() const noexcept; virtual void visit(ITypeVisitor* visitor); diff --git a/src_smartcontract/lang/sc_declare_types/ShortType.cpp b/src_smartcontract/lang/sc_declare_types/ShortType.cpp index 5924080..57bd671 100644 --- a/src_smartcontract/lang/sc_declare_types/ShortType.cpp +++ b/src_smartcontract/lang/sc_declare_types/ShortType.cpp @@ -28,7 +28,7 @@ int ShortType::binarySize() const { return total; } -void ShortType::toBinary(ByteBuffer* out) { +void ShortType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_SHORT); AbstractType::toBinary(out); } diff --git a/src_smartcontract/lang/sc_declare_types/ShortType.h b/src_smartcontract/lang/sc_declare_types/ShortType.h index 8e53236..50e0225 100644 --- a/src_smartcontract/lang/sc_declare_types/ShortType.h +++ b/src_smartcontract/lang/sc_declare_types/ShortType.h @@ -20,7 +20,7 @@ class ShortType : public AbstractPrimitiveType { virtual ~ShortType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/StringType.cpp b/src_smartcontract/lang/sc_declare_types/StringType.cpp index d54bcd9..f739cd1 100644 --- a/src_smartcontract/lang/sc_declare_types/StringType.cpp +++ b/src_smartcontract/lang/sc_declare_types/StringType.cpp @@ -28,7 +28,7 @@ int StringType::binarySize() const { return total; } -void StringType::toBinary(ByteBuffer* out) { +void StringType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_STRING); AbstractType::toBinary(out); } diff --git a/src_smartcontract/lang/sc_declare_types/StringType.h b/src_smartcontract/lang/sc_declare_types/StringType.h index d71c638..b292ada 100644 --- a/src_smartcontract/lang/sc_declare_types/StringType.h +++ b/src_smartcontract/lang/sc_declare_types/StringType.h @@ -20,7 +20,7 @@ class StringType : public AbstractType { virtual ~StringType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_declare_types/VoidType.cpp b/src_smartcontract/lang/sc_declare_types/VoidType.cpp index 5183ebe..33e2215 100644 --- a/src_smartcontract/lang/sc_declare_types/VoidType.cpp +++ b/src_smartcontract/lang/sc_declare_types/VoidType.cpp @@ -28,7 +28,7 @@ int VoidType::binarySize() const { return total; } -void VoidType::toBinary(ByteBuffer* out) { +void VoidType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_VOID); } diff --git a/src_smartcontract/lang/sc_declare_types/VoidType.h b/src_smartcontract/lang/sc_declare_types/VoidType.h index 2de3210..487a9df 100644 --- a/src_smartcontract/lang/sc_declare_types/VoidType.h +++ b/src_smartcontract/lang/sc_declare_types/VoidType.h @@ -20,7 +20,7 @@ class VoidType : public AbstractType { virtual ~VoidType(); virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); virtual const UnicodeString* toString() noexcept; diff --git a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp index 9a4f996..8190550 100644 --- a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp +++ b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp @@ -124,9 +124,10 @@ void ConstructorCall::toBinary(ByteBuffer* out) const { } void ConstructorCall::fromBinary(ByteBuffer* in) { - CodeElement* element = createFromBinary(in); - checkIsExp(element); + CodeElement* element = createFromBinary(in); __STP(element); this->name = dynamic_cast(element); + checkNotNull(element); + __STP_MV(element); int maxLoop = in->getInt(); for(int i = 0; i != maxLoop; ++i){ diff --git a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp index e882455..5a50d32 100644 --- a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp +++ b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp @@ -55,6 +55,8 @@ void DatabaseExceptionClassDeclare::throwException(const UnicodeString* msg, Vir DatabaseExceptionClassDeclare::DatabaseExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + this->extends = new ClassExtends(); this->extends->setClassName(&ExceptionClassDeclare::NAME); } @@ -63,14 +65,6 @@ DatabaseExceptionClassDeclare::~DatabaseExceptionClassDeclare() { } -const UnicodeString* DatabaseExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* DatabaseExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* DatabaseExceptionClassDeclare::getBaseClass() const noexcept { AnalyzedType* atype = this->extends->getAnalyzedType(); AnalyzedClass* aclass = atype->getAnalyzedClass(); diff --git a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h index 77b5b19..1f820c3 100644 --- a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h +++ b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h @@ -25,9 +25,6 @@ class DatabaseExceptionClassDeclare : public AbstractExceptionClassDeclare { return TYPE_DATABASE_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/CMakeLists.txt b/src_smartcontract_vm/CMakeLists.txt index 8717ea1..19fb2a8 100644 --- a/src_smartcontract_vm/CMakeLists.txt +++ b/src_smartcontract_vm/CMakeLists.txt @@ -17,7 +17,11 @@ add_subdirectory(instance/instance_ref_class_static_meta) add_subdirectory(instance/instance_ref_static) add_subdirectory(instance/instance_string) add_subdirectory(instance/reserved_classes) +add_subdirectory(instance/reserved_classes/bigint) +add_subdirectory(instance/reserved_classes/list) +add_subdirectory(instance/reserved_classes/object) add_subdirectory(instance/reserved_classes_string) +add_subdirectory(instance/reserved_generics) add_subdirectory(vm) add_subdirectory(vm/memory) add_subdirectory(vm/stack) diff --git a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp index 8c33c86..8b09983 100644 --- a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp @@ -52,6 +52,11 @@ ExtClassObject* ExtClassObject::getExtClassObject(const UnicodeString* name) con return dynamic_cast(obj); } +ExtClassObject* ExtClassObject::getExtClassObject(const wchar_t *name) const noexcept { + UnicodeString __name(name); + return getExtClassObject(&__name); +} + ExtExceptionObject* ExtClassObject::getExtExceptionObject(const UnicodeString* name) const noexcept { AbstractExtObject* obj = this->map->get(name); diff --git a/src_smartcontract_vm/ext_binary/ExtClassObject.h b/src_smartcontract_vm/ext_binary/ExtClassObject.h index 844b2fd..cbd931e 100644 --- a/src_smartcontract_vm/ext_binary/ExtClassObject.h +++ b/src_smartcontract_vm/ext_binary/ExtClassObject.h @@ -31,6 +31,7 @@ class ExtClassObject : public AbstractExtObject { void add(AbstractExtObject* obj) noexcept; ExtPrimitiveObject* getExtPrimitiveObject(const UnicodeString* name) const noexcept; ExtClassObject* getExtClassObject(const UnicodeString* name) const noexcept; + ExtClassObject* getExtClassObject(const wchar_t* name) const noexcept; ExtArrayObject* getExtArrayObject(const UnicodeString* name) const noexcept; ExtStringClass* getExtStringObject(const UnicodeString* name)const noexcept; ExtExceptionObject* getExtExceptionObject(const UnicodeString* name)const noexcept; diff --git a/src_smartcontract_vm/instance/VmInstanceTypesConst.h b/src_smartcontract_vm/instance/VmInstanceTypesConst.h index 181d249..4eb432c 100644 --- a/src_smartcontract_vm/instance/VmInstanceTypesConst.h +++ b/src_smartcontract_vm/instance/VmInstanceTypesConst.h @@ -22,7 +22,6 @@ class VmInstanceTypesConst { static constexpr uint8_t INST_DOM_ARRAY{6}; static constexpr uint8_t INST_EXCEPTION{10}; - static constexpr uint8_t INST_BIG_INT{11}; static constexpr uint8_t REF_ROOT{100}; static constexpr uint8_t REF_OBJ{101}; diff --git a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp index 1978b0b..31b8018 100644 --- a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp @@ -31,6 +31,8 @@ UnicodeString ArrayOutOfBoundsExceptionClassDeclare::NAME{L"ArrayOutOfBoundsExce ArrayOutOfBoundsExceptionClassDeclare::ArrayOutOfBoundsExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + this->extends = new ClassExtends(); this->extends->setClassName(&ExceptionClassDeclare::NAME); } @@ -61,14 +63,6 @@ ArrayOutOfBoundsExceptionClassDeclare::~ArrayOutOfBoundsExceptionClassDeclare() } -const UnicodeString* ArrayOutOfBoundsExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* ArrayOutOfBoundsExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* ArrayOutOfBoundsExceptionClassDeclare::getBaseClass() const noexcept { AnalyzedType* atype = this->extends->getAnalyzedType(); AnalyzedClass* aclass = atype->getAnalyzedClass(); diff --git a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h index 4acd3cd..611d7dc 100644 --- a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h @@ -25,9 +25,6 @@ class ArrayOutOfBoundsExceptionClassDeclare : public AbstractExceptionClassDecla return TYPE_ARRAY_OUT_OF_BOUNDS_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp index 7df3e72..6860af5 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp @@ -33,6 +33,8 @@ UnicodeString NullPointerExceptionClassDeclare::NAME{L"NullPointerException"}; NullPointerExceptionClassDeclare::NullPointerExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + this->extends = new ClassExtends(); this->extends->setClassName(&ExceptionClassDeclare::NAME); } @@ -63,14 +65,6 @@ NullPointerExceptionClassDeclare::~NullPointerExceptionClassDeclare() { } -const UnicodeString* NullPointerExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* NullPointerExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* NullPointerExceptionClassDeclare::getBaseClass() const noexcept { AnalyzedType* atype = this->extends->getAnalyzedType(); AnalyzedClass* aclass = atype->getAnalyzedClass(); diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h index d5152d3..2c9dfcb 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h @@ -25,9 +25,6 @@ class NullPointerExceptionClassDeclare : public AbstractExceptionClassDeclare { return TYPE_NULL_POINTER_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp index 2027cef..2d0c123 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp @@ -32,6 +32,8 @@ UnicodeString TypeCastExceptionClassDeclare::NAME{L"TypeCastException"}; TypeCastExceptionClassDeclare::TypeCastExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + this->extends = new ClassExtends(); this->extends->setClassName(&ExceptionClassDeclare::NAME); } @@ -61,14 +63,6 @@ void TypeCastExceptionClassDeclare::throwException(VirtualMachine* vm, const Cod TypeCastExceptionClassDeclare::~TypeCastExceptionClassDeclare() { } -const UnicodeString* TypeCastExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* TypeCastExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* TypeCastExceptionClassDeclare::getBaseClass() const noexcept { AnalyzedType* atype = this->extends->getAnalyzedType(); AnalyzedClass* aclass = atype->getAnalyzedClass(); diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h index d89e508..dc7c291 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h @@ -25,9 +25,6 @@ class TypeCastExceptionClassDeclare : public AbstractExceptionClassDeclare { return TYPE_TYPE_CAST_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp index 2123c76..2a4d37c 100644 --- a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp @@ -35,6 +35,8 @@ UnicodeString ZeroDivisionExceptionClassDeclare::NAME{L"ZeroDivisionException"}; ZeroDivisionExceptionClassDeclare::ZeroDivisionExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + this->extends = new ClassExtends(); this->extends->setClassName(&ExceptionClassDeclare::NAME); } @@ -65,14 +67,6 @@ ZeroDivisionExceptionClassDeclare::~ZeroDivisionExceptionClassDeclare() { } -const UnicodeString* ZeroDivisionExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* ZeroDivisionExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* ZeroDivisionExceptionClassDeclare::getBaseClass() const noexcept { AnalyzedType* atype = this->extends->getAnalyzedType(); AnalyzedClass* aclass = atype->getAnalyzedClass(); diff --git a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.h index 0af2d42..c205541 100644 --- a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.h @@ -26,9 +26,6 @@ class ZeroDivisionExceptionClassDeclare : public AbstractExceptionClassDeclare { return TYPE_ZERO_DIVISION_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.cpp index 84c4d8e..a6ad0f9 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.cpp @@ -8,8 +8,14 @@ #include "instance/instance_exception_class/AbstractExceptionClassDeclare.h" #include "engine/sc_analyze/AnalyzedClass.h" + +#include "base/UnicodeString.h" + + namespace alinous { +const UnicodeString AbstractExceptionClassDeclare::PACKAGE_NAME(L"lang"); + AbstractExceptionClassDeclare::AbstractExceptionClassDeclare() : AbstractReservedClassDeclare() { } @@ -18,4 +24,8 @@ AbstractExceptionClassDeclare::~AbstractExceptionClassDeclare() { } +const alinous::UnicodeString* AbstractExceptionClassDeclare::getPackageName() const noexcept { + return &PACKAGE_NAME; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.h index fa6b7cc..ac653c4 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception_class/AbstractExceptionClassDeclare.h @@ -16,8 +16,12 @@ class AnalyzedClass; class AbstractExceptionClassDeclare : public AbstractReservedClassDeclare { public: + static const UnicodeString PACKAGE_NAME; + AbstractExceptionClassDeclare(); virtual ~AbstractExceptionClassDeclare(); + + virtual const UnicodeString* getPackageName() const noexcept; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp index 23556be..18bfa52 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp @@ -25,6 +25,8 @@ UnicodeString ExceptionClassDeclare::NAME{L"Exception"}; ExceptionClassDeclare::ExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); + this->name = new UnicodeString(&NAME); + MemberVariableDeclare* message = new MemberVariableDeclare(); message->setAccessControl(AccessControlDeclare::PROTECTED); message->setType(new StringType()); @@ -44,14 +46,6 @@ AnalyzedClass* ExceptionClassDeclare::createAnalyzedClass() noexcept { return aclass; } -const UnicodeString* ExceptionClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* ExceptionClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - ClassDeclare* ExceptionClassDeclare::getBaseClass() const noexcept { return nullptr; } diff --git a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h index ed74554..7bd001e 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h @@ -26,9 +26,6 @@ class ExceptionClassDeclare : public AbstractExceptionClassDeclare { return TYPE_EXCEPTION; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_gc/ReferenceStatus.h b/src_smartcontract_vm/instance/instance_gc/ReferenceStatus.h index 67afd35..8beb56a 100644 --- a/src_smartcontract_vm/instance/instance_gc/ReferenceStatus.h +++ b/src_smartcontract_vm/instance/instance_gc/ReferenceStatus.h @@ -41,7 +41,7 @@ class ReferenceStatus { IAbstractVmInstanceSubstance* instance; ArrayList ownerList; - ArrayList terminalOwnerList; + ArrayList terminalOwnerList; // references from root and stack to make cyclic removel fast }; diff --git a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp index a82009f..6e8c144 100644 --- a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp @@ -9,14 +9,18 @@ #include "instance/VmClassInstance.h" #include "instance/VmInstanceTypesConst.h" +#include "instance/AbstractVmInstance.h" + #include "instance/instance_gc/GcManager.h" #include "instance/instance_string/VmStringInstance.h" +#include "instance/reserved_classes/AbstractVmReservedInstance.h" + #include "ext_binary/ExtStringClass.h" #include "ext_binary/ExtNullPtrObject.h" -#include "instance/AbstractVmInstance.h" + namespace alinous { ObjectReference::ObjectReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint8_t instanceType) : AbstractReference(owner, type) { @@ -42,6 +46,14 @@ ObjectReference* ObjectReference::createStringReference(IAbstractVmInstanceSubst return ref; } +ObjectReference* ObjectReference::createReservedClassObjectReference(IAbstractVmInstanceSubstance *owner, AbstractVmReservedInstance *clazzInst, VirtualMachine *vm) { + ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE); + ref->setInstance(clazzInst); + + return ref; +} + + bool ObjectReference::isPrimitive() const noexcept { return false; } diff --git a/src_smartcontract_vm/instance/instance_ref/ObjectReference.h b/src_smartcontract_vm/instance/instance_ref/ObjectReference.h index fc7f98b..16baf25 100644 --- a/src_smartcontract_vm/instance/instance_ref/ObjectReference.h +++ b/src_smartcontract_vm/instance/instance_ref/ObjectReference.h @@ -14,6 +14,7 @@ namespace alinous { class AbstractVmInstance; class VmStringInstance; +class AbstractVmReservedInstance; class ObjectReference : public AbstractReference { public: @@ -25,6 +26,7 @@ class ObjectReference : public AbstractReference { static ObjectReference* createObjectReference(IAbstractVmInstanceSubstance* owner, VmClassInstance* clazzInst, VirtualMachine* vm); static ObjectReference* createStringReference(IAbstractVmInstanceSubstance* owner, VmStringInstance* clazzInst, VirtualMachine* vm); + static ObjectReference* createReservedClassObjectReference(IAbstractVmInstanceSubstance* owner, AbstractVmReservedInstance* clazzInst, VirtualMachine* vm); virtual bool isPrimitive() const noexcept; virtual IAbstractVmInstanceSubstance* getInstance() noexcept; diff --git a/src_smartcontract_vm/instance/instance_string/VmStringInstance.h b/src_smartcontract_vm/instance/instance_string/VmStringInstance.h index c9fe3c9..0a7dbbc 100644 --- a/src_smartcontract_vm/instance/instance_string/VmStringInstance.h +++ b/src_smartcontract_vm/instance/instance_string/VmStringInstance.h @@ -24,6 +24,7 @@ class VmStringInstance : public AbstractVmInstance, public IAbstractVmInstanceSu VmStringInstance(VirtualMachine* vm, const UnicodeString* str); virtual ~VmStringInstance(); + // AbstractVmInstance virtual IAbstractVmInstanceSubstance* getInstance() noexcept; virtual int valueCompare(const IAbstractVmInstanceSubstance* right) const noexcept; virtual AbstractReference* wrap(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm); @@ -31,6 +32,7 @@ class VmStringInstance : public AbstractVmInstance, public IAbstractVmInstanceSu virtual AnalyzedType getRuntimeType() const noexcept; virtual int hashCode() const noexcept; + // IAbstractVmInstanceSubstance virtual const VMemList* getInstReferences() const noexcept; virtual int instHashCode() const noexcept; virtual bool instIsPrimitive() const noexcept; diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp index a6b5bc0..cf53d60 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp @@ -15,6 +15,7 @@ #include "base/ArrayList.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" #include "lang/sc_declare/AccessControlDeclare.h" #include "lang/sc_declare/ArgumentsListDeclare.h" @@ -41,6 +42,8 @@ #include "trx/transaction_exception/DatabaseExceptionClassDeclare.h" +#include "instance/reserved_classes/object/ObjectClassDeclare.h" + namespace alinous { @@ -64,6 +67,10 @@ ArrayList* AbstractReservedClassDeclare::getMethods() noexcept { return this->methods; } +ArrayList* AbstractReservedClassDeclare::getMemberVariables() noexcept { + return this->members; +} + void AbstractReservedClassDeclare::preAnalyze(AnalyzeContext* actx) { if(this->extends != nullptr){ this->extends->setParent(this); @@ -106,11 +113,9 @@ void AbstractReservedClassDeclare::analyzeTypeRef(AnalyzeContext* actx) { member->analyzeTypeRef(actx); } - ReservedClassRegistory* reg = actx->getReservedClassRegistory(); - CompilationUnit* unit = reg->getUnit(); - PackageSpace* space = actx->getPackegeSpace(unit->getPackageName()); + PackageSpace* space = actx->getPackegeSpace(this->getPackageName()); - const UnicodeString* fqn = getFullQualifiedName(); + const UnicodeString* fqn = getName(); AnalyzedClass* dec = space->getClass(fqn); // set analyzed class @@ -136,10 +141,6 @@ void AbstractReservedClassDeclare::analyze(AnalyzeContext* actx) { } } -ArrayList* AbstractReservedClassDeclare::getMemberVariables() noexcept { - return this->members; -} - void AbstractReservedClassDeclare::addDefaultConstructor(const UnicodeString* className) noexcept { MethodDeclare* m = new MethodDeclare(); this->methods->addElement(m); @@ -185,6 +186,9 @@ AbstractReservedClassDeclare* AbstractReservedClassDeclare::createFromBinary(Byt case TYPE_ZERO_DIVISION_EXCEPTION: ret = new ZeroDivisionExceptionClassDeclare(); break; + case TYPE_OBJECT: + ret = new ObjectClassDeclare(); + break; default: throw new BinaryFormatException(__FILE__, __LINE__); } @@ -195,22 +199,132 @@ AbstractReservedClassDeclare* AbstractReservedClassDeclare::createFromBinary(Byt } int AbstractReservedClassDeclare::binarySize() const { - int total = ClassDeclare::binarySize(); + checkNotNull(this->block); + + int total = sizeof(uint16_t); // toBinaryHead(out); + + total += sizeof(uint16_t); // out->putShort(getClassType()); + + total += stringSize(this->name); + + total += sizeof(uint8_t); + if(this->extends != nullptr){ + total += this->extends->binarySize(); + } + + total += sizeof(uint8_t); + if(this->implements != nullptr){ + total += this->implements->binarySize(); + } + total += sizeof(uint16_t); + int maxLoop = this->methods->size(); + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* method = this->methods->get(i); + + total += method->binarySize(); + } + + total += sizeof(uint16_t); + maxLoop = this->members->size(); + for(int i = 0; i != maxLoop; ++i){ + MemberVariableDeclare* member = this->members->get(i); + + total += member->binarySize(); + } return total; } -void AbstractReservedClassDeclare::toBinary(ByteBuffer *out) { - toBinaryCheck(out); +void AbstractReservedClassDeclare::toBinary(ByteBuffer *out) const { + checkNotNull(this->name); + toBinaryHead(out); out->putShort(getClassType()); - toBinaryBody(out); + putString(out, this->name); + + out->put(this->extends != nullptr ? (uint8_t)1 : (uint8_t)0); + if(this->extends != nullptr){ + this->extends->toBinary(out); + } + + out->put(this->implements != nullptr ? (uint8_t)1 : (uint8_t)0); + if(this->implements != nullptr){ + this->implements->toBinary(out); + } + + int maxLoop = this->methods->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* method = this->methods->get(i); + + method->toBinary(out); + } + + maxLoop = this->members->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + MemberVariableDeclare* member = this->members->get(i); + + member->toBinary(out); + } } void AbstractReservedClassDeclare::fromBinary(ByteBuffer *in) { - ClassDeclare::fromBinary(in); + this->name = getString(in); + + bool bl = in->get(); + if(bl == 1){ + CodeElement* element = CodeElement::createFromBinary(in); + checkKind(element, CodeElement::CLASS_EXTENDS); + this->extends = dynamic_cast(element); + } + + bl = in->get(); + if(bl == 1){ + CodeElement* element = CodeElement::createFromBinary(in); + checkKind(element, CodeElement::CLASS_IMPLEMENTS); + this->implements = dynamic_cast(element); + } + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + CodeElement* element = CodeElement::createFromBinary(in); __STP(element); + MethodDeclare* method = dynamic_cast(element); + + checkNotNull(method); + __STP_MV(element); + + this->methods->addElement(method); + } + + maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + CodeElement* element = CodeElement::createFromBinary(in); __STP(element); + MemberVariableDeclare* member = dynamic_cast(element); + + checkNotNull(member); + __STP_MV(element); + + this->members->addElement(member); + } +} + +void AbstractReservedClassDeclare::addMethod(MethodDeclare *method) noexcept { + this->methods->addElement(method); +} + +ClassDeclare* AbstractReservedClassDeclare::generateGenericsImplement(HashMap *input) { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); + + toBinary(buff); + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); + + return dynamic_cast(element); } } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h index 893bb05..afc4e3b 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h @@ -23,6 +23,8 @@ class AbstractReservedClassDeclare : public ClassDeclare { static constexpr const uint16_t TYPE_TYPE_CAST_EXCEPTION = 6; static constexpr const uint16_t TYPE_ZERO_DIVISION_EXCEPTION = 7; + static constexpr const uint16_t TYPE_OBJECT = 8; + AbstractReservedClassDeclare(); virtual ~AbstractReservedClassDeclare(); @@ -37,11 +39,15 @@ class AbstractReservedClassDeclare : public ClassDeclare { virtual ArrayList* getMemberVariables() noexcept; virtual int binarySize() const; - virtual void toBinary(ByteBuffer* out); + virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); + virtual ClassDeclare* generateGenericsImplement(HashMap *input); + virtual uint16_t getClassType() const noexcept = 0; + void addMethod(MethodDeclare* method) noexcept; + protected: void addDefaultConstructor(const UnicodeString* className) noexcept; diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp new file mode 100644 index 0000000..b955487 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp @@ -0,0 +1,134 @@ +/* + * AbstractReservedMethodDeclare.cpp + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +#include "instance/instance_ref/ObjectReference.h" + +#include "lang/sc_declare/ArgumentsListDeclare.h" +#include "lang/sc_declare_types/AbstractType.h" + +#include "base/exceptions.h" + +#include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc_analyze/AnalyzedClass.h" +#include "engine/sc_analyze/AnalyzedThisClassStackPopper.h" + +#include "vm/VirtualMachine.h" + +#include "vm/variable_access/FunctionArguments.h" + +#include "vm/stack/VmStack.h" +#include "vm/stack/MethodArgumentSetupper.h" +#include "vm/stack/StackPopper.h" + + +namespace alinous { + +AbstractReservedMethodDeclare::AbstractReservedMethodDeclare(uint32_t methodId) : MethodDeclare(RESERVED_METHOD_DECLARE) { + this->methodId = methodId; +} + +AbstractReservedMethodDeclare::~AbstractReservedMethodDeclare() { + +} + +AbstractReservedMethodDeclare* AbstractReservedMethodDeclare::createMethodFromBinary(ByteBuffer *in) { + uint16_t methodId = in->getShort(); + + switch(methodId){ + default: + return nullptr; + } + +} + +void AbstractReservedMethodDeclare::preAnalyze(AnalyzeContext *actx) { + AnalyzedClass* aclass = actx->getAnalyzedClass(this); + aclass->addMemberMethodDeclare(this); + + this->args->setParent(this); + this->args->preAnalyze(actx); + + if(this->type != nullptr){ + this->type->preAnalyze(actx); + this->type->setParent(this); + actx->detectGenericsType(this->type); + } +} + +void AbstractReservedMethodDeclare::analyzeTypeRef(AnalyzeContext *actx) { + this->args->analyzeTypeRef(actx); + + if(this->type != nullptr){ + this->type->analyzeTypeRef(actx); + } +} + +void AbstractReservedMethodDeclare::analyze(AnalyzeContext *actx) { + this->args->analyze(actx); + + AnalyzedClass* aclass = actx->getAnalyzedClass(this); + AnalyzedThisClassStackPopper thisStack(actx, aclass); + + if(this->type != nullptr){ + this->type->analyze(actx); + } +} + +void AbstractReservedMethodDeclare::init(VirtualMachine *vm) { +} + +void AbstractReservedMethodDeclare::interpret(FunctionArguments *args, VirtualMachine *vm) { + MethodArgumentSetupper argSetup(args, vm); + { + vm->newStack(); + StackPopper stackPopper(vm); + + interpretFunctionArguments(vm); + } +} + +void AbstractReservedMethodDeclare::interpretFunctionArguments(VirtualMachine *vm) { + FunctionArguments* args = vm->getFunctionArguments(); + VmStack* stack = vm->topStack(); + + if(!isStatic()){ + VmClassInstance* _this = args->getThisPtr(); + ObjectReference* ref = ObjectReference::createObjectReference(stack, _this, vm); + + stack->addInnerReference(ref); + } + + const ArrayList* list = args->getArguments(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + IAbstractVmInstanceSubstance* inst = list->get(i); + + if(inst != nullptr){ + stack->addInnerReference(inst->wrap(stack, vm)); + } + else{ + ObjectReference* ref = ObjectReference::createObjectReference(stack, nullptr, vm); + stack->addInnerReference(ref); + } + } +} + +MethodDeclare* AbstractReservedMethodDeclare::generateGenericsImplement(HashMap *input) const { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); + + toBinary(buff); + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); + + return dynamic_cast(element); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h new file mode 100644 index 0000000..ad8585b --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h @@ -0,0 +1,42 @@ +/* + * AbstractReservedMethodDeclare.h + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_ABSTRACTRESERVEDMETHODDECLARE_H_ +#define INSTANCE_RESERVED_CLASSES_ABSTRACTRESERVEDMETHODDECLARE_H_ + +#include "lang/sc_declare/MethodDeclare.h" + +namespace alinous { + +class AbstractReservedMethodDeclare : public MethodDeclare { +public: + static constexpr const uint32_t METHOD_OBJECT_OBJECT = 1; + + explicit AbstractReservedMethodDeclare(uint32_t methodId); + virtual ~AbstractReservedMethodDeclare(); + + static AbstractReservedMethodDeclare* createMethodFromBinary(ByteBuffer* in); + + void preAnalyze(AnalyzeContext* actx); + void analyzeTypeRef(AnalyzeContext* actx); + void analyze(AnalyzeContext* actx); + + virtual void init(VirtualMachine* vm); + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); + + virtual MethodDeclare* generateGenericsImplement(HashMap *input) const; + +protected: + void interpretFunctionArguments(VirtualMachine* vm); + +protected: + uint32_t methodId; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_ABSTRACTRESERVEDMETHODDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.cpp new file mode 100644 index 0000000..9230885 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.cpp @@ -0,0 +1,26 @@ +/* + * AbstractVmReservedInstance.cpp + * + * Created on: Nov 3, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/AbstractVmReservedInstance.h" + +#include "instance/VmInstanceTypesConst.h" + +#include "instance/instance_ref/ObjectReference.h" + +namespace alinous { + +AbstractVmReservedInstance::AbstractVmReservedInstance(AnalyzedClass* clazz, VirtualMachine* vm) + : VmClassInstance(VmInstanceTypesConst::INST_OBJ, clazz, vm) { + +} + +AbstractVmReservedInstance::~AbstractVmReservedInstance() { + +} + + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.h b/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.h new file mode 100644 index 0000000..dbf06c5 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractVmReservedInstance.h @@ -0,0 +1,24 @@ +/* + * AbstractVmReservedInstance.h + * + * Created on: Nov 3, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_ABSTRACTVMRESERVEDINSTANCE_H_ +#define INSTANCE_RESERVED_CLASSES_ABSTRACTVMRESERVEDINSTANCE_H_ + +#include "instance/VmClassInstance.h" + + +namespace alinous { + +class AbstractVmReservedInstance : public VmClassInstance { +public: + AbstractVmReservedInstance(AnalyzedClass* clazz, VirtualMachine* vm); + virtual ~AbstractVmReservedInstance(); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_ABSTRACTVMRESERVEDINSTANCE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/CMakeLists.txt index ff84f49..62349ea 100644 --- a/src_smartcontract_vm/instance/reserved_classes/CMakeLists.txt +++ b/src_smartcontract_vm/instance/reserved_classes/CMakeLists.txt @@ -2,6 +2,8 @@ set(__src AbstractReservedClassDeclare.cpp + AbstractReservedMethodDeclare.cpp + AbstractVmReservedInstance.cpp ReservedClassRegistory.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes) diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp index 09efab5..99f48d6 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp @@ -22,11 +22,18 @@ #include "trx/transaction_exception/DatabaseExceptionClassDeclare.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "instance/reserved_classes/object/ObjectClassDeclare.h" + +#include "lang/sc_declare/PackageDeclare.h" +#include "lang/sc_declare/PackageNameDeclare.h" + namespace alinous { ReservedClassRegistory::ReservedClassRegistory() { - this->unit = new CompilationUnit(); + this->unitlist = new ArrayList(); AnalyzedClass* aclass = StringClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); @@ -48,6 +55,10 @@ ReservedClassRegistory::ReservedClassRegistory() { aclass = DatabaseExceptionClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); + + // Object Class + aclass = ObjectClassDeclare::createAnalyzedClass(); + addAnalyzedClass(aclass); } AnalyzedClass* ReservedClassRegistory::getAnalyzedClass(const UnicodeString* fqn) const noexcept { @@ -73,16 +84,40 @@ ReservedClassRegistory::~ReservedClassRegistory() { this->list.deleteElements(); - delete this->unit; + this->unitlist->deleteElements(); + delete this->unitlist; } const ArrayList* ReservedClassRegistory::getReservedClassesList() const noexcept { return &this->list; } -CompilationUnit* ReservedClassRegistory::getUnit() const noexcept { - return this->unit; -} +CompilationUnit* ReservedClassRegistory::makeCompilantUnit(const UnicodeString *packageName) noexcept { + CompilationUnit* unit = new CompilationUnit(); + this->unitlist->addElement(unit); + + if(packageName != nullptr){ + PackageDeclare* packageDec = new PackageDeclare(); + PackageNameDeclare* nameDec = new PackageNameDeclare(); + nameDec->setParent(packageDec); + + UnicodeString pattern(L"\\."); + ArrayList* list = packageName->split(&pattern); __STP(list); + list->setDeleteOnExit(); + + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* seg = list->get(i); + + nameDec->addSegment(new UnicodeString(seg)); + } + + packageDec->setName(nameDec); + unit->setPackage(packageDec); + } + + return unit; +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h index 7082c73..1743d4b 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h @@ -22,17 +22,18 @@ class ReservedClassRegistory { virtual ~ReservedClassRegistory(); const ArrayList* getReservedClassesList() const noexcept; - CompilationUnit* getUnit() const noexcept; AnalyzedClass* getAnalyzedClass(const UnicodeString* fqn) const noexcept; + CompilationUnit* makeCompilantUnit(const UnicodeString* packageName) noexcept; + private: void addAnalyzedClass(AnalyzedClass* aclass) noexcept; private: ArrayList list; HashMap map; - CompilationUnit* unit; + ArrayList* unitlist; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt new file mode 100644 index 0000000..5160c8a --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt @@ -0,0 +1,7 @@ + + +set(__src + +) +handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes/bigint) + diff --git a/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt new file mode 100644 index 0000000..695ab25 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt @@ -0,0 +1,7 @@ + + +set(__src + ListClassDeclare.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes/list) + diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp new file mode 100644 index 0000000..042210a --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp @@ -0,0 +1,21 @@ +/* + * ListClassDeclare.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/list/ListClassDeclare.h" + +namespace alinous { + +ListClassDeclare::ListClassDeclare() { + + +} + +ListClassDeclare::~ListClassDeclare() { + +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h new file mode 100644 index 0000000..77fe26a --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h @@ -0,0 +1,23 @@ +/* + * ListClassDeclare.h + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSDECLARE_H_ +#define INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSDECLARE_H_ + +#include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" + +namespace alinous { + +class ListClassDeclare : public AbstractReservedGenericsClassDeclare { +public: + ListClassDeclare(); + virtual ~ListClassDeclare(); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/object/CMakeLists.txt new file mode 100644 index 0000000..da3aa21 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/CMakeLists.txt @@ -0,0 +1,10 @@ + + +set(__src + ObjectClassDeclare.cpp + ObjectClassInstanceFactory.cpp + ObjectObjectMethod.cpp + VmObjectClassInstance.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes/object) + diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp new file mode 100644 index 0000000..5dd486f --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp @@ -0,0 +1,69 @@ +/* + * ObjectClassDeclare.cpp + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/object/ObjectClassDeclare.h" +#include "instance/reserved_classes/object/ObjectClassInstanceFactory.h" +#include "instance/reserved_classes/object/ObjectObjectMethod.h" + +#include "base/UnicodeString.h" + +#include "base_io/ByteBuffer.h" + +#include "engine/sc_analyze/AnalyzedClass.h" + +namespace alinous { + +const UnicodeString ObjectClassDeclare::NAME(L"Object"); +const UnicodeString ObjectClassDeclare::PACKAGE(L"lang"); + +ObjectClassDeclare::ObjectClassDeclare() { + this->fqn = new UnicodeString(&PACKAGE); + this->fqn->append(L".").append(&NAME); + + this->name = new UnicodeString(&NAME); + + addMethod(new ObjectObjectMethod()); + +} + +ObjectClassDeclare::~ObjectClassDeclare() { + delete this->fqn; +} + +AnalyzedClass* ObjectClassDeclare::createAnalyzedClass() noexcept { + ObjectClassDeclare* classDec = new ObjectClassDeclare(); + AnalyzedClass* aclass = new AnalyzedClass(classDec); + + return aclass; +} + + +const UnicodeString* ObjectClassDeclare::getName() const noexcept { + return &NAME; +} + +const UnicodeString* ObjectClassDeclare::getPackageName() const noexcept { + return &PACKAGE; +} + +const UnicodeString* ObjectClassDeclare::getFullQualifiedName() noexcept { + return this->fqn; +} + +void ObjectClassDeclare::init(VirtualMachine *vm) { + +} + +ClassDeclare* ObjectClassDeclare::getBaseClass() const noexcept { + return nullptr; +} + +IVmInstanceFactory* ObjectClassDeclare::getFactory() const noexcept { + return ObjectClassInstanceFactory::getInstance(); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h new file mode 100644 index 0000000..610f611 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h @@ -0,0 +1,44 @@ +/* + * ObjectClassDeclare.h + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSDECLARE_H_ +#define INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedClassDeclare.h" + +namespace alinous { + +class ObjectClassDeclare : public AbstractReservedClassDeclare { +public: + static const UnicodeString NAME; + static const UnicodeString PACKAGE; + + ObjectClassDeclare(); + virtual ~ObjectClassDeclare(); + + static AnalyzedClass* createAnalyzedClass() noexcept; + + virtual uint16_t getClassType() const noexcept { + return AbstractReservedClassDeclare::TYPE_OBJECT; + } + + virtual const UnicodeString* getName() const noexcept; + virtual const UnicodeString* getPackageName() const noexcept; + + virtual void init(alinous::VirtualMachine *vm); + virtual ClassDeclare* getBaseClass() const noexcept; + virtual IVmInstanceFactory* getFactory() const noexcept; + const virtual alinous::UnicodeString* getFullQualifiedName() noexcept; + + +private: + UnicodeString* fqn; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.cpp b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.cpp new file mode 100644 index 0000000..9bedd42 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.cpp @@ -0,0 +1,34 @@ +/* + * ObjectClassInstanceFactory.cpp + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/object/ObjectClassInstanceFactory.h" +#include "instance/reserved_classes/object/VmObjectClassInstance.h" + + +namespace alinous { + +ObjectClassInstanceFactory::ObjectClassInstanceFactory() { + + +} + +ObjectClassInstanceFactory::~ObjectClassInstanceFactory() { + +} + +VmClassInstance* ObjectClassInstanceFactory::createInstance(AnalyzedClass *clazz, VirtualMachine *vm) { + VmObjectClassInstance* inst = new(vm) VmObjectClassInstance(clazz, vm); + + return inst; +} + +ObjectClassInstanceFactory* ObjectClassInstanceFactory::getInstance() noexcept { + static ObjectClassInstanceFactory factory; + return &factory; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.h b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.h new file mode 100644 index 0000000..a115f76 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassInstanceFactory.h @@ -0,0 +1,28 @@ +/* + * ObjectClassInstanceFactory.h + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSINSTANCEFACTORY_H_ +#define INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSINSTANCEFACTORY_H_ + +#include "engine/sc_analyze/IVmInstanceFactory.h" + +namespace alinous { + +class ObjectClassInstanceFactory : public IVmInstanceFactory { +private: + ObjectClassInstanceFactory(); + +public: + static ObjectClassInstanceFactory* getInstance() noexcept; + virtual ~ObjectClassInstanceFactory(); + + virtual VmClassInstance* createInstance(AnalyzedClass* clazz, VirtualMachine* vm); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTCLASSINSTANCEFACTORY_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.cpp b/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.cpp new file mode 100644 index 0000000..8256ff7 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.cpp @@ -0,0 +1,50 @@ +/* + * ObjectObject.cpp + * + * Created on: Nov 3, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/object/ObjectObjectMethod.h" + +#include "base/UnicodeString.h" + +#include "vm/stack/MethodArgumentSetupper.h" +#include "vm/stack/StackPopper.h" + +#include "vm/VirtualMachine.h" + +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" + + +namespace alinous { + +const UnicodeString ObjectObjectMethod::METHOD_NAME(L"Object"); + +ObjectObjectMethod::ObjectObjectMethod() : AbstractReservedMethodDeclare(METHOD_OBJECT_OBJECT) { + this->_static = false; + this->name = new UnicodeString(METHOD_NAME); + this->ctrl = new AccessControlDeclare(AccessControlDeclare::PUBLIC); + this->type = nullptr; + this->args = new ArgumentsListDeclare(); +} + +ObjectObjectMethod::~ObjectObjectMethod() { + +} + +void ObjectObjectMethod::init(VirtualMachine *vm) { + AbstractReservedMethodDeclare::init(vm); +} + +void ObjectObjectMethod::interpret(FunctionArguments *args, VirtualMachine *vm) { + AbstractReservedMethodDeclare::interpret(args, vm); + +} + +const UnicodeString* ObjectObjectMethod::toString() { + return &METHOD_NAME; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.h b/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.h new file mode 100644 index 0000000..1760135 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectObjectMethod.h @@ -0,0 +1,29 @@ +/* + * ObjectObject.h + * + * Created on: Nov 3, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTOBJECTMETHOD_H_ +#define INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTOBJECTMETHOD_H_ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +namespace alinous { + +class ObjectObjectMethod : public AbstractReservedMethodDeclare { +public: + static const UnicodeString METHOD_NAME; + + ObjectObjectMethod(); + virtual ~ObjectObjectMethod(); + + virtual void init(VirtualMachine* vm); + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); + virtual const UnicodeString* toString(); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_OBJECT_OBJECTOBJECTMETHOD_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp new file mode 100644 index 0000000..7dbb2fc --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp @@ -0,0 +1,22 @@ +/* + * VmObjectClassInstance.cpp + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/object/VmObjectClassInstance.h" + +namespace alinous { + +VmObjectClassInstance::VmObjectClassInstance(AnalyzedClass* clazz, VirtualMachine* v) + : AbstractVmReservedInstance(clazz, v) { + // TODO Auto-generated constructor stub + +} + +VmObjectClassInstance::~VmObjectClassInstance() { + +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.h b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.h new file mode 100644 index 0000000..9bc9deb --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.h @@ -0,0 +1,28 @@ +/* + * VmObjectClassInstance.h + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_OBJECT_VMOBJECTCLASSINSTANCE_H_ +#define INSTANCE_RESERVED_CLASSES_OBJECT_VMOBJECTCLASSINSTANCE_H_ + +#include "instance/reserved_classes/AbstractVmReservedInstance.h" + +namespace alinous { + +class AnalyzedType; +class IAbstractVmInstanceSubstance; + +class VmObjectClassInstance : public AbstractVmReservedInstance { +public: + VmObjectClassInstance(AnalyzedClass* clazz, VirtualMachine* v); + virtual ~VmObjectClassInstance(); + + +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_OBJECT_VMOBJECTCLASSINSTANCE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp index 110547c..9e7c701 100644 --- a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp @@ -16,20 +16,12 @@ namespace alinous { UnicodeString StringClassDeclare::NAME{L"String"}; StringClassDeclare::StringClassDeclare() : AbstractReservedClassDeclare() { - + this->name = new UnicodeString(&NAME); } StringClassDeclare::~StringClassDeclare() { } -const UnicodeString* StringClassDeclare::getName() const noexcept { - return &NAME; -} - -const UnicodeString* StringClassDeclare::getFullQualifiedName() noexcept { - return &NAME; -} - AnalyzedClass* StringClassDeclare::createAnalyzedClass() noexcept { StringClassDeclare* classDec = new StringClassDeclare(); AnalyzedClass* aclass = new AnalyzedClass(classDec); @@ -41,4 +33,8 @@ ClassDeclare* StringClassDeclare::getBaseClass() const noexcept { return nullptr; } +const UnicodeString* StringClassDeclare::getPackageName() const noexcept { + return nullptr; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h index a3f5b42..b937f2a 100644 --- a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h @@ -28,12 +28,9 @@ class StringClassDeclare : public AbstractReservedClassDeclare { return TYPE_STRING_CLASS; } - virtual const UnicodeString* getName() const noexcept; - virtual const UnicodeString* getFullQualifiedName() noexcept; - virtual ClassDeclare* getBaseClass() const noexcept; - + virtual const UnicodeString* getPackageName() const noexcept; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp new file mode 100644 index 0000000..9618a99 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp @@ -0,0 +1,43 @@ +/* + * AbstractReservedGenericsClassDeclare.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" + +#include "instance/reserved_classes/list/ListClassDeclare.h" + +#include "filestore_block/exceptions.h" + + +namespace alinous { + + +AbstractReservedGenericsClassDeclare::AbstractReservedGenericsClassDeclare() : GenericsClassDeclare(RESERVED_GENERICS_CLASS_DECLARE) { + +} + +AbstractReservedGenericsClassDeclare::~AbstractReservedGenericsClassDeclare() { + +} + +AbstractReservedGenericsClassDeclare* AbstractReservedGenericsClassDeclare::createFromBinary(ByteBuffer *in) { + AbstractReservedGenericsClassDeclare* ret = nullptr; + uint16_t classType = in->getShort(); + + switch(classType){ + case TYPE_GENERICS_LIST_CLASS: + ret = new ListClassDeclare(); + break; + default: + throw new BinaryFormatException(__FILE__, __LINE__); + } + + ret->fromBinary(in); + + return ret; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h new file mode 100644 index 0000000..49884ac --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h @@ -0,0 +1,29 @@ +/* + * AbstractReservedGenericsClassDeclare.h + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_GENERICS_ABSTRACTRESERVEDGENERICSCLASSDECLARE_H_ +#define INSTANCE_RESERVED_GENERICS_ABSTRACTRESERVEDGENERICSCLASSDECLARE_H_ + +#include "lang/sc_declare/GenericsClassDeclare.h" + +namespace alinous { + +class AbstractReservedGenericsClassDeclare : public GenericsClassDeclare { +public: + static constexpr const uint16_t TYPE_GENERICS_LIST_CLASS = 1; + + AbstractReservedGenericsClassDeclare(); + virtual ~AbstractReservedGenericsClassDeclare(); + + static AbstractReservedGenericsClassDeclare* createFromBinary(ByteBuffer* in); + + +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_GENERICS_ABSTRACTRESERVEDGENERICSCLASSDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt new file mode 100644 index 0000000..f1316a1 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt @@ -0,0 +1,7 @@ + + +set(__src + AbstractReservedGenericsClassDeclare.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_generics) + diff --git a/src_test/db/db_base/test_exceptions.cpp b/src_test/db/db_base/test_exceptions.cpp index 773ae16..3b8a870 100644 --- a/src_test/db/db_base/test_exceptions.cpp +++ b/src_test/db/db_base/test_exceptions.cpp @@ -31,4 +31,5 @@ TEST(ExceptionsTestGroup, ex){ TEST(ExceptionsTestGroup, test01){ testException(); testException(); + testException(); } diff --git a/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt b/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt index a25daff..9560153 100644 --- a/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt +++ b/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt @@ -1,5 +1,7 @@ set(testsrc + test_generic_list.cpp + test_object_class.cpp test_string_class.cpp ) handle_sub(testall "${testsrc}" test smartcontract_vm/reserved_classes) diff --git a/src_test/smartcontract_vm/reserved_classes/resources/object/case01/main.alns b/src_test/smartcontract_vm/reserved_classes/resources/object/case01/main.alns new file mode 100644 index 0000000..5e4e895 --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/resources/object/case01/main.alns @@ -0,0 +1,16 @@ + +package test.fw; + + + +class SmartContract { + public SmartContract() { + this.obj = new Object(); + } + + public int main(){ + + } + + private Object obj; +} diff --git a/src_test/smartcontract_vm/reserved_classes/resources/string/base01/main.alns b/src_test/smartcontract_vm/reserved_classes/resources/string/base01/main.alns index 8672a67..a1be178 100644 --- a/src_test/smartcontract_vm/reserved_classes/resources/string/base01/main.alns +++ b/src_test/smartcontract_vm/reserved_classes/resources/string/base01/main.alns @@ -3,10 +3,11 @@ package test.fw; class SmartContract { public SmartContract() { - + } public int main(){ + } } diff --git a/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp b/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp new file mode 100644 index 0000000..06bdabb --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp @@ -0,0 +1,25 @@ +/* + * test_generic_list.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "../VmTestUtils.h" +#include "ext_binary/ExtClassObject.h" + + + +using namespace alinous; + +TEST_GROUP(TestGenericListGroup) { + TEST_SETUP(){} + TEST_TEARDOWN(){} +}; + + +TEST(TestGenericListGroup, case01){ + +} + diff --git a/src_test/smartcontract_vm/reserved_classes/test_object_class.cpp b/src_test/smartcontract_vm/reserved_classes/test_object_class.cpp new file mode 100644 index 0000000..a43e73a --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/test_object_class.cpp @@ -0,0 +1,40 @@ +/* + * test_object_class.cpp + * + * Created on: Nov 2, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "../VmTestUtils.h" +#include "ext_binary/ExtClassObject.h" + + + +using namespace alinous; + +TEST_GROUP(TestObjectClassGroup) { + TEST_SETUP(){} + TEST_TEARDOWN(){} +}; + +TEST(TestObjectClassGroup, case01){ + const File* projectFolder = this->env->getProjectRoot(); + VmTestUtils util(L"src_test/smartcontract_vm/reserved_classes/resources/object/case01/", projectFolder); + + bool result = util.loadAllFiles(); + CHECK(result) + util.setMain(L"test.fw", L"SmartContract", L"main"); + + result = util.analyze(); + CHECK(result) + + result = util.createInstance(); + CHECK(result) + + ExtClassObject* mainobj = util.getMainExtObject(); __STP(mainobj); + ExtClassObject* obj = mainobj->getExtClassObject(L"obj"); + + CHECK(obj != nullptr); +} + diff --git a/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp b/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp index 6f3762d..b221076 100644 --- a/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp +++ b/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp @@ -18,6 +18,7 @@ #include "instance/instance_string/VmString.h" #include "instance/instance_string/VmStringInstance.h" + using namespace alinous; TEST_GROUP(TestStringClassGroup) { From 4f707d02d228f310b2a672a752e95bd2a6692659 Mon Sep 17 00:00:00 2001 From: iizuka Date: Sat, 8 Nov 2025 08:44:55 +0800 Subject: [PATCH 02/11] List new --- src_smartcontract/engine/sc/CodeElement.cpp | 7 +- src_smartcontract/engine/sc/CodeElement.h | 1 + .../engine/sc/CompilationUnit.cpp | 3 +- src_smartcontract/engine/sc/SmartContract.cpp | 1 + .../lang/sc_declare/ArgumentsListDeclare.cpp | 3 +- .../lang/sc_declare/ClassDeclare.cpp | 21 ++- .../lang/sc_declare/ClassName.cpp | 4 + src_smartcontract/lang/sc_declare/ClassName.h | 1 + .../lang/sc_declare/GenericsClassDeclare.h | 2 +- .../GenericsGeneratedClassDeclare.cpp | 10 +- .../GenericsGeneratedClassDeclare.h | 10 +- .../lang/sc_declare/MethodDeclare.cpp | 5 + .../AbstractReservedClassDeclare.cpp | 99 +--------- .../AbstractReservedMethodDeclare.cpp | 33 +++- .../AbstractReservedMethodDeclare.h | 6 + .../ReservedClassRegistory.cpp | 15 +- .../reserved_classes/list/CMakeLists.txt | 3 + .../list/ListClassDeclare.cpp | 74 ++++++++ .../reserved_classes/list/ListClassDeclare.h | 16 ++ .../list/ListClassInstanceFactory.cpp | 32 ++++ .../list/ListClassInstanceFactory.h | 27 +++ .../reserved_classes/list/ListListMethod.cpp | 54 ++++++ .../reserved_classes/list/ListListMethod.h | 31 ++++ .../list/VmListClassInstance.cpp | 21 +++ .../list/VmListClassInstance.h | 23 +++ .../object/ObjectClassDeclare.cpp | 1 - .../object/ObjectClassDeclare.h | 2 +- .../object/VmObjectClassInstance.cpp | 1 - .../AbstractGenericReservedMethodDeclare.cpp | 48 +++++ .../AbstractGenericReservedMethodDeclare.h | 25 +++ .../AbstractReservedGenericsClassDeclare.cpp | 92 +++++++++- .../AbstractReservedGenericsClassDeclare.h | 26 +++ .../instance/reserved_generics/CMakeLists.txt | 2 + .../ReservedGeneratedGenericsClassDeclare.cpp | 173 ++++++++++++++++++ .../ReservedGeneratedGenericsClassDeclare.h | 45 +++++ .../reserved_classes/CMakeLists.txt | 2 + .../resources/list/case01/SampleObject.alns | 9 + .../resources/list/case01/main.alns | 16 ++ .../reserved_classes/test_generic_list.cpp | 17 ++ .../test_generic_list_binary.cpp | 62 +++++++ .../test_object_class_binary.cpp | 62 +++++++ 41 files changed, 958 insertions(+), 127 deletions(-) create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.h create mode 100644 src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.h create mode 100644 src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h create mode 100644 src_test/smartcontract_vm/reserved_classes/resources/list/case01/SampleObject.alns create mode 100644 src_test/smartcontract_vm/reserved_classes/resources/list/case01/main.alns create mode 100644 src_test/smartcontract_vm/reserved_classes/test_generic_list_binary.cpp create mode 100644 src_test/smartcontract_vm/reserved_classes/test_object_class_binary.cpp diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index 5fc95f8..f23a540 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -171,6 +171,7 @@ #include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" +#include "instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h" namespace alinous { @@ -307,7 +308,10 @@ CodeElement* CodeElement::createFromBinary(ByteBuffer* in) { element = AbstractReservedMethodDeclare::createMethodFromBinary(in); break; case RESERVED_GENERICS_CLASS_DECLARE: - element =AbstractReservedGenericsClassDeclare::createFromBinary(in); + element = AbstractReservedGenericsClassDeclare::createFromBinary(in); + break; + case RESERVED_GENERATED_GENERICS_CLASS_DECLARE: + element = new ReservedGeneratedGenericsClassDeclare(); break; case TYPE_BOOL: @@ -812,6 +816,7 @@ ClassDeclare* CodeElement::getClassDeclare() const { if(this->kind == CodeElement::CLASS_DECLARE || this->kind == CodeElement::GENERICS_CLASS_DECLARE || this->kind == CodeElement::RESERVED_CLASS_DECLARE || this->kind == CodeElement::RESERVED_GENERICS_CLASS_DECLARE || + this->kind == CodeElement::RESERVED_GENERATED_GENERICS_CLASS_DECLARE || this->kind == CodeElement::GENERICS_GENERATED_CLASS_DECLARE ){ CodeElement* element = const_cast(this); diff --git a/src_smartcontract/engine/sc/CodeElement.h b/src_smartcontract/engine/sc/CodeElement.h index ff13a26..c2cbdbb 100644 --- a/src_smartcontract/engine/sc/CodeElement.h +++ b/src_smartcontract/engine/sc/CodeElement.h @@ -47,6 +47,7 @@ class CodeElement { static const constexpr short RESERVED_CLASS_DECLARE{18}; static const constexpr short RESERVED_METHOD_DECLARE{19}; static const constexpr short RESERVED_GENERICS_CLASS_DECLARE{20}; + static const constexpr short RESERVED_GENERATED_GENERICS_CLASS_DECLARE{21}; static const constexpr short TYPE_BOOL{30}; diff --git a/src_smartcontract/engine/sc/CompilationUnit.cpp b/src_smartcontract/engine/sc/CompilationUnit.cpp index 5a02bfc..3ec6cec 100644 --- a/src_smartcontract/engine/sc/CompilationUnit.cpp +++ b/src_smartcontract/engine/sc/CompilationUnit.cpp @@ -15,7 +15,7 @@ namespace alinous { CompilationUnit::CompilationUnit() : classes(4), CodeElement(CodeElement::COMPILANT_UNIT) { this->package = nullptr; - this->imports = nullptr; + this->imports = new ImportsDeclare(); } CompilationUnit::~CompilationUnit() { @@ -79,6 +79,7 @@ const UnicodeString* CompilationUnit::getPackageName() noexcept { void CompilationUnit::setImports(ImportsDeclare* imports) noexcept { + delete this->imports; this->imports = imports; } diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index 1e5eb1d..791c45e 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -127,6 +127,7 @@ void SmartContract::analyze(VirtualMachine* vm) { const UnicodeString* packageName = dec->getPackageName(); CompilationUnit* reservedUnit = this->reservedClassRegistory->makeCompilantUnit(packageName); + reservedUnit->addClassDeclare(dec); dec->setParent(reservedUnit); dec->preAnalyze(actx); diff --git a/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp b/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp index 89c7512..e12484e 100644 --- a/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp @@ -107,9 +107,10 @@ ArrayList* ArgumentsListDeclare::getArgumentsAnalyzedType() noexce int ArgumentsListDeclare::binarySize() const { int total = sizeof(uint16_t); - total += sizeof(uint32_t); int maxLoop = this->list.size(); + total += sizeof(uint32_t); + for(int i = 0; i != maxLoop; ++i){ ArgumentDeclare* arg = this->list.get(i); total += arg->binarySize(); diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp index 41f6068..c33aff3 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp @@ -55,12 +55,15 @@ ClassDeclare::~ClassDeclare() { delete this->name; } delete this->extends; + this->extends = nullptr; delete this->implements; delete this->fqn; } void ClassDeclare::preAnalyze(AnalyzeContext* actx) { - this->block->setParent(this); + if(this->block != nullptr){ + this->block->setParent(this); + } if(!this->interface){ addDefaultConstructor(); @@ -88,11 +91,15 @@ void ClassDeclare::preAnalyze(AnalyzeContext* actx) { this->implements->preAnalyze(actx); } - this->block->preAnalyze(actx); + if(this->block != nullptr){ + this->block->preAnalyze(actx); + } } void ClassDeclare::addDefaultConstructor() noexcept { - this->block->addDefaultConstructor(this->name); + if(this->block != nullptr){ + this->block->addDefaultConstructor(this->name); + } } @@ -128,12 +135,16 @@ void ClassDeclare::analyzeTypeRef(AnalyzeContext* actx) { } } - this->block->analyzeTypeRef(actx); + if(this->block != nullptr){ + this->block->analyzeTypeRef(actx); + } } void ClassDeclare::analyze(AnalyzeContext* actx) { - this->block->analyze(actx); + if(this->block != nullptr){ + this->block->analyze(actx); + } if(!this->interface && this->implements != nullptr){ checkImplementsInterfaces(actx); diff --git a/src_smartcontract/lang/sc_declare/ClassName.cpp b/src_smartcontract/lang/sc_declare/ClassName.cpp index fd0be7c..565461d 100644 --- a/src_smartcontract/lang/sc_declare/ClassName.cpp +++ b/src_smartcontract/lang/sc_declare/ClassName.cpp @@ -19,6 +19,10 @@ ClassName::ClassName() : CodeElement(CodeElement::CLASS_NAME) { this->fqn = nullptr; } +ClassName::ClassName(const wchar_t *fqn) : CodeElement(CodeElement::CLASS_NAME) { + this->fqn = new UnicodeString(fqn); +} + ClassName::~ClassName() { delete this->fqn; } diff --git a/src_smartcontract/lang/sc_declare/ClassName.h b/src_smartcontract/lang/sc_declare/ClassName.h index 4e885be..f1b218e 100644 --- a/src_smartcontract/lang/sc_declare/ClassName.h +++ b/src_smartcontract/lang/sc_declare/ClassName.h @@ -18,6 +18,7 @@ class ClassName : public CodeElement { public: ClassName(const ClassName& inst); ClassName(); + ClassName(const wchar_t* fqn); virtual ~ClassName(); void addStr(const char* str) noexcept; diff --git a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h index c4ecadb..310f06f 100644 --- a/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/GenericsClassDeclare.h @@ -49,7 +49,7 @@ class GenericsClassDeclare : public ClassDeclare { virtual void init(VirtualMachine* vm); -private: +protected: ArrayList* genericsParams; }; diff --git a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp index 893c66f..4388605 100644 --- a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp @@ -9,17 +9,19 @@ #include "lang/sc_declare/GenericsClassDeclare.h" #include "engine/sc_analyze/AnalyzeContext.h" - #include "engine/sc_analyze/AnalyzedClass.h" - #include "engine/sc_analyze/ValidationError.h" - #include "engine/sc_analyze/PackageSpace.h" #include "engine/sc/CompilationUnit.h" + + namespace alinous { -// GENERICS_GENERATED_CLASS_DECLARE +GenericsGeneratedClassDeclare::GenericsGeneratedClassDeclare(short kind) : ClassDeclare(kind) { + this->genericsClass = nullptr; +} + GenericsGeneratedClassDeclare::GenericsGeneratedClassDeclare() : ClassDeclare(GENERICS_GENERATED_CLASS_DECLARE) { this->genericsClass = nullptr; } diff --git a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.h b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.h index 7ea94db..d834e8b 100644 --- a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.h @@ -16,6 +16,7 @@ class GenericsClassDeclare; class GenericsGeneratedClassDeclare : public ClassDeclare { public: + GenericsGeneratedClassDeclare(short kind); GenericsGeneratedClassDeclare(); virtual ~GenericsGeneratedClassDeclare(); @@ -33,9 +34,16 @@ class GenericsGeneratedClassDeclare : public ClassDeclare { virtual const UnicodeString* getConstructorName() const noexcept; + virtual IVmInstanceFactory* getFactory() const noexcept { + return this->factory; + } + void setFactory(IVmInstanceFactory* factory){ + this->factory = factory; + } -private: +protected: GenericsClassDeclare* genericsClass; + IVmInstanceFactory* factory; }; } /* namespace alinous */ diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index 0165ca2..83ce8f6 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -146,22 +146,27 @@ void MethodDeclare::setStatic(bool s) noexcept { } void MethodDeclare::setAccessControl(AccessControlDeclare* ctrl) noexcept { + delete this->ctrl; this->ctrl = ctrl; } void MethodDeclare::setType(AbstractType* type) noexcept { + delete this->type; this->type = type; } void MethodDeclare::setName(UnicodeString* name) noexcept { + delete this->name; this->name = name; } void MethodDeclare::setArguments(ArgumentsListDeclare* args) noexcept { + delete this->args; this->args = args; } void MethodDeclare::setBlock(StatementBlock* block) noexcept { + delete this->block; this->block = block; } diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp index cf53d60..39b4757 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp @@ -58,9 +58,6 @@ AbstractReservedClassDeclare::~AbstractReservedClassDeclare() { this->members->deleteElements(); delete this->members; - - delete this->extends; - this->extends = nullptr; } ArrayList* AbstractReservedClassDeclare::getMethods() noexcept { @@ -193,46 +190,16 @@ AbstractReservedClassDeclare* AbstractReservedClassDeclare::createFromBinary(Byt throw new BinaryFormatException(__FILE__, __LINE__); } - ret->fromBinary(in); - return ret; } int AbstractReservedClassDeclare::binarySize() const { - checkNotNull(this->block); + checkNotNull(this->name); int total = sizeof(uint16_t); // toBinaryHead(out); total += sizeof(uint16_t); // out->putShort(getClassType()); - total += stringSize(this->name); - - total += sizeof(uint8_t); - if(this->extends != nullptr){ - total += this->extends->binarySize(); - } - - total += sizeof(uint8_t); - if(this->implements != nullptr){ - total += this->implements->binarySize(); - } - - total += sizeof(uint16_t); - int maxLoop = this->methods->size(); - for(int i = 0; i != maxLoop; ++i){ - MethodDeclare* method = this->methods->get(i); - - total += method->binarySize(); - } - - total += sizeof(uint16_t); - maxLoop = this->members->size(); - for(int i = 0; i != maxLoop; ++i){ - MemberVariableDeclare* member = this->members->get(i); - - total += member->binarySize(); - } - return total; } @@ -241,74 +208,10 @@ void AbstractReservedClassDeclare::toBinary(ByteBuffer *out) const { toBinaryHead(out); out->putShort(getClassType()); - - putString(out, this->name); - - out->put(this->extends != nullptr ? (uint8_t)1 : (uint8_t)0); - if(this->extends != nullptr){ - this->extends->toBinary(out); - } - - out->put(this->implements != nullptr ? (uint8_t)1 : (uint8_t)0); - if(this->implements != nullptr){ - this->implements->toBinary(out); - } - - int maxLoop = this->methods->size(); - out->putShort(maxLoop); - for(int i = 0; i != maxLoop; ++i){ - MethodDeclare* method = this->methods->get(i); - - method->toBinary(out); - } - - maxLoop = this->members->size(); - out->putShort(maxLoop); - for(int i = 0; i != maxLoop; ++i){ - MemberVariableDeclare* member = this->members->get(i); - - member->toBinary(out); - } } void AbstractReservedClassDeclare::fromBinary(ByteBuffer *in) { - this->name = getString(in); - bool bl = in->get(); - if(bl == 1){ - CodeElement* element = CodeElement::createFromBinary(in); - checkKind(element, CodeElement::CLASS_EXTENDS); - this->extends = dynamic_cast(element); - } - - bl = in->get(); - if(bl == 1){ - CodeElement* element = CodeElement::createFromBinary(in); - checkKind(element, CodeElement::CLASS_IMPLEMENTS); - this->implements = dynamic_cast(element); - } - - int maxLoop = in->getShort(); - for(int i = 0; i != maxLoop; ++i){ - CodeElement* element = CodeElement::createFromBinary(in); __STP(element); - MethodDeclare* method = dynamic_cast(element); - - checkNotNull(method); - __STP_MV(element); - - this->methods->addElement(method); - } - - maxLoop = in->getShort(); - for(int i = 0; i != maxLoop; ++i){ - CodeElement* element = CodeElement::createFromBinary(in); __STP(element); - MemberVariableDeclare* member = dynamic_cast(element); - - checkNotNull(member); - __STP_MV(element); - - this->members->addElement(member); - } } void AbstractReservedClassDeclare::addMethod(MethodDeclare *method) noexcept { diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp index b955487..e50b125 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp @@ -26,7 +26,10 @@ #include "vm/stack/MethodArgumentSetupper.h" #include "vm/stack/StackPopper.h" +#include "instance/reserved_classes/object/ObjectObjectMethod.h" +#include "instance/reserved_classes/list/ListListMethod.h" +#include "lang/sc_declare/AccessControlDeclare.h" namespace alinous { AbstractReservedMethodDeclare::AbstractReservedMethodDeclare(uint32_t methodId) : MethodDeclare(RESERVED_METHOD_DECLARE) { @@ -38,13 +41,41 @@ AbstractReservedMethodDeclare::~AbstractReservedMethodDeclare() { } AbstractReservedMethodDeclare* AbstractReservedMethodDeclare::createMethodFromBinary(ByteBuffer *in) { - uint16_t methodId = in->getShort(); + AbstractReservedMethodDeclare* method = nullptr; + uint32_t methodId = in->getInt(); switch(methodId){ + case METHOD_OBJECT_OBJECT: + method = new ObjectObjectMethod(); + break; + case METHOD_LIST_LIST: + method = new ListListMethod(); + break; default: return nullptr; } + return method; +} + +int AbstractReservedMethodDeclare::binarySize() const { + checkNotNull(this->name); + checkNotNull(this->ctrl); + checkNotNull(this->args); + + int total = sizeof(uint16_t); + total += sizeof(uint32_t); + + return total; +} + +void AbstractReservedMethodDeclare::toBinary(ByteBuffer *out) const { + out->putShort(this->kind); + out->putInt(this->methodId); +} + +void AbstractReservedMethodDeclare::fromBinary(ByteBuffer *in) { + } void AbstractReservedMethodDeclare::preAnalyze(AnalyzeContext *actx) { diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h index ad8585b..ef81570 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h @@ -16,11 +16,17 @@ class AbstractReservedMethodDeclare : public MethodDeclare { public: static constexpr const uint32_t METHOD_OBJECT_OBJECT = 1; + static constexpr const uint32_t METHOD_LIST_LIST = 100; + explicit AbstractReservedMethodDeclare(uint32_t methodId); virtual ~AbstractReservedMethodDeclare(); static AbstractReservedMethodDeclare* createMethodFromBinary(ByteBuffer* in); + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + void preAnalyze(AnalyzeContext* actx); void analyzeTypeRef(AnalyzeContext* actx); void analyze(AnalyzeContext* actx); diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp index 99f48d6..dd0b5b2 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp @@ -26,6 +26,8 @@ #include "instance/reserved_classes/object/ObjectClassDeclare.h" +#include "instance/reserved_classes/list/ListClassDeclare.h" + #include "lang/sc_declare/PackageDeclare.h" #include "lang/sc_declare/PackageNameDeclare.h" @@ -59,6 +61,10 @@ ReservedClassRegistory::ReservedClassRegistory() { // Object Class aclass = ObjectClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); + + // List Class (Generics) + aclass = ListClassDeclare::createAnalyzedClass(); + addAnalyzedClass(aclass); } AnalyzedClass* ReservedClassRegistory::getAnalyzedClass(const UnicodeString* fqn) const noexcept { @@ -74,14 +80,6 @@ void ReservedClassRegistory::addAnalyzedClass(AnalyzedClass* aclass) noexcept { } ReservedClassRegistory::~ReservedClassRegistory() { - int maxLoop = this->list.size(); - for(int i = 0; i != maxLoop; ++i){ - AnalyzedClass* aclass = this->list.get(i); - - ClassDeclare* dec = aclass->getClassDeclare(); - delete dec; - } - this->list.deleteElements(); this->unitlist->deleteElements(); @@ -94,6 +92,7 @@ const ArrayList* ReservedClassRegistory::getReservedClassesList() CompilationUnit* ReservedClassRegistory::makeCompilantUnit(const UnicodeString *packageName) noexcept { CompilationUnit* unit = new CompilationUnit(); + this->unitlist->addElement(unit); if(packageName != nullptr){ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt index 695ab25..bec5512 100644 --- a/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt +++ b/src_smartcontract_vm/instance/reserved_classes/list/CMakeLists.txt @@ -2,6 +2,9 @@ set(__src ListClassDeclare.cpp + ListClassInstanceFactory.cpp + ListListMethod.cpp + VmListClassInstance.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes/list) diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp index 042210a..6b455d1 100644 --- a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.cpp @@ -6,16 +6,90 @@ */ #include "instance/reserved_classes/list/ListClassDeclare.h" +#include "instance/reserved_classes/list/ListClassInstanceFactory.h" +#include "instance/reserved_classes/list/ListListMethod.h" + +#include "instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h" + +#include "base/UnicodeString.h" +#include "base/ArrayList.h" +#include "base/StackRelease.h" + +#include "engine/sc_analyze/AnalyzedClass.h" + +#include "lang/sc_declare/GenericsParameter.h" +#include "lang/sc_declare/ClassName.h" +#include "lang/sc_declare/MemberVariableDeclare.h" + namespace alinous { +const UnicodeString ListClassDeclare::NAME(L"List"); +const UnicodeString ListClassDeclare::PACKAGE(L"lang"); + ListClassDeclare::ListClassDeclare() { + this->fqn = new UnicodeString(&PACKAGE); + this->fqn->append(L".").append(&NAME); + this->name = new UnicodeString(&NAME); + // generic parameter + { + GenericsParameter *p = new GenericsParameter(); + p->setGenericsName(new UnicodeString(L"T")); + p->setGenericsExtendsName(new ClassName(L"Object")); + this->genericsParams->addElement(p); + } + + addMethod(new ListListMethod()); } ListClassDeclare::~ListClassDeclare() { } +const UnicodeString* ListClassDeclare::getPackageName() const noexcept { + return &PACKAGE; +} + +IVmInstanceFactory* ListClassDeclare::getFactory() const noexcept { + return ListClassInstanceFactory::getInstance(); +} + +const UnicodeString* ListClassDeclare::getFullQualifiedName() noexcept { + return this->fqn; +} + +AnalyzedClass* ListClassDeclare::createAnalyzedClass() noexcept { + ListClassDeclare* classDec = new ListClassDeclare(); + AnalyzedClass* aclass = new AnalyzedClass(classDec); + + return aclass; +} + +ClassDeclare* ListClassDeclare::generateGenericsImplement(HashMap *input) { + ReservedGeneratedGenericsClassDeclare* inst = new ReservedGeneratedGenericsClassDeclare(); __STP(inst); + inst->setGenericsClassDeclare(this); + + AbstractReservedGenericsClassDeclare::doGenerateGenericsImplement(inst, input); + + int maxLoop = this->methods->size(); + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* m = this->methods->get(i); + + MethodDeclare* copied = m->generateGenericsImplement(input); + inst->addMethod(copied); + } + + maxLoop = this->members->size(); + for(int i = 0; i != maxLoop; ++i){ + MemberVariableDeclare* m = this->members->get(i); + + MemberVariableDeclare* copied = m->generateGenericsImplement(input); + inst->addMemberVariable(copied); + } + + return __STP_MV(inst); +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h index 77fe26a..390ebba 100644 --- a/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassDeclare.h @@ -14,8 +14,24 @@ namespace alinous { class ListClassDeclare : public AbstractReservedGenericsClassDeclare { public: + static const UnicodeString NAME; + static const UnicodeString PACKAGE; + ListClassDeclare(); virtual ~ListClassDeclare(); + + static AnalyzedClass* createAnalyzedClass() noexcept; + + virtual uint16_t getGenericsClassType() const noexcept { + return TYPE_GENERICS_LIST_CLASS; + } + + virtual const UnicodeString* getPackageName() const noexcept; + + virtual IVmInstanceFactory* getFactory() const noexcept; + const virtual UnicodeString* getFullQualifiedName() noexcept; + + virtual ClassDeclare* generateGenericsImplement(HashMap* input); }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.cpp b/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.cpp new file mode 100644 index 0000000..c9866a2 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.cpp @@ -0,0 +1,32 @@ +/* + * ListClassInstanceFactory.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/list/ListClassInstanceFactory.h" +#include "instance/reserved_classes/list/VmListClassInstance.h" + +namespace alinous { + +ListClassInstanceFactory::ListClassInstanceFactory() { + +} + +ListClassInstanceFactory::~ListClassInstanceFactory() { + +} + +VmClassInstance* ListClassInstanceFactory::createInstance(AnalyzedClass *clazz, VirtualMachine *vm) { + VmListClassInstance* inst = new(vm) VmListClassInstance(clazz, vm); + + return inst; +} + +ListClassInstanceFactory* ListClassInstanceFactory::getInstance() noexcept { + static ListClassInstanceFactory inst; + return &inst; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.h b/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.h new file mode 100644 index 0000000..da3119d --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListClassInstanceFactory.h @@ -0,0 +1,27 @@ +/* + * ListClassInstanceFactory.h + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSINSTANCEFACTORY_H_ +#define INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSINSTANCEFACTORY_H_ + +#include "engine/sc_analyze/IVmInstanceFactory.h" + +namespace alinous { + +class ListClassInstanceFactory : public IVmInstanceFactory { +public: + ListClassInstanceFactory(); + virtual ~ListClassInstanceFactory(); + + virtual VmClassInstance* createInstance(AnalyzedClass* clazz, VirtualMachine* vm); + + static ListClassInstanceFactory* getInstance() noexcept; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_LIST_LISTCLASSINSTANCEFACTORY_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp new file mode 100644 index 0000000..5bbf1a5 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp @@ -0,0 +1,54 @@ +/* + * ListListMethod.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/list/ListListMethod.h" + +#include "base/UnicodeString.h" + +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" + + +namespace alinous { + +const UnicodeString ListListMethod::METHOD_NAME(L"List"); + +ListListMethod::ListListMethod() : AbstractGenericReservedMethodDeclare(METHOD_LIST_LIST) { + this->_static = false; + this->name = new UnicodeString(METHOD_NAME); + this->ctrl = new AccessControlDeclare(AccessControlDeclare::PUBLIC); + this->type = nullptr; + this->args = new ArgumentsListDeclare(); +} + +ListListMethod::~ListListMethod() { + +} + +void ListListMethod::init(VirtualMachine *vm) { + AbstractReservedMethodDeclare::init(vm); +} + +void ListListMethod::interpret(FunctionArguments *args, VirtualMachine *vm) { + AbstractReservedMethodDeclare::interpret(args, vm); + +} + +const UnicodeString* ListListMethod::toString() { + return &METHOD_NAME; +} + +MethodDeclare* ListListMethod::generateGenericsImplement(HashMap *input) const { + ListListMethod* inst = new ListListMethod(); + inst->copyCodePositions(this); + + AbstractGenericReservedMethodDeclare::doGenerateGenericsImplement(inst, input); + + return inst; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.h b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.h new file mode 100644 index 0000000..b0d6051 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.h @@ -0,0 +1,31 @@ +/* + * ListListMethod.h + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_LIST_LISTLISTMETHOD_H_ +#define INSTANCE_RESERVED_CLASSES_LIST_LISTLISTMETHOD_H_ + +#include "instance/reserved_generics/AbstractGenericReservedMethodDeclare.h" + +namespace alinous { + +class ListListMethod : public AbstractGenericReservedMethodDeclare { +public: + static const UnicodeString METHOD_NAME; + + ListListMethod(); + virtual ~ListListMethod(); + + virtual void init(VirtualMachine* vm); + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); + virtual const UnicodeString* toString(); + + virtual MethodDeclare* generateGenericsImplement(HashMap *input) const; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_LIST_LISTLISTMETHOD_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.cpp b/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.cpp new file mode 100644 index 0000000..a44901a --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.cpp @@ -0,0 +1,21 @@ +/* + * VmListClassInstance.cpp + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes/list/VmListClassInstance.h" + +namespace alinous { + +VmListClassInstance::VmListClassInstance(AnalyzedClass* clazz, VirtualMachine* v) + : AbstractVmReservedInstance(clazz, v) { + +} + +VmListClassInstance::~VmListClassInstance() { + +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.h b/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.h new file mode 100644 index 0000000..4a4a370 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/list/VmListClassInstance.h @@ -0,0 +1,23 @@ +/* + * VmListClassInstance.h + * + * Created on: Nov 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_LIST_VMLISTCLASSINSTANCE_H_ +#define INSTANCE_RESERVED_CLASSES_LIST_VMLISTCLASSINSTANCE_H_ + +#include "instance/reserved_classes/AbstractVmReservedInstance.h" + +namespace alinous { + +class VmListClassInstance : public AbstractVmReservedInstance { +public: + VmListClassInstance(AnalyzedClass* clazz, VirtualMachine* v); + virtual ~VmListClassInstance(); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_LIST_VMLISTCLASSINSTANCE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp index 5dd486f..168a8fc 100644 --- a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.cpp @@ -27,7 +27,6 @@ ObjectClassDeclare::ObjectClassDeclare() { this->name = new UnicodeString(&NAME); addMethod(new ObjectObjectMethod()); - } ObjectClassDeclare::~ObjectClassDeclare() { diff --git a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h index 610f611..7ef4aba 100644 --- a/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/object/ObjectClassDeclare.h @@ -32,7 +32,7 @@ class ObjectClassDeclare : public AbstractReservedClassDeclare { virtual void init(alinous::VirtualMachine *vm); virtual ClassDeclare* getBaseClass() const noexcept; virtual IVmInstanceFactory* getFactory() const noexcept; - const virtual alinous::UnicodeString* getFullQualifiedName() noexcept; + const virtual UnicodeString* getFullQualifiedName() noexcept; private: diff --git a/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp index 7dbb2fc..efc724e 100644 --- a/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/object/VmObjectClassInstance.cpp @@ -11,7 +11,6 @@ namespace alinous { VmObjectClassInstance::VmObjectClassInstance(AnalyzedClass* clazz, VirtualMachine* v) : AbstractVmReservedInstance(clazz, v) { - // TODO Auto-generated constructor stub } diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.cpp new file mode 100644 index 0000000..eac046c --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.cpp @@ -0,0 +1,48 @@ +/* + * AbstractGenericReservedMethodDeclare.cpp + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ + +#include "instance/reserved_generics/AbstractGenericReservedMethodDeclare.h" + +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare_types/AbstractType.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" + +#include "base/UnicodeString.h" + + +namespace alinous { + +AbstractGenericReservedMethodDeclare::AbstractGenericReservedMethodDeclare(uint32_t methodId) + : AbstractReservedMethodDeclare(methodId) { + +} + +AbstractGenericReservedMethodDeclare::~AbstractGenericReservedMethodDeclare() { + +} + +MethodDeclare* AbstractGenericReservedMethodDeclare::doGenerateGenericsImplement(AbstractGenericReservedMethodDeclare* inst, HashMap *input) const { + inst->copyCodePositions(this); + + AccessControlDeclare* copiedAccess = this->ctrl->generateGenericsImplement(input); + inst->setAccessControl(copiedAccess); + + if(this->type != nullptr){ + AbstractType* copiedType = this->type->generateGenericsImplement(input); + inst->setType(copiedType); + } + + inst->setName(new UnicodeString(this->name)); + inst->setStatic(this->_static); + + ArgumentsListDeclare* copiedArgs = this->args->generateGenericsImplement(input); + inst->setArguments(copiedArgs); + + return inst; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.h b/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.h new file mode 100644 index 0000000..0680893 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractGenericReservedMethodDeclare.h @@ -0,0 +1,25 @@ +/* + * AbstractGenericReservedMethodDeclare.h + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_GENERICS_ABSTRACTGENERICRESERVEDMETHODDECLARE_H_ +#define INSTANCE_RESERVED_GENERICS_ABSTRACTGENERICRESERVEDMETHODDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +namespace alinous { + +class AbstractGenericReservedMethodDeclare : public AbstractReservedMethodDeclare { +public: + AbstractGenericReservedMethodDeclare(uint32_t methodId); + virtual ~AbstractGenericReservedMethodDeclare(); + + virtual MethodDeclare* doGenerateGenericsImplement(AbstractGenericReservedMethodDeclare* inst, HashMap *input) const; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_GENERICS_ABSTRACTGENERICRESERVEDMETHODDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp index 9618a99..9770db6 100644 --- a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.cpp @@ -6,21 +6,41 @@ */ #include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" +#include "instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h" #include "instance/reserved_classes/list/ListClassDeclare.h" #include "filestore_block/exceptions.h" +#include "lang/sc_declare/GenericsParameter.h" +#include "lang/sc_declare/ClassDeclareBlock.h" +#include "lang/sc_declare/ClassExtends.h" +#include "lang/sc_declare/ClassImplements.h" + +#include "lang/sc_declare/MethodDeclare.h" +#include "lang/sc_declare/MemberVariableDeclare.h" + +#include "base/StackRelease.h" +#include "base/ArrayList.h" +#include "base/UnicodeString.h" + +#include "engine/sc_analyze/GeneratedGenericsTypeNaming.h" + namespace alinous { AbstractReservedGenericsClassDeclare::AbstractReservedGenericsClassDeclare() : GenericsClassDeclare(RESERVED_GENERICS_CLASS_DECLARE) { - + this->methods = new ArrayList(); + this->members = new ArrayList(); } AbstractReservedGenericsClassDeclare::~AbstractReservedGenericsClassDeclare() { + this->methods->deleteElements(); + delete this->methods; + this->members->deleteElements(); + delete this->members; } AbstractReservedGenericsClassDeclare* AbstractReservedGenericsClassDeclare::createFromBinary(ByteBuffer *in) { @@ -35,9 +55,75 @@ AbstractReservedGenericsClassDeclare* AbstractReservedGenericsClassDeclare::crea throw new BinaryFormatException(__FILE__, __LINE__); } - ret->fromBinary(in); - return ret; } +int AbstractReservedGenericsClassDeclare::binarySize() const { + int total = sizeof(uint16_t); + total += sizeof(uint16_t); // generics type + + return total; +} + +void AbstractReservedGenericsClassDeclare::toBinary(ByteBuffer *out) const { + toBinaryHead(out); + out->putShort(getGenericsClassType()); // generics type +} + +void AbstractReservedGenericsClassDeclare::fromBinary(ByteBuffer *in) { + +} + +void AbstractReservedGenericsClassDeclare::preAnalyze(AnalyzeContext *actx) { + // GenericsParams + int maxLoop = this->genericsParams->size(); + for(int i = 0; i != maxLoop; ++i){ + GenericsParameter* param = this->genericsParams->get(i); + + param->setParent(this); + param->preAnalyze(actx); + } +} + +void AbstractReservedGenericsClassDeclare::analyzeTypeRef(AnalyzeContext *actx) { + int maxLoop = this->genericsParams->size(); + for(int i = 0; i != maxLoop; ++i){ + GenericsParameter* param = this->genericsParams->get(i); + + param->analyzeTypeRef(actx); + } +} + +void AbstractReservedGenericsClassDeclare::analyze(AnalyzeContext *actx) { +} + +void AbstractReservedGenericsClassDeclare::addMethod(MethodDeclare *method) noexcept { + this->methods->addElement(method); +} + +void AbstractReservedGenericsClassDeclare::doGenerateGenericsImplement( + ReservedGeneratedGenericsClassDeclare *inst, HashMap *input) const { + inst->copyCodePositions(this); + inst->setFactory(getFactory()); + + // interface + inst->setInterface(this->interface); + + // name + UnicodeString* name = GeneratedGenericsTypeNaming::fromGenericsClassDeclare(this, input); + inst->setName(name); + + // extends + if(this->extends != nullptr){ + ClassExtends* ex = this->extends->generateGenericsImplement(input); + inst->setExtends(ex); + } + + // implements + if(this->implements != nullptr){ + ClassImplements* implements = this->implements->generateGenericsImplement(input); + inst->setImplements(implements); + } +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h index 49884ac..28a058a 100644 --- a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h @@ -12,6 +12,8 @@ namespace alinous { +class ReservedGeneratedGenericsClassDeclare; + class AbstractReservedGenericsClassDeclare : public GenericsClassDeclare { public: static constexpr const uint16_t TYPE_GENERICS_LIST_CLASS = 1; @@ -21,6 +23,30 @@ class AbstractReservedGenericsClassDeclare : public GenericsClassDeclare { static AbstractReservedGenericsClassDeclare* createFromBinary(ByteBuffer* in); + virtual uint16_t getGenericsClassType() const noexcept = 0; + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + + virtual void preAnalyze(AnalyzeContext* actx); + virtual void analyzeTypeRef(AnalyzeContext* actx); + virtual void analyze(AnalyzeContext* actx); + + virtual ArrayList* getMethods() noexcept { + return this->methods; + } + virtual ArrayList* getMemberVariables() noexcept { + return this->members; + } + + void addMethod(MethodDeclare* method) noexcept; + + virtual void doGenerateGenericsImplement(ReservedGeneratedGenericsClassDeclare* inst, HashMap *input) const; + +protected: + ArrayList* methods; + ArrayList* members; }; diff --git a/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt index f1316a1..300a6e8 100644 --- a/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt +++ b/src_smartcontract_vm/instance/reserved_generics/CMakeLists.txt @@ -1,7 +1,9 @@ set(__src + AbstractGenericReservedMethodDeclare.cpp AbstractReservedGenericsClassDeclare.cpp + ReservedGeneratedGenericsClassDeclare.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_generics) diff --git a/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.cpp new file mode 100644 index 0000000..a6c7c8d --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.cpp @@ -0,0 +1,173 @@ +/* + * ReservedGeneratedGenericsClassDeclare.cpp + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ + +#include "instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h" + +#include "lang/sc_declare/MethodDeclare.h" +#include "lang/sc_declare/MemberVariableDeclare.h" +#include "lang/sc_declare/ClassExtends.h" +#include "lang/sc_declare/ClassImplements.h" + +#include "base/StackRelease.h" + +namespace alinous { + + +ReservedGeneratedGenericsClassDeclare::ReservedGeneratedGenericsClassDeclare() + : GenericsGeneratedClassDeclare(RESERVED_GENERATED_GENERICS_CLASS_DECLARE) { + this->methods = new ArrayList(); + this->members = new ArrayList(); +} + +ReservedGeneratedGenericsClassDeclare::~ReservedGeneratedGenericsClassDeclare() { + this->methods->deleteElements(); + this->members->deleteElements(); + + delete this->methods; + delete this->members; +} + +int ReservedGeneratedGenericsClassDeclare::binarySize() const { + checkNotNull(this->name); + + int total = sizeof(uint16_t); // this->kind + + total += sizeof(uint8_t); // interface + + total += stringSize(this->name); + + total += sizeof(uint8_t); + if(this->extends != nullptr){ + total += this->extends->binarySize(); + } + + total += sizeof(uint8_t); + if(this->implements != nullptr){ + total += this->implements->binarySize(); + } + + // members + int maxLoop = this->methods->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* m = this->methods->get(i); + total += m->binarySize(); + } + + maxLoop = this->members->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + MemberVariableDeclare* m = this->members->get(i); + total += m->binarySize(); + } + + return total; + +} + +void ReservedGeneratedGenericsClassDeclare::toBinary(ByteBuffer *out) { + out->put(this->interface ? 1 : 0); + + checkNotNull(this->name); + + out->putShort(this->kind); + + putString(out, this->name); + + uint8_t bl = this->extends != nullptr ? 1 : 0; + out->put(bl); + if(this->extends != nullptr){ + this->extends->toBinary(out); + } + + bl = this->implements != nullptr ? 1 : 0; + out->put(bl); + if(this->implements != nullptr){ + this->implements->toBinary(out); + } + + // members + int maxLoop = this->methods->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* m = this->methods->get(i); + m->toBinary(out); + } + + maxLoop = this->members->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + MemberVariableDeclare* m = this->members->get(i); + m->toBinary(out); + } +} + +void ReservedGeneratedGenericsClassDeclare::fromBinary(ByteBuffer *in) { + this->interface = (in->get() > 0 ? 1 : 0); + this->name = getString(in); + + bool bl = in->get(); + if(bl == 1){ + CodeElement* element = CodeElement::createFromBinary(in); + checkKind(element, CodeElement::CLASS_EXTENDS); + this->extends = dynamic_cast(element); + } + + bl = in->get(); + if(bl == 1){ + CodeElement* element = CodeElement::createFromBinary(in); + checkKind(element, CodeElement::CLASS_IMPLEMENTS); + this->implements = dynamic_cast(element); + } + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + CodeElement* element = CodeElement::createFromBinary(in); __STP(element); + MethodDeclare* m = dynamic_cast(element); + checkNotNull(m); + + __STP_MV(element); + this->methods->addElement(m); + } + + maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + CodeElement* element = CodeElement::createFromBinary(in); __STP(element); + MemberVariableDeclare* m = dynamic_cast(element); + checkNotNull(m); + + __STP_MV(element); + this->members->addElement(m); + } +} + +void ReservedGeneratedGenericsClassDeclare::preAnalyze(AnalyzeContext *actx) { + GenericsGeneratedClassDeclare::preAnalyze(actx); + +} + +void ReservedGeneratedGenericsClassDeclare::analyzeTypeRef(AnalyzeContext *actx) { + GenericsGeneratedClassDeclare::analyzeTypeRef(actx); +} + +void ReservedGeneratedGenericsClassDeclare::analyze(AnalyzeContext *actx) { + GenericsGeneratedClassDeclare::analyze(actx); +} + +void ReservedGeneratedGenericsClassDeclare::addMethod(MethodDeclare *method) noexcept { + this->methods->addElement(method); +} + +void ReservedGeneratedGenericsClassDeclare::addMemberVariable(MemberVariableDeclare *variable) noexcept { + this->members->addElement(variable); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h new file mode 100644 index 0000000..c06bb30 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h @@ -0,0 +1,45 @@ +/* + * ReservedGeneratedGenericsClassDeclare.h + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_GENERICS_RESERVEDGENERATEDGENERICSCLASSDECLARE_H_ +#define INSTANCE_RESERVED_GENERICS_RESERVEDGENERATEDGENERICSCLASSDECLARE_H_ + +#include "lang/sc_declare/GenericsGeneratedClassDeclare.h" + +namespace alinous { + +class ReservedGeneratedGenericsClassDeclare : public GenericsGeneratedClassDeclare { +public: + ReservedGeneratedGenericsClassDeclare(); + virtual ~ReservedGeneratedGenericsClassDeclare(); + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out); + virtual void fromBinary(ByteBuffer* in); + + virtual void preAnalyze(AnalyzeContext* actx); + virtual void analyzeTypeRef(AnalyzeContext* actx); + virtual void analyze(AnalyzeContext* actx); + + virtual ArrayList* getMethods() noexcept { + return this->methods; + } + virtual ArrayList* getMemberVariables() noexcept { + return this->members; + } + + void addMethod(MethodDeclare* method) noexcept; + void addMemberVariable(MemberVariableDeclare* variable) noexcept; + +protected: + ArrayList* methods; + ArrayList* members; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_GENERICS_RESERVEDGENERATEDGENERICSCLASSDECLARE_H_ */ diff --git a/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt b/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt index 9560153..a03a8c1 100644 --- a/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt +++ b/src_test/smartcontract_vm/reserved_classes/CMakeLists.txt @@ -1,6 +1,8 @@ set(testsrc + test_generic_list_binary.cpp test_generic_list.cpp + test_object_class_binary.cpp test_object_class.cpp test_string_class.cpp ) diff --git a/src_test/smartcontract_vm/reserved_classes/resources/list/case01/SampleObject.alns b/src_test/smartcontract_vm/reserved_classes/resources/list/case01/SampleObject.alns new file mode 100644 index 0000000..9bfbdf5 --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/resources/list/case01/SampleObject.alns @@ -0,0 +1,9 @@ +package test.fw; + +class SampleObject { + public SampleObject() { + + } + + private int count = 0; +} \ No newline at end of file diff --git a/src_test/smartcontract_vm/reserved_classes/resources/list/case01/main.alns b/src_test/smartcontract_vm/reserved_classes/resources/list/case01/main.alns new file mode 100644 index 0000000..35d437d --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/resources/list/case01/main.alns @@ -0,0 +1,16 @@ + +package test.fw; + +import lang.List; + +class SmartContract { + public SmartContract() { + this.list = new List(); + } + + public int main(){ + + } + + private List list; +} diff --git a/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp b/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp index 06bdabb..90d8838 100644 --- a/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp +++ b/src_test/smartcontract_vm/reserved_classes/test_generic_list.cpp @@ -20,6 +20,23 @@ TEST_GROUP(TestGenericListGroup) { TEST(TestGenericListGroup, case01){ + const File* projectFolder = this->env->getProjectRoot(); + VmTestUtils util(L"src_test/smartcontract_vm/reserved_classes/resources/list/case01/", projectFolder); + + bool result = util.loadAllFiles(); + CHECK(result) + util.setMain(L"test.fw", L"SmartContract", L"main"); + + result = util.analyze(); + CHECK(result) + + result = util.createInstance(); + CHECK(result) + + // FIXME TestGenericListGroup +} + +TEST(TestGenericListGroup, case02){ } diff --git a/src_test/smartcontract_vm/reserved_classes/test_generic_list_binary.cpp b/src_test/smartcontract_vm/reserved_classes/test_generic_list_binary.cpp new file mode 100644 index 0000000..6d9ae90 --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/test_generic_list_binary.cpp @@ -0,0 +1,62 @@ +/* + * test_generic_list_binary.cpp + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "../VmTestUtils.h" +#include "ext_binary/ExtClassObject.h" + +#include "instance/reserved_classes/list/ListListMethod.h" +#include "instance/reserved_classes/list/ListClassDeclare.h" + +using namespace alinous; + +TEST_GROUP(TestGenericListBinaryGroup) { + TEST_SETUP(){} + TEST_TEARDOWN(){} +}; + + +TEST(TestGenericListBinaryGroup, case01) { + ListListMethod* method = new ListListMethod(); __STP(method); + + int cap = method->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + method->toBinary(buff); + + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); __STP(element); + ListListMethod* method2 = dynamic_cast(element); + CHECK(method2 != nullptr); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + method2->toBinary(buff2); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); +} + +TEST(TestGenericListBinaryGroup, case02) { + ListClassDeclare* clazz = new ListClassDeclare(); __STP(clazz); + + int cap = clazz->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + clazz->toBinary(buff); + + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); __STP(element); + ListClassDeclare* clazz2 = dynamic_cast(element); + CHECK(clazz2 != nullptr); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + clazz2->toBinary(buff2); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); +} + diff --git a/src_test/smartcontract_vm/reserved_classes/test_object_class_binary.cpp b/src_test/smartcontract_vm/reserved_classes/test_object_class_binary.cpp new file mode 100644 index 0000000..d47ca79 --- /dev/null +++ b/src_test/smartcontract_vm/reserved_classes/test_object_class_binary.cpp @@ -0,0 +1,62 @@ +/* + * test_object_class_binary.cpp + * + * Created on: Nov 7, 2025 + * Author: iizuka + */ + +#include "test_utils/t_macros.h" + +#include "../VmTestUtils.h" +#include "ext_binary/ExtClassObject.h" + +#include "instance/reserved_classes/object/ObjectObjectMethod.h" +#include "instance/reserved_classes/object/ObjectClassDeclare.h" + +using namespace alinous; + +TEST_GROUP(TestObjectClassBinaryGroup) { + TEST_SETUP(){} + TEST_TEARDOWN(){} +}; + +TEST(TestObjectClassBinaryGroup, case01){ + ObjectObjectMethod* method = new ObjectObjectMethod(); __STP(method); + + int cap = method->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + method->toBinary(buff); + + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); __STP(element); + ObjectObjectMethod* method2 = dynamic_cast(element); + CHECK(method2 != nullptr); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + method2->toBinary(buff2); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); +} + +TEST(TestObjectClassBinaryGroup, case02){ + ObjectClassDeclare* clazz = new ObjectClassDeclare(); __STP(clazz); + + int cap = clazz->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + clazz->toBinary(buff); + + buff->position(0); + + CodeElement* element = CodeElement::createFromBinary(buff); __STP(element); + ObjectClassDeclare* clazz2 = dynamic_cast(element); + CHECK(clazz2 != nullptr); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + clazz2->toBinary(buff2); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); +} + From 373d6f014889f059731512b7c97770c3caa29874 Mon Sep 17 00:00:00 2001 From: iizuka Date: Sat, 15 Nov 2025 16:06:48 +0800 Subject: [PATCH 03/11] Modular Smartcontract project structure --- src_blockchain/bc/SoftwareVersion.cpp | 6 + src_blockchain/bc/SoftwareVersion.h | 1 + src_db/json_object/AbstractJsonObject.cpp | 42 +++++ src_db/json_object/AbstractJsonObject.h | 10 ++ src_db/json_object/JsonArrayObject.cpp | 40 +++++ src_db/json_object/JsonArrayObject.h | 4 + src_db/json_object/JsonBooleanValue.cpp | 20 +++ src_db/json_object/JsonBooleanValue.h | 4 + src_db/json_object/JsonNumericValue.cpp | 17 ++ src_db/json_object/JsonNumericValue.h | 4 + src_db/json_object/JsonObject.cpp | 48 +++++ src_db/json_object/JsonObject.h | 5 + src_db/json_object/JsonStringValue.cpp | 25 +++ src_db/json_object/JsonStringValue.h | 4 + src_db/json_object/JsonValuePair.cpp | 35 ++++ src_db/json_object/JsonValuePair.h | 4 + .../engine/sc_analyze/TypeResolver.cpp | 14 +- .../sc_statement_exception/CatchStatement.cpp | 2 +- .../sc_statement_exception/ThrowStatement.cpp | 2 +- .../DatabaseExceptionClassDeclare.cpp | 10 +- .../DatabaseExceptionClassDeclare.h | 4 +- .../AbstractDependencyConfig.cpp | 51 +++++- .../AbstractDependencyConfig.h | 11 ++ .../AbstractSmartcontractModule.cpp | 18 ++ .../AbstractSmartcontractModule.h | 3 + .../modular_project/CMakeLists.txt | 1 + .../modular_project/DependencyConfig.cpp | 33 +++- .../modular_project/DependencyConfig.h | 1 + .../ExecutableSmartcontractModule.cpp | 9 + .../ExecutableSmartcontractModule.h | 2 + .../LibrarySmartcontractModule.cpp | 45 +++++ .../LibrarySmartcontractModule.h | 5 + .../LocalProjectModuleDependencyConfig.cpp | 59 +++++++ .../LocalProjectModuleDependencyConfig.h | 39 +++++ .../modular_project/ModularInstanceConfig.cpp | 165 ++++++++++++++++-- .../modular_project/ModularInstanceConfig.h | 18 +- .../modular_project/ModularProjectConfig.cpp | 119 +++++++++++++ .../modular_project/ModularProjectConfig.h | 7 + .../ModularSmartcontractProject.cpp | 39 ++++- .../ModularSmartcontractProject.h | 3 + .../ModularSmartcontractVersion.cpp | 5 + .../ModularSmartcontractVersion.h | 1 + .../modular_project_registory/CMakeLists.txt | 7 + .../ModularSmartcontractProjectRegistory.cpp | 20 +++ .../ModularSmartcontractProjectRegistory.h | 21 +++ .../AbstractExecutableModuleInstance.cpp | 79 +++++++++ .../AbstractExecutableModuleInstance.h | 49 ++++++ .../smartcontract_instance/CMakeLists.txt | 3 + .../ExecutableModuleInstance.cpp | 41 +++++ .../ExecutableModuleInstance.h | 34 ++++ .../LibraryExectableModuleInstance.cpp | 41 +++++ .../LibraryExectableModuleInstance.h | 42 +++++ .../ModularSmartcontractInstance.cpp | 59 ++++++- .../ModularSmartcontractInstance.h | 29 +++ .../ArrayOutOfBoundsExceptionClassDeclare.cpp | 10 +- .../ArrayOutOfBoundsExceptionClassDeclare.h | 3 +- .../NullPointerExceptionClassDeclare.cpp | 9 +- .../NullPointerExceptionClassDeclare.h | 4 +- .../TypeCastExceptionClassDeclare.cpp | 8 +- .../TypeCastExceptionClassDeclare.h | 3 +- .../ZeroDivisionExceptionClassDeclare.cpp | 6 +- .../ExceptionClassDeclare.cpp | 4 +- .../ExceptionClassDeclare.h | 3 +- .../bigint/BigIntegerClassDeclare.cpp | 21 +++ .../bigint/BigIntegerClassDeclare.h | 21 +++ .../reserved_classes/bigint/CMakeLists.txt | 2 +- src_smartcontract_vm/vm/VirtualMachine.cpp | 7 +- src_test/db/db_json/test_json_copy.cpp | 113 ++++++++++++ .../test_exec_alter_column_add_error.cpp | 4 +- .../test_exec_alter_column_drop_error.cpp | 4 +- .../test_exec_alter_index_add_err.cpp | 10 +- .../test_exec_alter_index_drop_err.cpp | 6 +- .../test_exec_alter_modify_index_check.cpp | 2 +- .../test_exec_alter_modify_text_type.cpp | 18 +- .../test_exec_alter_modify_unique.cpp | 2 +- .../test_exec_alter_primary.cpp | 8 +- .../ddl/table_alter_rename/CMakeLists.txt | 1 + .../test_exec_alter_rename_column.cpp | 5 +- .../test_exec_alter_rename_table_err.cpp | 2 +- .../ddl/table_ddl/test_create_table_error.cpp | 4 +- .../ddl/table_ddl/test_drop_table.cpp | 2 +- .../engine/test_transaction_fw.cpp | 6 +- .../smartcontract_db/table/test_insert.cpp | 8 +- .../variable/test_dom_array.cpp | 14 +- .../variable/test_dom_array_member.cpp | 10 +- .../variable/test_dom_variable.cpp | 4 +- .../instance/test_modular_instance.cpp | 18 +- .../case01/project01/exec/config.json | 7 +- .../project01/modules/mod01/config.json | 5 +- .../project01/modules/mod02/config.json | 5 +- .../project/test_modular_project.cpp | 2 + .../access_inst/test_array_access.cpp | 6 +- .../test_array_instruction_access.cpp | 6 +- .../access_inst/test_nullpointerexception.cpp | 4 +- .../inheritance/test_super_constructor.cpp | 2 +- .../stmt_exception/test_try_catch.cpp | 6 +- .../variables/test_allocation.cpp | 2 +- 97 files changed, 1627 insertions(+), 120 deletions(-) create mode 100644 src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp create mode 100644 src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h create mode 100644 src_smartcontract_modular/modular_project_registory/CMakeLists.txt create mode 100644 src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp create mode 100644 src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h create mode 100644 src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h create mode 100644 src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h create mode 100644 src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h create mode 100644 src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.h diff --git a/src_blockchain/bc/SoftwareVersion.cpp b/src_blockchain/bc/SoftwareVersion.cpp index fa2e936..06db532 100644 --- a/src_blockchain/bc/SoftwareVersion.cpp +++ b/src_blockchain/bc/SoftwareVersion.cpp @@ -15,6 +15,12 @@ namespace codablecash { +SoftwareVersion::SoftwareVersion(const SoftwareVersion &inst) { + this->major = inst.major; + this->minor = inst.minor; + this->patch = inst.patch; +} + SoftwareVersion::SoftwareVersion(int major, int minor, int patch) { this->major = major; this->minor = minor; diff --git a/src_blockchain/bc/SoftwareVersion.h b/src_blockchain/bc/SoftwareVersion.h index 689699f..421eb15 100644 --- a/src_blockchain/bc/SoftwareVersion.h +++ b/src_blockchain/bc/SoftwareVersion.h @@ -19,6 +19,7 @@ namespace codablecash { class SoftwareVersion { public: + SoftwareVersion(const SoftwareVersion& inst); SoftwareVersion(int major, int minor, int patch); virtual ~SoftwareVersion(); diff --git a/src_db/json_object/AbstractJsonObject.cpp b/src_db/json_object/AbstractJsonObject.cpp index b94115a..28b5923 100644 --- a/src_db/json_object/AbstractJsonObject.cpp +++ b/src_db/json_object/AbstractJsonObject.cpp @@ -6,7 +6,17 @@ */ #include "json_object/AbstractJsonObject.h" +#include "json_object/JsonObject.h" +#include "json_object/JsonValuePair.h" +#include "json_object/JsonArrayObject.h" +#include "base_io/ByteBuffer.h" + +#include "json_object/JsonStringValue.h" + +#include "json_object/JsonBooleanValue.h" + +#include "json_object/JsonNumericValue.h" namespace codablecash { AbstractJsonObject::AbstractJsonObject() { @@ -17,4 +27,36 @@ AbstractJsonObject::~AbstractJsonObject() { } +AbstractJsonObject* AbstractJsonObject::createFromBinary(ByteBuffer *in) { + AbstractJsonObject* object = nullptr; + + uint8_t type = in->get(); + switch(type){ + case JSON_TYPE_OBJECT: + object = new JsonObject(); + break; + case JSON_TYPE_ARRAY_OBJECT: + object = new JsonArrayObject(); + break; + case JSON_TYPE_VALUE_PAIR: + object = new JsonValuePair(); + break; + case JSON_TYPE_STRING_VALUE: + object = new JsonStringValue(); + break; + case JSON_TYPE_BOOLEAN_VALUE: + object = new JsonBooleanValue(); + break; + case JSON_TYPE_NUMERIC_VALUE: + object = new JsonNumericValue(); + break; + default: + return nullptr; + } + + object->fromBinary(in); + + return object; +} + } /* namespace codablecash */ diff --git a/src_db/json_object/AbstractJsonObject.h b/src_db/json_object/AbstractJsonObject.h index 3f27d5b..51b8437 100644 --- a/src_db/json_object/AbstractJsonObject.h +++ b/src_db/json_object/AbstractJsonObject.h @@ -9,6 +9,11 @@ #define JSON_OBJECT_ABSTRACTJSONOBJECT_H_ #include +namespace alinous { +class ByteBuffer; +} +using namespace alinous; + namespace codablecash { class AbstractJsonObject { @@ -26,6 +31,11 @@ class AbstractJsonObject { virtual uint8_t getType() const noexcept = 0; virtual AbstractJsonObject* copy() const noexcept = 0; virtual bool equals(const AbstractJsonObject* other) const noexcept = 0; + + virtual int binarySize() const = 0; + virtual void toBinary(ByteBuffer *out) const = 0; + virtual void fromBinary(ByteBuffer *in) = 0; + static AbstractJsonObject* createFromBinary(ByteBuffer* in); }; } /* namespace codablecash */ diff --git a/src_db/json_object/JsonArrayObject.cpp b/src_db/json_object/JsonArrayObject.cpp index 138ea24..22c2e5b 100644 --- a/src_db/json_object/JsonArrayObject.cpp +++ b/src_db/json_object/JsonArrayObject.cpp @@ -8,6 +8,10 @@ #include "json_object/JsonArrayObject.h" #include "json_object/AbstractJsonObject.h" +#include "base_io/ByteBuffer.h" + +#include "bc_base/BinaryUtils.h" + namespace codablecash { @@ -68,4 +72,40 @@ bool JsonArrayObject::equals(const AbstractJsonObject *other) const noexcept { return bl; } +int JsonArrayObject::binarySize() const { + int total = sizeof(uint8_t); + + int maxLoop = this->list->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* obj = this->list->get(i); + total += obj->binarySize(); + } + + return total; +} + +void JsonArrayObject::toBinary(ByteBuffer *out) const { + out->put(getType()); + + int maxLoop = this->list->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* obj = this->list->get(i); + obj->toBinary(out); + } +} + +void JsonArrayObject::fromBinary(ByteBuffer *in) { + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(in); + BinaryUtils::checkNotNull(obj); + + this->list->addElement(obj); + } +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonArrayObject.h b/src_db/json_object/JsonArrayObject.h index d4abae1..f14e572 100644 --- a/src_db/json_object/JsonArrayObject.h +++ b/src_db/json_object/JsonArrayObject.h @@ -35,6 +35,10 @@ class JsonArrayObject : public AbstractJsonContainer { virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: ArrayList* list; }; diff --git a/src_db/json_object/JsonBooleanValue.cpp b/src_db/json_object/JsonBooleanValue.cpp index 879ff03..e4a2329 100644 --- a/src_db/json_object/JsonBooleanValue.cpp +++ b/src_db/json_object/JsonBooleanValue.cpp @@ -7,6 +7,9 @@ #include "json_object/JsonBooleanValue.h" +#include "base_io/ByteBuffer.h" + + namespace codablecash { JsonBooleanValue::JsonBooleanValue(const JsonBooleanValue &inst) { @@ -31,4 +34,21 @@ bool JsonBooleanValue::equals(const AbstractJsonObject *other) const noexcept { return v != nullptr && this->value == v->value; } +int JsonBooleanValue::binarySize() const { + int total = sizeof(uint8_t); + total += sizeof(uint8_t); + + return total; +} + +void JsonBooleanValue::toBinary(ByteBuffer *out) const { + out->put(getType()); + out->put(this->value ? 1 : 0); +} + +void JsonBooleanValue::fromBinary(ByteBuffer *in) { + uint8_t bl = in->get(); + this->value = bl > 0; +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonBooleanValue.h b/src_db/json_object/JsonBooleanValue.h index b3d6df3..8c7ccdc 100644 --- a/src_db/json_object/JsonBooleanValue.h +++ b/src_db/json_object/JsonBooleanValue.h @@ -33,6 +33,10 @@ class JsonBooleanValue : public AbstractJsonValue { virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: bool value; }; diff --git a/src_db/json_object/JsonNumericValue.cpp b/src_db/json_object/JsonNumericValue.cpp index 62bd8d1..bbb08cb 100644 --- a/src_db/json_object/JsonNumericValue.cpp +++ b/src_db/json_object/JsonNumericValue.cpp @@ -7,6 +7,7 @@ #include "json_object/JsonNumericValue.h" +#include "base_io/ByteBuffer.h" namespace codablecash { JsonNumericValue::JsonNumericValue(const JsonNumericValue &inst) { @@ -35,4 +36,20 @@ bool JsonNumericValue::equals(const AbstractJsonObject *other) const noexcept { return v != nullptr && this->value == v->value; } +int JsonNumericValue::binarySize() const { + int total = sizeof(uint8_t); + total += sizeof(uint32_t); + + return total; +} + +void JsonNumericValue::toBinary(ByteBuffer *out) const { + out->put(getType()); + out->putInt(this->value); +} + +void JsonNumericValue::fromBinary(ByteBuffer *in) { + this->value = in->getInt(); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonNumericValue.h b/src_db/json_object/JsonNumericValue.h index eddbba6..f3b3fb0 100644 --- a/src_db/json_object/JsonNumericValue.h +++ b/src_db/json_object/JsonNumericValue.h @@ -33,6 +33,10 @@ class JsonNumericValue : public AbstractJsonValue { virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: int value; }; diff --git a/src_db/json_object/JsonObject.cpp b/src_db/json_object/JsonObject.cpp index 8ad028d..2c40a23 100644 --- a/src_db/json_object/JsonObject.cpp +++ b/src_db/json_object/JsonObject.cpp @@ -12,7 +12,11 @@ #include "base/UnicodeString.h" +#include "base_io/ByteBuffer.h" +#include "bc_base/BinaryUtils.h" + +#include "base/StackRelease.h" using namespace alinous; namespace codablecash { @@ -67,6 +71,12 @@ const JsonValuePair* JsonObject::get(const wchar_t *name) const noexcept { return ret; } + +bool JsonObject::hasNamedPair(const wchar_t *name) const noexcept { + const JsonValuePair* p = get(name); + return p != nullptr; +} + AbstractJsonObject* JsonObject::copy() const noexcept { return new JsonObject(*this); } @@ -96,4 +106,42 @@ int JsonObject::size() const noexcept { return this->list->size(); } +int JsonObject::binarySize() const { + int total = sizeof(uint8_t); + + int maxLoop = this->list->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + JsonValuePair* obj = this->list->get(i); + total += obj->binarySize(); + } + + return total; +} + +void JsonObject::toBinary(ByteBuffer *out) const { + out->put(getType()); + + int maxLoop = this->list->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + JsonValuePair* obj = this->list->get(i); + obj->toBinary(out); + } +} + +void JsonObject::fromBinary(ByteBuffer *in) { + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(in); __STP(obj); + JsonValuePair* pair = dynamic_cast(obj); + BinaryUtils::checkNotNull(pair); + + this->list->addElement(pair); + __STP_MV(obj); + } +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonObject.h b/src_db/json_object/JsonObject.h index 2af36ab..571571b 100644 --- a/src_db/json_object/JsonObject.h +++ b/src_db/json_object/JsonObject.h @@ -33,10 +33,15 @@ class JsonObject : public AbstractJsonContainer { const JsonValuePair* get(int pos) const noexcept; const JsonValuePair* get(const wchar_t* name) const noexcept; int size() const noexcept; + bool hasNamedPair(const wchar_t* name) const noexcept; virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: ArrayList* list; }; diff --git a/src_db/json_object/JsonStringValue.cpp b/src_db/json_object/JsonStringValue.cpp index c4dc7a0..25f13fb 100644 --- a/src_db/json_object/JsonStringValue.cpp +++ b/src_db/json_object/JsonStringValue.cpp @@ -9,6 +9,10 @@ #include "base/UnicodeString.h" +#include "bc_base/BinaryUtils.h" + +#include "base_io/ByteBuffer.h" + namespace codablecash { @@ -48,4 +52,25 @@ bool JsonStringValue::equals(const AbstractJsonObject *other) const noexcept { return otherString != nullptr && this->value->equals(str); } +int JsonStringValue::binarySize() const { + BinaryUtils::checkNotNull(this->value); + + int total = sizeof(uint8_t); + total += BinaryUtils::stringSize(this->value); + + return total; +} + +void JsonStringValue::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->value); + + out->put(getType()); + BinaryUtils::putString(out, this->value); +} + +void JsonStringValue::fromBinary(ByteBuffer *in) { + this->value = BinaryUtils::getString(in); + BinaryUtils::checkNotNull(this->value); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonStringValue.h b/src_db/json_object/JsonStringValue.h index 98473d0..90e4caa 100644 --- a/src_db/json_object/JsonStringValue.h +++ b/src_db/json_object/JsonStringValue.h @@ -37,6 +37,10 @@ class JsonStringValue : public AbstractJsonValue { virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: UnicodeString* value; }; diff --git a/src_db/json_object/JsonValuePair.cpp b/src_db/json_object/JsonValuePair.cpp index d035ec0..081040b 100644 --- a/src_db/json_object/JsonValuePair.cpp +++ b/src_db/json_object/JsonValuePair.cpp @@ -9,7 +9,11 @@ #include "json_object/AbstractJsonValue.h" #include "json_object/AbstractJsonObject.h" +#include "bc_base/BinaryUtils.h" +#include "base_io/ByteBuffer.h" + +#include "base/StackRelease.h" namespace codablecash { JsonValuePair::JsonValuePair(const JsonValuePair& inst) { @@ -52,4 +56,35 @@ bool JsonValuePair::equals(const AbstractJsonObject *other) const noexcept { return bl; } +int JsonValuePair::binarySize() const { + BinaryUtils::checkNotNull(this->key); + BinaryUtils::checkNotNull(this->value); + + int total = sizeof(uint8_t); + + total += this->key->binarySize(); + total += this->value->binarySize(); + + return total; +} + +void JsonValuePair::toBinary(ByteBuffer *out) const { + out->put(getType()); + + this->key->toBinary(out); + this->value->toBinary(out); +} + +void JsonValuePair::fromBinary(ByteBuffer *in) { + { + AbstractJsonObject* object = createFromBinary(in); __STP(object); + this->key = dynamic_cast(object); + BinaryUtils::checkNotNull(this->key); + __STP_MV(object); + } + + this->value = createFromBinary(in); + BinaryUtils::checkNotNull(this->value); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonValuePair.h b/src_db/json_object/JsonValuePair.h index 6c65fdd..6cb36c8 100644 --- a/src_db/json_object/JsonValuePair.h +++ b/src_db/json_object/JsonValuePair.h @@ -38,6 +38,10 @@ class JsonValuePair : public AbstractJsonObject { virtual AbstractJsonObject* copy() const noexcept; virtual bool equals(const AbstractJsonObject* other) const noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer *out) const; + virtual void fromBinary(ByteBuffer *in); + private: AbstractJsonValue* key; AbstractJsonObject* value; diff --git a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp index 2b1c34d..5325abe 100644 --- a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp +++ b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp @@ -173,11 +173,6 @@ AnalyzedType* TypeResolver::findClassType(const CodeElement* element, const Unic CompilationUnit* unit = element->getCompilationUnit(); ClassDeclare* clazz = element->getClassDeclare(); - // is Object - if(name->equals(&ObjectClassDeclare::NAME)){ - return findClassType(&ObjectClassDeclare::PACKAGE, &ObjectClassDeclare::NAME); - } - // find from generitics params, like T if(clazz->isGenerics()) { GenericsClassDeclare* gclazz = dynamic_cast(clazz); @@ -211,6 +206,15 @@ AnalyzedType* TypeResolver::findClassType(const CodeElement* element, const Unic return atype; } + // find "lang" package + if(name->equals(&ObjectClassDeclare::NAME)){ + return findClassType(&ObjectClassDeclare::PACKAGE, &ObjectClassDeclare::NAME); + } + atype = findClassType(&ObjectClassDeclare::PACKAGE, name); + if(atype != nullptr){ + return atype; + } + // base class atype = findClassType((const UnicodeString*)nullptr, name); return atype; diff --git a/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp b/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp index 2f472e5..3b4714b 100644 --- a/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp @@ -76,7 +76,7 @@ void CatchStatement::analyze(AnalyzeContext* actx) { } TypeResolver* resolver = actx->getTypeResolver(); - AnalyzedType* exType = resolver->findClassType((const UnicodeString*)nullptr, &ExceptionClassDeclare::NAME); __STP(exType); + AnalyzedType* exType = resolver->findClassType(&AbstractExceptionClassDeclare::PACKAGE_NAME, &ExceptionClassDeclare::NAME); __STP(exType); AnalyzedClass* ac = at.getAnalyzedClass(); AnalyzedClass* exc = exType->getAnalyzedClass(); diff --git a/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp b/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp index ef50410..4b78c45 100644 --- a/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp @@ -61,7 +61,7 @@ void ThrowStatement::analyze(AnalyzeContext* actx) { } TypeResolver* resolver = actx->getTypeResolver(); - AnalyzedType* exType = resolver->findClassType(this, &ExceptionClassDeclare::NAME); __STP(exType); + AnalyzedType* exType = resolver->findClassType(&AbstractExceptionClassDeclare::PACKAGE_NAME, &ExceptionClassDeclare::NAME); __STP(exType); AnalyzedClass* clazz = atype.getAnalyzedClass(); if(!clazz->hasBaseClass(exType->getAnalyzedClass())){ diff --git a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp index 5a50d32..cb5fcfe 100644 --- a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp +++ b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp @@ -28,7 +28,9 @@ namespace alinous { -UnicodeString DatabaseExceptionClassDeclare::NAME{L"DatabaseException"}; +const UnicodeString DatabaseExceptionClassDeclare::NAME{L"DatabaseException"}; +const UnicodeString DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME{L"lang.DatabaseException"}; + AnalyzedClass* DatabaseExceptionClassDeclare::createAnalyzedClass() noexcept { DatabaseExceptionClassDeclare* classDec = new DatabaseExceptionClassDeclare(); @@ -41,7 +43,11 @@ void DatabaseExceptionClassDeclare::throwException(const UnicodeString* msg, Vir ExecControlManager* ctrl = vm->getCtrl(); IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&NAME); + UnicodeString fqn(AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); diff --git a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h index 1f820c3..4b33694 100644 --- a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h +++ b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.h @@ -14,7 +14,9 @@ namespace alinous { class DatabaseExceptionClassDeclare : public AbstractExceptionClassDeclare { public: - static UnicodeString NAME; + static const UnicodeString NAME; + static const UnicodeString FULL_QUALIFIED_NAME; + static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(const UnicodeString* msg, VirtualMachine* vm, const CodeElement* element) noexcept; diff --git a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp index a776287..ffbcc0d 100644 --- a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp +++ b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp @@ -6,15 +6,27 @@ */ #include "modular_project/AbstractDependencyConfig.h" - #include "modular_project/ModularSmartcontractVersion.h" +#include "modular_project/ModularConfigException.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "json_object/JsonObject.h" +#include "json_object/JsonValuePair.h" +#include "json_object/JsonStringValue.h" +#include "bc/ExceptionThrower.h" namespace codablecash { + +AbstractDependencyConfig::AbstractDependencyConfig(const AbstractDependencyConfig &inst) { + this->moduleName = new UnicodeString(inst.moduleName); + this->version = new ModularSmartcontractVersion(*inst.version); +} + AbstractDependencyConfig::AbstractDependencyConfig() { this->moduleName = nullptr; this->version = nullptr; @@ -25,4 +37,41 @@ AbstractDependencyConfig::~AbstractDependencyConfig() { delete this->version; } +void AbstractDependencyConfig::fromJson(AbstractDependencyConfig *inst, const JsonObject *jsonObj) { + { + const JsonValuePair* pair = jsonObj->get(NAME); + ExceptionThrower::throwExceptionIfCondition(pair == nullptr, L"The name is essential for dependency config.", __FILE__, __LINE__); + + AbstractJsonObject* obj = pair->getValue(); + JsonStringValue* str = dynamic_cast(obj); + ExceptionThrower::throwExceptionIfCondition(pair == nullptr, L"The name of dependency config must be string value.", __FILE__, __LINE__); + + const UnicodeString* strcValue = str->getValue(); + inst->setModuleName(strcValue); + } + + { + const JsonValuePair* pair = jsonObj->get(VERSION); + ExceptionThrower::throwExceptionIfCondition(pair == nullptr, L"The version is essential for dependency config.", __FILE__, __LINE__); + + AbstractJsonObject* obj = pair->getValue(); + JsonStringValue* str = dynamic_cast(obj); + ExceptionThrower::throwExceptionIfCondition(pair == nullptr, L"The name of dependency config must be string value.", __FILE__, __LINE__); + + const UnicodeString* strValue = str->getValue(); + ModularSmartcontractVersion* ver = ModularSmartcontractVersion::parseString(strValue); __STP(ver); + inst->setVersion(ver); + } +} + +void AbstractDependencyConfig::setModuleName(const UnicodeString *name) noexcept { + delete this->moduleName; + this->moduleName = new UnicodeString(name); +} + +void AbstractDependencyConfig::setVersion(const ModularSmartcontractVersion *v) noexcept { + delete this->version; + this->version = new ModularSmartcontractVersion(*v); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h index 4fb302a..dea265a 100644 --- a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h +++ b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h @@ -16,12 +16,23 @@ using namespace alinous; namespace codablecash { class ModularSmartcontractVersion; +class JsonObject; class AbstractDependencyConfig { public: + static constexpr const wchar_t* NAME = L"name"; + static constexpr const wchar_t* VERSION = L"version"; + + AbstractDependencyConfig(const AbstractDependencyConfig& inst); AbstractDependencyConfig(); virtual ~AbstractDependencyConfig(); + virtual AbstractDependencyConfig* copy() const = 0; + + static void fromJson(AbstractDependencyConfig* inst, const JsonObject* jsonObj); + + void setModuleName(const UnicodeString* name) noexcept; + void setVersion(const ModularSmartcontractVersion* v) noexcept; private: UnicodeString* moduleName; diff --git a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp index 9d7d2f1..2073972 100644 --- a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp +++ b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp @@ -20,6 +20,7 @@ #include "json_object/JsonArrayObject.h" #include "json_object/JsonStringValue.h" +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" namespace codablecash { @@ -40,6 +41,8 @@ AbstractSmartcontractModule::~AbstractSmartcontractModule() { this->sourceFolders->deleteElements(); delete this->sourceFolders; + delete this->instance; + delete this->version; delete this->dependencies; @@ -109,4 +112,19 @@ void AbstractSmartcontractModule::analyzeJsonObject(const JsonObject *object) { } +void AbstractSmartcontractModule::setupInstance(AbstractExecutableModuleInstance *inst) const { + inst->setProjectRelativePath(this->projectRelativePath); + + int maxLoop = this->sourceFolders->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* path = this->sourceFolders->get(i); + inst->addSourceFolders(path); + } + + inst->setSoftwareVersion(this->version); + + inst->setInstanceConfig(this->instance); + inst->setDependencyConfig(this->dependencies); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.h b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.h index 355deb0..9dd72b5 100644 --- a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.h +++ b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.h @@ -22,6 +22,7 @@ class SoftwareVersion; class DependencyConfig; class JsonObject; class ModularInstanceConfig; +class AbstractExecutableModuleInstance; class AbstractSmartcontractModule { public: @@ -37,9 +38,11 @@ class AbstractSmartcontractModule { virtual ~AbstractSmartcontractModule(); virtual void load(const File* modulePath) = 0; + virtual AbstractExecutableModuleInstance* toInstance() const = 0; protected: virtual void analyzeJsonObject(const JsonObject* object); + void setupInstance(AbstractExecutableModuleInstance* inst) const; protected: const UnicodeString* projectRelativePath; diff --git a/src_smartcontract_modular/modular_project/CMakeLists.txt b/src_smartcontract_modular/modular_project/CMakeLists.txt index 6f58095..e2a5568 100644 --- a/src_smartcontract_modular/modular_project/CMakeLists.txt +++ b/src_smartcontract_modular/modular_project/CMakeLists.txt @@ -6,6 +6,7 @@ set(__src DependencyConfig.cpp ExecutableSmartcontractModule.cpp LibrarySmartcontractModule.cpp + LocalProjectModuleDependencyConfig.cpp ModularConfigException.cpp ModularInstanceConfig.cpp ModularProjectConfig.cpp diff --git a/src_smartcontract_modular/modular_project/DependencyConfig.cpp b/src_smartcontract_modular/modular_project/DependencyConfig.cpp index a45b88f..bf57bf1 100644 --- a/src_smartcontract_modular/modular_project/DependencyConfig.cpp +++ b/src_smartcontract_modular/modular_project/DependencyConfig.cpp @@ -7,10 +7,30 @@ #include "modular_project/DependencyConfig.h" #include "modular_project/AbstractDependencyConfig.h" +#include "modular_project/ModularConfigException.h" +#include "json_object/JsonArrayObject.h" +#include "json_object/JsonValuePair.h" +#include "json_object/AbstractJsonObject.h" +#include "json_object/JsonObject.h" + +#include "bc/ExceptionThrower.h" + +#include "modular_project/LocalProjectModuleDependencyConfig.h" namespace codablecash { +DependencyConfig::DependencyConfig(const DependencyConfig &inst) { + this->list = new ArrayList(); + + int maxLoop = inst.list->size(); + for(int i = 0; i != maxLoop; ++i){ + const AbstractDependencyConfig* cfg = inst.list->get(i); + + this->list->addElement(cfg->copy()); + } +} + DependencyConfig::DependencyConfig() { this->list = new ArrayList(); @@ -22,8 +42,17 @@ DependencyConfig::~DependencyConfig() { } void DependencyConfig::load(const JsonArrayObject *dependencies) { - - + int maxLoop = dependencies->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* jobj = dependencies->get(i); + JsonObject* jsonObj = dynamic_cast(jobj); + ExceptionThrower::throwExceptionIfCondition(jsonObj == nullptr, L"The dependencies must be array object with json objects.", __FILE__, __LINE__); + + if(jsonObj->hasNamedPair(LocalProjectModuleDependencyConfig::LOCALLOC)){ + LocalProjectModuleDependencyConfig* dconf = LocalProjectModuleDependencyConfig::fromJsonObject(jsonObj); + this->list->addElement(dconf); + } + } } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/DependencyConfig.h b/src_smartcontract_modular/modular_project/DependencyConfig.h index d2741c9..4de5640 100644 --- a/src_smartcontract_modular/modular_project/DependencyConfig.h +++ b/src_smartcontract_modular/modular_project/DependencyConfig.h @@ -23,6 +23,7 @@ class DependencyConfig { static constexpr const wchar_t* NAME = L"name"; static constexpr const wchar_t* VERSION = L"version"; + DependencyConfig(const DependencyConfig& inst); DependencyConfig(); virtual ~DependencyConfig(); diff --git a/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.cpp b/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.cpp index 2d752ed..564ed42 100644 --- a/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.cpp +++ b/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.cpp @@ -8,6 +8,8 @@ #include "modular_project/ExecutableSmartcontractModule.h" #include "modular_project/ModularConfigException.h" +#include "smartcontract_instance/ExecutableModuleInstance.h" + #include "json/JsonHandler.h" #include "json_object/AbstractJsonObject.h" @@ -44,4 +46,11 @@ void ExecutableSmartcontractModule::load(const File *modulePath) { analyzeJsonObject(root); } +AbstractExecutableModuleInstance* ExecutableSmartcontractModule::toInstance() const { + ExecutableModuleInstance* inst = new ExecutableModuleInstance(); __STP(inst); + setupInstance(inst); + + return __STP_MV(inst); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.h b/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.h index 15edcbf..2392f9d 100644 --- a/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.h +++ b/src_smartcontract_modular/modular_project/ExecutableSmartcontractModule.h @@ -18,6 +18,8 @@ class ExecutableSmartcontractModule : public AbstractSmartcontractModule { virtual ~ExecutableSmartcontractModule(); virtual void load(const File* modulePath); + + virtual AbstractExecutableModuleInstance* toInstance() const; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp index f2e0663..9e0ca4c 100644 --- a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp +++ b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp @@ -8,12 +8,15 @@ #include "modular_project/LibrarySmartcontractModule.h" #include "modular_project/ModularConfigException.h" +#include "smartcontract_instance/LibraryExectableModuleInstance.h" + #include "json/JsonHandler.h" #include "json_object/AbstractJsonObject.h" #include "json_object/JsonObject.h" #include "json_object/JsonStringValue.h" #include "json_object/JsonValuePair.h" +#include "json_object/JsonArrayObject.h" #include "base/StackRelease.h" #include "base/UnicodeString.h" @@ -28,10 +31,14 @@ namespace codablecash { LibrarySmartcontractModule::LibrarySmartcontractModule(const UnicodeString* projectRelativePath) : AbstractSmartcontractModule(projectRelativePath) { this->libraryName = nullptr; + this->exportClasses = new ArrayList(); } LibrarySmartcontractModule::~LibrarySmartcontractModule() { delete this->libraryName; + + this->exportClasses->deleteElements(); + delete this->exportClasses; } void LibrarySmartcontractModule::load(const File *modulePath) { @@ -53,6 +60,27 @@ void LibrarySmartcontractModule::load(const File *modulePath) { ExceptionThrower::throwExceptionIfCondition(strValue == nullptr, L"The libraryName must be String.", __FILE__, __LINE__); } + // exportClasses + { + const JsonValuePair* pair = root->get(EXPORT_CLASSES); + if(pair != nullptr){ + AbstractJsonObject* obj = pair->getValue(); + JsonArrayObject* exportClasses = dynamic_cast(obj); + ExceptionThrower::throwExceptionIfCondition(exportClasses == nullptr, L"The exportClasses must be array object.", __FILE__, __LINE__); + + int maxLoop = exportClasses->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* element = exportClasses->get(i); + JsonStringValue* strValue = dynamic_cast(element); + + ExceptionThrower::throwExceptionIfCondition(strValue == nullptr, L"The element of exportClasses must be a String object.", __FILE__, __LINE__); + const UnicodeString* str = strValue->getValue(); + + this->exportClasses->addElement(new UnicodeString(str)); + } + } + } + analyzeJsonObject(root); } @@ -61,4 +89,21 @@ void LibrarySmartcontractModule::setLibraryName(const UnicodeString *str) noexce this->libraryName = new UnicodeString(str); } +AbstractExecutableModuleInstance* LibrarySmartcontractModule::toInstance() const { + LibraryExectableModuleInstance* inst = new LibraryExectableModuleInstance(); __STP(inst); + setupInstance(inst); + + inst->setLibraryName(this->libraryName); + + int maxLoop = this->exportClasses->size(); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* clazz = this->exportClasses->get(i); + inst->addExportClass(clazz); + } + + return __STP_MV(inst); +} + + + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h index 3ae0e94..440fb05 100644 --- a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h +++ b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h @@ -15,6 +15,7 @@ namespace codablecash { class LibrarySmartcontractModule : public AbstractSmartcontractModule { public: static constexpr const wchar_t* LIBRARY_NAME = L"libraryName"; + static constexpr const wchar_t* EXPORT_CLASSES = L"exportClasses"; explicit LibrarySmartcontractModule(const UnicodeString* projectRelativePath); virtual ~LibrarySmartcontractModule(); @@ -23,8 +24,12 @@ class LibrarySmartcontractModule : public AbstractSmartcontractModule { void setLibraryName(const UnicodeString* str) noexcept; + + virtual AbstractExecutableModuleInstance* toInstance() const; + private: UnicodeString* libraryName; + ArrayList* exportClasses; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp new file mode 100644 index 0000000..ed13ba7 --- /dev/null +++ b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp @@ -0,0 +1,59 @@ +/* + * LocalProjectModuleDependencyConfig.cpp + * + * Created on: Nov 14, 2025 + * Author: iizuka + */ + +#include "modular_project/LocalProjectModuleDependencyConfig.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "json_object/JsonObject.h" +#include "json_object/JsonValuePair.h" +#include "json_object/JsonStringValue.h" + + +namespace codablecash { + +LocalProjectModuleDependencyConfig::LocalProjectModuleDependencyConfig(const LocalProjectModuleDependencyConfig &inst) + : AbstractDependencyConfig(inst) { + this->localloc = inst.localloc != nullptr ? new UnicodeString(inst.localloc) : nullptr; +} + +LocalProjectModuleDependencyConfig::LocalProjectModuleDependencyConfig() { + this->localloc = nullptr; +} + +LocalProjectModuleDependencyConfig::~LocalProjectModuleDependencyConfig() { + delete this->localloc; +} + +AbstractDependencyConfig* LocalProjectModuleDependencyConfig::copy() const { + return new LocalProjectModuleDependencyConfig(*this); +} + +LocalProjectModuleDependencyConfig* LocalProjectModuleDependencyConfig::fromJsonObject(const JsonObject *jsonObj) { + LocalProjectModuleDependencyConfig* inst = new LocalProjectModuleDependencyConfig(); __STP(inst); + + fromJson(inst, jsonObj); + + { + const JsonValuePair* p = jsonObj->get(LOCALLOC); // existence is proved + AbstractJsonObject* jvalue = p->getValue(); + JsonStringValue* jstr = dynamic_cast(jvalue); + + const UnicodeString* lloc = jstr->getValue(); + inst->setLocalLoc(lloc); + } + + return __STP_MV(inst); +} + +void LocalProjectModuleDependencyConfig::setLocalLoc(const UnicodeString *lloc) noexcept { + delete this->localloc; + this->localloc = new UnicodeString(lloc); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h new file mode 100644 index 0000000..40d73cd --- /dev/null +++ b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h @@ -0,0 +1,39 @@ +/* + * LocalProjectModuleDependencyConfig.h + * + * Created on: Nov 14, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_LOCALPROJECTMODULEDEPENDENCYCONFIG_H_ +#define MODULAR_PROJECT_LOCALPROJECTMODULEDEPENDENCYCONFIG_H_ + +#include "modular_project/AbstractDependencyConfig.h" + +namespace codablecash { + +class LocalProjectModuleDependencyConfig; +class JsonObject; + +class LocalProjectModuleDependencyConfig : public AbstractDependencyConfig { +public: + static constexpr const wchar_t* LOCALLOC = L"localloc"; + + LocalProjectModuleDependencyConfig(const LocalProjectModuleDependencyConfig& inst); + LocalProjectModuleDependencyConfig(); + virtual ~LocalProjectModuleDependencyConfig(); + + virtual AbstractDependencyConfig* copy() const; + + static LocalProjectModuleDependencyConfig* fromJsonObject(const JsonObject* jsonObj); + + void setLocalLoc(const UnicodeString* lloc) noexcept; + +private: + UnicodeString* localloc; + +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_LOCALPROJECTMODULEDEPENDENCYCONFIG_H_ */ diff --git a/src_smartcontract_modular/modular_project/ModularInstanceConfig.cpp b/src_smartcontract_modular/modular_project/ModularInstanceConfig.cpp index ff271dd..d69a89c 100644 --- a/src_smartcontract_modular/modular_project/ModularInstanceConfig.cpp +++ b/src_smartcontract_modular/modular_project/ModularInstanceConfig.cpp @@ -15,9 +15,14 @@ #include "json_object/JsonStringValue.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" #include "bc/ExceptionThrower.h" +#include "bc_base/BinaryUtils.h" + +#include "base_io/ByteBuffer.h" + namespace codablecash { @@ -27,7 +32,8 @@ ModularInstanceConfig::ModularInstanceConfig() { this->initializerMethod = nullptr; this->initializerMethodArguments = new ArrayList(); - this->exportMethods = new ArrayList(); + this->libExport = new ArrayList(); + this->directAccess = new ArrayList(); } @@ -39,8 +45,11 @@ ModularInstanceConfig::~ModularInstanceConfig() { this->initializerMethodArguments->deleteElements(); delete this->initializerMethodArguments; - this->exportMethods->deleteElements(); - delete this->exportMethods; + this->libExport->deleteElements(); + delete this->libExport; + + this->directAccess->deleteElements(); + delete this->directAccess; } void ModularInstanceConfig::load(const JsonObject *instance) { @@ -60,15 +69,28 @@ void ModularInstanceConfig::load(const JsonObject *instance) { } } - // exportMethods + // libExport + { + const JsonValuePair* pair = instance->get(LIB_EXPORT); + if(pair != nullptr){ + AbstractJsonObject* object = pair->getValue(); + JsonArrayObject* libExport = dynamic_cast(object); + + if(libExport != nullptr){ + loadLibExport(libExport); + } + } + } + + // directAccess { - const JsonValuePair* pair = instance->get(EXPORT_METHODS); + const JsonValuePair* pair = instance->get(DIRECT_ACCESS); if(pair != nullptr){ AbstractJsonObject* object = pair->getValue(); - JsonArrayObject* exportMethods = dynamic_cast(object); + JsonArrayObject* directAccess = dynamic_cast(object); - if(exportMethods != nullptr){ - loadExportMethods(exportMethods); + if(directAccess != nullptr){ + loadDirectAccess(directAccess); } } } @@ -137,16 +159,29 @@ void ModularInstanceConfig::loadInitializer(const JsonObject *initializer) { } } -void ModularInstanceConfig::loadExportMethods(const JsonArrayObject *exportMethods) { - int maxLoop = exportMethods->size(); +void ModularInstanceConfig::loadLibExport(const JsonArrayObject *libExport) { + int maxLoop = libExport->size(); for(int i = 0; i != maxLoop; ++i){ - AbstractJsonObject* jobj = exportMethods->get(i); + AbstractJsonObject* jobj = libExport->get(i); JsonStringValue* stringValue = dynamic_cast(jobj); - ExceptionThrower::throwExceptionIfCondition(stringValue == nullptr, L"The exportMethods must be string value.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(stringValue == nullptr, L"The libExport must be string value.", __FILE__, __LINE__); - const UnicodeString* method = stringValue->getValue(); - this->exportMethods->addElement(new UnicodeString(method)); + const UnicodeString* __interface = stringValue->getValue(); + this->libExport->addElement(new UnicodeString(__interface)); + } +} + +void ModularInstanceConfig::loadDirectAccess(const JsonArrayObject *directAccess) { + int maxLoop = directAccess->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* jobj = directAccess->get(i); + JsonStringValue* stringValue = dynamic_cast(jobj); + + ExceptionThrower::throwExceptionIfCondition(stringValue == nullptr, L"The directAccess must be string value.", __FILE__, __LINE__); + + const UnicodeString* __interface = stringValue->getValue(); + this->directAccess->addElement(new UnicodeString(__interface)); } } @@ -165,4 +200,106 @@ void ModularInstanceConfig::setInitializerMethod(const UnicodeString *value) noe this->initializerMethod = new UnicodeString(value); } +int ModularInstanceConfig::binarySize() const { + BinaryUtils::checkNotNull(this->mainPackage); + BinaryUtils::checkNotNull(this->mainClass); + BinaryUtils::checkNotNull(this->initializerMethod); + + int total = BinaryUtils::stringSize(this->mainPackage); + total += BinaryUtils::stringSize(this->mainClass); + total += BinaryUtils::stringSize(this->initializerMethod); + + int maxLoop = this->initializerMethodArguments->size(); + total += sizeof(uint16_t); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonValue* value = this->initializerMethodArguments->get(i); + + total += value->binarySize(); + } + + maxLoop = this->libExport->size(); + total += sizeof(uint16_t); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* element = this->libExport->get(i); + total += BinaryUtils::stringSize(element); + } + + maxLoop = this->directAccess->size(); + total += sizeof(uint16_t); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* element = this->directAccess->get(i); + total += BinaryUtils::stringSize(element); + } + + return total; +} + +void ModularInstanceConfig::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->mainPackage); + BinaryUtils::checkNotNull(this->mainClass); + BinaryUtils::checkNotNull(this->initializerMethod); + + BinaryUtils::putString(out, this->mainPackage); + BinaryUtils::putString(out, this->mainClass); + BinaryUtils::putString(out, this->initializerMethod); + + int maxLoop = this->initializerMethodArguments->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonValue* value = this->initializerMethodArguments->get(i); + + value->toBinary(out); + } + + maxLoop = this->libExport->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* element = this->libExport->get(i); + BinaryUtils::putString(out, element); + } + + maxLoop = this->directAccess->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* element = this->directAccess->get(i); + BinaryUtils::putString(out, element); + } +} + +ModularInstanceConfig* ModularInstanceConfig::createFromBinary(ByteBuffer *in) { + ModularInstanceConfig* inst = new ModularInstanceConfig(); __STP(inst); + + inst->fromBinary(in); + + return __STP_MV(inst); +} + +void ModularInstanceConfig::fromBinary(ByteBuffer *in) { + this->mainPackage = BinaryUtils::getString(in); + this->mainClass = BinaryUtils::getString(in); + this->initializerMethod = BinaryUtils::getString(in); + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(in); __STP(obj); + AbstractJsonValue* value = dynamic_cast(obj); + BinaryUtils::checkNotNull(value); + __STP_MV(obj); + + this->initializerMethodArguments->addElement(value); + } + + maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* element = BinaryUtils::getString(in); + this->libExport->addElement(element); + } + + maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* element = BinaryUtils::getString(in); + this->directAccess->addElement(element); + } +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h index bef9917..bf67d18 100644 --- a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h +++ b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h @@ -12,6 +12,7 @@ namespace alinous { class UnicodeString; +class ByteBuffer; } using namespace alinous; @@ -28,7 +29,8 @@ class ModularInstanceConfig { static const constexpr wchar_t* INITIALIZER = L"initializer"; static const constexpr wchar_t* METHOD = L"method"; static const constexpr wchar_t* ARGS = L"args"; - static const constexpr wchar_t* EXPORT_METHODS = L"exportMethods"; + static const constexpr wchar_t* LIB_EXPORT = L"libExport"; + static const constexpr wchar_t* DIRECT_ACCESS = L"directAccess"; ModularInstanceConfig(); virtual ~ModularInstanceConfig(); @@ -39,10 +41,18 @@ class ModularInstanceConfig { void setMainClass(const UnicodeString* value) noexcept; void setInitializerMethod(const UnicodeString* value) noexcept; + int binarySize() const; + void toBinary(ByteBuffer* out) const; + void fromBinary(ByteBuffer* in); + static ModularInstanceConfig* createFromBinary(ByteBuffer* in); + + + private: void loadMainPackageAndClass(const JsonObject* instance); void loadInitializer(const JsonObject* initializer); - void loadExportMethods(const JsonArrayObject* exportMethods); + void loadLibExport(const JsonArrayObject* libExport); + void loadDirectAccess(const JsonArrayObject* directAccess); private: UnicodeString* mainPackage; @@ -51,8 +61,8 @@ class ModularInstanceConfig { ArrayList* initializerMethodArguments; - ArrayList* exportMethods; - + ArrayList* libExport; + ArrayList* directAccess; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp b/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp index a5fdc00..b975734 100644 --- a/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp +++ b/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp @@ -21,6 +21,12 @@ #include "bc/ExceptionThrower.h" +#include "bc_base/BinaryUtils.h" + +#include "base_io/ByteBuffer.h" + +#include + namespace codablecash { @@ -89,6 +95,18 @@ void ModularProjectConfig::load(const File *file) { } } + // license + { + const JsonValuePair* pair = root->get(LICENSE); + if(pair != nullptr){ + AbstractJsonObject* obj = pair->getValue(); + JsonStringValue* stringValue = dynamic_cast(obj); + ExceptionThrower::throwExceptionIfCondition(stringValue == nullptr, L"The license must be string value.", __FILE__, __LINE__); + + setLicense(stringValue->getValue()); + } + } + // libraries { const JsonValuePair* pair = root->get(LIBRALIES); @@ -135,4 +153,105 @@ void ModularProjectConfig::addLibrary(const UnicodeString *libname) noexcept { this->libralies->addElement(str); } +int ModularProjectConfig::binarySize() const { + BinaryUtils::checkNotNull(this->projectName); + BinaryUtils::checkNotNull(this->executable); + + int total = BinaryUtils::stringSize(this->projectName); + total += BinaryUtils::stringSize(this->executable); + + total += sizeof(uint8_t); + if(this->author != nullptr){ + total += BinaryUtils::stringSize(this->author); + } + + total += sizeof(uint8_t); + if(this->license != nullptr){ + total += BinaryUtils::stringSize(this->author); + } + + int maxLoop = this->libralies->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* lib = this->libralies->get(i); + total += BinaryUtils::stringSize(lib); + } + + return total; +} + +void ModularProjectConfig::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->projectName); + BinaryUtils::checkNotNull(this->executable); + + BinaryUtils::putString(out, this->projectName); + BinaryUtils::putString(out, this->executable); + + uint8_t bl = (this->author != nullptr) ? 1 : 0; + out->put(bl); + if(bl > 0){ + BinaryUtils::putString(out, this->author); + } + + bl = (this->license != nullptr) ? 1 : 0; + out->put(bl); + if(bl > 0){ + BinaryUtils::putString(out, this->license); + } + + int maxLoop = this->libralies->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* lib = this->libralies->get(i); + BinaryUtils::putString(out, lib); + } +} + +ModularProjectConfig* ModularProjectConfig::createFromBinary(ByteBuffer *in) { + ModularProjectConfig* inst = new ModularProjectConfig(); __STP(inst); + + { + UnicodeString* str = BinaryUtils::getString(in); __STP(str); + inst->setProjectName(str); + } + + { + UnicodeString* str = BinaryUtils::getString(in); __STP(str); + inst->setExecutable(str); + } + + uint8_t bl = in->get(); + if(bl > 0){ + UnicodeString* str = BinaryUtils::getString(in); __STP(str); + inst->setAuthor(str); + } + + bl = in->get(); + if(bl > 0){ + UnicodeString* str = BinaryUtils::getString(in); __STP(str); + inst->setLicense(str); + } + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* str = BinaryUtils::getString(in); __STP(str); + inst->addLibrary(str); + } + + return __STP_MV(inst); +} + +ModularProjectConfig* ModularProjectConfig::copy() const { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + + toBinary(buff); + buff->position(0); + + ModularProjectConfig* config = createFromBinary(buff); + return config; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularProjectConfig.h b/src_smartcontract_modular/modular_project/ModularProjectConfig.h index b4e97ba..b9382e8 100644 --- a/src_smartcontract_modular/modular_project/ModularProjectConfig.h +++ b/src_smartcontract_modular/modular_project/ModularProjectConfig.h @@ -13,6 +13,7 @@ namespace alinous { class UnicodeString; class File; +class ByteBuffer; } using namespace alinous; @@ -46,6 +47,12 @@ class ModularProjectConfig { return this->libralies; } + int binarySize() const; + void toBinary(ByteBuffer* out) const; + static ModularProjectConfig* createFromBinary(ByteBuffer* in); + + ModularProjectConfig* copy() const; + private: UnicodeString* projectName; UnicodeString* executable; diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp index d59a6d9..2aee662 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp @@ -11,11 +11,15 @@ #include "modular_project/ModularProjectConfig.h" #include "modular_project/ModularConfigException.h" -#include "base_io/File.h" +#include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "smartcontract_instance/ExecutableModuleInstance.h" +#include "smartcontract_instance/LibraryExectableModuleInstance.h" #include "base/StackRelease.h" #include "base/UnicodeString.h" +#include "base_io/File.h" + #include "bc/ExceptionThrower.h" @@ -96,4 +100,37 @@ void ModularSmartcontractProject::loadLibrary(const File* libraryPath, const Uni this->libModules->addElement(__STP_MV(libMod)); } +ModularSmartcontractInstance* ModularSmartcontractProject::toInstance() const { + ModularSmartcontractInstance* instance = new ModularSmartcontractInstance(); __STP(instance); + + instance->setModularProjectConfig(this->config); + + // exec + { + AbstractExecutableModuleInstance* inst = this->executableModule->toInstance(); + UnicodeString name(L"exec"); + inst->setName(&name); + instance->setExecutableModuleInstance(dynamic_cast(inst)); + } + + { + int maxLoop = this->libModules->size(); + for(int i = 0; i != maxLoop; ++i){ + LibrarySmartcontractModule* mod = this->libModules->get(i); + + AbstractExecutableModuleInstance* inst = mod->toInstance(); + LibraryExectableModuleInstance* lib = dynamic_cast(inst); + + const UnicodeString* name = lib->getLibraryName(); + + if(!instance->libraryExists(name)){ + instance->addLibraryModuleInstance(name, lib); + } + } + } + + return __STP_MV(instance); +} + + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h index d98f028..9366e9f 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h @@ -21,6 +21,7 @@ namespace codablecash { class ExecutableSmartcontractModule; class LibrarySmartcontractModule; class ModularProjectConfig; +class ModularSmartcontractInstance; class ModularSmartcontractProject { public: @@ -34,6 +35,8 @@ class ModularSmartcontractProject { void loadProject(); + ModularSmartcontractInstance* toInstance() const; + private: void loadExecutable(const UnicodeString* path); void loadLibrary(const File* libraryPath, const UnicodeString* libname); diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp index d1e4b56..366d48d 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp @@ -20,6 +20,11 @@ using namespace alinous; namespace codablecash { +ModularSmartcontractVersion::ModularSmartcontractVersion(const ModularSmartcontractVersion &inst) + : SoftwareVersion(inst.major, inst.minor, inst.patch) { + this->versionType = inst.versionType; +} + ModularSmartcontractVersion::ModularSmartcontractVersion(int major, int minor, int patch, int verType) : SoftwareVersion(major, minor, patch) { this->versionType = verType; diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h index 9afec78..3af054d 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h @@ -18,6 +18,7 @@ class ModularSmartcontractVersion : public SoftwareVersion { static const constexpr int TYPE_CARET{1}; static const constexpr int TYPE_TILDE{2}; + ModularSmartcontractVersion(const ModularSmartcontractVersion& inst); ModularSmartcontractVersion(int major, int minor, int patch, int verType); virtual ~ModularSmartcontractVersion(); diff --git a/src_smartcontract_modular/modular_project_registory/CMakeLists.txt b/src_smartcontract_modular/modular_project_registory/CMakeLists.txt new file mode 100644 index 0000000..df89f4a --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/CMakeLists.txt @@ -0,0 +1,7 @@ + + +set(__src + ModularSmartcontractProjectRegistory.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_modular modular_project_registory) + diff --git a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp new file mode 100644 index 0000000..4fe7373 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp @@ -0,0 +1,20 @@ +/* + * ModularSmartcontractProjectRegistory.cpp + * + * Created on: Nov 10, 2025 + * Author: iizuka + */ + +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" + +namespace alinous { + +ModularSmartcontractProjectRegistory::ModularSmartcontractProjectRegistory() { + +} + +ModularSmartcontractProjectRegistory::~ModularSmartcontractProjectRegistory() { + // TODO Auto-generated destructor stub +} + +} /* namespace alinous */ diff --git a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h new file mode 100644 index 0000000..a0b194d --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h @@ -0,0 +1,21 @@ +/* + * ModularSmartcontractProjectRegistory.h + * + * Created on: Nov 10, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_REGISTORY_MODULARSMARTCONTRACTPROJECTREGISTORY_H_ +#define MODULAR_PROJECT_REGISTORY_MODULARSMARTCONTRACTPROJECTREGISTORY_H_ + +namespace alinous { + +class ModularSmartcontractProjectRegistory { +public: + ModularSmartcontractProjectRegistory(); + virtual ~ModularSmartcontractProjectRegistory(); +}; + +} /* namespace alinous */ + +#endif /* MODULAR_PROJECT_REGISTORY_MODULARSMARTCONTRACTPROJECTREGISTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp new file mode 100644 index 0000000..2d2b773 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -0,0 +1,79 @@ +/* + * AbstractExecutableModule.cpp + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "bc/SoftwareVersion.h" + +#include "modular_project/ModularInstanceConfig.h" +#include "modular_project/DependencyConfig.h" + +#include "base_io/ByteBuffer.h" + + +namespace codablecash { + +AbstractExecutableModuleInstance::AbstractExecutableModuleInstance() { + this->name = nullptr; + this->projectRelativePath = nullptr; + + this->sourceFolders = new ArrayList(); + this->version = nullptr; + this->instanceConfig = nullptr; + this->dependencyConfig = nullptr; +} + +AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { + delete this->name; + delete this->projectRelativePath; + + this->sourceFolders->deleteElements(); + delete this->sourceFolders; + + delete this->version; + delete this->instanceConfig; + delete this->dependencyConfig; +} + +void AbstractExecutableModuleInstance::setName(const UnicodeString *name) noexcept { + delete this->name; + this->name = new UnicodeString(name); +} + +void AbstractExecutableModuleInstance::setProjectRelativePath(const UnicodeString *path) noexcept { + delete this->projectRelativePath; + this->projectRelativePath = new UnicodeString(path); +} + +void AbstractExecutableModuleInstance::addSourceFolders(const UnicodeString *folder) { + this->sourceFolders->addElement(new UnicodeString(folder)); +} + +void AbstractExecutableModuleInstance::setSoftwareVersion(const SoftwareVersion *v) { + delete this->version; + this->version = new SoftwareVersion(*v); +} + +void AbstractExecutableModuleInstance::setInstanceConfig(const ModularInstanceConfig *config) { + delete this->instanceConfig; + + int cap = config->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + config->toBinary(buff); + + buff->position(0); + this->instanceConfig = ModularInstanceConfig::createFromBinary(buff); +} + +void AbstractExecutableModuleInstance::setDependencyConfig(const DependencyConfig *config) { + delete this->dependencyConfig; + this->dependencyConfig = new DependencyConfig(*config); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h new file mode 100644 index 0000000..c89cf38 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -0,0 +1,49 @@ +/* + * AbstractExecutableModule.h + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_ABSTRACTEXECUTABLEMODULEINSTANCE_H_ +#define SMARTCONTRACT_INSTANCE_ABSTRACTEXECUTABLEMODULEINSTANCE_H_ + +namespace alinous { +class UnicodeString; +} +using namespace alinous; + +#include "base/ArrayList.h" + +namespace codablecash { + +class SoftwareVersion; +class ModularInstanceConfig; +class DependencyConfig; + +class AbstractExecutableModuleInstance { +public: + AbstractExecutableModuleInstance(); + virtual ~AbstractExecutableModuleInstance(); + + void setName(const UnicodeString* name) noexcept; + void setProjectRelativePath(const UnicodeString* path) noexcept; + void addSourceFolders(const UnicodeString* folder); + void setSoftwareVersion(const SoftwareVersion* v); + void setInstanceConfig(const ModularInstanceConfig* config); + void setDependencyConfig(const DependencyConfig* config); + +protected: + UnicodeString* name; + UnicodeString* projectRelativePath; + + ArrayList* sourceFolders; + SoftwareVersion* version; + + ModularInstanceConfig* instanceConfig; + DependencyConfig* dependencyConfig; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_ABSTRACTEXECUTABLEMODULEINSTANCE_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt index 59a8f07..02b5840 100644 --- a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt @@ -1,6 +1,9 @@ set(__src + AbstractExecutableModuleInstance.cpp + ExecutableModuleInstance.cpp + LibraryExectableModuleInstance.cpp ModularSmartcontractInstance.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_instance) diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp new file mode 100644 index 0000000..ef41b7e --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp @@ -0,0 +1,41 @@ +/* + * ExecutableModule.cpp + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ +#include "smartcontract_instance/ExecutableModuleInstance.h" + +#include "base_io/File.h" + +#include "base_io_stream/exceptions.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "bc/ExceptionThrower.h" + + +namespace codablecash { + +ExecutableModuleInstance::ExecutableModuleInstance() { + + +} + +ExecutableModuleInstance::~ExecutableModuleInstance() { + +} + +void ExecutableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { + File* baseDir = projectBaseDir->get(this->projectRelativePath); __STP(baseDir); + + ExceptionThrower::throwExceptionIfCondition(!baseDir->exists(), L"Module base folder does not exists.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(!baseDir->isDirectory(), L"Module base folder id not a directory.", __FILE__, __LINE__); + + + + +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h new file mode 100644 index 0000000..3e3b3c6 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h @@ -0,0 +1,34 @@ +/* + * ExecutableModule.h + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_EXECUTABLEMODULEINSTANCE_H_ +#define SMARTCONTRACT_INSTANCE_EXECUTABLEMODULEINSTANCE_H_ + +#include "base/ArrayList.h" +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" + +namespace alinous { +class File; +} +using namespace alinous; + + +namespace codablecash { + + +class ExecutableModuleInstance : public AbstractExecutableModuleInstance { +public: + ExecutableModuleInstance(); + virtual ~ExecutableModuleInstance(); + + void loadCompilantUnits(const File* projectBaseDir); + +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_EXECUTABLEMODULEINSTANCE_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp new file mode 100644 index 0000000..79631b2 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp @@ -0,0 +1,41 @@ +/* + * LibraryExectableModuleInstance.cpp + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/LibraryExectableModuleInstance.h" + +#include "base/UnicodeString.h" + + +namespace codablecash { + +LibraryExectableModuleInstance::LibraryExectableModuleInstance() + : AbstractExecutableModuleInstance() { + this->libraryName = nullptr; + this->exportClasses = new ArrayList(); +} + +LibraryExectableModuleInstance::~LibraryExectableModuleInstance() { + delete this->libraryName; + + this->exportClasses->deleteElements(); + delete this->exportClasses; +} + +void LibraryExectableModuleInstance::setLibraryName(const UnicodeString *str) noexcept { + delete this->libraryName; + this->libraryName = new UnicodeString(str); +} + +void LibraryExectableModuleInstance::addExportClass(const UnicodeString *clazz) noexcept { + this->exportClasses->addElement(new UnicodeString(clazz)); +} + +void LibraryExectableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { + // FIXME load lib +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h new file mode 100644 index 0000000..12955d7 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h @@ -0,0 +1,42 @@ +/* + * LibraryExectableModuleInstance.h + * + * Created on: Nov 11, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_LIBRARYEXECTABLEMODULEINSTANCE_H_ +#define SMARTCONTRACT_INSTANCE_LIBRARYEXECTABLEMODULEINSTANCE_H_ + +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" + +namespace alinous { +class File; +} +using namespace alinous; + +namespace codablecash { + +class LibraryExectableModuleInstance : public AbstractExecutableModuleInstance { +public: + LibraryExectableModuleInstance(); + virtual ~LibraryExectableModuleInstance(); + + const UnicodeString* getLibraryName() const noexcept { + return this->libraryName; + } + + void setLibraryName(const UnicodeString* str) noexcept; + void addExportClass(const UnicodeString* clazz) noexcept; + + void loadCompilantUnits(const File* projectBaseDir); + +private: + UnicodeString* libraryName; + ArrayList* exportClasses; + +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_LIBRARYEXECTABLEMODULEINSTANCE_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 2955463..679a6c4 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -6,15 +6,70 @@ */ #include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "smartcontract_instance/ExecutableModuleInstance.h" +#include "smartcontract_instance/LibraryExectableModuleInstance.h" + +#include "modular_project/ModularProjectConfig.h" + +#include "base/StackRelease.h" +#include "base/UnicodeString.h" + namespace codablecash { ModularSmartcontractInstance::ModularSmartcontractInstance() { - + this->config = nullptr; + this->execModule = nullptr; + this->libraries = new HashMap(); + this->libArray = new ArrayList(); } ModularSmartcontractInstance::~ModularSmartcontractInstance() { - // TODO Auto-generated destructor stub + delete this->config; + delete this->execModule; + + { + Iterator* it = this->libraries->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + LibraryExectableModuleInstance* inst = this->libraries->get(key); + + delete inst; + } + } + delete this->libraries; + + delete this->libArray; +} + +void ModularSmartcontractInstance::setModularProjectConfig(const ModularProjectConfig *config) { + delete this->config; + this->config = config->copy(); +} + +void ModularSmartcontractInstance::setExecutableModuleInstance(ExecutableModuleInstance *inst) { + this->execModule = inst; +} + +void ModularSmartcontractInstance::addLibraryModuleInstance(const UnicodeString *name, LibraryExectableModuleInstance *inst) { + this->libraries->put(name, inst); + this->libArray->addElement(inst); +} + +void ModularSmartcontractInstance::loadCompilantUnits(const File *projectBaseDir) { + this->execModule->loadCompilantUnits(projectBaseDir); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + inst->loadCompilantUnits(projectBaseDir); + } + +} + +bool ModularSmartcontractInstance::libraryExists(const UnicodeString *name) const noexcept { + LibraryExectableModuleInstance* value = this->libraries->get(name); + return value != nullptr; } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 36d79ec..8823b60 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -8,12 +8,41 @@ #ifndef SMARTCONTRACT_INSTANCE_MODULARSMARTCONTRACTINSTANCE_H_ #define SMARTCONTRACT_INSTANCE_MODULARSMARTCONTRACTINSTANCE_H_ +#include "base/HashMap.h" +#include "base/ArrayList.h" + +namespace alinous { +class File; +} +using namespace alinous; + namespace codablecash { +class ModularProjectConfig; +class ExecutableModuleInstance; +class LibraryExectableModuleInstance; + class ModularSmartcontractInstance { public: ModularSmartcontractInstance(); virtual ~ModularSmartcontractInstance(); + + void setModularProjectConfig(const ModularProjectConfig* config); + void setExecutableModuleInstance(ExecutableModuleInstance* inst); + void addLibraryModuleInstance(const UnicodeString* name, LibraryExectableModuleInstance* inst); + + bool libraryExists(const UnicodeString* name) const noexcept; + + void loadCompilantUnits(const File* projectBaseDir); + +private: + ModularProjectConfig* config; + + ExecutableModuleInstance* execModule; + + HashMap* libraries; + ArrayList* libArray; + }; } /* namespace codablecash */ diff --git a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp index 31b8018..914b4aa 100644 --- a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp @@ -26,7 +26,9 @@ namespace alinous { -UnicodeString ArrayOutOfBoundsExceptionClassDeclare::NAME{L"ArrayOutOfBoundsException"}; +const UnicodeString ArrayOutOfBoundsExceptionClassDeclare::NAME{L"ArrayOutOfBoundsException"}; +const UnicodeString ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME{L"lang.ArrayOutOfBoundsException"}; + ArrayOutOfBoundsExceptionClassDeclare::ArrayOutOfBoundsExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); @@ -48,7 +50,11 @@ void ArrayOutOfBoundsExceptionClassDeclare::throwException(VirtualMachine* vm, c ExecControlManager* ctrl = vm->getCtrl(); IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&NAME); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); diff --git a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h index 611d7dc..d47eb07 100644 --- a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.h @@ -14,7 +14,8 @@ namespace alinous { class ArrayOutOfBoundsExceptionClassDeclare : public AbstractExceptionClassDeclare { public: - static UnicodeString NAME; + static const UnicodeString NAME; + static const UnicodeString FULL_QUALIFIED_NAME; static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(VirtualMachine* vm, const CodeElement* element) noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp index 6860af5..ded514d 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp @@ -28,7 +28,8 @@ namespace alinous { -UnicodeString NullPointerExceptionClassDeclare::NAME{L"NullPointerException"}; +const UnicodeString NullPointerExceptionClassDeclare::NAME{L"NullPointerException"}; +const UnicodeString NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME{L"lang.NullPointerException"}; NullPointerExceptionClassDeclare::NullPointerExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); @@ -50,7 +51,11 @@ void NullPointerExceptionClassDeclare::throwException(VirtualMachine* vm, const ExecControlManager* ctrl = vm->getCtrl(); IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&NAME); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h index 2c9dfcb..edbc974 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h @@ -14,7 +14,9 @@ namespace alinous { class NullPointerExceptionClassDeclare : public AbstractExceptionClassDeclare { public: - static UnicodeString NAME; + static const UnicodeString NAME; + static const UnicodeString FULL_QUALIFIED_NAME; + static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(VirtualMachine* vm, const CodeElement* element) noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp index 2d0c123..6976fd1 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp @@ -27,7 +27,8 @@ namespace alinous { -UnicodeString TypeCastExceptionClassDeclare::NAME{L"TypeCastException"}; +const UnicodeString TypeCastExceptionClassDeclare::NAME{L"TypeCastException"}; +const UnicodeString TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME{L"lang.TypeCastException"}; TypeCastExceptionClassDeclare::TypeCastExceptionClassDeclare() { addDefaultConstructor(&NAME); @@ -49,7 +50,10 @@ void TypeCastExceptionClassDeclare::throwException(VirtualMachine* vm, const Cod ExecControlManager* ctrl = vm->getCtrl(); IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&NAME); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h index dc7c291..84d49da 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h @@ -14,7 +14,8 @@ namespace alinous { class TypeCastExceptionClassDeclare : public AbstractExceptionClassDeclare { public: - static UnicodeString NAME; + static const UnicodeString NAME; + static const UnicodeString FULL_QUALIFIED_NAME; static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(VirtualMachine* vm, const CodeElement* element) noexcept; diff --git a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp index 2a4d37c..31fd222 100644 --- a/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/ZeroDivisionExceptionClassDeclare.cpp @@ -52,7 +52,11 @@ void ZeroDivisionExceptionClassDeclare::throwException(VirtualMachine* vm, const ExecControlManager* ctrl = vm->getCtrl(); IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&NAME); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); diff --git a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp index 18bfa52..2e5c19a 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.cpp @@ -20,7 +20,9 @@ namespace alinous { -UnicodeString ExceptionClassDeclare::NAME{L"Exception"}; +const UnicodeString ExceptionClassDeclare::NAME{L"Exception"}; +const UnicodeString ExceptionClassDeclare::FULL_QUALIFIED_NAME{L"lang.Exception"}; + ExceptionClassDeclare::ExceptionClassDeclare() : AbstractExceptionClassDeclare() { addDefaultConstructor(&NAME); diff --git a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h index 7bd001e..b78164a 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception_class/ExceptionClassDeclare.h @@ -16,7 +16,8 @@ class AnalyzedClass; class ExceptionClassDeclare : public AbstractExceptionClassDeclare { public: - static UnicodeString NAME; + const static UnicodeString NAME; + const static UnicodeString FULL_QUALIFIED_NAME; static AnalyzedClass* createAnalyzedClass() noexcept; ExceptionClassDeclare(); diff --git a/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.cpp new file mode 100644 index 0000000..bfa4b17 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.cpp @@ -0,0 +1,21 @@ +/* + * BigIntegerClassDeclare.cpp + * + * Created on: Nov 8, 2025 + * Author: iizuka + */ + +#include + +namespace alinous { + +BigIntegerClassDeclare::BigIntegerClassDeclare() { + // TODO Auto-generated constructor stub + +} + +BigIntegerClassDeclare::~BigIntegerClassDeclare() { + +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.h new file mode 100644 index 0000000..8f22db9 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes/bigint/BigIntegerClassDeclare.h @@ -0,0 +1,21 @@ +/* + * BigIntegerClassDeclare.h + * + * Created on: Nov 8, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_BIGINT_BIGINTEGERCLASSDECLARE_H_ +#define INSTANCE_RESERVED_CLASSES_BIGINT_BIGINTEGERCLASSDECLARE_H_ + +namespace alinous { + +class BigIntegerClassDeclare { +public: + BigIntegerClassDeclare(); + virtual ~BigIntegerClassDeclare(); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_BIGINT_BIGINTEGERCLASSDECLARE_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt index 5160c8a..bb379a2 100644 --- a/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt +++ b/src_smartcontract_vm/instance/reserved_classes/bigint/CMakeLists.txt @@ -1,7 +1,7 @@ set(__src - + BigIntegerClassDeclare.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes/bigint) diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index 285b211..2c30642 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -227,7 +227,12 @@ void VirtualMachine::checkUncaughtException() { return; } ReservedClassRegistory* reg = getReservedClassRegistory(); - AnalyzedClass* exclass = reg->getAnalyzedClass(&ExceptionClassDeclare::NAME); + + UnicodeString fqn(AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&ExceptionClassDeclare::NAME); + + AnalyzedClass* exclass = reg->getAnalyzedClass(&fqn); this->uncaughtException = catchException(exclass); diff --git a/src_test/db/db_json/test_json_copy.cpp b/src_test/db/db_json/test_json_copy.cpp index ec045cf..43110f9 100644 --- a/src_test/db/db_json/test_json_copy.cpp +++ b/src_test/db/db_json/test_json_copy.cpp @@ -18,6 +18,7 @@ #include "base/StackRelease.h" +#include "base_io/ByteBuffer.h" using namespace codablecash; @@ -36,6 +37,20 @@ TEST(TestJsonCopyGroup, case01) { bool eq = bl.equals(bl2); CHECK(eq); + + int cap = bl2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + bl2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case02) { @@ -44,6 +59,20 @@ TEST(TestJsonCopyGroup, case02) { bool eq = value.equals(value2); CHECK(eq); + + int cap = value2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + value2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case03) { @@ -52,6 +81,20 @@ TEST(TestJsonCopyGroup, case03) { bool eq = value.equals(value2); CHECK(eq); + + int cap = value2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + value2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case04) { @@ -63,6 +106,20 @@ TEST(TestJsonCopyGroup, case04) { bool eq = value.equals(value2); CHECK(eq); + + int cap = value2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + value2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } @@ -80,6 +137,20 @@ TEST(TestJsonCopyGroup, case05) { bool eq = value->equals(value2); CHECK(eq); + + int cap = value2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + value2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case06){ @@ -96,6 +167,20 @@ TEST(TestJsonCopyGroup, case06){ bool eq = value->equals(value2); CHECK(eq); + + int cap = value2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + value2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case07){ @@ -115,6 +200,20 @@ TEST(TestJsonCopyGroup, case07){ bool bl = object->equals(object2); CHECK(!bl); + + int cap = object2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + object2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } TEST(TestJsonCopyGroup, case08){ @@ -134,4 +233,18 @@ TEST(TestJsonCopyGroup, case08){ bool bl = object->equals(object2); CHECK(!bl); + + int cap = object2->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + object2->toBinary(buff); + + buff->position(0); + AbstractJsonObject* obj = AbstractJsonObject::createFromBinary(buff); __STP(obj); + + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + obj->toBinary(buff2); + buff2->position(0); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); } diff --git a/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_add_error.cpp b/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_add_error.cpp index 7ca69df..de2dc40 100644 --- a/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_add_error.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_add_error.cpp @@ -61,7 +61,7 @@ TEST(TestExecAlterColumnAddErrorGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -84,7 +84,7 @@ TEST(TestExecAlterColumnAddErrorGroup, case02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_drop_error.cpp b/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_drop_error.cpp index 6b712f5..c49878c 100644 --- a/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_drop_error.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_column/test_exec_alter_column_drop_error.cpp @@ -61,7 +61,7 @@ TEST(TestExecAlterColumnDropErrorGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -84,6 +84,6 @@ TEST(TestExecAlterColumnDropErrorGroup, case02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_add_err.cpp b/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_add_err.cpp index 5aeb782..88c75e2 100644 --- a/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_add_err.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_add_err.cpp @@ -61,7 +61,7 @@ TEST(TestExecAlterIndexAddErrGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -96,7 +96,7 @@ TEST(TestExecAlterIndexAddErrGroup, case02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -128,7 +128,7 @@ TEST(TestExecAlterIndexAddErrGroup, case03){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -150,7 +150,7 @@ TEST(TestExecAlterIndexAddErrGroup, case04){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -173,6 +173,6 @@ TEST(TestExecAlterIndexAddErrGroup, case05){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_drop_err.cpp b/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_drop_err.cpp index 1494825..e2e2ac3 100644 --- a/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_drop_err.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_index/test_exec_alter_index_drop_err.cpp @@ -61,7 +61,7 @@ TEST(TestExecAlterIndexDropErrGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -85,7 +85,7 @@ TEST(TestExecAlterIndexDropErrGroup, case02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -108,6 +108,6 @@ TEST(TestExecAlterIndexDropErrGroup, case03){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_index_check.cpp b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_index_check.cpp index 69082a2..a80a058 100644 --- a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_index_check.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_index_check.cpp @@ -59,7 +59,7 @@ TEST(TestExecAlterModifyIndexCheckGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_text_type.cpp b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_text_type.cpp index 0925c05..8062327 100644 --- a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_text_type.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_text_type.cpp @@ -44,7 +44,7 @@ using namespace codablecash; -TEST_GROUP(TestExecAlterMofdifyTextGroup) { +TEST_GROUP(TestExecAlterModifyTextGroup) { TEST_SETUP() { env->setup(); } @@ -71,7 +71,7 @@ bool checkTextValue(const AbstractCdbValue* cdbv, const wchar_t* ans){ * text to int (includes not int) * ALTER TABLE test_table MODIFY name int; */ -TEST(TestExecAlterMofdifyTextGroup, case01){ +TEST(TestExecAlterModifyTextGroup, case01){ TestDbSchemaAlterText01 tester(this->env); tester.init(1024*512); tester.insert01(); @@ -138,7 +138,7 @@ TEST(TestExecAlterMofdifyTextGroup, case01){ * text to int (includes not int) * ALTER TABLE test_table MODIFY name int UNIQUE; */ -TEST(TestExecAlterMofdifyTextGroup, case01_err){ +TEST(TestExecAlterModifyTextGroup, case01_err){ TestDbSchemaAlterTextUnique01 tester(this->env); tester.init(1024*512); tester.insert01(); @@ -166,7 +166,7 @@ TEST(TestExecAlterMofdifyTextGroup, case01_err){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -176,7 +176,7 @@ TEST(TestExecAlterMofdifyTextGroup, case01_err){ * text change length(shorter) including null * ALTER TABLE test_table MODIFY name VARCHAR(2) UNIQUE; */ -TEST(TestExecAlterMofdifyTextGroup, case02){ +TEST(TestExecAlterModifyTextGroup, case02){ TestDbSchemaAlterTextUnique01 tester(this->env); tester.init(1024*512); tester.insert01(); @@ -251,7 +251,7 @@ TEST(TestExecAlterMofdifyTextGroup, case02){ * unique error on text change length(shorter) * ALTER TABLE test_table MODIFY name VARCHAR(2) UNIQUE; */ -TEST(TestExecAlterMofdifyTextGroup, case03_err){ +TEST(TestExecAlterModifyTextGroup, case03_err){ TestDbSchemaAlterTextUnique01 tester(this->env); tester.init(1024*512); tester.insert02(); @@ -279,7 +279,7 @@ TEST(TestExecAlterMofdifyTextGroup, case03_err){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -288,7 +288,7 @@ TEST(TestExecAlterMofdifyTextGroup, case03_err){ * text change length(longer) * ALTER TABLE test_table MODIFY name VARCHAR(255) UNIQUE; */ -TEST(TestExecAlterMofdifyTextGroup, case04){ +TEST(TestExecAlterModifyTextGroup, case04){ TestDbSchemaAlterTextUnique01 tester(this->env); tester.init(1024*512); tester.insert03(); @@ -365,7 +365,7 @@ TEST(TestExecAlterMofdifyTextGroup, case04){ * text change length(longer) * ALTER TABLE test_table MODIFY name TEXT UNIQUE; */ -TEST(TestExecAlterMofdifyTextGroup, case05){ +TEST(TestExecAlterModifyTextGroup, case05){ TestDbSchemaAlterTextUnique01 tester(this->env); tester.init(1024*512); tester.insert03(); diff --git a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_unique.cpp b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_unique.cpp index 0c5f48f..f9fc506 100644 --- a/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_unique.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_modify/test_exec_alter_modify_unique.cpp @@ -80,7 +80,7 @@ TEST(TestExecAlterMofdifyUniqueGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } /** diff --git a/src_test/smartcontract_db/ddl/table_alter_primary/test_exec_alter_primary.cpp b/src_test/smartcontract_db/ddl/table_alter_primary/test_exec_alter_primary.cpp index c49d49c..d96fca7 100644 --- a/src_test/smartcontract_db/ddl/table_alter_primary/test_exec_alter_primary.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_primary/test_exec_alter_primary.cpp @@ -33,6 +33,8 @@ #include "ext_binary/ExtExceptionObject.h" #include "trx/transaction_exception/DatabaseExceptionClassDeclare.h" + + TEST_GROUP(TestExecAlterPrimaryGroup) { TEST_SETUP() { env->setup(); @@ -94,7 +96,7 @@ TEST(TestExecAlterPrimaryGroup, dropPrimaryKey01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } /** @@ -269,7 +271,7 @@ TEST(TestExecAlterPrimaryGroup, addPrimaryKey03_err){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -291,6 +293,6 @@ TEST(TestExecAlterPrimaryGroup, addPrimaryKey04_err){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_alter_rename/CMakeLists.txt b/src_test/smartcontract_db/ddl/table_alter_rename/CMakeLists.txt index c179f4b..ecc07da 100644 --- a/src_test/smartcontract_db/ddl/table_alter_rename/CMakeLists.txt +++ b/src_test/smartcontract_db/ddl/table_alter_rename/CMakeLists.txt @@ -1,5 +1,6 @@ set(testsrc + test_exec_alter_rename_column.cpp test_exec_alter_rename_table_err.cpp test_exec_alter_rename_table.cpp test_exec_alter_rename_table.cpp diff --git a/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_column.cpp b/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_column.cpp index 597fc23..b428af3 100644 --- a/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_column.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_column.cpp @@ -34,6 +34,7 @@ #include "ext_binary/ExtExceptionObject.h" + TEST_GROUP(TestExecAlterRenameColumnGroup) { TEST_SETUP() { env->setup(); @@ -124,7 +125,7 @@ TEST(TestExecAlterRenameColumnGroup, renameColumn02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } /** @@ -160,6 +161,6 @@ TEST(TestExecAlterRenameColumnGroup, renameColumn03){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_table_err.cpp b/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_table_err.cpp index d5add65..ee3cb01 100644 --- a/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_table_err.cpp +++ b/src_test/smartcontract_db/ddl/table_alter_rename/test_exec_alter_rename_table_err.cpp @@ -71,6 +71,6 @@ TEST(TestExecAlterRenameTableErrGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_db/ddl/table_ddl/test_create_table_error.cpp b/src_test/smartcontract_db/ddl/table_ddl/test_create_table_error.cpp index d3797ce..ff7b763 100644 --- a/src_test/smartcontract_db/ddl/table_ddl/test_create_table_error.cpp +++ b/src_test/smartcontract_db/ddl/table_ddl/test_create_table_error.cpp @@ -54,7 +54,7 @@ TEST(TestCreateTableErrorGroup, case01){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } @@ -71,7 +71,7 @@ TEST(TestCreateTableErrorGroup, case02){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/ddl/table_ddl/test_drop_table.cpp b/src_test/smartcontract_db/ddl/table_ddl/test_drop_table.cpp index d268164..ec26a5b 100644 --- a/src_test/smartcontract_db/ddl/table_ddl/test_drop_table.cpp +++ b/src_test/smartcontract_db/ddl/table_ddl/test_drop_table.cpp @@ -86,7 +86,7 @@ TEST(TestDropTableGroup, case02_err){ const ExtExceptionObject* ex = tester.checkUncaughtException(); CHECK(ex != nullptr); - CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::NAME)); + CHECK(ex->getClassName()->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)); } } diff --git a/src_test/smartcontract_db/engine/test_transaction_fw.cpp b/src_test/smartcontract_db/engine/test_transaction_fw.cpp index 210b239..1fe28fb 100644 --- a/src_test/smartcontract_db/engine/test_transaction_fw.cpp +++ b/src_test/smartcontract_db/engine/test_transaction_fw.cpp @@ -79,7 +79,7 @@ TEST(TestTransactionFwGroup, case03_err){ CHECK(e != nullptr) const UnicodeString* exname = e->getClassName(); - CHECK(exname->equals(&DatabaseExceptionClassDeclare::NAME)) + CHECK(exname->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)) } TEST(TestTransactionFwGroup, case04_err){ @@ -99,7 +99,7 @@ TEST(TestTransactionFwGroup, case04_err){ CHECK(e != nullptr) const UnicodeString* exname = e->getClassName(); - CHECK(exname->equals(&DatabaseExceptionClassDeclare::NAME)) + CHECK(exname->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)) } TEST(TestTransactionFwGroup, case05_err){ @@ -119,6 +119,6 @@ TEST(TestTransactionFwGroup, case05_err){ CHECK(e != nullptr) const UnicodeString* exname = e->getClassName(); - CHECK(exname->equals(&DatabaseExceptionClassDeclare::NAME)) + CHECK(exname->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME)) } diff --git a/src_test/smartcontract_db/table/test_insert.cpp b/src_test/smartcontract_db/table/test_insert.cpp index 63f786f..ff4802a 100644 --- a/src_test/smartcontract_db/table/test_insert.cpp +++ b/src_test/smartcontract_db/table/test_insert.cpp @@ -74,7 +74,7 @@ TEST(TestInsertGroup, case03_err) { ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exName = ex->getClassName(); - bool bl = exName->equals(&DatabaseExceptionClassDeclare::NAME); + bool bl = exName->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME); CHECK(bl) } @@ -95,7 +95,7 @@ TEST(TestInsertGroup, case04_err) { ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exName = ex->getClassName(); - bool bl = exName->equals(&DatabaseExceptionClassDeclare::NAME); + bool bl = exName->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME); CHECK(bl) } @@ -116,7 +116,7 @@ TEST(TestInsertGroup, case05_err) { ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exName = ex->getClassName(); - bool bl = exName->equals(&DatabaseExceptionClassDeclare::NAME); + bool bl = exName->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME); CHECK(bl) } @@ -150,7 +150,7 @@ TEST(TestInsertGroup, case07_err){ ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exName = ex->getClassName(); - bool bl = exName->equals(&DatabaseExceptionClassDeclare::NAME); + bool bl = exName->equals(&DatabaseExceptionClassDeclare::FULL_QUALIFIED_NAME); CHECK(bl) } diff --git a/src_test/smartcontract_db/variable/test_dom_array.cpp b/src_test/smartcontract_db/variable/test_dom_array.cpp index b35703c..7179f14 100644 --- a/src_test/smartcontract_db/variable/test_dom_array.cpp +++ b/src_test/smartcontract_db/variable/test_dom_array.cpp @@ -136,7 +136,7 @@ TEST(TestDomArrayGroup, case04_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(name->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case05_err){ @@ -158,7 +158,7 @@ TEST(TestDomArrayGroup, case05_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(name->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case06){ @@ -226,7 +226,7 @@ TEST(TestDomArrayGroup, case08_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case09_err){ @@ -248,7 +248,7 @@ TEST(TestDomArrayGroup, case09_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case10_err){ @@ -270,7 +270,7 @@ TEST(TestDomArrayGroup, case10_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(name->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case11_err){ @@ -292,7 +292,7 @@ TEST(TestDomArrayGroup, case11_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(TypeCastExceptionClassDeclare::NAME)); + CHECK(name->equals(TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayGroup, case12_err){ @@ -314,7 +314,7 @@ TEST(TestDomArrayGroup, case12_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(TypeCastExceptionClassDeclare::NAME)); + CHECK(name->equals(TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_db/variable/test_dom_array_member.cpp b/src_test/smartcontract_db/variable/test_dom_array_member.cpp index e648279..c4e5c28 100644 --- a/src_test/smartcontract_db/variable/test_dom_array_member.cpp +++ b/src_test/smartcontract_db/variable/test_dom_array_member.cpp @@ -125,7 +125,7 @@ TEST(TestDomArrayMemberGroup, case04_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayMemberGroup, case05_err){ @@ -147,7 +147,7 @@ TEST(TestDomArrayMemberGroup, case05_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(name->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayMemberGroup, case06_err){ @@ -169,7 +169,7 @@ TEST(TestDomArrayMemberGroup, case06_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(name->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayMemberGroup, case07_err){ @@ -191,7 +191,7 @@ TEST(TestDomArrayMemberGroup, case07_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(TypeCastExceptionClassDeclare::NAME)); + CHECK(name->equals(TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomArrayMemberGroup, case08_err){ @@ -213,6 +213,6 @@ TEST(TestDomArrayMemberGroup, case08_err){ CHECK(ex != nullptr); const UnicodeString* name = ex->getClassName(); - CHECK(name->equals(TypeCastExceptionClassDeclare::NAME)); + CHECK(name->equals(TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_db/variable/test_dom_variable.cpp b/src_test/smartcontract_db/variable/test_dom_variable.cpp index 5fbc223..52610c4 100644 --- a/src_test/smartcontract_db/variable/test_dom_variable.cpp +++ b/src_test/smartcontract_db/variable/test_dom_variable.cpp @@ -119,7 +119,7 @@ TEST(TestDomVariableGroup, testLocalDec05_err){ ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exname = ex->getClassName(); - CHECK(exname->equals(&NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(&NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomVariableGroup, testLocalDec06_err){ @@ -140,7 +140,7 @@ TEST(TestDomVariableGroup, testLocalDec06_err){ ExtExceptionObject* ex = util.vm->getUncaughtException(); __STP(ex); const UnicodeString* exname = ex->getClassName(); - CHECK(exname->equals(&TypeCastExceptionClassDeclare::NAME)); + CHECK(exname->equals(&TypeCastExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestDomVariableGroup, testLocalDec07_err){ diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index 6ae83e0..937db82 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -6,7 +6,13 @@ */ #include "test_utils/t_macros.h" +#include "../utils/ModularProjectUtils.h" +#include "modular_project/ModularSmartcontractProject.h" + +#include "smartcontract_instance/ModularSmartcontractInstance.h" + +using namespace codablecash; TEST_GROUP(TestModularInstanceGroup) { @@ -20,9 +26,19 @@ TEST_GROUP(TestModularInstanceGroup) { TEST(TestModularInstanceGroup, case01){ - File projectFolder = this->env->testCaseDir(); + const File* projectFolder = this->env->getProjectRoot(); + + ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case01/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + ModularSmartcontractInstance* inst = project.toInstance(); __STP(inst); + inst->loadCompilantUnits(baseDir); + // FIXME TestModularInstanceGroup } diff --git a/src_test/smartcontract_modular/project/resources/case01/project01/exec/config.json b/src_test/smartcontract_modular/project/resources/case01/project01/exec/config.json index b5a5851..d1a1281 100644 --- a/src_test/smartcontract_modular/project/resources/case01/project01/exec/config.json +++ b/src_test/smartcontract_modular/project/resources/case01/project01/exec/config.json @@ -9,12 +9,13 @@ "method" : "main", "args" : [] }, - "exportMethods" : [] + "libExport" : [], + "directAccess" : [] }, "dependencies": [ - {"name" : "module_01", "version" : "^1.0.0"}, - {"name" : "module_02", "version" : "^1.0.0"} + {"name" : "module_01", "localloc": "mod01", "version" : "^1.0.0"}, + {"name" : "module_02", "localloc": "mod02", "version" : "^1.0.0"} ] } diff --git a/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod01/config.json b/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod01/config.json index 116ca92..63fe682 100644 --- a/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod01/config.json +++ b/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod01/config.json @@ -10,8 +10,11 @@ "method" : "main", "args" : [] }, - "exportMethods" : [] + "libExport" : [], + "directAccess" : [] }, + "exportClasses" : [], + "dependencies": [] } diff --git a/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod02/config.json b/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod02/config.json index 1aff0d7..8a57386 100644 --- a/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod02/config.json +++ b/src_test/smartcontract_modular/project/resources/case01/project01/modules/mod02/config.json @@ -10,8 +10,11 @@ "method" : "main", "args" : [] }, - "exportMethods" : [] + "libExport" : ["sample.IExport"], + "directAccess" : ["net.IAccess"] }, + "exportClasses" : [], + "dependencies": [] } diff --git a/src_test/smartcontract_modular/project/test_modular_project.cpp b/src_test/smartcontract_modular/project/test_modular_project.cpp index 7dff5dc..833f265 100644 --- a/src_test/smartcontract_modular/project/test_modular_project.cpp +++ b/src_test/smartcontract_modular/project/test_modular_project.cpp @@ -9,6 +9,8 @@ #include "modular_project/ModularSmartcontractProject.h" #include "modular_project/ModularConfigException.h" +#include "smartcontract_instance/ModularSmartcontractInstance.h" + #include "../utils/ModularProjectUtils.h" diff --git a/src_test/smartcontract_vm/access_inst/test_array_access.cpp b/src_test/smartcontract_vm/access_inst/test_array_access.cpp index 8341dd7..a3ac6ea 100644 --- a/src_test/smartcontract_vm/access_inst/test_array_access.cpp +++ b/src_test/smartcontract_vm/access_inst/test_array_access.cpp @@ -103,7 +103,7 @@ TEST(TestArrayAccessGroup, case05){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestArrayAccessGroup, case06){ @@ -122,7 +122,7 @@ TEST(TestArrayAccessGroup, case06){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestArrayAccessGroup, case07){ @@ -141,6 +141,6 @@ TEST(TestArrayAccessGroup, case07){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_vm/access_inst/test_array_instruction_access.cpp b/src_test/smartcontract_vm/access_inst/test_array_instruction_access.cpp index eb86fa7..4c24708 100644 --- a/src_test/smartcontract_vm/access_inst/test_array_instruction_access.cpp +++ b/src_test/smartcontract_vm/access_inst/test_array_instruction_access.cpp @@ -105,7 +105,7 @@ TEST(TestArrayInstAccessGroup, case05){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestArrayInstAccessGroup, case06){ @@ -124,7 +124,7 @@ TEST(TestArrayInstAccessGroup, case06){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestArrayInstAccessGroup, case07){ @@ -143,7 +143,7 @@ TEST(TestArrayInstAccessGroup, case07){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::NAME)); + CHECK(exname->equals(ArrayOutOfBoundsExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_vm/access_inst/test_nullpointerexception.cpp b/src_test/smartcontract_vm/access_inst/test_nullpointerexception.cpp index e5a9260..a9dd6f2 100644 --- a/src_test/smartcontract_vm/access_inst/test_nullpointerexception.cpp +++ b/src_test/smartcontract_vm/access_inst/test_nullpointerexception.cpp @@ -43,7 +43,7 @@ TEST(TestNullPointerExceptionGroup, case01) { ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestNullPointerExceptionGroup, case02) { @@ -62,5 +62,5 @@ TEST(TestNullPointerExceptionGroup, case02) { ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); } diff --git a/src_test/smartcontract_vm/inheritance/test_super_constructor.cpp b/src_test/smartcontract_vm/inheritance/test_super_constructor.cpp index 074fd40..1d119d2 100644 --- a/src_test/smartcontract_vm/inheritance/test_super_constructor.cpp +++ b/src_test/smartcontract_vm/inheritance/test_super_constructor.cpp @@ -78,7 +78,7 @@ TEST(TestSuperConstructorGroup, case03){ ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); const UnicodeString* exname = exobj->getClassName(); - CHECK(exname->equals(ExceptionClassDeclare::NAME)); + CHECK(exname->equals(ExceptionClassDeclare::FULL_QUALIFIED_NAME)); } TEST(TestSuperConstructorGroup, case04_err){ diff --git a/src_test/smartcontract_vm/stmt_exception/test_try_catch.cpp b/src_test/smartcontract_vm/stmt_exception/test_try_catch.cpp index 1c209e5..1378352 100644 --- a/src_test/smartcontract_vm/stmt_exception/test_try_catch.cpp +++ b/src_test/smartcontract_vm/stmt_exception/test_try_catch.cpp @@ -131,7 +131,7 @@ TEST(TestTryCatchGroup, case04){ CHECK(codeElement->getKind() == CodeElement::STMT_THROW) const UnicodeString* exname = exception->getClassName(); - CHECK(exname->equals(NullPointerExceptionClassDeclare::NAME)); + CHECK(exname->equals(NullPointerExceptionClassDeclare::FULL_QUALIFIED_NAME)); ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); CHECK(exobj == nullptr) @@ -160,7 +160,7 @@ TEST(TestTryCatchGroup, case05){ CHECK(codeElement->getKind() == CodeElement::STMT_THROW) const UnicodeString* exname = exception->getClassName(); - CHECK(exname->equals(ExceptionClassDeclare::NAME)); + CHECK(exname->equals(ExceptionClassDeclare::FULL_QUALIFIED_NAME)); ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); CHECK(exobj == nullptr) @@ -189,7 +189,7 @@ TEST(TestTryCatchGroup, case06){ CHECK(codeElement->getKind() == CodeElement::STMT_THROW) const UnicodeString* exname = exception->getClassName(); - CHECK(exname->equals(ExceptionClassDeclare::NAME)); + CHECK(exname->equals(ExceptionClassDeclare::FULL_QUALIFIED_NAME)); ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); CHECK(exobj == nullptr) diff --git a/src_test/smartcontract_vm/variables/test_allocation.cpp b/src_test/smartcontract_vm/variables/test_allocation.cpp index d67fede..cddbc5c 100644 --- a/src_test/smartcontract_vm/variables/test_allocation.cpp +++ b/src_test/smartcontract_vm/variables/test_allocation.cpp @@ -211,7 +211,7 @@ TEST(TestAllocationStmtGroup, primitiveArrayAllocation09){ const UnicodeString* str = e->toString(); - CHECK(str->equals(L"@Exception")); + CHECK(str->equals(L"@lang.Exception")); } TEST(TestAllocationStmtGroup, primitiveArrayAllocation10){ From 068b6be06402d247c0e9cbc32011a10028f0391e Mon Sep 17 00:00:00 2001 From: iizuka Date: Mon, 17 Nov 2025 18:46:05 +0800 Subject: [PATCH 04/11] Modular Contract base instance --- src_db/json_object/AbstractJsonValue.h | 8 + src_db/json_object/JsonBooleanValue.cpp | 5 + src_db/json_object/JsonBooleanValue.h | 2 + src_db/json_object/JsonNumericValue.cpp | 10 ++ src_db/json_object/JsonNumericValue.h | 2 + src_db/json_object/JsonStringValue.cpp | 5 + src_db/json_object/JsonStringValue.h | 2 + src_smartcontract/engine/sc/SmartContract.cpp | 3 + .../modular_project/ModularInstanceConfig.h | 13 ++ .../AbstractExecutableModuleInstance.cpp | 147 +++++++++++++++++- .../AbstractExecutableModuleInstance.h | 32 ++++ .../ExecutableModuleInstance.cpp | 10 +- .../ExecutableModuleInstance.h | 8 +- .../LibraryExectableModuleInstance.cpp | 6 +- .../LibraryExectableModuleInstance.h | 2 +- .../ModularSmartcontractInstance.cpp | 69 +++++++- .../ModularSmartcontractInstance.h | 8 + .../instance/instance_ref/VmRootReference.cpp | 5 +- .../instance/instance_ref/VmRootReference.h | 4 +- .../instance_ref_static/CMakeLists.txt | 2 +- .../StaticConstInstanceHolder.cpp | 41 +++++ ...ceHolder.h => StaticConstInstanceHolder.h} | 6 +- .../StaticInstanceHolder.cpp | 42 ----- src_smartcontract_vm/vm/VirtualMachine.cpp | 4 +- src_smartcontract_vm/vm/VirtualMachine.h | 2 +- .../project01/exec/src/sample/Sample01.alns | 2 + .../instance/test_modular_instance.cpp | 13 ++ .../method_invoke/test_call_maininst.cpp | 12 +- 28 files changed, 386 insertions(+), 79 deletions(-) create mode 100644 src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.cpp rename src_smartcontract_vm/instance/instance_ref_static/{StaticInstanceHolder.h => StaticConstInstanceHolder.h} (90%) delete mode 100644 src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.cpp diff --git a/src_db/json_object/AbstractJsonValue.h b/src_db/json_object/AbstractJsonValue.h index 4fb33fe..ddfeb9a 100644 --- a/src_db/json_object/AbstractJsonValue.h +++ b/src_db/json_object/AbstractJsonValue.h @@ -10,12 +10,20 @@ #include "json_object/AbstractJsonObject.h" +namespace alinous { +class AbstractFunctionExtArguments; + + +} // namespace alinous + namespace codablecash { class AbstractJsonValue : public AbstractJsonObject { public: AbstractJsonValue(); virtual ~AbstractJsonValue(); + + virtual AbstractFunctionExtArguments* toFunctionExtArgument() const = 0; }; } /* namespace codablecash */ diff --git a/src_db/json_object/JsonBooleanValue.cpp b/src_db/json_object/JsonBooleanValue.cpp index e4a2329..4b3f11e 100644 --- a/src_db/json_object/JsonBooleanValue.cpp +++ b/src_db/json_object/JsonBooleanValue.cpp @@ -9,6 +9,7 @@ #include "base_io/ByteBuffer.h" +#include "ext_arguments/BoolArgument.h" namespace codablecash { @@ -51,4 +52,8 @@ void JsonBooleanValue::fromBinary(ByteBuffer *in) { this->value = bl > 0; } +AbstractFunctionExtArguments* JsonBooleanValue::toFunctionExtArgument() const { + return new BoolArgument(this->value); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonBooleanValue.h b/src_db/json_object/JsonBooleanValue.h index 8c7ccdc..853eef9 100644 --- a/src_db/json_object/JsonBooleanValue.h +++ b/src_db/json_object/JsonBooleanValue.h @@ -37,6 +37,8 @@ class JsonBooleanValue : public AbstractJsonValue { virtual void toBinary(ByteBuffer *out) const; virtual void fromBinary(ByteBuffer *in); + virtual AbstractFunctionExtArguments* toFunctionExtArgument() const; + private: bool value; }; diff --git a/src_db/json_object/JsonNumericValue.cpp b/src_db/json_object/JsonNumericValue.cpp index bbb08cb..ea5b8a5 100644 --- a/src_db/json_object/JsonNumericValue.cpp +++ b/src_db/json_object/JsonNumericValue.cpp @@ -8,6 +8,12 @@ #include "json_object/JsonNumericValue.h" #include "base_io/ByteBuffer.h" + +#include "ext_arguments/NumericArgument.h" + +#include "engine/sc_analyze/AnalyzedType.h" + + namespace codablecash { JsonNumericValue::JsonNumericValue(const JsonNumericValue &inst) { @@ -52,4 +58,8 @@ void JsonNumericValue::fromBinary(ByteBuffer *in) { this->value = in->getInt(); } +AbstractFunctionExtArguments* JsonNumericValue::toFunctionExtArgument() const { + return new NumericArgument(this->value, AnalyzedType::TYPE_INT); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonNumericValue.h b/src_db/json_object/JsonNumericValue.h index f3b3fb0..3a42b7a 100644 --- a/src_db/json_object/JsonNumericValue.h +++ b/src_db/json_object/JsonNumericValue.h @@ -37,6 +37,8 @@ class JsonNumericValue : public AbstractJsonValue { virtual void toBinary(ByteBuffer *out) const; virtual void fromBinary(ByteBuffer *in); + virtual AbstractFunctionExtArguments* toFunctionExtArgument() const; + private: int value; }; diff --git a/src_db/json_object/JsonStringValue.cpp b/src_db/json_object/JsonStringValue.cpp index 25f13fb..e188d1d 100644 --- a/src_db/json_object/JsonStringValue.cpp +++ b/src_db/json_object/JsonStringValue.cpp @@ -13,6 +13,7 @@ #include "base_io/ByteBuffer.h" +#include "ext_arguments/StringArgument.h" namespace codablecash { @@ -73,4 +74,8 @@ void JsonStringValue::fromBinary(ByteBuffer *in) { BinaryUtils::checkNotNull(this->value); } +AbstractFunctionExtArguments* JsonStringValue::toFunctionExtArgument() const { + return new StringArgument(this->value); +} + } /* namespace codablecash */ diff --git a/src_db/json_object/JsonStringValue.h b/src_db/json_object/JsonStringValue.h index 90e4caa..8e2434c 100644 --- a/src_db/json_object/JsonStringValue.h +++ b/src_db/json_object/JsonStringValue.h @@ -41,6 +41,8 @@ class JsonStringValue : public AbstractJsonValue { virtual void toBinary(ByteBuffer *out) const; virtual void fromBinary(ByteBuffer *in); + virtual AbstractFunctionExtArguments* toFunctionExtArgument() const; + private: UnicodeString* value; }; diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index 791c45e..75c3bbb 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -213,6 +213,9 @@ void SmartContract::clearRootReference(VirtualMachine* vm) noexcept { this->rootReference->resetOnGc(); delete this->rootReference; this->rootReference = nullptr; + + vm->setVmRootReference(nullptr); + this->initialized = false; } void SmartContract::releaseMainInstance(GcManager* gc) noexcept { this->rootReference->releaseMainInstance(gc); diff --git a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h index bf67d18..39c62aa 100644 --- a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h +++ b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h @@ -41,6 +41,19 @@ class ModularInstanceConfig { void setMainClass(const UnicodeString* value) noexcept; void setInitializerMethod(const UnicodeString* value) noexcept; + const UnicodeString* getMainPackage() const noexcept { + return this->mainPackage; + } + const UnicodeString* getMainClass() const noexcept { + return this->mainClass; + } + const UnicodeString* getInitializerMethod() const noexcept { + return this->initializerMethod; + } + const ArrayList* getInitializerMethodArguments() const noexcept { + return this->initializerMethodArguments; + } + int binarySize() const; void toBinary(ByteBuffer* out) const; void fromBinary(ByteBuffer* in); diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index 2d2b773..69a30a2 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -6,15 +6,33 @@ */ #include "smartcontract_instance/AbstractExecutableModuleInstance.h" +#include "modular_project/ModularInstanceConfig.h" +#include "modular_project/DependencyConfig.h" + #include "base/UnicodeString.h" #include "base/StackRelease.h" +#include "base/ArrayList.h" +#include "base_io/ByteBuffer.h" +#include "base_io/File.h" + +#include "base_io_stream/exceptions.h" +#include "base_io_stream/FileInputStream.h" + +#include "bc/ExceptionThrower.h" #include "bc/SoftwareVersion.h" -#include "modular_project/ModularInstanceConfig.h" -#include "modular_project/DependencyConfig.h" +#include "engine/sc/SmartContract.h" -#include "base_io/ByteBuffer.h" +#include "engine/compiler/CompileError.h" + +#include "vm/VirtualMachine.h" + +#include "json_object/AbstractJsonValue.h" + +#include "ext_arguments/AbstractFunctionExtArguments.h" + +#include "instance/instance_gc/GcManager.h" namespace codablecash { @@ -27,6 +45,11 @@ AbstractExecutableModuleInstance::AbstractExecutableModuleInstance() { this->version = nullptr; this->instanceConfig = nullptr; this->dependencyConfig = nullptr; + + this->contract = nullptr; + this->vm = nullptr; + this->compile_errors = nullptr; + this->mainInst = nullptr; } AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { @@ -39,6 +62,13 @@ AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { delete this->version; delete this->instanceConfig; delete this->dependencyConfig; + + vm->destroy(); + delete this->vm; + + this->contract = nullptr; + + this->mainInst = nullptr; } void AbstractExecutableModuleInstance::setName(const UnicodeString *name) noexcept { @@ -76,4 +106,115 @@ void AbstractExecutableModuleInstance::setDependencyConfig(const DependencyConfi this->dependencyConfig = new DependencyConfig(*config); } +void AbstractExecutableModuleInstance::resetContract() { + delete this->contract; + this->contract = new SmartContract(); + + delete this->vm; + this->vm = new VirtualMachine(1024*1024); + + this->compile_errors = nullptr; +} + +void AbstractExecutableModuleInstance::parseSourceFolders(const File *projectBaseDir) { + File* baseDir = projectBaseDir->get(this->projectRelativePath); __STP(baseDir); + + ExceptionThrower::throwExceptionIfCondition(!baseDir->exists(), L"Module base folder does not exists.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(!baseDir->isDirectory(), L"Module base folder id not a directory.", __FILE__, __LINE__); + + int maxLoop = this->sourceFolders->size(); + for(int i = 0; i != maxLoop; ++i){ + const UnicodeString* folder = this->sourceFolders->get(i); + scanSourceFolder(baseDir, folder); + } +} + +void AbstractExecutableModuleInstance::scanSourceFolder(File *baseDir, const UnicodeString *folder) { + File* dir = baseDir->get(folder); __STP(dir); + scanFiles(dir); + + this->compile_errors = this->contract->getCompileErrors(); +} + +void AbstractExecutableModuleInstance::scanFiles(File *folder) { + ArrayList* filesList = folder->list(); __STP(filesList); + filesList->setDeleteOnExit(); + + int maxLoop = filesList->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* path = filesList->get(i); + + File* f = folder->get(path); __STP(f); + if(f->isDirectory()){ + scanFiles(f); + } else{ + addCompilantUnit(f, folder); + } + } +} + +void AbstractExecutableModuleInstance::addCompilantUnit(File *file, File *base) { + int length = file->length(); + FileInputStream stream(file); + + this->contract->addCompilationUnit(&stream, length, base, file); +} + +bool AbstractExecutableModuleInstance::hasCompileError() const noexcept { + return !this->compile_errors->isEmpty(); +} + +bool AbstractExecutableModuleInstance::analyze() { + this->vm->analyze(); + return !this->vm->hasError(); +} + +void AbstractExecutableModuleInstance::setMainInstance() { + const UnicodeString* mainPackage = this->instanceConfig->getMainPackage(); + const UnicodeString* mainClass = this->instanceConfig->getMainClass(); + const UnicodeString* initializerMethod = this->instanceConfig->getInitializerMethod(); + + this->contract->setMainMethod(mainPackage, mainClass, initializerMethod); +} + +bool AbstractExecutableModuleInstance::createMainInstance() { + this->mainInst = this->vm->createScInstance(); + ArrayList& exceptions = this->vm->getExceptions(); + + return !this->vm->hasError() && exceptions.isEmpty(); +} + +bool AbstractExecutableModuleInstance::interpretInitializer() { + ArrayList arguments; + arguments.setDeleteOnExit(); + { + const ArrayList* argList = this->instanceConfig->getInitializerMethodArguments(); + int maxLoop = argList->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractJsonValue* jval = argList->get(i); + + AbstractFunctionExtArguments* arg = jval->toFunctionExtArgument(); + arguments.addElement(arg); + } + } + + const UnicodeString* initializerMethod = this->instanceConfig->getInitializerMethod(); + + this->vm->interpretMainObjectMethod(initializerMethod, &arguments); + + ArrayList& exceptions = this->vm->getExceptions(); + return !this->vm->hasError() && exceptions.isEmpty(); +} + +void AbstractExecutableModuleInstance::resetRootReference() { + this->mainInst = nullptr; + + this->contract->clearRootReference(this->vm); + + GcManager* gc = this->vm->getGc(); + gc->garbageCollect(); + + assert(gc->isEmpty()); +} + } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index c89cf38..a6cc1bc 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -10,6 +10,11 @@ namespace alinous { class UnicodeString; +class File; +class SmartContract; +class VirtualMachine; +class CompileError; +class VmClassInstance; } using namespace alinous; @@ -21,6 +26,7 @@ class SoftwareVersion; class ModularInstanceConfig; class DependencyConfig; + class AbstractExecutableModuleInstance { public: AbstractExecutableModuleInstance(); @@ -33,6 +39,24 @@ class AbstractExecutableModuleInstance { void setInstanceConfig(const ModularInstanceConfig* config); void setDependencyConfig(const DependencyConfig* config); + virtual void loadCompilantUnits(const File* projectBaseDir) = 0; + bool hasCompileError() const noexcept; + + bool analyze(); + void setMainInstance(); + bool createMainInstance(); + bool interpretInitializer(); + + void resetRootReference(); + +protected: + void resetContract(); + void parseSourceFolders(const File *projectBaseDir); + void scanSourceFolder(File* baseDir, const UnicodeString* folder); + + void scanFiles(File* folder); + void addCompilantUnit(File* file, File* base); + protected: UnicodeString* name; UnicodeString* projectRelativePath; @@ -42,6 +66,14 @@ class AbstractExecutableModuleInstance { ModularInstanceConfig* instanceConfig; DependencyConfig* dependencyConfig; + +protected: + SmartContract* contract; + VirtualMachine* vm; + + VmClassInstance* mainInst; + + const ArrayList* compile_errors; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp index ef41b7e..84c267c 100644 --- a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp @@ -15,6 +15,7 @@ #include "bc/ExceptionThrower.h" +#include "vm/VirtualMachine.h" namespace codablecash { @@ -28,13 +29,10 @@ ExecutableModuleInstance::~ExecutableModuleInstance() { } void ExecutableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { - File* baseDir = projectBaseDir->get(this->projectRelativePath); __STP(baseDir); - - ExceptionThrower::throwExceptionIfCondition(!baseDir->exists(), L"Module base folder does not exists.", __FILE__, __LINE__); - ExceptionThrower::throwExceptionIfCondition(!baseDir->isDirectory(), L"Module base folder id not a directory.", __FILE__, __LINE__); - - + resetContract(); + parseSourceFolders(projectBaseDir); + this->vm->loadSmartContract(this->contract); } diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h index 3e3b3c6..c5c292b 100644 --- a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.h @@ -11,12 +11,6 @@ #include "base/ArrayList.h" #include "smartcontract_instance/AbstractExecutableModuleInstance.h" -namespace alinous { -class File; -} -using namespace alinous; - - namespace codablecash { @@ -25,7 +19,7 @@ class ExecutableModuleInstance : public AbstractExecutableModuleInstance { ExecutableModuleInstance(); virtual ~ExecutableModuleInstance(); - void loadCompilantUnits(const File* projectBaseDir); + virtual void loadCompilantUnits(const File* projectBaseDir); }; diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp index 79631b2..f679b3a 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp @@ -9,6 +9,7 @@ #include "base/UnicodeString.h" +#include "vm/VirtualMachine.h" namespace codablecash { @@ -35,7 +36,10 @@ void LibraryExectableModuleInstance::addExportClass(const UnicodeString *clazz) } void LibraryExectableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { - // FIXME load lib + resetContract(); + parseSourceFolders(projectBaseDir); + + this->vm->loadSmartContract(this->contract); } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h index 12955d7..27c36cd 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h @@ -29,7 +29,7 @@ class LibraryExectableModuleInstance : public AbstractExecutableModuleInstance { void setLibraryName(const UnicodeString* str) noexcept; void addExportClass(const UnicodeString* clazz) noexcept; - void loadCompilantUnits(const File* projectBaseDir); + virtual void loadCompilantUnits(const File* projectBaseDir); private: UnicodeString* libraryName; diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 679a6c4..fdd8db2 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -64,7 +64,6 @@ void ModularSmartcontractInstance::loadCompilantUnits(const File *projectBaseDir LibraryExectableModuleInstance* inst = this->libArray->get(i); inst->loadCompilantUnits(projectBaseDir); } - } bool ModularSmartcontractInstance::libraryExists(const UnicodeString *name) const noexcept { @@ -72,4 +71,72 @@ bool ModularSmartcontractInstance::libraryExists(const UnicodeString *name) cons return value != nullptr; } +bool ModularSmartcontractInstance::hasCompileError() const noexcept { + bool hasError = this->execModule->hasCompileError(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->hasCompileError(); + } + + return hasError; +} + +bool ModularSmartcontractInstance::analyze() { + bool hasError = !this->execModule->analyze(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= (!inst->analyze()); + } + + return hasError; +} + +void ModularSmartcontractInstance::setMainInstance() { + this->execModule->setMainInstance(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + inst->setMainInstance(); + } +} + +bool ModularSmartcontractInstance::createMainInstance() { + bool hasError = !this->execModule->createMainInstance(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= (!inst->createMainInstance()); + } + + return hasError; +} + +bool ModularSmartcontractInstance::interpretInitializer() { + bool hasError = !this->execModule->interpretInitializer(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= (!inst->interpretInitializer()); + } + + return hasError; +} + +void ModularSmartcontractInstance::resetRootReference() { + this->execModule->resetRootReference(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + inst->resetRootReference(); + } +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 8823b60..888264b 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -34,6 +34,14 @@ class ModularSmartcontractInstance { bool libraryExists(const UnicodeString* name) const noexcept; void loadCompilantUnits(const File* projectBaseDir); + bool hasCompileError() const noexcept; + + bool analyze(); + void setMainInstance(); + bool createMainInstance(); + bool interpretInitializer(); + + void resetRootReference(); private: ModularProjectConfig* config; diff --git a/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp b/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp index b0e41b7..5eb2423 100644 --- a/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp @@ -7,8 +7,6 @@ #include "instance/instance_ref/VmRootReference.h" #include "instance/instance_gc/GcManager.h" -#include "instance/instance_ref_static/StaticInstanceHolder.h" - #include "vm/VirtualMachine.h" #include "instance/instance_ref/RefereceFactory.h" @@ -18,6 +16,7 @@ #include "engine/sc_analyze/AnalyzedType.h" #include "instance/instance_ref_class_static/StaticClassReferenceHolder.h" +#include "instance/instance_ref_static/StaticConstInstanceHolder.h" namespace alinous { @@ -25,7 +24,7 @@ namespace alinous { VmRootReference::VmRootReference(VirtualMachine* vm) : AbstractReference(this, VmInstanceTypesConst::REF_ROOT) { this->vm = vm; this->mainInst = nullptr; - this->staticHolder = new StaticInstanceHolder(); + this->staticHolder = new StaticConstInstanceHolder(); this->classStaticHolder = new StaticClassReferenceHolder(); } diff --git a/src_smartcontract_vm/instance/instance_ref/VmRootReference.h b/src_smartcontract_vm/instance/instance_ref/VmRootReference.h index 915151b..729975b 100644 --- a/src_smartcontract_vm/instance/instance_ref/VmRootReference.h +++ b/src_smartcontract_vm/instance/instance_ref/VmRootReference.h @@ -16,7 +16,7 @@ namespace alinous { class VirtualMachine; -class StaticInstanceHolder; +class StaticConstInstanceHolder; class StaticClassReferenceHolder; class PrimitiveReference; class VmClassInstance; @@ -56,7 +56,7 @@ class VmRootReference : public AbstractReference, public IAbstractVmInstanceSubs private: VirtualMachine* vm; AbstractReference* mainInst; - StaticInstanceHolder* staticHolder; + StaticConstInstanceHolder* staticHolder; StaticClassReferenceHolder* classStaticHolder; }; diff --git a/src_smartcontract_vm/instance/instance_ref_static/CMakeLists.txt b/src_smartcontract_vm/instance/instance_ref_static/CMakeLists.txt index 98e011b..2b55e02 100644 --- a/src_smartcontract_vm/instance/instance_ref_static/CMakeLists.txt +++ b/src_smartcontract_vm/instance/instance_ref_static/CMakeLists.txt @@ -3,7 +3,7 @@ set(__src LongIntegerKey.cpp NumericConstHolder.cpp - StaticInstanceHolder.cpp + StaticConstInstanceHolder.cpp StringConstHolder.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/instance_ref_static) diff --git a/src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.cpp b/src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.cpp new file mode 100644 index 0000000..06eb8f4 --- /dev/null +++ b/src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.cpp @@ -0,0 +1,41 @@ +/* + * StaticInstanceHolder.cpp + * + * Created on: 2019/11/14 + * Author: iizuka + */ + +#include "instance/instance_ref_static/NumericConstHolder.h" +#include "instance/instance_ref_static/StaticConstInstanceHolder.h" +#include "instance/instance_ref_static/StringConstHolder.h" + + +namespace alinous { + +StaticConstInstanceHolder::StaticConstInstanceHolder() { // @suppress("Class members should be properly initialized") + this->numeric = new NumericConstHolder(); + this->stringConsts = new StringConstHolder(); +} + +StaticConstInstanceHolder::~StaticConstInstanceHolder() { + delete this->numeric; + delete this->stringConsts; +} + +PrimitiveReference* StaticConstInstanceHolder::newNumericConstReferenece(int64_t value, uint8_t type, VirtualMachine* vm) { + return this->numeric->newNumericConstReferenece(value, type, vm); +} + +VmStringInstance* StaticConstInstanceHolder::newStringConstInstance(VmRootReference* rootRef, const UnicodeString* str, VirtualMachine* vm) { + return this->stringConsts->newStringConstInstance(rootRef, str, vm); +} + +void StaticConstInstanceHolder::removeStringConst(VmRootReference* rootRef, VirtualMachine* vm) noexcept { + this->stringConsts->removeInnerReferences(rootRef, vm); +} + +void StaticConstInstanceHolder::removeInnerReferences(VmRootReference* rootRef, VirtualMachine* vm) noexcept { + this->numeric->removeInnerReferences(rootRef, vm); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.h b/src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.h similarity index 90% rename from src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.h rename to src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.h index ec19547..a348dd3 100644 --- a/src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.h +++ b/src_smartcontract_vm/instance/instance_ref_static/StaticConstInstanceHolder.h @@ -19,10 +19,10 @@ class UnicodeString; class StringConstHolder; class VmStringInstance; -class StaticInstanceHolder { +class StaticConstInstanceHolder { public: - StaticInstanceHolder(); - virtual ~StaticInstanceHolder(); + StaticConstInstanceHolder(); + virtual ~StaticConstInstanceHolder(); PrimitiveReference* newNumericConstReferenece(int64_t value, uint8_t type, VirtualMachine* vm); VmStringInstance* newStringConstInstance(VmRootReference* rootRef, const UnicodeString* str, VirtualMachine* vm); diff --git a/src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.cpp b/src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.cpp deleted file mode 100644 index b23b9f2..0000000 --- a/src_smartcontract_vm/instance/instance_ref_static/StaticInstanceHolder.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * StaticInstanceHolder.cpp - * - * Created on: 2019/11/14 - * Author: iizuka - */ - -#include "instance/instance_ref_static/StaticInstanceHolder.h" - -#include "instance/instance_ref_static/NumericConstHolder.h" -#include "instance/instance_ref_static/StringConstHolder.h" - - -namespace alinous { - -StaticInstanceHolder::StaticInstanceHolder() { // @suppress("Class members should be properly initialized") - this->numeric = new NumericConstHolder(); - this->stringConsts = new StringConstHolder(); -} - -StaticInstanceHolder::~StaticInstanceHolder() { - delete this->numeric; - delete this->stringConsts; -} - -PrimitiveReference* StaticInstanceHolder::newNumericConstReferenece(int64_t value, uint8_t type, VirtualMachine* vm) { - return this->numeric->newNumericConstReferenece(value, type, vm); -} - -VmStringInstance* StaticInstanceHolder::newStringConstInstance(VmRootReference* rootRef, const UnicodeString* str, VirtualMachine* vm) { - return this->stringConsts->newStringConstInstance(rootRef, str, vm); -} - -void StaticInstanceHolder::removeStringConst(VmRootReference* rootRef, VirtualMachine* vm) noexcept { - this->stringConsts->removeInnerReferences(rootRef, vm); -} - -void StaticInstanceHolder::removeInnerReferences(VmRootReference* rootRef, VirtualMachine* vm) noexcept { - this->numeric->removeInnerReferences(rootRef, vm); -} - -} /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index 2c30642..5ffba57 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -141,10 +141,10 @@ VmClassInstance* VirtualMachine::createScInstance() { void VirtualMachine::interpret(const UnicodeString* method) { ArrayList list; - interpret(method, &list); + interpretMainObjectMethod(method, &list); } -void VirtualMachine::interpret(const UnicodeString* method, ArrayList* arguments) { +void VirtualMachine::interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments) { VmClassInstance* _this = dynamic_cast(this->sc->getRootReference()->getInstance()); AnalyzedClass* aclass = _this->getAnalyzedClass(); diff --git a/src_smartcontract_vm/vm/VirtualMachine.h b/src_smartcontract_vm/vm/VirtualMachine.h index 7a307d4..4f4c9f3 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.h +++ b/src_smartcontract_vm/vm/VirtualMachine.h @@ -64,7 +64,7 @@ class VirtualMachine { VmClassInstance* createScInstance(); - void interpret(const UnicodeString* method, ArrayList* arguments); + void interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments); void interpret(const UnicodeString* method); void interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments); diff --git a/src_test/smartcontract_modular/instance/resources/case01/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/instance/resources/case01/project01/exec/src/sample/Sample01.alns index 5f9b1cd..debca82 100644 --- a/src_test/smartcontract_modular/instance/resources/case01/project01/exec/src/sample/Sample01.alns +++ b/src_test/smartcontract_modular/instance/resources/case01/project01/exec/src/sample/Sample01.alns @@ -4,6 +4,7 @@ package sample; class Sample01 { public Sample01() { this.count = 3 * 2; + stcount++; } public int main(){ @@ -11,4 +12,5 @@ class Sample01 { } private int count = 0; + public static int stcount = 10; } diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index 937db82..e189cad 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -38,6 +38,19 @@ TEST(TestModularInstanceGroup, case01){ ModularSmartcontractInstance* inst = project.toInstance(); __STP(inst); inst->loadCompilantUnits(baseDir); + bool res = inst->hasCompileError(); + CHECK(res == false); + + + res = inst->analyze(); + CHECK(res == false); + + inst->setMainInstance(); + res = inst->createMainInstance(); + CHECK(res == false); + + inst->resetRootReference(); + // FIXME TestModularInstanceGroup } diff --git a/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp b/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp index 6d5250a..dd1fe44 100644 --- a/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp +++ b/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp @@ -112,7 +112,7 @@ TEST(TestCallMainInstGroup, callMainMethod2){ args.setDeleteOnExit(); args.addElement(new NumericArgument(10, AnalyzedType::TYPE_INT)); - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); ExtClassObject* classObject = util.getMainExtObject(); __STP(classObject); @@ -141,7 +141,7 @@ TEST(TestCallMainInstGroup, callMainMethod2_err){ VmMethodNotFoundException* ex = nullptr; try{ - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); }catch(VmMethodNotFoundException* e){ ex = e; } @@ -169,7 +169,7 @@ TEST(TestCallMainInstGroup, callMainMethod3){ UnicodeString hello(L"Hello World"); args.addElement(new StringArgument(&hello)); - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); } TEST(TestCallMainInstGroup, callMainMethod4){ @@ -191,7 +191,7 @@ TEST(TestCallMainInstGroup, callMainMethod4){ args.addElement(new BoolArgument(true)); - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); ExtClassObject* classObject = util.getMainExtObject(); __STP(classObject); bool bl = VmTestUtils::getBoolMemberValue(classObject, L"count"); @@ -218,7 +218,7 @@ TEST(TestCallMainInstGroup, callMainMethod5){ AnalyzedType at(AnalyzedType::TYPE_STRING); args.addElement(new NullArgument(&at)); - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); ExtClassObject* classObject = util.getMainExtObject(); __STP(classObject); const UnicodeString* str = VmTestUtils::getStringMemberValue(classObject, L"str"); @@ -248,7 +248,7 @@ TEST(TestCallMainInstGroup, callMainMethod6){ args.addElement(new NumericArgument(12, AnalyzedType::TYPE_CHAR)); args.addElement(new NumericArgument(13, AnalyzedType::TYPE_LONG)); - util.vm->interpret(&method, &args); + util.vm->interpretMainObjectMethod(&method, &args); ExtClassObject* classObject = util.getMainExtObject(); __STP(classObject); From 83602aa83a129c40c2bca33be1dd0ede5525eee6 Mon Sep 17 00:00:00 2001 From: iizuka Date: Mon, 24 Nov 2025 15:58:23 +0800 Subject: [PATCH 05/11] Class Loader --- src_db/base/UnicodeString.cpp | 3 + src_db/base/exceptions.cpp | 19 ++ src_db/base/exceptions.h | 11 ++ src_smartcontract/engine/sc/CodeElement.cpp | 18 ++ src_smartcontract/engine/sc/CodeElement.h | 6 + .../engine/sc/CompilationUnit.cpp | 67 +++++++ src_smartcontract/engine/sc/CompilationUnit.h | 10 + src_smartcontract/engine/sc/SmartContract.cpp | 161 ++++++++++----- src_smartcontract/engine/sc/SmartContract.h | 19 +- .../lang/sc_declare/AccessControlDeclare.cpp | 6 + .../lang/sc_declare/ArgumentDeclare.cpp | 6 + .../lang/sc_declare/ArgumentsListDeclare.cpp | 6 + .../lang/sc_declare/ClassDeclare.cpp | 6 + .../lang/sc_declare/ClassDeclare.h | 3 + .../lang/sc_declare/ClassDeclareBlock.cpp | 6 + .../lang/sc_declare/ClassExtends.cpp | 6 + .../lang/sc_declare/ClassImplements.cpp | 6 + .../lang/sc_declare/ClassName.cpp | 6 + .../GenericsGeneratedClassDeclare.cpp | 3 + .../lang/sc_declare/GenericsParameter.cpp | 6 + .../lang/sc_declare/ImportDeclare.cpp | 6 + .../lang/sc_declare/ImportsDeclare.cpp | 6 + .../lang/sc_declare/MemberVariableDeclare.cpp | 7 +- .../lang/sc_declare/MethodDeclare.cpp | 37 +++- .../lang/sc_declare/PackageDeclare.cpp | 6 + .../lang/sc_declare/PackageNameDeclare.cpp | 6 + .../lang/sc_declare_types/BoolType.cpp | 6 + .../lang/sc_declare_types/ByteType.cpp | 6 + .../lang/sc_declare_types/CharType.cpp | 6 + .../lang/sc_declare_types/DomType.cpp | 6 + .../lang/sc_declare_types/IntType.cpp | 6 + .../lang/sc_declare_types/LongType.cpp | 6 + .../lang/sc_declare_types/ObjectType.cpp | 6 + .../lang/sc_declare_types/ShortType.cpp | 6 + .../lang/sc_declare_types/StringType.cpp | 6 + .../lang/sc_declare_types/VoidType.cpp | 5 + .../sc_expression/AllocationExpression.cpp | 5 + .../ArrayReferenceExpression.cpp | 6 + .../lang/sc_expression/CastExpression.cpp | 6 + .../lang/sc_expression/ConstructorArray.cpp | 6 + .../lang/sc_expression/ConstructorCall.cpp | 6 + .../sc_expression/FunctionCallExpression.cpp | 6 + .../MemberReferenceExpression.cpp | 6 + .../sc_expression/ParenthesisExpression.cpp | 6 + .../lang/sc_expression/VariableIdentifier.cpp | 6 + .../AddExpression.cpp | 19 ++ .../sc_expression_arithmetic/AddExpression.h | 4 + .../MultiplicativeExpression.cpp | 19 ++ .../MultiplicativeExpression.h | 4 + .../NegateExpression.cpp | 6 + .../PostIncrementExpression.cpp | 6 + .../PreIncrementExpression.cpp | 6 + .../lang/sc_expression_bit/AndExpression.cpp | 5 + .../BitReverseExpression.cpp | 6 + .../ExclusiveOrExpression.cpp | 5 + .../lang/sc_expression_bit/OrExpression.cpp | 6 + .../sc_expression_bit/ShiftExpression.cpp | 6 + .../JsonArrayExpression.cpp | 6 + .../JsonInitializerExpression.cpp | 6 + .../JsonKeyValuePairExpression.cpp | 6 + .../sc_expression_literal/BooleanLiteral.cpp | 6 + .../LiteralExpression.cpp | 6 + .../sc_expression_literal/NullLiteral.cpp | 5 + .../sc_expression_literal/NumberLiteral.cpp | 6 + .../ConditionalAndExpression.cpp | 6 + .../ConditionalOrExpression.cpp | 6 + .../EqualityExpression.cpp | 6 + .../sc_expression_logical/NotExpression.cpp | 6 + .../RelationalExpression.cpp | 6 + .../lang/sc_statement/BlankStatement.cpp | 5 + .../lang/sc_statement/ExpressionStatement.cpp | 6 + .../lang/sc_statement/StatementBlock.cpp | 6 + .../sc_statement/SubstitutionStatement.cpp | 6 + .../sc_statement/VariableDeclareStatement.cpp | 6 + .../lang/sc_statement_ctrl/BreakStatement.cpp | 5 + .../sc_statement_ctrl/ContinueStatement.cpp | 5 + .../sc_statement_ctrl/DoWhileStatement.cpp | 6 + .../lang/sc_statement_ctrl/ForStatement.cpp | 6 + .../lang/sc_statement_ctrl/IfStatement.cpp | 6 + .../sc_statement_ctrl/ReturnStatement.cpp | 6 + .../lang/sc_statement_ctrl/WhileStatement.cpp | 6 + .../sc_statement_exception/CatchStatement.cpp | 6 + .../FinallyStatement.cpp | 6 + .../sc_statement_exception/ThrowStatement.cpp | 6 + .../sc_statement_exception/TryStatement.cpp | 6 + .../lang_sql/sql_ddl/AlterTableStatement.cpp | 5 + .../lang_sql/sql_ddl/ColumnTypeDescriptor.cpp | 6 + .../lang_sql/sql_ddl/CreateTableStatement.cpp | 6 + .../lang_sql/sql_ddl/DdlColumnDescriptor.cpp | 5 + .../lang_sql/sql_ddl/DropTableStatement.cpp | 6 + .../sql_ddl_alter/AlterAddColumnCommand.cpp | 6 + .../sql_ddl_alter/AlterAddIndexCommand.cpp | 6 + .../sql_ddl_alter/AlterDropColumnCommand.cpp | 6 + .../sql_ddl_alter/AlterDropIndexCommand.cpp | 6 + .../AlterAddPrimaryKeyCommand.cpp | 6 + .../AlterDropPrimaryKeyCommand.cpp | 5 + .../AlterModifyCommand.cpp | 6 + .../AlterRenameColumnCommand.cpp | 6 + .../AlterRenameTableCommand.cpp | 6 + .../lang_sql/sql_dml/BeginStatement.cpp | 5 + .../lang_sql/sql_dml/CommitStatement.cpp | 5 + .../lang_sql/sql_dml/DeleteStatement.cpp | 6 + .../lang_sql/sql_dml/InsertStatement.cpp | 6 + .../lang_sql/sql_dml/RollbackStatement.cpp | 5 + .../lang_sql/sql_dml/SelectStatement.cpp | 6 + .../lang_sql/sql_dml/UpdateStatement.cpp | 6 + .../lang_sql/sql_dml_parts/SQLColumnsList.cpp | 6 + .../lang_sql/sql_dml_parts/SQLFrom.cpp | 6 + .../lang_sql/sql_dml_parts/SQLGroupBy.cpp | 6 + .../lang_sql/sql_dml_parts/SQLHaving.cpp | 6 + .../lang_sql/sql_dml_parts/SQLLimitOffset.cpp | 6 + .../lang_sql/sql_dml_parts/SQLOrderBy.cpp | 6 + .../sql_dml_parts/SQLSelectTarget.cpp | 6 + .../sql_dml_parts/SQLSelectTargetList.cpp | 6 + .../lang_sql/sql_dml_parts/SQLSet.cpp | 6 + .../lang_sql/sql_dml_parts/SQLSetPair.cpp | 6 + .../lang_sql/sql_dml_parts/SQLWhere.cpp | 6 + .../AbstractSQLBinaryExpression.cpp | 5 + .../sql_expression/SQLBetweenExpression.cpp | 6 + .../sql_expression/SQLBooleanLiteral.cpp | 6 + .../sql_expression/SQLColumnIdentifier.cpp | 6 + .../sql_expression/SQLDistinctArgument.cpp | 6 + .../sql_expression/SQLEqualityExpression.cpp | 6 + .../sql_expression/SQLExpressionList.cpp | 6 + .../sql_expression/SQLFunctionCall.cpp | 6 + .../sql_expression/SQLInExpression.cpp | 6 + .../sql_expression/SQLIsNullExpression.cpp | 6 + .../sql_expression/SQLLikeExpression.cpp | 6 + .../lang_sql/sql_expression/SQLLiteral.cpp | 6 + .../sql_expression/SQLNotExpression.cpp | 6 + .../sql_expression/SQLNullLiteral.cpp | 5 + .../SQLParenthesisExpression.cpp | 6 + .../sql_expression/SQLPlaceHolder.cpp | 5 + .../SQLRelationalExpression.cpp | 6 + .../lang_sql/sql_expression/SQLWildCard.cpp | 5 + .../sql_join_parts/ParenthesisJoinPart.cpp | 6 + .../lang_sql/sql_join_parts/SQLJoin.cpp | 6 + .../lang_sql/sql_join_parts/SQLJoinPart.cpp | 6 + .../sql_join_parts/TableIdentifier.cpp | 6 + .../lang_sql/sql_join_parts/TableList.cpp | 6 + .../AbstractDependencyConfig.h | 11 ++ .../AbstractSmartcontractModule.cpp | 5 +- .../modular_project/DependencyConfig.h | 4 + .../LibrarySmartcontractModule.cpp | 3 + .../modular_project/ModularInstanceConfig.h | 4 +- .../ModularSmartcontractProject.cpp | 2 + .../AbstractExecutableModuleInstance.cpp | 184 +++++++++++++++--- .../AbstractExecutableModuleInstance.h | 34 +++- .../smartcontract_instance/CMakeLists.txt | 3 + .../ExecutableModuleInstance.cpp | 3 - .../InstanceDependencyContext.cpp | 38 ++++ .../InstanceDependencyContext.h | 49 +++++ .../InstanceDependencyHandler.cpp | 117 +++++++++++ .../InstanceDependencyHandler.h | 46 +++++ .../LibraryExectableModuleInstance.cpp | 13 +- .../LibraryExectableModuleInstance.h | 2 + .../ModularSmartcontractInstance.cpp | 152 ++++++++++++++- .../ModularSmartcontractInstance.h | 17 +- .../ModuleInstanceClassLoader.cpp | 111 +++++++++++ .../ModuleInstanceClassLoader.h | 52 +++++ .../AbstractReservedClassDeclare.h | 4 + .../AbstractReservedGenericsClassDeclare.h | 4 + .../ReservedGeneratedGenericsClassDeclare.h | 4 + src_smartcontract_vm/vm/VirtualMachine.cpp | 2 + .../case01/project01/exec/config.json | 3 +- .../case02/project01/exec/config.json | 20 ++ .../project01/exec/src/sample/Sample01.alns | 16 ++ .../project01/modules/mod01/config.json | 20 ++ .../modules/mod01/src/IDirectAccess.alns | 6 + .../modules/mod01/src/IExportMethods.alns | 6 + .../project01/modules/mod01/src/Module01.alns | 23 +++ .../project01/modules/mod01/src/Result.alns | 9 + .../case02/project01/projectconfig.json | 9 + .../instance/test_modular_instance.cpp | 29 ++- 174 files changed, 2034 insertions(+), 101 deletions(-) create mode 100644 src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h create mode 100644 src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h create mode 100644 src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/config.json create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IDirectAccess.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IExportMethods.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Module01.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Result.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/projectconfig.json diff --git a/src_db/base/UnicodeString.cpp b/src_db/base/UnicodeString.cpp index ac68930..33df75d 100644 --- a/src_db/base/UnicodeString.cpp +++ b/src_db/base/UnicodeString.cpp @@ -585,6 +585,9 @@ bool UnicodeString::equals(const UnicodeString& str) const noexcept { bool UnicodeString::equals(const UnicodeString* str) const noexcept { + if(str == nullptr){ + return false; + } int hash = str->hashCode(); int _this_hash = this->hashCode(); if(hash != _this_hash){ diff --git a/src_db/base/exceptions.cpp b/src_db/base/exceptions.cpp index c978297..939a176 100644 --- a/src_db/base/exceptions.cpp +++ b/src_db/base/exceptions.cpp @@ -70,5 +70,24 @@ UnsupportedFunctionException::UnsupportedFunctionException(const wchar_t* messag UnsupportedFunctionException::~UnsupportedFunctionException() { } +const wchar_t* CompilantUnitAnalyzeException::defaultMessage = L"Analayze Unit has failed. "; + +CompilantUnitAnalyzeException::CompilantUnitAnalyzeException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +CompilantUnitAnalyzeException::CompilantUnitAnalyzeException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +CompilantUnitAnalyzeException::CompilantUnitAnalyzeException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +CompilantUnitAnalyzeException::CompilantUnitAnalyzeException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +CompilantUnitAnalyzeException::~CompilantUnitAnalyzeException() { +} + } /* namespace alinous */ diff --git a/src_db/base/exceptions.h b/src_db/base/exceptions.h index cf97d55..52a2af4 100644 --- a/src_db/base/exceptions.h +++ b/src_db/base/exceptions.h @@ -42,6 +42,17 @@ class UnsupportedFunctionException : public Exception{ static const wchar_t* defaultMessage; }; +class CompilantUnitAnalyzeException : public Exception{ +public: + CompilantUnitAnalyzeException(const char* srcfile, int srcline) noexcept; + CompilantUnitAnalyzeException(Exception* cause, const char* srcfile, int srcline) noexcept; + CompilantUnitAnalyzeException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + CompilantUnitAnalyzeException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; + virtual ~CompilantUnitAnalyzeException(); + static const wchar_t* defaultMessage; +}; + + } /* namespace alinous */ #endif /* BASE_EXCEPTIONS_H_ */ diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index f23a540..bee03bc 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -858,4 +858,22 @@ void CodeElement::copyCodePositions(const CodeElement *other) noexcept { this->endColumn = other->endColumn; } +int CodeElement::positionBinarySize() const { + return sizeof(uint32_t) * 4; +} + +void CodeElement::positionToBinary(ByteBuffer *out) const { + out->putInt(this->beginLine); + out->putInt(this->beginColumn); + out->putInt(this->endLine); + out->putInt(this->endColumn); +} + +void CodeElement::positionFromBinary(ByteBuffer *in) { + this->beginLine = in->getInt(); + this->beginColumn = in->getInt(); + this->endLine = in->getInt(); + this->endColumn = in->getInt(); +} + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/CodeElement.h b/src_smartcontract/engine/sc/CodeElement.h index c2cbdbb..ddfc58d 100644 --- a/src_smartcontract/engine/sc/CodeElement.h +++ b/src_smartcontract/engine/sc/CodeElement.h @@ -232,6 +232,12 @@ class CodeElement { void copyCodePositions(const CodeElement* other) noexcept; +protected: + int positionBinarySize() const; + void positionToBinary(ByteBuffer* out) const; + void positionFromBinary(ByteBuffer* in); + + protected: short kind; diff --git a/src_smartcontract/engine/sc/CompilationUnit.cpp b/src_smartcontract/engine/sc/CompilationUnit.cpp index 3ec6cec..bc94490 100644 --- a/src_smartcontract/engine/sc/CompilationUnit.cpp +++ b/src_smartcontract/engine/sc/CompilationUnit.cpp @@ -6,16 +6,20 @@ */ #include "engine/sc/CompilationUnit.h" + #include "lang/sc_declare/ClassDeclare.h" #include "lang/sc_declare/PackageDeclare.h" #include "lang/sc_declare/ImportsDeclare.h" + #include "base/UnicodeString.h" +#include "base/StackRelease.h" namespace alinous { CompilationUnit::CompilationUnit() : classes(4), CodeElement(CodeElement::COMPILANT_UNIT) { this->package = nullptr; this->imports = new ImportsDeclare(); + this->projectRelativePath = nullptr; } CompilationUnit::~CompilationUnit() { @@ -23,6 +27,8 @@ CompilationUnit::~CompilationUnit() { delete this->imports; this->classes.deleteElements(); + + delete this->projectRelativePath; } void CompilationUnit::preAnalyze(AnalyzeContext* actx) { @@ -116,6 +122,13 @@ int CompilationUnit::binarySize() const { total += dec->binarySize(); } + total += sizeof(char); + if(this->projectRelativePath != nullptr){ + total += stringSize(this->projectRelativePath); + } + + total += positionBinarySize(); + return total; } @@ -143,6 +156,13 @@ void CompilationUnit::toBinary(ByteBuffer* out) const { dec->toBinary(out); } + bl = (this->projectRelativePath != nullptr); + out->put(bl ? 1 : 0); + if(bl > 0){ + putString(out, this->projectRelativePath); + } + + positionToBinary(out); } void CompilationUnit::fromBinary(ByteBuffer* in) { @@ -157,6 +177,8 @@ void CompilationUnit::fromBinary(ByteBuffer* in) { if(bl == (char)1){ CodeElement* element = createFromBinary(in); checkKind(element, CodeElement::IMPORTS_DECLARE); + + delete this->imports; this->imports = dynamic_cast(element); } @@ -168,6 +190,13 @@ void CompilationUnit::fromBinary(ByteBuffer* in) { ClassDeclare* dec = dynamic_cast(element); this->classes.addElement(dec); } + + bl = in->get(); + if(bl > 0){ + this->projectRelativePath = getString(in); + } + + positionFromBinary(in); } CompilationUnit* CompilationUnit::generateGenericsImplement(HashMap *input) { @@ -194,4 +223,42 @@ CompilationUnit* CompilationUnit::generateGenericsImplement(HashMapclasses.size(); + for(int i = 0; i != maxLoop; ++i){ + ClassDeclare* clazz = this->classes.get(i); + const UnicodeString* className = clazz->getName(); + + if(className->equals(name)){ + ret = clazz; + break; + } + } + + return ret; +} + +void CompilationUnit::setProjectRelativePath(const UnicodeString *path) noexcept { + delete this->projectRelativePath; + this->projectRelativePath = new UnicodeString(path); +} + +CompilationUnit* CompilationUnit::copy() const { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + + toBinary(buff); + + buff->position(0); + CodeElement* element = CodeElement::createFromBinary(buff); __STP(element); + CompilationUnit* unit = dynamic_cast(element); + + checkNotNull(unit); + __STP_MV(element); + + return unit; +} + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/CompilationUnit.h b/src_smartcontract/engine/sc/CompilationUnit.h index 498277a..6a06e4e 100644 --- a/src_smartcontract/engine/sc/CompilationUnit.h +++ b/src_smartcontract/engine/sc/CompilationUnit.h @@ -35,6 +35,7 @@ class CompilationUnit : public CodeElement { void setImports(ImportsDeclare* imports) noexcept; void addClassDeclare(ClassDeclare* clazz); ClassDeclare* getClassDeclare(int pos) const noexcept; + ClassDeclare* getClassDeclare(const UnicodeString* name) const noexcept; const UnicodeString* getPackageName() noexcept; @@ -44,12 +45,21 @@ class CompilationUnit : public CodeElement { virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); + CompilationUnit* copy() const; + CompilationUnit* generateGenericsImplement(HashMap* input); + void setProjectRelativePath(const UnicodeString* path) noexcept; + const UnicodeString* getProjectRelativePath() const noexcept { + return this->projectRelativePath; + } + private: PackageDeclare* package; ImportsDeclare* imports; ArrayList classes; + + UnicodeString* projectRelativePath; }; } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index 75c3bbb..e001d0a 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -13,16 +13,25 @@ #include "engine/sc_analyze/AnalyzeContext.h" #include "engine/sc_analyze/PackageSpace.h" #include "engine/sc_analyze/AnalyzedClass.h" +#include "engine/sc_analyze/TypeResolver.h" #include "engine/sc_analyze_stack/AnalyzeStackPopper.h" #include "engine/sc_analyze_stack/AnalyzeStackManager.h" #include "base/UnicodeString.h" +#include "base/Exception.h" #include "lang/sc_declare/ClassDeclare.h" #include "lang/sc_declare/MethodDeclare.h" #include "instance/VmClassInstance.h" + +#include "instance/instance_exception/ExceptionInterrupt.h" + +#include "instance/reserved_classes/ReservedClassRegistory.h" + +#include "instance/instance_ref_class_static/StaticClassReferenceHolder.h" + #include "instance/instance_ref/ObjectReference.h" #include "instance/instance_ref/VmRootReference.h" @@ -32,22 +41,20 @@ #include "base_io_stream/FileInputStream.h" #include "base_io/File.h" +#include "vm/exceptions.h" + #include "vm/stack/StackPopper.h" #include "vm/stack/VmStack.h" + #include "engine/compiler/CompileError.h" #include "engine/compiler/ParseErrorHandler.h" #include "ext_arguments/AbstractFunctionExtArguments.h" -#include "instance/reserved_classes/ReservedClassRegistory.h" - -#include "base/Exception.h" - -#include "instance/instance_exception/ExceptionInterrupt.h" - -#include "instance/instance_ref_class_static/StaticClassReferenceHolder.h" +#include "bc/ExceptionThrower.h" +#include "base/StackRelease.h" namespace alinous { @@ -58,7 +65,7 @@ SmartContract::SmartContract() { this->mainMethod = nullptr; this->rootReference = nullptr; this->initialized = false; - this->reservedClassRegistory = new ReservedClassRegistory(); + this->reservedClassRegistory = nullptr; } SmartContract::~SmartContract() { @@ -73,17 +80,21 @@ SmartContract::~SmartContract() { this->compileErrorList.deleteElements(); } -void alinous::SmartContract::setMainMethod(const UnicodeString* mainPackage, +void SmartContract::setMainMethod(const UnicodeString* mainPackage, const UnicodeString* mainClass, const UnicodeString* mainMethod) { if(mainPackage != nullptr){ + delete this->mainPackage; this->mainPackage = new UnicodeString(*mainPackage); } + delete this->mainClass; + delete this->mainMethod; + this->mainClass = new UnicodeString(*mainClass); this->mainMethod = new UnicodeString(*mainMethod); } -void SmartContract::addCompilationUnit(InputStream* stream, int length, const File* base, File* source) { +CompilationUnit* SmartContract::addCompilationUnit(InputStream* stream, int length, const File* base, File* source) { SmartContractParser parser(stream, length); CompilationUnit* unit = parser.parse(); @@ -98,21 +109,55 @@ void SmartContract::addCompilationUnit(InputStream* stream, int length, const Fi } this->progs.addElement(unit); + + return unit; } -void SmartContract::addCompilationUnit(File* file, const File* base) { +CompilationUnit* SmartContract::addCompilationUnit(File* file, const File* base) { FileInputStream stream(file); int length = file->length(); - addCompilationUnit(&stream, length, base, file); + return addCompilationUnit(&stream, length, base, file); } void SmartContract::analyze(VirtualMachine* vm) { - const ArrayList* list = this->reservedClassRegistory->getReservedClassesList(); + initBeforeAnalyze(vm); + + preAnalyze(vm); + if(this->actx->hasError()){ + return; + } + + preAnalyzeGenerics(vm); + if(this->actx->hasError()){ + return; + } + + analyzeType(vm); + if(this->actx->hasError()){ + return; + } + + analyzeMetadata(vm); + if(this->actx->hasError()){ + return; + } + + analyzeFinal(vm); +} + + +void SmartContract::initBeforeAnalyze(VirtualMachine *vm) { + delete this->reservedClassRegistory; + this->reservedClassRegistory = new ReservedClassRegistory(); this->actx = new AnalyzeContext(this); this->actx->setVm(vm); this->actx->resigterReservedClasses(); +} + +void SmartContract::preAnalyze(VirtualMachine *vm) { + const ArrayList* list = this->reservedClassRegistory->getReservedClassesList(); // pre analyze int maxLoop = this->progs.size(); @@ -130,22 +175,20 @@ void SmartContract::analyze(VirtualMachine* vm) { reservedUnit->addClassDeclare(dec); dec->setParent(reservedUnit); - dec->preAnalyze(actx); - } - - if(this->actx->hasError()){ - return; + dec->preAnalyze(this->actx); } +} +void SmartContract::preAnalyzeGenerics(VirtualMachine *vm) { // generics this->actx->generateGenericsClasses(); this->actx->preAnalyzeGenerics(); +} - if(this->actx->hasError()){ - return; - } +void SmartContract::analyzeType(VirtualMachine *vm) { + const ArrayList* list = this->reservedClassRegistory->getReservedClassesList(); - maxLoop = this->progs.size(); + int maxLoop = this->progs.size(); for(int i = 0; i != maxLoop; ++i){ CompilationUnit* unit = this->progs.get(i); unit->analyzeType(this->actx); @@ -160,45 +203,39 @@ void SmartContract::analyze(VirtualMachine* vm) { } this->actx->analyzeTypeRefGenerics(); +} - if(this->actx->hasError()){ - return; - } - +void SmartContract::analyzeMetadata(VirtualMachine *vm) { // static meta data this->actx->analyzeStaticVariables(); // inheritance this->actx->analyzeClassInheritance(); +} - if(this->actx->hasError()){ - return; - } - - { - // make top stack - AnalyzeStackManager* stackMgr = actx->getAnalyzeStackManager(); - AnalyzeStackPopper popper(stackMgr, true); - stackMgr->addFunctionStack(); - - maxLoop = this->progs.size(); - for(int i = 0; i != maxLoop; ++i){ - CompilationUnit* unit = this->progs.get(i); - unit->analyze(this->actx); - } +void SmartContract::analyzeFinal(VirtualMachine *vm) { + const ArrayList* list = this->reservedClassRegistory->getReservedClassesList(); + // make top stack + AnalyzeStackManager* stackMgr = actx->getAnalyzeStackManager(); + AnalyzeStackPopper popper(stackMgr, true); + stackMgr->addFunctionStack(); - maxLoop = list->size(); - for(int i = 0; i != maxLoop; ++i){ - AnalyzedClass* cls = list->get(i); - ClassDeclare* dec = cls->getClassDeclare(); + int maxLoop = this->progs.size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs.get(i); + unit->analyze(this->actx); + } - dec->analyze(actx); - } + maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* cls = list->get(i); + ClassDeclare* dec = cls->getClassDeclare(); - this->actx->analyzeGenerics(); + dec->analyze(actx); } + this->actx->analyzeGenerics(); } bool SmartContract::hasError() noexcept { @@ -226,7 +263,10 @@ VmClassInstance* SmartContract::createInstance(VirtualMachine* vm) { initialize(vm); PackageSpace* space = this->actx->getPackegeSpace(this->mainPackage); + ExceptionThrower::throwExceptionIfCondition(space == nullptr, L"The package space does not exist.", __FILE__, __LINE__); + AnalyzedClass* clazz = space->getClass(this->mainClass); + ExceptionThrower::throwExceptionIfCondition(clazz == nullptr, L"The Main Class does not exist.", __FILE__, __LINE__); MethodDeclare* defConstructor = clazz->getDefaultConstructor(); @@ -300,4 +340,29 @@ ReservedClassRegistory* SmartContract::getReservedClassRegistory() const noexcep return this->reservedClassRegistory; } +ClassDeclare* SmartContract::getClassDeclareByFqn(const UnicodeString *fqn) const { + ClassDeclare* result = nullptr; + + int maxLoop = this->progs.size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs.get(i); + + UnicodeString* package = TypeResolver::getPackageName(fqn); __STP(package); + UnicodeString* className = TypeResolver::getClassName(fqn); __STP(className); + + const UnicodeString* unitPackage = unit->getPackageName(); + + if((package != nullptr && package->equals(unitPackage)) || (package == nullptr && unitPackage == nullptr)){ + ClassDeclare* dec = unit->getClassDeclare(className); + + if(dec != nullptr){ + result = dec; + break; + } + } + } + + return result; +} + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/SmartContract.h b/src_smartcontract/engine/sc/SmartContract.h index 927bd7d..d84d44d 100644 --- a/src_smartcontract/engine/sc/SmartContract.h +++ b/src_smartcontract/engine/sc/SmartContract.h @@ -10,6 +10,7 @@ #include "base/ArrayList.h" + namespace alinous { class File; @@ -24,17 +25,25 @@ class ExtClassObject; class CompileError; class ReservedClassRegistory; class GcManager; +class ClassDeclare; class SmartContract { public: SmartContract(); virtual ~SmartContract(); - void addCompilationUnit(InputStream* stream, int length, const File* base, File* source); - void addCompilationUnit(File* file, const File* base); + CompilationUnit* addCompilationUnit(InputStream* stream, int length, const File* base, File* source); + CompilationUnit* addCompilationUnit(File* file, const File* base); void analyze(VirtualMachine* vm); bool hasError() noexcept; + void initBeforeAnalyze(VirtualMachine* vm); + void preAnalyze(VirtualMachine* vm); + void preAnalyzeGenerics(VirtualMachine* vm); + void analyzeType(VirtualMachine* vm); + void analyzeMetadata(VirtualMachine* vm); + void analyzeFinal(VirtualMachine* vm); + void setMainMethod(const UnicodeString* mainPackage, const UnicodeString* mainClass, const UnicodeString* mainMethod); VmRootReference* getRootReference() const noexcept; @@ -51,6 +60,12 @@ class SmartContract { CompilationUnit* getCompilationUnit(int pos); ReservedClassRegistory* getReservedClassRegistory() const noexcept; + bool isInitialized() const noexcept { + return this->initialized; + } + + ClassDeclare* getClassDeclareByFqn(const UnicodeString* fqn) const; + private: UnicodeString* mainPackage; UnicodeString* mainClass; diff --git a/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp b/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp index 19489c1..82b70aa 100644 --- a/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/AccessControlDeclare.cpp @@ -28,16 +28,22 @@ int AccessControlDeclare::binarySize() const { int total = sizeof(uint16_t); total += sizeof(char); + total += positionBinarySize(); + return total; } void AccessControlDeclare::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::ACCESS_CONTROL_DECLARE); out->put(this->accessCtrl); + + positionToBinary(out); } void AccessControlDeclare::fromBinary(ByteBuffer* in) { this->accessCtrl = in->get(); + + positionFromBinary(in); } AccessControlDeclare* AccessControlDeclare::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare/ArgumentDeclare.cpp b/src_smartcontract/lang/sc_declare/ArgumentDeclare.cpp index b1f71fe..ec193e0 100644 --- a/src_smartcontract/lang/sc_declare/ArgumentDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ArgumentDeclare.cpp @@ -75,6 +75,8 @@ int alinous::ArgumentDeclare::binarySize() const { total += this->type->binarySize(); total += stringSize(this->name); + total += positionBinarySize(); + return total; } @@ -85,6 +87,8 @@ void alinous::ArgumentDeclare::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::ARGUMENT_DECLARE); this->type->toBinary(out); putString(out, this->name); + + positionToBinary(out); } AnalyzedType* ArgumentDeclare::getAnalyzedType() const noexcept { @@ -98,6 +102,8 @@ void alinous::ArgumentDeclare::fromBinary(ByteBuffer* in) { this->type = dynamic_cast(element); this->name = getString(in); + + positionFromBinary(in); } ArgumentDeclare* ArgumentDeclare::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp b/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp index e12484e..3c331a5 100644 --- a/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ArgumentsListDeclare.cpp @@ -116,6 +116,8 @@ int ArgumentsListDeclare::binarySize() const { total += arg->binarySize(); } + total += positionBinarySize(); + return total; } @@ -129,6 +131,8 @@ void ArgumentsListDeclare::toBinary(ByteBuffer* out) const { ArgumentDeclare* arg = this->list.get(i); arg->toBinary(out); } + + positionToBinary(out); } @@ -141,6 +145,8 @@ void ArgumentsListDeclare::fromBinary(ByteBuffer* in) { ArgumentDeclare* arg = dynamic_cast(element); this->list.addElement(arg); } + + positionFromBinary(in); } const UnicodeString* ArgumentsListDeclare::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp index c33aff3..ebc8eb4 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp @@ -251,6 +251,8 @@ int ClassDeclare::binarySize() const { total += this->implements->binarySize(); } + total += positionBinarySize(); + return total; } @@ -258,6 +260,8 @@ void ClassDeclare::toBinary(ByteBuffer* out) const { toBinaryCheck(out); toBinaryHead(out); toBinaryBody(out); + + positionToBinary(out); } void ClassDeclare::toBinaryCheck(ByteBuffer *out) const { @@ -315,6 +319,8 @@ void ClassDeclare::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::CLASS_IMPLEMENTS); this->implements = dynamic_cast(element); } + + positionFromBinary(in); } void ClassDeclare::setExtends(ClassExtends* extends) noexcept { diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.h b/src_smartcontract/lang/sc_declare/ClassDeclare.h index 49854de..63c5707 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.h @@ -43,6 +43,9 @@ class ClassDeclare : public CodeElement { virtual bool isGenerics() const noexcept { return false; } + virtual bool isReserved() const noexcept { + return false; + } virtual void preAnalyze(AnalyzeContext* actx); virtual void analyzeTypeRef(AnalyzeContext* actx); diff --git a/src_smartcontract/lang/sc_declare/ClassDeclareBlock.cpp b/src_smartcontract/lang/sc_declare/ClassDeclareBlock.cpp index 99fdd32..5bc8b21 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclareBlock.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclareBlock.cpp @@ -164,6 +164,8 @@ int ClassDeclareBlock::binarySize() const { total += method->binarySize(); } + total += positionBinarySize(); + return total; } @@ -183,6 +185,8 @@ void ClassDeclareBlock::toBinary(ByteBuffer* out) const { MethodDeclare* method = this->methods.get(i); method->toBinary(out); } + + positionToBinary(out); } void ClassDeclareBlock::fromBinary(ByteBuffer* in) { @@ -203,6 +207,8 @@ void ClassDeclareBlock::fromBinary(ByteBuffer* in) { MethodDeclare* method = dynamic_cast(element); this->methods.addElement(method); } + + positionFromBinary(in); } bool ClassDeclareBlock::hasCtrlStatement() const noexcept { diff --git a/src_smartcontract/lang/sc_declare/ClassExtends.cpp b/src_smartcontract/lang/sc_declare/ClassExtends.cpp index b9cd168..9a1316d 100644 --- a/src_smartcontract/lang/sc_declare/ClassExtends.cpp +++ b/src_smartcontract/lang/sc_declare/ClassExtends.cpp @@ -63,6 +63,8 @@ int ClassExtends::binarySize() const { int total = sizeof(uint16_t); total += this->className->binarySize(); + total += positionBinarySize(); + return total; } @@ -71,6 +73,8 @@ void ClassExtends::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::CLASS_EXTENDS); this->className->toBinary(out); + + positionToBinary(out); } void ClassExtends::fromBinary(ByteBuffer* in) { @@ -78,6 +82,8 @@ void ClassExtends::fromBinary(ByteBuffer* in) { CodeElement::checkKind(element, CodeElement::CLASS_NAME); this->className = dynamic_cast(element); + + positionFromBinary(in); } ClassExtends* ClassExtends::generateGenericsImplement(HashMap* input) const { diff --git a/src_smartcontract/lang/sc_declare/ClassImplements.cpp b/src_smartcontract/lang/sc_declare/ClassImplements.cpp index aeb2f17..edfb4af 100644 --- a/src_smartcontract/lang/sc_declare/ClassImplements.cpp +++ b/src_smartcontract/lang/sc_declare/ClassImplements.cpp @@ -62,6 +62,8 @@ int ClassImplements::binarySize() const { total += n->binarySize(); } + total += positionBinarySize(); + return total; } @@ -75,6 +77,8 @@ void ClassImplements::toBinary(ByteBuffer* out) const { ClassName* n = this->list.get(i); n->toBinary(out); } + + positionToBinary(out); } void ClassImplements::fromBinary(ByteBuffer* in) { @@ -86,6 +90,8 @@ void ClassImplements::fromBinary(ByteBuffer* in) { ClassName* n = dynamic_cast(element); this->list.addElement(n); } + + positionFromBinary(in); } ClassImplements* ClassImplements::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare/ClassName.cpp b/src_smartcontract/lang/sc_declare/ClassName.cpp index 565461d..614943d 100644 --- a/src_smartcontract/lang/sc_declare/ClassName.cpp +++ b/src_smartcontract/lang/sc_declare/ClassName.cpp @@ -53,16 +53,22 @@ int ClassName::binarySize() const { int total = sizeof(uint16_t); total += stringSize(this->fqn); + total += positionBinarySize(); + return total; } void ClassName::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::CLASS_NAME); putString(out, this->fqn); + + positionToBinary(out); } void ClassName::fromBinary(ByteBuffer* in) { this->fqn = getString(in); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp index 4388605..f6e9e51 100644 --- a/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/GenericsGeneratedClassDeclare.cpp @@ -20,14 +20,17 @@ namespace alinous { GenericsGeneratedClassDeclare::GenericsGeneratedClassDeclare(short kind) : ClassDeclare(kind) { this->genericsClass = nullptr; + this->factory = nullptr; } GenericsGeneratedClassDeclare::GenericsGeneratedClassDeclare() : ClassDeclare(GENERICS_GENERATED_CLASS_DECLARE) { this->genericsClass = nullptr; + this->factory = nullptr; } GenericsGeneratedClassDeclare::~GenericsGeneratedClassDeclare() { this->genericsClass = nullptr; + this->factory = nullptr; // factory is singleton } void GenericsGeneratedClassDeclare::setGenericsClassDeclare(GenericsClassDeclare* clazz) { diff --git a/src_smartcontract/lang/sc_declare/GenericsParameter.cpp b/src_smartcontract/lang/sc_declare/GenericsParameter.cpp index 158ffc8..d3b6865 100644 --- a/src_smartcontract/lang/sc_declare/GenericsParameter.cpp +++ b/src_smartcontract/lang/sc_declare/GenericsParameter.cpp @@ -43,6 +43,8 @@ int GenericsParameter::binarySize() const { total += this->genericsExtendsName->binarySize(); } + total += positionBinarySize(); + return total; } @@ -57,6 +59,8 @@ void GenericsParameter::toBinary(ByteBuffer *out) const { if(bl > 0){ this->genericsExtendsName->toBinary(out); } + + positionToBinary(out); } void GenericsParameter::fromBinary(ByteBuffer *in) { @@ -70,6 +74,8 @@ void GenericsParameter::fromBinary(ByteBuffer *in) { __STP_MV(element); } + + positionFromBinary(in); } void GenericsParameter::setGenericsName(UnicodeString *name) noexcept { diff --git a/src_smartcontract/lang/sc_declare/ImportDeclare.cpp b/src_smartcontract/lang/sc_declare/ImportDeclare.cpp index dc0de23..8699f0d 100644 --- a/src_smartcontract/lang/sc_declare/ImportDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ImportDeclare.cpp @@ -65,16 +65,22 @@ int ImportDeclare::binarySize() const { total += stringSize(this->className); + total += positionBinarySize(); + return total; } void ImportDeclare::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::IMPORT_DECLARE); putString(out, this->className); + + positionToBinary(out); } void ImportDeclare::fromBinary(ByteBuffer* in) { this->className = getString(in); + + positionFromBinary(in); } ImportDeclare* ImportDeclare::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare/ImportsDeclare.cpp b/src_smartcontract/lang/sc_declare/ImportsDeclare.cpp index 33c815a..27cbcb1 100644 --- a/src_smartcontract/lang/sc_declare/ImportsDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ImportsDeclare.cpp @@ -48,6 +48,8 @@ int ImportsDeclare::binarySize() const { total += imp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -60,6 +62,8 @@ void ImportsDeclare::toBinary(ByteBuffer* out) const { ImportDeclare* imp = this->list.get(i); imp->toBinary(out); } + + positionToBinary(out); } void ImportsDeclare::fromBinary(ByteBuffer* in) { @@ -70,6 +74,8 @@ void ImportsDeclare::fromBinary(ByteBuffer* in) { this->list.addElement(dynamic_cast(element)); } + + positionFromBinary(in); } const ArrayList* ImportsDeclare::getImports() const noexcept { diff --git a/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp b/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp index df56908..b6338ab 100644 --- a/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp @@ -205,6 +205,8 @@ int MemberVariableDeclare::binarySize() const { total += this->type->binarySize(); total += stringSize(this->name); + total += positionBinarySize(); + return total; } @@ -225,10 +227,11 @@ void MemberVariableDeclare::toBinary(ByteBuffer* out) const { this->ctrl->toBinary(out); this->type->toBinary(out); putString(out, this->name); + + positionToBinary(out); } void MemberVariableDeclare::fromBinary(ByteBuffer* in) { - uint8_t bl = in->get(); if(bl == 0){ CodeElement* element = createFromBinary(in); @@ -249,6 +252,8 @@ void MemberVariableDeclare::fromBinary(ByteBuffer* in) { this->type = dynamic_cast(element); this->name = getString(in); + + positionFromBinary(in); } MemberVariableDeclare* MemberVariableDeclare::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index 83ce8f6..204763f 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -218,14 +218,21 @@ AnalyzedType* MethodDeclare::getReturnedType() const noexcept { int MethodDeclare::binarySize() const { checkNotNull(this->name); checkNotNull(this->ctrl); - checkNotNull(this->type); + if(!isConstructor()){ + checkNotNull(this->type); + } checkNotNull(this->args); int total = sizeof(uint16_t); total += sizeof(char); total += stringSize(this->name); total += this->ctrl->binarySize(); - total += this->type->binarySize(); + + total += sizeof(uint8_t); + if(this->type != nullptr){ + total += this->type->binarySize(); + } + total += this->args->binarySize(); total += sizeof(uint8_t); @@ -233,13 +240,17 @@ int MethodDeclare::binarySize() const { total += this->block->binarySize(); } + total += positionBinarySize(); + return total; } void MethodDeclare::toBinary(ByteBuffer* out) const { checkNotNull(this->name); checkNotNull(this->ctrl); - checkNotNull(this->type); + if(!isConstructor()){ + checkNotNull(this->type); + } checkNotNull(this->args); out->putShort(CodeElement::METHOD_DECLARE); @@ -247,7 +258,13 @@ void MethodDeclare::toBinary(ByteBuffer* out) const { out->put(this->_static ? (char)1 : (char)0); putString(out, this->name); this->ctrl->toBinary(out); - this->type->toBinary(out); + + uint8_t bl = (this->type != nullptr) ? 1 : 0; + out->put(bl); + if(bl > 0){ + this->type->toBinary(out); + } + this->args->toBinary(out); out->put(this->block != nullptr ? (uint8_t)1 : (uint8_t)0); @@ -255,6 +272,7 @@ void MethodDeclare::toBinary(ByteBuffer* out) const { this->block->toBinary(out); } + positionToBinary(out); } void MethodDeclare::fromBinary(ByteBuffer* in) { @@ -267,9 +285,12 @@ void MethodDeclare::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::ACCESS_CONTROL_DECLARE); this->ctrl = dynamic_cast(element); - element = createFromBinary(in); - checkIsType(element); - this->type = dynamic_cast(element); + bl = in->get(); + if(bl > 0){ + element = createFromBinary(in); + checkIsType(element); + this->type = dynamic_cast(element); + } element = createFromBinary(in); checkKind(element, CodeElement::ARGUMENTS_LIST_DECLARE); @@ -281,6 +302,8 @@ void MethodDeclare::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::STMT_BLOCK); this->block = dynamic_cast(element); } + + positionFromBinary(in); } void MethodDeclare::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_declare/PackageDeclare.cpp b/src_smartcontract/lang/sc_declare/PackageDeclare.cpp index 664b26b..861d036 100644 --- a/src_smartcontract/lang/sc_declare/PackageDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/PackageDeclare.cpp @@ -34,6 +34,8 @@ int PackageDeclare::binarySize() const { checkNotNull(this->name); total += this->name->binarySize(); + total += positionBinarySize(); + return total; } @@ -41,6 +43,8 @@ void PackageDeclare::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::PACKAGE_DECLARE); this->name->toBinary(out); + + positionToBinary(out); } void PackageDeclare::fromBinary(ByteBuffer* in) { @@ -48,6 +52,8 @@ void PackageDeclare::fromBinary(ByteBuffer* in) { checkKind(nm, CodeElement::PACKAGE_NAME_DECLARE); this->name = dynamic_cast(nm); + + positionFromBinary(in); } PackageDeclare* PackageDeclare::generateGenericsImplement(HashMap *input) { diff --git a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp index a9910bc..7281792 100644 --- a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp @@ -65,6 +65,8 @@ int PackageNameDeclare::binarySize() const { total += stringSize(str); } + total += positionBinarySize(); + return total; } @@ -78,6 +80,8 @@ void PackageNameDeclare::toBinary(ByteBuffer* out) const { UnicodeString* str = this->list.get(i); putString(out, str); } + + positionToBinary(out); } void PackageNameDeclare::fromBinary(ByteBuffer* in) { @@ -86,6 +90,8 @@ void PackageNameDeclare::fromBinary(ByteBuffer* in) { UnicodeString* str = getString(in); this->list.addElement(str); } + + positionFromBinary(in); } PackageNameDeclare* PackageNameDeclare::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_declare_types/BoolType.cpp b/src_smartcontract/lang/sc_declare_types/BoolType.cpp index 04526da..3db37e4 100644 --- a/src_smartcontract/lang/sc_declare_types/BoolType.cpp +++ b/src_smartcontract/lang/sc_declare_types/BoolType.cpp @@ -27,16 +27,22 @@ int BoolType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void BoolType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_BOOL); AbstractType::toBinary(out); + + positionToBinary(out); } void BoolType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* BoolType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/ByteType.cpp b/src_smartcontract/lang/sc_declare_types/ByteType.cpp index 469e54e..a7bce20 100644 --- a/src_smartcontract/lang/sc_declare_types/ByteType.cpp +++ b/src_smartcontract/lang/sc_declare_types/ByteType.cpp @@ -25,16 +25,22 @@ int ByteType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void ByteType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_BYTE); AbstractType::toBinary(out); + + positionToBinary(out); } void ByteType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* ByteType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/CharType.cpp b/src_smartcontract/lang/sc_declare_types/CharType.cpp index 5f074fd..47df8a0 100644 --- a/src_smartcontract/lang/sc_declare_types/CharType.cpp +++ b/src_smartcontract/lang/sc_declare_types/CharType.cpp @@ -25,16 +25,22 @@ int CharType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void CharType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_CHAR); AbstractType::toBinary(out); + + positionToBinary(out); } void CharType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* CharType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/DomType.cpp b/src_smartcontract/lang/sc_declare_types/DomType.cpp index 2cb044e..3ab4c78 100644 --- a/src_smartcontract/lang/sc_declare_types/DomType.cpp +++ b/src_smartcontract/lang/sc_declare_types/DomType.cpp @@ -27,16 +27,22 @@ int DomType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void DomType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_DOM); AbstractType::toBinary(out); + + positionToBinary(out); } void DomType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* DomType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/IntType.cpp b/src_smartcontract/lang/sc_declare_types/IntType.cpp index 9d7b5bd..049916b 100644 --- a/src_smartcontract/lang/sc_declare_types/IntType.cpp +++ b/src_smartcontract/lang/sc_declare_types/IntType.cpp @@ -27,16 +27,22 @@ int IntType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void IntType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_INT); AbstractType::toBinary(out); + + positionToBinary(out); } void IntType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* IntType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/LongType.cpp b/src_smartcontract/lang/sc_declare_types/LongType.cpp index 1d2e226..558c9c0 100644 --- a/src_smartcontract/lang/sc_declare_types/LongType.cpp +++ b/src_smartcontract/lang/sc_declare_types/LongType.cpp @@ -25,16 +25,22 @@ int LongType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void LongType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_LONG); AbstractType::toBinary(out); + + positionToBinary(out); } void LongType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* LongType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/ObjectType.cpp b/src_smartcontract/lang/sc_declare_types/ObjectType.cpp index 7f33fc6..5047d68 100644 --- a/src_smartcontract/lang/sc_declare_types/ObjectType.cpp +++ b/src_smartcontract/lang/sc_declare_types/ObjectType.cpp @@ -49,6 +49,8 @@ int ObjectType::binarySize() const { total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } @@ -63,6 +65,8 @@ void ObjectType::toBinary(ByteBuffer* out) const { putString(out, this->className); AbstractType::toBinary(out); + + positionToBinary(out); } void ObjectType::fromBinary(ByteBuffer* in) { @@ -74,6 +78,8 @@ void ObjectType::fromBinary(ByteBuffer* in) { this->className = getString(in); AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* ObjectType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/ShortType.cpp b/src_smartcontract/lang/sc_declare_types/ShortType.cpp index 57bd671..0d2d342 100644 --- a/src_smartcontract/lang/sc_declare_types/ShortType.cpp +++ b/src_smartcontract/lang/sc_declare_types/ShortType.cpp @@ -25,16 +25,22 @@ int ShortType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void ShortType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_SHORT); AbstractType::toBinary(out); + + positionToBinary(out); } void ShortType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* ShortType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/StringType.cpp b/src_smartcontract/lang/sc_declare_types/StringType.cpp index f739cd1..86bb8a8 100644 --- a/src_smartcontract/lang/sc_declare_types/StringType.cpp +++ b/src_smartcontract/lang/sc_declare_types/StringType.cpp @@ -25,16 +25,22 @@ int StringType::binarySize() const { int total = sizeof(uint16_t); total += AbstractType::binarySize(); + total += positionBinarySize(); + return total; } void StringType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_STRING); AbstractType::toBinary(out); + + positionToBinary(out); } void StringType::fromBinary(ByteBuffer* in) { AbstractType::fromBinary(in); + + positionFromBinary(in); } const UnicodeString* StringType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_declare_types/VoidType.cpp b/src_smartcontract/lang/sc_declare_types/VoidType.cpp index 33e2215..f64dbb4 100644 --- a/src_smartcontract/lang/sc_declare_types/VoidType.cpp +++ b/src_smartcontract/lang/sc_declare_types/VoidType.cpp @@ -25,14 +25,19 @@ VoidType::~VoidType() { int VoidType::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void VoidType::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::TYPE_VOID); + + positionToBinary(out); } void VoidType::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } const UnicodeString* VoidType::toString() noexcept { diff --git a/src_smartcontract/lang/sc_expression/AllocationExpression.cpp b/src_smartcontract/lang/sc_expression/AllocationExpression.cpp index a5898a0..4e64c85 100644 --- a/src_smartcontract/lang/sc_expression/AllocationExpression.cpp +++ b/src_smartcontract/lang/sc_expression/AllocationExpression.cpp @@ -124,6 +124,8 @@ int AllocationExpression::binarySize() const { total += this->array->binarySize(); } + total += positionBinarySize(); + return total; } @@ -142,6 +144,7 @@ void AllocationExpression::toBinary(ByteBuffer* out) const { this->array->toBinary(out); } + positionToBinary(out); } void AllocationExpression::fromBinary(ByteBuffer* in) { @@ -158,6 +161,8 @@ void AllocationExpression::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::EXP_CONSTRUCTORARRAY); this->array = dynamic_cast(element); } + + positionFromBinary(in); } AnalyzedType AllocationExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/ArrayReferenceExpression.cpp b/src_smartcontract/lang/sc_expression/ArrayReferenceExpression.cpp index 1b0b72c..660642c 100644 --- a/src_smartcontract/lang/sc_expression/ArrayReferenceExpression.cpp +++ b/src_smartcontract/lang/sc_expression/ArrayReferenceExpression.cpp @@ -145,6 +145,8 @@ int ArrayReferenceExpression::binarySize() const { total += ex->binarySize(); } + total += positionBinarySize(); + return total; } @@ -161,6 +163,8 @@ void ArrayReferenceExpression::toBinary(ByteBuffer* out) const { AbstractExpression* ex = this->list.get(i); ex->toBinary(out); } + + positionToBinary(out); } void ArrayReferenceExpression::fromBinary(ByteBuffer* in) { @@ -178,6 +182,8 @@ void ArrayReferenceExpression::fromBinary(ByteBuffer* in) { AbstractExpression* ex = dynamic_cast(element); this->list.addElement(ex); } + + positionFromBinary(in); } AnalyzedType ArrayReferenceExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/CastExpression.cpp b/src_smartcontract/lang/sc_expression/CastExpression.cpp index 5c55abc..5ef23eb 100644 --- a/src_smartcontract/lang/sc_expression/CastExpression.cpp +++ b/src_smartcontract/lang/sc_expression/CastExpression.cpp @@ -106,6 +106,8 @@ int CastExpression::binarySize() const { total += this->exp->binarySize(); total += this->type->binarySize(); + total += positionBinarySize(); + return total; } @@ -116,6 +118,8 @@ void CastExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_CAST); this->exp->toBinary(out); this->type->toBinary(out); + + positionToBinary(out); } void CastExpression::fromBinary(ByteBuffer* in) { @@ -126,6 +130,8 @@ void CastExpression::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsType(element); this->type = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType CastExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/ConstructorArray.cpp b/src_smartcontract/lang/sc_expression/ConstructorArray.cpp index 295cafe..d1533b7 100644 --- a/src_smartcontract/lang/sc_expression/ConstructorArray.cpp +++ b/src_smartcontract/lang/sc_expression/ConstructorArray.cpp @@ -56,6 +56,8 @@ int ConstructorArray::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -73,6 +75,8 @@ void ConstructorArray::toBinary(ByteBuffer* out) const { AbstractExpression* exp = this->dims.get(i); exp->toBinary(out); } + + positionToBinary(out); } void ConstructorArray::fromBinary(ByteBuffer* in) { @@ -90,6 +94,8 @@ void ConstructorArray::fromBinary(ByteBuffer* in) { AbstractExpression* exp = dynamic_cast(element); this->dims.addElement(exp); } + + positionFromBinary(in); } void ConstructorArray::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp index 8190550..d275e8e 100644 --- a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp +++ b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp @@ -105,6 +105,8 @@ int ConstructorCall::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -121,6 +123,8 @@ void ConstructorCall::toBinary(ByteBuffer* out) const { AbstractExpression* exp = this->args.get(i); exp->toBinary(out); } + + positionToBinary(out); } void ConstructorCall::fromBinary(ByteBuffer* in) { @@ -137,6 +141,8 @@ void ConstructorCall::fromBinary(ByteBuffer* in) { this->args.addElement(exp); } + + positionFromBinary(in); } void ConstructorCall::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp index 3302fc1..66d6c23 100644 --- a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp +++ b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp @@ -295,6 +295,8 @@ int FunctionCallExpression::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -311,6 +313,8 @@ void FunctionCallExpression::toBinary(ByteBuffer* out) const { AbstractExpression* exp = this->args.get(i); exp->toBinary(out); } + + positionToBinary(out); } void FunctionCallExpression::fromBinary(ByteBuffer* in) { @@ -327,6 +331,8 @@ void FunctionCallExpression::fromBinary(ByteBuffer* in) { this->args.addElement(exp); } + + positionFromBinary(in); } AnalyzedType FunctionCallExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/MemberReferenceExpression.cpp b/src_smartcontract/lang/sc_expression/MemberReferenceExpression.cpp index 81a15f4..a404286 100644 --- a/src_smartcontract/lang/sc_expression/MemberReferenceExpression.cpp +++ b/src_smartcontract/lang/sc_expression/MemberReferenceExpression.cpp @@ -101,16 +101,22 @@ int MemberReferenceExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); + return total; } void MemberReferenceExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_MEMBER_REF); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void MemberReferenceExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType MemberReferenceExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/ParenthesisExpression.cpp b/src_smartcontract/lang/sc_expression/ParenthesisExpression.cpp index 6553819..3307188 100644 --- a/src_smartcontract/lang/sc_expression/ParenthesisExpression.cpp +++ b/src_smartcontract/lang/sc_expression/ParenthesisExpression.cpp @@ -41,6 +41,8 @@ int ParenthesisExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -49,12 +51,16 @@ void ParenthesisExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_PARENTHESIS); this->exp->toBinary(out); + + positionToBinary(out); } void ParenthesisExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType ParenthesisExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression/VariableIdentifier.cpp b/src_smartcontract/lang/sc_expression/VariableIdentifier.cpp index 8420cfe..b5f22af 100644 --- a/src_smartcontract/lang/sc_expression/VariableIdentifier.cpp +++ b/src_smartcontract/lang/sc_expression/VariableIdentifier.cpp @@ -120,6 +120,8 @@ int VariableIdentifier::binarySize() const { int total = sizeof(uint16_t); total += stringSize(this->name); + total += positionBinarySize(); + return total; } @@ -128,10 +130,14 @@ void VariableIdentifier::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_VARIABLE_ID); putString(out, this->name); + + positionToBinary(out); } void VariableIdentifier::fromBinary(ByteBuffer* in) { this->name = getString(in); + + positionFromBinary(in); } AnalyzedType VariableIdentifier::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_arithmetic/AddExpression.cpp b/src_smartcontract/lang/sc_expression_arithmetic/AddExpression.cpp index 3d367e5..83b0c1a 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/AddExpression.cpp +++ b/src_smartcontract/lang/sc_expression_arithmetic/AddExpression.cpp @@ -173,4 +173,23 @@ AbstractExpression* AddExpression::generateGenericsImplement(HashMap *input) const; diff --git a/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.cpp b/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.cpp index c04295d..cee51ef 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.cpp +++ b/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.cpp @@ -238,4 +238,23 @@ AbstractExpression* MultiplicativeExpression::generateGenericsImplement(HashMap< return inst; } +int MultiplicativeExpression::binarySize() const { + int total = AbstractArithmeticBinaryExpresson::binarySize(); + + total += positionBinarySize(); + return total; +} + +void MultiplicativeExpression::toBinary(ByteBuffer *out) const { + AbstractArithmeticBinaryExpresson::toBinary(out); + + positionToBinary(out); +} + +void MultiplicativeExpression::fromBinary(ByteBuffer *in) { + AbstractArithmeticBinaryExpresson::fromBinary(in); + + positionFromBinary(in); +} + } /* namespace alinous */ diff --git a/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.h b/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.h index 17f9aa4..f4df0bc 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.h +++ b/src_smartcontract/lang/sc_expression_arithmetic/MultiplicativeExpression.h @@ -35,6 +35,10 @@ class MultiplicativeExpression : public AbstractArithmeticBinaryExpresson { virtual AbstractExpression* generateGenericsImplement(HashMap *input) const; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + private: AbstractVmInstance* interpret8Bit(VirtualMachine* vm); AbstractVmInstance* interpret16Bit(VirtualMachine* vm); diff --git a/src_smartcontract/lang/sc_expression_arithmetic/NegateExpression.cpp b/src_smartcontract/lang/sc_expression_arithmetic/NegateExpression.cpp index b7c5eb9..9c28ea5 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/NegateExpression.cpp +++ b/src_smartcontract/lang/sc_expression_arithmetic/NegateExpression.cpp @@ -49,6 +49,8 @@ int NegateExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -57,12 +59,16 @@ void NegateExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_NEGATE); this->exp->toBinary(out); + + positionToBinary(out); } void NegateExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType NegateExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_arithmetic/PostIncrementExpression.cpp b/src_smartcontract/lang/sc_expression_arithmetic/PostIncrementExpression.cpp index d3b6a1e..094af6b 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/PostIncrementExpression.cpp +++ b/src_smartcontract/lang/sc_expression_arithmetic/PostIncrementExpression.cpp @@ -53,6 +53,8 @@ int PostIncrementExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -61,12 +63,16 @@ void PostIncrementExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_POST_INC); this->exp->toBinary(out); + + positionToBinary(out); } void PostIncrementExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType PostIncrementExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_arithmetic/PreIncrementExpression.cpp b/src_smartcontract/lang/sc_expression_arithmetic/PreIncrementExpression.cpp index f824f55..f733b2a 100644 --- a/src_smartcontract/lang/sc_expression_arithmetic/PreIncrementExpression.cpp +++ b/src_smartcontract/lang/sc_expression_arithmetic/PreIncrementExpression.cpp @@ -54,6 +54,8 @@ int PreIncrementExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -62,12 +64,16 @@ void PreIncrementExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_PRE_INC); this->exp->toBinary(out); + + positionToBinary(out); } void PreIncrementExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType PreIncrementExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_bit/AndExpression.cpp b/src_smartcontract/lang/sc_expression_bit/AndExpression.cpp index 2571b39..e0c5253 100644 --- a/src_smartcontract/lang/sc_expression_bit/AndExpression.cpp +++ b/src_smartcontract/lang/sc_expression_bit/AndExpression.cpp @@ -45,16 +45,21 @@ int AndExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); return total; } void AndExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_AND); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void AndExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType AndExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_bit/BitReverseExpression.cpp b/src_smartcontract/lang/sc_expression_bit/BitReverseExpression.cpp index 8678e64..3ed5997 100644 --- a/src_smartcontract/lang/sc_expression_bit/BitReverseExpression.cpp +++ b/src_smartcontract/lang/sc_expression_bit/BitReverseExpression.cpp @@ -61,6 +61,8 @@ int BitReverseExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -69,12 +71,16 @@ void BitReverseExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_BIT_REV); this->exp->toBinary(out); + + positionToBinary(out); } void BitReverseExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType BitReverseExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_bit/ExclusiveOrExpression.cpp b/src_smartcontract/lang/sc_expression_bit/ExclusiveOrExpression.cpp index c6d17c1..54fba4a 100644 --- a/src_smartcontract/lang/sc_expression_bit/ExclusiveOrExpression.cpp +++ b/src_smartcontract/lang/sc_expression_bit/ExclusiveOrExpression.cpp @@ -45,16 +45,21 @@ int ExclusiveOrExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); return total; } void ExclusiveOrExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_EX_OR); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void ExclusiveOrExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType ExclusiveOrExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_bit/OrExpression.cpp b/src_smartcontract/lang/sc_expression_bit/OrExpression.cpp index 798486a..8dd6566 100644 --- a/src_smartcontract/lang/sc_expression_bit/OrExpression.cpp +++ b/src_smartcontract/lang/sc_expression_bit/OrExpression.cpp @@ -46,16 +46,22 @@ int OrExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); + return total; } void OrExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_OR); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void OrExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType OrExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_bit/ShiftExpression.cpp b/src_smartcontract/lang/sc_expression_bit/ShiftExpression.cpp index 504740b..85a8a20 100644 --- a/src_smartcontract/lang/sc_expression_bit/ShiftExpression.cpp +++ b/src_smartcontract/lang/sc_expression_bit/ShiftExpression.cpp @@ -62,6 +62,8 @@ int ShiftExpression::binarySize() const { total += sizeof(uint8_t); } + total += positionBinarySize(); + return total; } @@ -76,6 +78,8 @@ void ShiftExpression::toBinary(ByteBuffer* out) const { uint8_t op = this->operations.get(i); out->put(op); } + + positionToBinary(out); } void ShiftExpression::fromBinary(ByteBuffer* in) { @@ -86,6 +90,8 @@ void ShiftExpression::fromBinary(ByteBuffer* in) { uint8_t op = in->get(); this->operations.addElement(op); } + + positionFromBinary(in); } AnalyzedType ShiftExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_json/JsonArrayExpression.cpp b/src_smartcontract/lang/sc_expression_json/JsonArrayExpression.cpp index 3bb1508..2a6cc21 100644 --- a/src_smartcontract/lang/sc_expression_json/JsonArrayExpression.cpp +++ b/src_smartcontract/lang/sc_expression_json/JsonArrayExpression.cpp @@ -105,6 +105,8 @@ int JsonArrayExpression::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -119,6 +121,8 @@ void JsonArrayExpression::toBinary(ByteBuffer* out) const { exp->toBinary(out); } + + positionToBinary(out); } void JsonArrayExpression::fromBinary(ByteBuffer* in) { @@ -130,6 +134,8 @@ void JsonArrayExpression::fromBinary(ByteBuffer* in) { AbstractExpression* exp = dynamic_cast(element); addElement(exp); } + + positionFromBinary(in); } AbstractExpression* JsonArrayExpression::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_expression_json/JsonInitializerExpression.cpp b/src_smartcontract/lang/sc_expression_json/JsonInitializerExpression.cpp index 4d16f9d..20d73c8 100644 --- a/src_smartcontract/lang/sc_expression_json/JsonInitializerExpression.cpp +++ b/src_smartcontract/lang/sc_expression_json/JsonInitializerExpression.cpp @@ -115,6 +115,8 @@ int JsonInitializerExpression::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -129,6 +131,8 @@ void JsonInitializerExpression::toBinary(ByteBuffer* out) const { exp->toBinary(out); } + + positionToBinary(out); } void JsonInitializerExpression::fromBinary(ByteBuffer* in) { @@ -140,6 +144,8 @@ void JsonInitializerExpression::fromBinary(ByteBuffer* in) { JsonKeyValuePairExpression* exp = dynamic_cast(element); addElement(exp); } + + positionFromBinary(in); } AbstractExpression* JsonInitializerExpression::generateGenericsImplement(HashMap *input) const { diff --git a/src_smartcontract/lang/sc_expression_json/JsonKeyValuePairExpression.cpp b/src_smartcontract/lang/sc_expression_json/JsonKeyValuePairExpression.cpp index 37b291e..bced81a 100644 --- a/src_smartcontract/lang/sc_expression_json/JsonKeyValuePairExpression.cpp +++ b/src_smartcontract/lang/sc_expression_json/JsonKeyValuePairExpression.cpp @@ -77,6 +77,8 @@ int JsonKeyValuePairExpression::binarySize() const { total += stringSize(this->name); total += this->value->binarySize(); + total += positionBinarySize(); + return total; } @@ -87,6 +89,8 @@ void JsonKeyValuePairExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_JSON_VALUE_PAIR); putString(out, this->name); this->value->toBinary(out); + + positionToBinary(out); } void JsonKeyValuePairExpression::fromBinary(ByteBuffer* in) { @@ -96,6 +100,8 @@ void JsonKeyValuePairExpression::fromBinary(ByteBuffer* in) { checkIsExp(element); this->value = dynamic_cast(element); + + positionFromBinary(in); } const UnicodeString* JsonKeyValuePairExpression::getName() const noexcept { diff --git a/src_smartcontract/lang/sc_expression_literal/BooleanLiteral.cpp b/src_smartcontract/lang/sc_expression_literal/BooleanLiteral.cpp index 14be59e..5b5e5c0 100644 --- a/src_smartcontract/lang/sc_expression_literal/BooleanLiteral.cpp +++ b/src_smartcontract/lang/sc_expression_literal/BooleanLiteral.cpp @@ -38,17 +38,23 @@ int BooleanLiteral::binarySize() const { int total = sizeof(uint16_t); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } void BooleanLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_BOOLEAN_LITERAL); out->put(this->value ? 1 : 0); + + positionToBinary(out); } void BooleanLiteral::fromBinary(ByteBuffer* in) { char val = in->get(); this->value = (val == 1); + + positionFromBinary(in); } AnalyzedType BooleanLiteral::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_literal/LiteralExpression.cpp b/src_smartcontract/lang/sc_expression_literal/LiteralExpression.cpp index 0d83519..f01f140 100644 --- a/src_smartcontract/lang/sc_expression_literal/LiteralExpression.cpp +++ b/src_smartcontract/lang/sc_expression_literal/LiteralExpression.cpp @@ -60,6 +60,8 @@ int LiteralExpression::binarySize() const { total += sizeof(uint8_t); total += stringSize(this->str); + total += positionBinarySize(); + return total; } @@ -68,12 +70,16 @@ void LiteralExpression::toBinary(ByteBuffer* out) const { out->put(this->dquote ? 1 : 0); putString(out, this->str); + + positionToBinary(out); } void LiteralExpression::fromBinary(ByteBuffer* in) { char bl = in->get(); this->dquote = (bl == 1); this->str = getString(in); + + positionFromBinary(in); } AnalyzedType LiteralExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_literal/NullLiteral.cpp b/src_smartcontract/lang/sc_expression_literal/NullLiteral.cpp index b9406c8..1ed4df2 100644 --- a/src_smartcontract/lang/sc_expression_literal/NullLiteral.cpp +++ b/src_smartcontract/lang/sc_expression_literal/NullLiteral.cpp @@ -31,14 +31,19 @@ void NullLiteral::analyze(AnalyzeContext* actx) { int NullLiteral::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void NullLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_NULL_LITERAL); + + positionToBinary(out); } void NullLiteral::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } AnalyzedType NullLiteral::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_literal/NumberLiteral.cpp b/src_smartcontract/lang/sc_expression_literal/NumberLiteral.cpp index 1162959..64600c1 100644 --- a/src_smartcontract/lang/sc_expression_literal/NumberLiteral.cpp +++ b/src_smartcontract/lang/sc_expression_literal/NumberLiteral.cpp @@ -71,6 +71,8 @@ int NumberLiteral::binarySize() const { int total = sizeof(uint16_t); total += stringSize(this->str); + total += positionBinarySize(); + return total; } @@ -79,10 +81,14 @@ void NumberLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_NUMBER_LITERAL); putString(out, this->str); + + positionToBinary(out); } void NumberLiteral::fromBinary(ByteBuffer* in) { this->str = getString(in); + + positionFromBinary(in); } AnalyzedType NumberLiteral::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_logical/ConditionalAndExpression.cpp b/src_smartcontract/lang/sc_expression_logical/ConditionalAndExpression.cpp index 1428010..cc25ae6 100644 --- a/src_smartcontract/lang/sc_expression_logical/ConditionalAndExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/ConditionalAndExpression.cpp @@ -53,16 +53,22 @@ int ConditionalAndExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); + return total; } void ConditionalAndExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_CND_AND); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void ConditionalAndExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType ConditionalAndExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_logical/ConditionalOrExpression.cpp b/src_smartcontract/lang/sc_expression_logical/ConditionalOrExpression.cpp index 8e30917..d2ce658 100644 --- a/src_smartcontract/lang/sc_expression_logical/ConditionalOrExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/ConditionalOrExpression.cpp @@ -53,16 +53,22 @@ int ConditionalOrExpression::binarySize() const { int total = sizeof(uint16_t); total += AbstractBinaryExpression::binarySize(); + total += positionBinarySize(); + return total; } void ConditionalOrExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_CND_OR); AbstractBinaryExpression::toBinary(out); + + positionToBinary(out); } void ConditionalOrExpression::fromBinary(ByteBuffer* in) { AbstractBinaryExpression::fromBinary(in); + + positionFromBinary(in); } AnalyzedType ConditionalOrExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp b/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp index ac000e2..6e9f066 100644 --- a/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp @@ -74,6 +74,8 @@ int EqualityExpression::binarySize() const { total += this->right->binarySize(); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -85,6 +87,8 @@ void EqualityExpression::toBinary(ByteBuffer* out) const { this->left->toBinary(out); this->right->toBinary(out); out->put(this->op); + + positionToBinary(out); } void EqualityExpression::fromBinary(ByteBuffer* in) { @@ -97,6 +101,8 @@ void EqualityExpression::fromBinary(ByteBuffer* in) { this->right = dynamic_cast(element); this->op = in->get(); + + positionFromBinary(in); } AnalyzedType EqualityExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_logical/NotExpression.cpp b/src_smartcontract/lang/sc_expression_logical/NotExpression.cpp index 5f6bffa..c0bd5ea 100644 --- a/src_smartcontract/lang/sc_expression_logical/NotExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/NotExpression.cpp @@ -55,6 +55,8 @@ int NotExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -63,12 +65,16 @@ void NotExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::EXP_CND_NOT); this->exp->toBinary(out); + + positionToBinary(out); } void NotExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } AnalyzedType NotExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_expression_logical/RelationalExpression.cpp b/src_smartcontract/lang/sc_expression_logical/RelationalExpression.cpp index 4ea3017..68d52bc 100644 --- a/src_smartcontract/lang/sc_expression_logical/RelationalExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/RelationalExpression.cpp @@ -77,6 +77,8 @@ int RelationalExpression::binarySize() const { total += this->right->binarySize(); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -88,6 +90,8 @@ void RelationalExpression::toBinary(ByteBuffer* out) const { this->left->toBinary(out); this->right->toBinary(out); out->put(this->op); + + positionToBinary(out); } void RelationalExpression::fromBinary(ByteBuffer* in) { @@ -100,6 +104,8 @@ void RelationalExpression::fromBinary(ByteBuffer* in) { this->right = dynamic_cast(element); this->op = in->get(); + + positionFromBinary(in); } AnalyzedType RelationalExpression::getType(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang/sc_statement/BlankStatement.cpp b/src_smartcontract/lang/sc_statement/BlankStatement.cpp index 4ef79f5..6fbc55f 100644 --- a/src_smartcontract/lang/sc_statement/BlankStatement.cpp +++ b/src_smartcontract/lang/sc_statement/BlankStatement.cpp @@ -28,14 +28,19 @@ void alinous::BlankStatement::init(VirtualMachine* vm) { int BlankStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void BlankStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_BLANK); + + positionToBinary(out); } void BlankStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void BlankStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement/ExpressionStatement.cpp b/src_smartcontract/lang/sc_statement/ExpressionStatement.cpp index 9efebb0..e32abb6 100644 --- a/src_smartcontract/lang/sc_statement/ExpressionStatement.cpp +++ b/src_smartcontract/lang/sc_statement/ExpressionStatement.cpp @@ -54,6 +54,8 @@ int ExpressionStatement::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -62,12 +64,16 @@ void ExpressionStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_EXPRESSION); this->exp->toBinary(out); + + positionToBinary(out); } void ExpressionStatement::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void ExpressionStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement/StatementBlock.cpp b/src_smartcontract/lang/sc_statement/StatementBlock.cpp index 69490c6..6332abf 100644 --- a/src_smartcontract/lang/sc_statement/StatementBlock.cpp +++ b/src_smartcontract/lang/sc_statement/StatementBlock.cpp @@ -223,6 +223,8 @@ int StatementBlock::binarySize() const { total += stmt->binarySize(); } + total += positionBinarySize(); + return total; } @@ -236,6 +238,8 @@ void StatementBlock::toBinary(ByteBuffer* out) const { AbstractStatement* stmt = this->statements.get(i); stmt->toBinary(out); } + + positionToBinary(out); } void StatementBlock::fromBinary(ByteBuffer* in) { @@ -247,6 +251,8 @@ void StatementBlock::fromBinary(ByteBuffer* in) { AbstractStatement* stmt = dynamic_cast(element); this->statements.addElement(stmt); } + + positionFromBinary(in); } void StatementBlock::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp index 0c66ead..e8c9e23 100644 --- a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp +++ b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp @@ -79,6 +79,8 @@ int SubstitutionStatement::binarySize() const { total += this->variable->binarySize(); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -89,6 +91,8 @@ void SubstitutionStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_SUBSTITUTION); this->variable->toBinary(out); this->exp->toBinary(out); + + positionToBinary(out); } void SubstitutionStatement::fromBinary(ByteBuffer* in) { @@ -99,6 +103,8 @@ void SubstitutionStatement::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void SubstitutionStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp b/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp index f004df0..656b204 100644 --- a/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp +++ b/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp @@ -147,6 +147,8 @@ int VariableDeclareStatement::binarySize() const { total += this->exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -166,6 +168,8 @@ void VariableDeclareStatement::toBinary(ByteBuffer* out) const { if(!isNull){ this->exp->toBinary(out); } + + positionToBinary(out); } void VariableDeclareStatement::fromBinary(ByteBuffer* in) { @@ -183,6 +187,8 @@ void VariableDeclareStatement::fromBinary(ByteBuffer* in) { checkIsExp(element); this->exp = dynamic_cast(element); } + + positionFromBinary(in); } void VariableDeclareStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/BreakStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/BreakStatement.cpp index dd4c266..97855f2 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/BreakStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/BreakStatement.cpp @@ -37,14 +37,19 @@ void BreakStatement::init(VirtualMachine* vm) { int BreakStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void BreakStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_BREAK); + + positionToBinary(out); } void BreakStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void BreakStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/ContinueStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/ContinueStatement.cpp index b3d1612..a634e1d 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/ContinueStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/ContinueStatement.cpp @@ -34,14 +34,19 @@ void ContinueStatement::analyze(AnalyzeContext* actx) { int ContinueStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void ContinueStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_CONTINUE); + + positionToBinary(out); } void ContinueStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void ContinueStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/DoWhileStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/DoWhileStatement.cpp index 1509d0d..ac2a5b4 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/DoWhileStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/DoWhileStatement.cpp @@ -96,6 +96,8 @@ int DoWhileStatement::binarySize() const { total += this->exp->binarySize(); total += this->stmt->binarySize(); + total += positionBinarySize(); + return total; } @@ -106,6 +108,8 @@ void DoWhileStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_DO_WHILE); this->exp->toBinary(out); this->stmt->toBinary(out); + + positionToBinary(out); } void DoWhileStatement::fromBinary(ByteBuffer* in) { @@ -116,6 +120,8 @@ void DoWhileStatement::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsStatement(element); this->stmt = dynamic_cast(element); + + positionFromBinary(in); } void DoWhileStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/ForStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/ForStatement.cpp index 3c1b596..1c25f15 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/ForStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/ForStatement.cpp @@ -153,6 +153,8 @@ int ForStatement::binarySize() const { total += this->cond->binarySize(); total += this->postLoop->binarySize(); + total += positionBinarySize(); + return total; } @@ -167,6 +169,8 @@ void ForStatement::toBinary(ByteBuffer* out) const { this->initStatement->toBinary(out); this->cond->toBinary(out); this->postLoop->toBinary(out); + + positionToBinary(out); } void ForStatement::fromBinary(ByteBuffer* in) { @@ -185,6 +189,8 @@ void ForStatement::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsStatement(element); this->postLoop = dynamic_cast(element); + + positionFromBinary(in); } void ForStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/IfStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/IfStatement.cpp index 78e5a69..dc6bdf6 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/IfStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/IfStatement.cpp @@ -161,6 +161,8 @@ int IfStatement::binarySize() const { total += this->elseStmt->binarySize(); } + total += positionBinarySize(); + return total; } @@ -185,6 +187,8 @@ void IfStatement::toBinary(ByteBuffer* out) const { if(bl){ this->elseStmt->toBinary(out); } + + positionToBinary(out); } void IfStatement::fromBinary(ByteBuffer* in) { @@ -211,6 +215,8 @@ void IfStatement::fromBinary(ByteBuffer* in) { checkIsStatement(element); this->elseStmt = dynamic_cast(element); } + + positionFromBinary(in); } void IfStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/ReturnStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/ReturnStatement.cpp index bd309ca..5170e5e 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/ReturnStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/ReturnStatement.cpp @@ -51,6 +51,8 @@ int alinous::ReturnStatement::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -59,12 +61,16 @@ void alinous::ReturnStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_RETURN); this->exp->toBinary(out); + + positionToBinary(out); } void alinous::ReturnStatement::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void ReturnStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_ctrl/WhileStatement.cpp b/src_smartcontract/lang/sc_statement_ctrl/WhileStatement.cpp index c159a24..6ed756f 100644 --- a/src_smartcontract/lang/sc_statement_ctrl/WhileStatement.cpp +++ b/src_smartcontract/lang/sc_statement_ctrl/WhileStatement.cpp @@ -87,6 +87,8 @@ int WhileStatement::binarySize() const { total += this->exp->binarySize(); total += this->stmt->binarySize(); + total += positionBinarySize(); + return total; } @@ -97,6 +99,8 @@ void WhileStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_WHILE); this->exp->toBinary(out); this->stmt->toBinary(out); + + positionToBinary(out); } void WhileStatement::fromBinary(ByteBuffer* in) { @@ -107,6 +111,8 @@ void WhileStatement::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsStatement(element); this->stmt = dynamic_cast(element); + + positionFromBinary(in); } void WhileStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp b/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp index 3b4714b..c373c0d 100644 --- a/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/CatchStatement.cpp @@ -138,6 +138,8 @@ int CatchStatement::binarySize() const { total += this->variableDeclare->binarySize(); total += this->block->binarySize(); + total += positionBinarySize(); + return total; } @@ -149,6 +151,8 @@ void CatchStatement::toBinary(ByteBuffer* out) const { this->variableDeclare->toBinary(out); this->block->toBinary(out); + + positionToBinary(out); } void CatchStatement::fromBinary(ByteBuffer* in) { @@ -161,6 +165,8 @@ void CatchStatement::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::STMT_BLOCK); this->block = dynamic_cast(element); + + positionFromBinary(in); } void CatchStatement::setBlock(StatementBlock* block) noexcept { diff --git a/src_smartcontract/lang/sc_statement_exception/FinallyStatement.cpp b/src_smartcontract/lang/sc_statement_exception/FinallyStatement.cpp index 036e90b..b0a2b94 100644 --- a/src_smartcontract/lang/sc_statement_exception/FinallyStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/FinallyStatement.cpp @@ -52,6 +52,8 @@ int FinallyStatement::binarySize() const { total += this->block->binarySize(); + total += positionBinarySize(); + return total; } @@ -61,6 +63,8 @@ void FinallyStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_FINALLY); this->block->toBinary(out); + + positionToBinary(out); } void FinallyStatement::fromBinary(ByteBuffer* in) { @@ -68,6 +72,8 @@ void FinallyStatement::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::STMT_BLOCK); this->block = dynamic_cast(element); + + positionFromBinary(in); } void FinallyStatement::setBlock(StatementBlock* block) noexcept { diff --git a/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp b/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp index 4b78c45..6a733f7 100644 --- a/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/ThrowStatement.cpp @@ -113,6 +113,8 @@ int ThrowStatement::binarySize() const { total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -122,6 +124,8 @@ void ThrowStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::STMT_THROW); this->exp->toBinary(out); + + positionToBinary(out); } void ThrowStatement::fromBinary(ByteBuffer* in) { @@ -129,6 +133,8 @@ void ThrowStatement::fromBinary(ByteBuffer* in) { checkIsExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void ThrowStatement::setExpression(AbstractExpression* exp) noexcept { diff --git a/src_smartcontract/lang/sc_statement_exception/TryStatement.cpp b/src_smartcontract/lang/sc_statement_exception/TryStatement.cpp index 3deb3f5..ed3c782 100644 --- a/src_smartcontract/lang/sc_statement_exception/TryStatement.cpp +++ b/src_smartcontract/lang/sc_statement_exception/TryStatement.cpp @@ -149,6 +149,8 @@ int TryStatement::binarySize() const { total += this->finallyStmt->binarySize(); } + total += positionBinarySize(); + return total; } @@ -172,6 +174,8 @@ void TryStatement::toBinary(ByteBuffer* out) const { if(bl){ this->finallyStmt->toBinary(out); } + + positionToBinary(out); } void TryStatement::fromBinary(ByteBuffer* in) { @@ -196,6 +200,8 @@ void TryStatement::fromBinary(ByteBuffer* in) { this->finallyStmt = dynamic_cast(element); } + + positionFromBinary(in); } void TryStatement::setBlock(StatementBlock* block) noexcept { diff --git a/src_smartcontract/lang_sql/sql_ddl/AlterTableStatement.cpp b/src_smartcontract/lang_sql/sql_ddl/AlterTableStatement.cpp index f654a38..54a1687 100644 --- a/src_smartcontract/lang_sql/sql_ddl/AlterTableStatement.cpp +++ b/src_smartcontract/lang_sql/sql_ddl/AlterTableStatement.cpp @@ -75,6 +75,8 @@ int AlterTableStatement::binarySize() const { total += this->tableId->binarySize(); total += this->cmd->binarySize(); + total += positionBinarySize(); + return total; } @@ -86,6 +88,8 @@ void AlterTableStatement::toBinary(ByteBuffer* out) const { this->tableId->toBinary(out); this->cmd->toBinary(out); + + positionToBinary(out); } void AlterTableStatement::fromBinary(ByteBuffer* in) { @@ -97,6 +101,7 @@ void AlterTableStatement::fromBinary(ByteBuffer* in) { checkIsAlterCommand(element); this->cmd =dynamic_cast(element); + positionFromBinary(in); } void AlterTableStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl/ColumnTypeDescriptor.cpp b/src_smartcontract/lang_sql/sql_ddl/ColumnTypeDescriptor.cpp index e50865e..41c0d68 100644 --- a/src_smartcontract/lang_sql/sql_ddl/ColumnTypeDescriptor.cpp +++ b/src_smartcontract/lang_sql/sql_ddl/ColumnTypeDescriptor.cpp @@ -49,6 +49,8 @@ int ColumnTypeDescriptor::binarySize() const { total += this->length->binarySize(); } + total += positionBinarySize(); + return total; } @@ -65,6 +67,8 @@ void ColumnTypeDescriptor::toBinary(ByteBuffer* out) const { if(bl){ this->length->toBinary(out); } + + positionToBinary(out); } void ColumnTypeDescriptor::fromBinary(ByteBuffer* in) { @@ -77,6 +81,8 @@ void ColumnTypeDescriptor::fromBinary(ByteBuffer* in) { this->length = dynamic_cast(element); } + + positionFromBinary(in); } void ColumnTypeDescriptor::analyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_ddl/CreateTableStatement.cpp b/src_smartcontract/lang_sql/sql_ddl/CreateTableStatement.cpp index 3bd30d1..1fda78a 100644 --- a/src_smartcontract/lang_sql/sql_ddl/CreateTableStatement.cpp +++ b/src_smartcontract/lang_sql/sql_ddl/CreateTableStatement.cpp @@ -238,6 +238,8 @@ int CreateTableStatement::binarySize() const { total += stringSize(key); } + total += positionBinarySize(); + return total; } @@ -261,6 +263,8 @@ void CreateTableStatement::toBinary(ByteBuffer* out) const { UnicodeString* key = this->primaryKeys->get(i); putString(out, key); } + + positionToBinary(out); } void CreateTableStatement::fromBinary(ByteBuffer* in) { @@ -279,6 +283,8 @@ void CreateTableStatement::fromBinary(ByteBuffer* in) { UnicodeString* key = getString(in); this->primaryKeys->addElement(key); } + + positionFromBinary(in); } void CreateTableStatement::addColumn(DdlColumnDescriptor* col) noexcept { diff --git a/src_smartcontract/lang_sql/sql_ddl/DdlColumnDescriptor.cpp b/src_smartcontract/lang_sql/sql_ddl/DdlColumnDescriptor.cpp index d811a06..280d584 100644 --- a/src_smartcontract/lang_sql/sql_ddl/DdlColumnDescriptor.cpp +++ b/src_smartcontract/lang_sql/sql_ddl/DdlColumnDescriptor.cpp @@ -45,6 +45,8 @@ int DdlColumnDescriptor::binarySize() const { total += this->defaultValue->binarySize(); } + total += positionBinarySize(); + return total; } @@ -65,6 +67,8 @@ void DdlColumnDescriptor::toBinary(ByteBuffer* out) const { if(bl){ this->defaultValue->toBinary(out); } + + positionToBinary(out); } void DdlColumnDescriptor::fromBinary(ByteBuffer* in) { @@ -88,6 +92,7 @@ void DdlColumnDescriptor::fromBinary(ByteBuffer* in) { this->defaultValue = dynamic_cast(element); } + positionFromBinary(in); } void DdlColumnDescriptor::analyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_ddl/DropTableStatement.cpp b/src_smartcontract/lang_sql/sql_ddl/DropTableStatement.cpp index c4d6a6a..6b38e61 100644 --- a/src_smartcontract/lang_sql/sql_ddl/DropTableStatement.cpp +++ b/src_smartcontract/lang_sql/sql_ddl/DropTableStatement.cpp @@ -57,6 +57,8 @@ int DropTableStatement::binarySize() const { int total = sizeof(uint16_t); total += this->tableId->binarySize(); + total += positionBinarySize(); + return total; } @@ -65,12 +67,16 @@ void DropTableStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_DROP_TABLE); this->tableId->toBinary(out); + + positionToBinary(out); } void DropTableStatement::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkKind(element, CodeElement::SQL_EXP_TABLE_ID); this->tableId = dynamic_cast(element); + + positionFromBinary(in); } void DropTableStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddColumnCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddColumnCommand.cpp index 793b626..fd7eb2d 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddColumnCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddColumnCommand.cpp @@ -53,6 +53,8 @@ int AlterAddColumnCommand::binarySize() const { int total = sizeof(uint16_t); total += this->columnDescriptor->binarySize(); + total += positionBinarySize(); + return total; } @@ -61,6 +63,8 @@ void AlterAddColumnCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_ADD_COLUMN); this->columnDescriptor->toBinary(out); + + positionToBinary(out); } void AlterAddColumnCommand::fromBinary(ByteBuffer* in) { @@ -68,6 +72,8 @@ void AlterAddColumnCommand::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::DDL_COLMUN_DESC); this->columnDescriptor = dynamic_cast(element); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterAddColumnCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddIndexCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddIndexCommand.cpp index f3c3640..48f1b7e 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddIndexCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter/AlterAddIndexCommand.cpp @@ -81,6 +81,8 @@ int AlterAddIndexCommand::binarySize() const { total += stringSize(col); } + total += positionBinarySize(); + return total; } @@ -98,6 +100,8 @@ void AlterAddIndexCommand::toBinary(ByteBuffer* out) const { UnicodeString* col = this->list.get(i); putString(out, col); } + + positionToBinary(out); } void AlterAddIndexCommand::fromBinary(ByteBuffer* in) { @@ -111,6 +115,8 @@ void AlterAddIndexCommand::fromBinary(ByteBuffer* in) { UnicodeString* col = getString(in); addColumn(col); } + + positionFromBinary(in); } AbstractAlterCommandLog* AlterAddIndexCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropColumnCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropColumnCommand.cpp index 11f33ee..6d56bd5 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropColumnCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropColumnCommand.cpp @@ -50,6 +50,8 @@ int AlterDropColumnCommand::binarySize() const { int total = sizeof(uint16_t); total += stringSize(this->name); + total += positionBinarySize(); + return total; } @@ -58,10 +60,14 @@ void AlterDropColumnCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_DROP_COLUMN); putString(out, this->name); + + positionToBinary(out); } void AlterDropColumnCommand::fromBinary(ByteBuffer* in) { this->name = getString(in); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterDropColumnCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropIndexCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropIndexCommand.cpp index 2e8bfeb..5ccd9e4 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropIndexCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter/AlterDropIndexCommand.cpp @@ -52,6 +52,8 @@ int AlterDropIndexCommand::binarySize() const { int total = sizeof(uint16_t); total += stringSize(this->name); + total += positionBinarySize(); + return total; } @@ -60,10 +62,14 @@ void AlterDropIndexCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_DROP_INDEX); putString(out, this->name); + + positionToBinary(out); } void AlterDropIndexCommand::fromBinary(ByteBuffer* in) { this->name = getString(in); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterDropIndexCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterAddPrimaryKeyCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterAddPrimaryKeyCommand.cpp index 307d523..bbddf06 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterAddPrimaryKeyCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterAddPrimaryKeyCommand.cpp @@ -58,6 +58,8 @@ int AlterAddPrimaryKeyCommand::binarySize() const { total += stringSize(col); } + total += positionBinarySize(); + return total; } @@ -71,6 +73,8 @@ void AlterAddPrimaryKeyCommand::toBinary(ByteBuffer* out) const { UnicodeString* col = this->list.get(i); putString(out, col); } + + positionToBinary(out); } void AlterAddPrimaryKeyCommand::fromBinary(ByteBuffer* in) { @@ -79,6 +83,8 @@ void AlterAddPrimaryKeyCommand::fromBinary(ByteBuffer* in) { UnicodeString* col = getString(in); addColumn(col); } + + positionFromBinary(in); } AbstractAlterCommandLog* AlterAddPrimaryKeyCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterDropPrimaryKeyCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterDropPrimaryKeyCommand.cpp index d25029a..9138ad6 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterDropPrimaryKeyCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterDropPrimaryKeyCommand.cpp @@ -38,14 +38,19 @@ AlterDropPrimaryKeyCommand::~AlterDropPrimaryKeyCommand() { int AlterDropPrimaryKeyCommand::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void AlterDropPrimaryKeyCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_DROP_PRIMARY_KEY); + + positionToBinary(out); } void AlterDropPrimaryKeyCommand::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } AbstractAlterCommandLog* AlterDropPrimaryKeyCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterModifyCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterModifyCommand.cpp index 55a72dd..7926c39 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterModifyCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterModifyCommand.cpp @@ -59,6 +59,8 @@ int AlterModifyCommand::binarySize() const { total += this->columnDescriptor->binarySize(); + total += positionBinarySize(); + return total; } @@ -67,6 +69,8 @@ void AlterModifyCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_MODIFY); this->columnDescriptor->toBinary(out); + + positionToBinary(out); } void AlterModifyCommand::fromBinary(ByteBuffer* in) { @@ -74,6 +78,8 @@ void AlterModifyCommand::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::DDL_COLMUN_DESC); this->columnDescriptor = dynamic_cast(element); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterModifyCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameColumnCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameColumnCommand.cpp index 5378287..292c895 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameColumnCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameColumnCommand.cpp @@ -56,6 +56,8 @@ int AlterRenameColumnCommand::binarySize() const { total += stringSize(this->lastName); total += stringSize(this->newName); + total += positionBinarySize(); + return total; } @@ -66,11 +68,15 @@ void AlterRenameColumnCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_RENAME_COLUMN); putString(out, this->lastName); putString(out, this->newName); + + positionToBinary(out); } void AlterRenameColumnCommand::fromBinary(ByteBuffer* in) { this->lastName = getString(in); this->newName = getString(in); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterRenameColumnCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameTableCommand.cpp b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameTableCommand.cpp index d2e62e0..0777ef0 100644 --- a/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameTableCommand.cpp +++ b/src_smartcontract/lang_sql/sql_ddl_alter_modify/AlterRenameTableCommand.cpp @@ -47,6 +47,8 @@ int AlterRenameTableCommand::binarySize() const { int total = sizeof(uint16_t); total += this->newName->binarySize(); + total += positionBinarySize(); + return total; } @@ -55,6 +57,8 @@ void AlterRenameTableCommand::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DDL_ALTER_RENAME_TABLE); this->newName->toBinary(out); + + positionToBinary(out); } void AlterRenameTableCommand::fromBinary(ByteBuffer* in) { @@ -62,6 +66,8 @@ void AlterRenameTableCommand::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_EXP_TABLE_ID); this->newName = dynamic_cast(element); + + positionFromBinary(in); } AbstractAlterCommandLog* AlterRenameTableCommand::getCommandLog(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/BeginStatement.cpp b/src_smartcontract/lang_sql/sql_dml/BeginStatement.cpp index 6a7c622..7647194 100644 --- a/src_smartcontract/lang_sql/sql_dml/BeginStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/BeginStatement.cpp @@ -35,14 +35,19 @@ void BeginStatement::analyze(AnalyzeContext* actx) { int BeginStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void BeginStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DML_STMT_BEGIN); + + positionToBinary(out); } void BeginStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void BeginStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/CommitStatement.cpp b/src_smartcontract/lang_sql/sql_dml/CommitStatement.cpp index 59b5951..16a460b 100644 --- a/src_smartcontract/lang_sql/sql_dml/CommitStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/CommitStatement.cpp @@ -36,14 +36,19 @@ void CommitStatement::analyze(AnalyzeContext* actx) { int CommitStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void CommitStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DML_STMT_COMMIT); + + positionToBinary(out); } void CommitStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void CommitStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/DeleteStatement.cpp b/src_smartcontract/lang_sql/sql_dml/DeleteStatement.cpp index 25914d6..3df0579 100644 --- a/src_smartcontract/lang_sql/sql_dml/DeleteStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/DeleteStatement.cpp @@ -117,6 +117,8 @@ int DeleteStatement::binarySize() const { total += this->where->binarySize(); } + total += positionBinarySize(); + return total; } @@ -130,6 +132,8 @@ void DeleteStatement::toBinary(ByteBuffer* out) const { if(this->where != nullptr){ this->where->toBinary(out); } + + positionToBinary(out); } void DeleteStatement::fromBinary(ByteBuffer* in) { @@ -143,6 +147,8 @@ void DeleteStatement::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_PART_WHERE); this->where = dynamic_cast(element); } + + positionFromBinary(in); } void DeleteStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/InsertStatement.cpp b/src_smartcontract/lang_sql/sql_dml/InsertStatement.cpp index 6722350..3e7d27e 100644 --- a/src_smartcontract/lang_sql/sql_dml/InsertStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/InsertStatement.cpp @@ -266,6 +266,8 @@ int InsertStatement::binarySize() const { total += this->expList->binarySize(); + total += positionBinarySize(); + return total; } @@ -282,6 +284,8 @@ void InsertStatement::toBinary(ByteBuffer* out) const { } this->expList->toBinary(out); + + positionToBinary(out); } void InsertStatement::fromBinary(ByteBuffer* in) { @@ -299,6 +303,8 @@ void InsertStatement::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkKind(element, CodeElement::SQL_EXP_EXP_LIST); this->expList = dynamic_cast(element); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml/RollbackStatement.cpp b/src_smartcontract/lang_sql/sql_dml/RollbackStatement.cpp index 5705d75..f664bb3 100644 --- a/src_smartcontract/lang_sql/sql_dml/RollbackStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/RollbackStatement.cpp @@ -36,14 +36,19 @@ void RollbackStatement::analyze(AnalyzeContext* actx) { int RollbackStatement::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void RollbackStatement::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::DML_STMT_ROLLBACK); + + positionToBinary(out); } void RollbackStatement::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void RollbackStatement::interpret(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/SelectStatement.cpp b/src_smartcontract/lang_sql/sql_dml/SelectStatement.cpp index dbf2d6f..3be84d8 100644 --- a/src_smartcontract/lang_sql/sql_dml/SelectStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/SelectStatement.cpp @@ -202,6 +202,8 @@ int SelectStatement::binarySize() const { total += this->limitOffset->binarySize(); } + total += positionBinarySize(); + return total; } @@ -232,6 +234,8 @@ void SelectStatement::toBinary(ByteBuffer* out) const { if(this->limitOffset != nullptr){ this->limitOffset->toBinary(out); } + + positionToBinary(out); } void SelectStatement::fromBinary(ByteBuffer* in) { @@ -270,6 +274,8 @@ void SelectStatement::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_PART_LIMIT_OFFSET); this->limitOffset = dynamic_cast(element); } + + positionFromBinary(in); } void SelectStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml/UpdateStatement.cpp b/src_smartcontract/lang_sql/sql_dml/UpdateStatement.cpp index 224b715..6e150b7 100644 --- a/src_smartcontract/lang_sql/sql_dml/UpdateStatement.cpp +++ b/src_smartcontract/lang_sql/sql_dml/UpdateStatement.cpp @@ -146,6 +146,8 @@ int UpdateStatement::binarySize() const { total += this->where->binarySize(); } + total += positionBinarySize(); + return total; } @@ -161,6 +163,8 @@ void UpdateStatement::toBinary(ByteBuffer* out) const { if(this->where != nullptr){ this->where->toBinary(out); } + + positionToBinary(out); } void UpdateStatement::fromBinary(ByteBuffer* in) { @@ -178,6 +182,8 @@ void UpdateStatement::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_PART_WHERE); this->where = dynamic_cast(element); } + + positionFromBinary(in); } void UpdateStatement::init(VirtualMachine* vm) { diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLColumnsList.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLColumnsList.cpp index 85d751f..262e9e5 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLColumnsList.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLColumnsList.cpp @@ -69,6 +69,8 @@ int SQLColumnsList::binarySize() const { total += colId->binarySize(); } + total += positionBinarySize(); + return total; } @@ -86,6 +88,8 @@ void SQLColumnsList::toBinary(ByteBuffer* out) const { SQLColumnIdentifier* colId = this->list.get(i); colId->toBinary(out); } + + positionToBinary(out); } void SQLColumnsList::fromBinary(ByteBuffer* in) { @@ -97,6 +101,8 @@ void SQLColumnsList::fromBinary(ByteBuffer* in) { SQLColumnIdentifier* colId = dynamic_cast(element); this->list.addElement(colId); } + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLFrom.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLFrom.cpp index 2072f81..a96cf92 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLFrom.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLFrom.cpp @@ -33,6 +33,8 @@ int SQLFrom::binarySize() const { int total = sizeof(uint16_t); total += this->tableId->binarySize(); + total += positionBinarySize(); + return total; } @@ -41,12 +43,16 @@ void SQLFrom::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_PART_FROM); this->tableId->toBinary(out); + + positionToBinary(out); } void SQLFrom::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsJoinPart(element); this->tableId = dynamic_cast(element); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLGroupBy.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLGroupBy.cpp index 37975f5..a29c1b2 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLGroupBy.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLGroupBy.cpp @@ -117,6 +117,8 @@ int SQLGroupBy::binarySize() const { total += this->having->binarySize(); } + total += positionBinarySize(); + return total; } @@ -130,6 +132,8 @@ void SQLGroupBy::toBinary(ByteBuffer* out) const { if(this->having != nullptr){ this->having->toBinary(out); } + + positionToBinary(out); } void SQLGroupBy::fromBinary(ByteBuffer* in) { @@ -143,6 +147,8 @@ void SQLGroupBy::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_PART_HAVING); this->having = dynamic_cast(element); } + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLHaving.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLHaving.cpp index 278aefc..400e50b 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLHaving.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLHaving.cpp @@ -83,6 +83,8 @@ int SQLHaving::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -91,12 +93,16 @@ void SQLHaving::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_PART_HAVING); this->exp->toBinary(out); + + positionToBinary(out); } void SQLHaving::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsSQLExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLLimitOffset.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLLimitOffset.cpp index 5e2a5b2..8c26344 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLLimitOffset.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLLimitOffset.cpp @@ -41,6 +41,8 @@ int SQLLimitOffset::binarySize() const { total += this->offset->binarySize(); } + total += positionBinarySize(); + return total; } @@ -56,6 +58,8 @@ void SQLLimitOffset::toBinary(ByteBuffer* out) const { if(this->offset != nullptr){ this->offset->toBinary(out); } + + positionToBinary(out); } void SQLLimitOffset::fromBinary(ByteBuffer* in) { @@ -72,6 +76,8 @@ void SQLLimitOffset::fromBinary(ByteBuffer* in) { checkIsSQLExp(element); this->offset = dynamic_cast(element); } + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLOrderBy.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLOrderBy.cpp index 9a70c9f..1b8309f 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLOrderBy.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLOrderBy.cpp @@ -28,6 +28,8 @@ int SQLOrderBy::binarySize() const { int total = sizeof(uint16_t); total += this->list->binarySize(); + total += positionBinarySize(); + return total; } @@ -36,12 +38,16 @@ void SQLOrderBy::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_PART_ORDER_BY); this->list->toBinary(out); + + positionToBinary(out); } void SQLOrderBy::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkKind(element, CodeElement::SQL_PART_COLUMN_LIST); this->list = dynamic_cast(element); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTarget.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTarget.cpp index e8c4038..9880d37 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTarget.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTarget.cpp @@ -104,6 +104,8 @@ int SQLSelectTarget::binarySize() const { total += stringSize(this->asName); } + total += positionBinarySize(); + return total; } @@ -120,6 +122,8 @@ void SQLSelectTarget::toBinary(ByteBuffer* out) const { if(this->asName != nullptr){ putString(out, this->asName); } + + positionToBinary(out); } void SQLSelectTarget::fromBinary(ByteBuffer* in) { @@ -139,6 +143,8 @@ void SQLSelectTarget::fromBinary(ByteBuffer* in) { if(bl == 1){ this->asName = getString(in); } + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTargetList.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTargetList.cpp index 05e7e46..36cfff8 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTargetList.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLSelectTargetList.cpp @@ -42,6 +42,8 @@ int SQLSelectTargetList::binarySize() const { total += target->binarySize(); } + total += positionBinarySize(); + return total; } @@ -55,6 +57,8 @@ void SQLSelectTargetList::toBinary(ByteBuffer* out) const { SQLSelectTarget* target = this->list.get(i); target->toBinary(out); } + + positionToBinary(out); } void SQLSelectTargetList::fromBinary(ByteBuffer* in) { @@ -66,6 +70,8 @@ void SQLSelectTargetList::fromBinary(ByteBuffer* in) { this->list.addElement(target); } + + positionFromBinary(in); } void SQLSelectTargetList::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLSet.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLSet.cpp index a4ce364..8d6f407 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLSet.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLSet.cpp @@ -84,6 +84,8 @@ int SQLSet::binarySize() const { total += pair->binarySize(); } + total += positionBinarySize(); + return total; } @@ -97,6 +99,8 @@ void SQLSet::toBinary(ByteBuffer* out) const { SQLSetPair* pair = this->list.get(i); pair->toBinary(out); } + + positionToBinary(out); } void SQLSet::fromBinary(ByteBuffer* in) { @@ -108,6 +112,8 @@ void SQLSet::fromBinary(ByteBuffer* in) { this->list.addElement(pair); } + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLSetPair.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLSetPair.cpp index eb9049a..2ff1b8f 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLSetPair.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLSetPair.cpp @@ -52,6 +52,8 @@ int SQLSetPair::binarySize() const { total += this->colId->binarySize(); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -62,6 +64,8 @@ void SQLSetPair::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_PART_SET_PAIR); this->colId->toBinary(out); this->exp->toBinary(out); + + positionToBinary(out); } void SQLSetPair::fromBinary(ByteBuffer* in) { @@ -72,6 +76,8 @@ void SQLSetPair::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsSQLExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void SQLSetPair::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_dml_parts/SQLWhere.cpp b/src_smartcontract/lang_sql/sql_dml_parts/SQLWhere.cpp index ae59b14..c3d4ea2 100644 --- a/src_smartcontract/lang_sql/sql_dml_parts/SQLWhere.cpp +++ b/src_smartcontract/lang_sql/sql_dml_parts/SQLWhere.cpp @@ -79,6 +79,8 @@ int SQLWhere::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -87,12 +89,16 @@ void SQLWhere::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_PART_WHERE); this->exp->toBinary(out); + + positionToBinary(out); } void SQLWhere::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsSQLExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } } /* namespace alinous */ diff --git a/src_smartcontract/lang_sql/sql_expression/AbstractSQLBinaryExpression.cpp b/src_smartcontract/lang_sql/sql_expression/AbstractSQLBinaryExpression.cpp index 067c9a6..1439b38 100644 --- a/src_smartcontract/lang_sql/sql_expression/AbstractSQLBinaryExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/AbstractSQLBinaryExpression.cpp @@ -31,6 +31,8 @@ int AbstractSQLBinaryExpression::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -43,6 +45,7 @@ void AbstractSQLBinaryExpression::toBinary(ByteBuffer* out) const { exp->toBinary(out); } + positionToBinary(out); } void AbstractSQLBinaryExpression::fromBinary(ByteBuffer* in) { @@ -53,6 +56,8 @@ void AbstractSQLBinaryExpression::fromBinary(ByteBuffer* in) { AbstractSQLExpression* exp = dynamic_cast(element); this->operands.addElement(exp); } + + positionFromBinary(in); } diff --git a/src_smartcontract/lang_sql/sql_expression/SQLBetweenExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLBetweenExpression.cpp index 83ae375..209926f 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLBetweenExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLBetweenExpression.cpp @@ -61,6 +61,8 @@ int SQLBetweenExpression::binarySize() const { total += this->start->binarySize(); total += this->end->binarySize(); + total += positionBinarySize(); + return total; } @@ -73,6 +75,8 @@ void SQLBetweenExpression::toBinary(ByteBuffer* out) const { this->left->toBinary(out); this->start->toBinary(out); this->end->toBinary(out); + + positionToBinary(out); } void SQLBetweenExpression::fromBinary(ByteBuffer* in) { @@ -87,6 +91,8 @@ void SQLBetweenExpression::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkIsSQLExp(element); this->end = dynamic_cast(element); + + positionFromBinary(in); } void SQLBetweenExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLBooleanLiteral.cpp b/src_smartcontract/lang_sql/sql_expression/SQLBooleanLiteral.cpp index dad3268..6113d96 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLBooleanLiteral.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLBooleanLiteral.cpp @@ -38,17 +38,23 @@ int SQLBooleanLiteral::binarySize() const { int total = sizeof(uint16_t); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } void SQLBooleanLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_BOOL_LITERAL); out->put(this->value ? 1 : 0); + + positionToBinary(out); } void SQLBooleanLiteral::fromBinary(ByteBuffer* in) { uint8_t bl = in->get(); this->value = (bl == 1); + + positionFromBinary(in); } void SQLBooleanLiteral::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLColumnIdentifier.cpp b/src_smartcontract/lang_sql/sql_expression/SQLColumnIdentifier.cpp index c51e5f3..9c2e033 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLColumnIdentifier.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLColumnIdentifier.cpp @@ -71,6 +71,8 @@ int SQLColumnIdentifier::binarySize() const { total += stringSize(this->columnName); + total += positionBinarySize(); + return total; } @@ -90,6 +92,8 @@ void SQLColumnIdentifier::toBinary(ByteBuffer* out) const { } putString(out, this->columnName); + + positionToBinary(out); } void SQLColumnIdentifier::fromBinary(ByteBuffer* in) { @@ -102,6 +106,8 @@ void SQLColumnIdentifier::fromBinary(ByteBuffer* in) { this->tableName = getString(in); } this->columnName = getString(in); + + positionFromBinary(in); } void SQLColumnIdentifier::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLDistinctArgument.cpp b/src_smartcontract/lang_sql/sql_expression/SQLDistinctArgument.cpp index 47bc4c8..20b54b6 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLDistinctArgument.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLDistinctArgument.cpp @@ -42,6 +42,8 @@ int SQLDistinctArgument::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -50,6 +52,8 @@ void SQLDistinctArgument::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_DISTINCT_ARGUMENT); this->exp->toBinary(out); + + positionToBinary(out); } void SQLDistinctArgument::fromBinary(ByteBuffer* in) { @@ -57,6 +61,8 @@ void SQLDistinctArgument::fromBinary(ByteBuffer* in) { checkIsSQLExp(el); this->exp = dynamic_cast(el); + + positionFromBinary(in); } void SQLDistinctArgument::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLEqualityExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLEqualityExpression.cpp index a8a0289..7e15990 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLEqualityExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLEqualityExpression.cpp @@ -62,6 +62,8 @@ int SQLEqualityExpression::binarySize() const { total += this->right->binarySize(); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -73,6 +75,8 @@ void SQLEqualityExpression::toBinary(ByteBuffer* out) const { this->left->toBinary(out); this->right->toBinary(out); out->put(this->op); + + positionToBinary(out); } void SQLEqualityExpression::fromBinary(ByteBuffer* in) { @@ -85,6 +89,8 @@ void SQLEqualityExpression::fromBinary(ByteBuffer* in) { this->right = dynamic_cast(element); this->op = in->get(); + + positionFromBinary(in); } void SQLEqualityExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLExpressionList.cpp b/src_smartcontract/lang_sql/sql_expression/SQLExpressionList.cpp index 9160318..1a38a1f 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLExpressionList.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLExpressionList.cpp @@ -51,6 +51,8 @@ int SQLExpressionList::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -64,6 +66,8 @@ void SQLExpressionList::toBinary(ByteBuffer* out) const { AbstractSQLExpression* exp = this->list.get(i); exp->toBinary(out); } + + positionToBinary(out); } void SQLExpressionList::fromBinary(ByteBuffer* in) { @@ -75,6 +79,8 @@ void SQLExpressionList::fromBinary(ByteBuffer* in) { this->list.addElement(exp); } + + positionFromBinary(in); } void SQLExpressionList::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLFunctionCall.cpp b/src_smartcontract/lang_sql/sql_expression/SQLFunctionCall.cpp index 1302ba5..2e9308d 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLFunctionCall.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLFunctionCall.cpp @@ -66,6 +66,8 @@ int SQLFunctionCall::binarySize() const { total += exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -82,6 +84,8 @@ void SQLFunctionCall::toBinary(ByteBuffer* out) const { AbstractSQLExpression* exp = this->arguments.get(i); exp->toBinary(out); } + + positionToBinary(out); } void SQLFunctionCall::fromBinary(ByteBuffer* in) { @@ -97,6 +101,8 @@ void SQLFunctionCall::fromBinary(ByteBuffer* in) { this->arguments.addElement(exp); } + + positionFromBinary(in); } void SQLFunctionCall::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLInExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLInExpression.cpp index b67c11c..caf3a2a 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLInExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLInExpression.cpp @@ -54,6 +54,8 @@ int SQLInExpression::binarySize() const { total += this->left->binarySize(); total += this->list->binarySize(); + total += positionBinarySize(); + return total; } @@ -64,6 +66,8 @@ void SQLInExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_IN); this->left->toBinary(out); this->list->toBinary(out); + + positionToBinary(out); } void SQLInExpression::fromBinary(ByteBuffer* in) { @@ -74,6 +78,8 @@ void SQLInExpression::fromBinary(ByteBuffer* in) { element = createFromBinary(in); checkKind(element, CodeElement::SQL_EXP_EXP_LIST); this->list = dynamic_cast(element); + + positionFromBinary(in); } void SQLInExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLIsNullExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLIsNullExpression.cpp index df58e9b..852c548 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLIsNullExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLIsNullExpression.cpp @@ -51,6 +51,8 @@ int SQLIsNullExpression::binarySize() const { total += this->exp->binarySize(); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -60,6 +62,8 @@ void SQLIsNullExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_IS_NULL); this->exp->toBinary(out); out->put(this->notnull ? 1 : 0); + + positionToBinary(out); } void SQLIsNullExpression::fromBinary(ByteBuffer* in) { @@ -69,6 +73,8 @@ void SQLIsNullExpression::fromBinary(ByteBuffer* in) { int8_t bl = in->get(); this->notnull = (bl == 1); + + positionFromBinary(in); } void SQLIsNullExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLLikeExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLLikeExpression.cpp index 4865553..fd182f4 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLLikeExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLLikeExpression.cpp @@ -63,6 +63,8 @@ int SQLLikeExpression::binarySize() const { total += this->escape->binarySize(); } + total += positionBinarySize(); + return total; } @@ -78,6 +80,8 @@ void SQLLikeExpression::toBinary(ByteBuffer* out) const { if(this->escape != nullptr){ this->escape->toBinary(out); } + + positionToBinary(out); } void SQLLikeExpression::fromBinary(ByteBuffer* in) { @@ -95,6 +99,8 @@ void SQLLikeExpression::fromBinary(ByteBuffer* in) { checkKind(element, CodeElement::SQL_EXP_LITERAL); this->escape = dynamic_cast(element); } + + positionFromBinary(in); } void SQLLikeExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLLiteral.cpp b/src_smartcontract/lang_sql/sql_expression/SQLLiteral.cpp index c2587e3..7d4f74e 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLLiteral.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLLiteral.cpp @@ -58,6 +58,8 @@ int SQLLiteral::binarySize() const { total += stringSize(this->value); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -67,11 +69,15 @@ void SQLLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_LITERAL); putString(out, this->value); out->put(this->type); + + positionToBinary(out); } void SQLLiteral::fromBinary(ByteBuffer* in) { this->value = getString(in); this->type = in->get(); + + positionFromBinary(in); } void SQLLiteral::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLNotExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLNotExpression.cpp index 70224f3..4f87f31 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLNotExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLNotExpression.cpp @@ -51,6 +51,8 @@ int SQLNotExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -59,12 +61,16 @@ void SQLNotExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_NOT); this->exp->toBinary(out); + + positionToBinary(out); } void SQLNotExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsSQLExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void SQLNotExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLNullLiteral.cpp b/src_smartcontract/lang_sql/sql_expression/SQLNullLiteral.cpp index c7d77c6..2f6c54a 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLNullLiteral.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLNullLiteral.cpp @@ -34,14 +34,19 @@ SQLNullLiteral::~SQLNullLiteral() { int SQLNullLiteral::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void SQLNullLiteral::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_NULL_LITERAL); + + positionToBinary(out); } void SQLNullLiteral::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void SQLNullLiteral::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLParenthesisExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLParenthesisExpression.cpp index 392d86c..85ee065 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLParenthesisExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLParenthesisExpression.cpp @@ -46,6 +46,8 @@ int SQLParenthesisExpression::binarySize() const { int total = sizeof(uint16_t); total += this->exp->binarySize(); + total += positionBinarySize(); + return total; } @@ -54,12 +56,16 @@ void SQLParenthesisExpression::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_PARENTHESIS); this->exp->toBinary(out); + + positionToBinary(out); } void SQLParenthesisExpression::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsSQLExp(element); this->exp = dynamic_cast(element); + + positionFromBinary(in); } void SQLParenthesisExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLPlaceHolder.cpp b/src_smartcontract/lang_sql/sql_expression/SQLPlaceHolder.cpp index 8055303..5f88940 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLPlaceHolder.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLPlaceHolder.cpp @@ -55,6 +55,8 @@ int SQLPlaceHolder::binarySize() const { total += this->available->binarySize(); } + total += positionBinarySize(); + return total; } @@ -71,6 +73,7 @@ void SQLPlaceHolder::toBinary(ByteBuffer* out) const { this->available->toBinary(out); } + positionToBinary(out); } void SQLPlaceHolder::fromBinary(ByteBuffer* in) { @@ -84,6 +87,8 @@ void SQLPlaceHolder::fromBinary(ByteBuffer* in) { checkIsExp(element); this->available = dynamic_cast(element); } + + positionFromBinary(in); } void SQLPlaceHolder::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLRelationalExpression.cpp b/src_smartcontract/lang_sql/sql_expression/SQLRelationalExpression.cpp index fa3189c..567407d 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLRelationalExpression.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLRelationalExpression.cpp @@ -59,6 +59,8 @@ int SQLRelationalExpression::binarySize() const { total += this->right->binarySize(); total += sizeof(uint8_t); + total += positionBinarySize(); + return total; } @@ -70,6 +72,8 @@ void SQLRelationalExpression::toBinary(ByteBuffer* out) const { this->left->toBinary(out); this->right->toBinary(out); out->put(this->op); + + positionToBinary(out); } void SQLRelationalExpression::fromBinary(ByteBuffer* in) { @@ -82,6 +86,8 @@ void SQLRelationalExpression::fromBinary(ByteBuffer* in) { this->right = dynamic_cast(element); this->op = in->get(); + + positionFromBinary(in); } void SQLRelationalExpression::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_expression/SQLWildCard.cpp b/src_smartcontract/lang_sql/sql_expression/SQLWildCard.cpp index 530b36e..9cd88fa 100644 --- a/src_smartcontract/lang_sql/sql_expression/SQLWildCard.cpp +++ b/src_smartcontract/lang_sql/sql_expression/SQLWildCard.cpp @@ -36,14 +36,19 @@ SQLWildCard::~SQLWildCard() { int SQLWildCard::binarySize() const { int total = sizeof(uint16_t); + total += positionBinarySize(); + return total; } void SQLWildCard::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_WILDCARD); + + positionToBinary(out); } void SQLWildCard::fromBinary(ByteBuffer* in) { + positionFromBinary(in); } void SQLWildCard::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_join_parts/ParenthesisJoinPart.cpp b/src_smartcontract/lang_sql/sql_join_parts/ParenthesisJoinPart.cpp index d111a97..4a199a7 100644 --- a/src_smartcontract/lang_sql/sql_join_parts/ParenthesisJoinPart.cpp +++ b/src_smartcontract/lang_sql/sql_join_parts/ParenthesisJoinPart.cpp @@ -37,6 +37,8 @@ int ParenthesisJoinPart::binarySize() const { int total = sizeof(uint16_t); total += this->part->binarySize(); + total += positionBinarySize(); + return total; } @@ -45,12 +47,16 @@ void ParenthesisJoinPart::toBinary(ByteBuffer* out) const { out->putShort(CodeElement::SQL_EXP_PARENTHESIS_JOIN_PART); this->part->toBinary(out); + + positionToBinary(out); } void ParenthesisJoinPart::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); checkIsJoinPart(element); this->part = dynamic_cast(element); + + positionFromBinary(in); } void ParenthesisJoinPart::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_join_parts/SQLJoin.cpp b/src_smartcontract/lang_sql/sql_join_parts/SQLJoin.cpp index 9f357a2..5b6f917 100644 --- a/src_smartcontract/lang_sql/sql_join_parts/SQLJoin.cpp +++ b/src_smartcontract/lang_sql/sql_join_parts/SQLJoin.cpp @@ -59,6 +59,8 @@ int SQLJoin::binarySize() const { total += part->binarySize(); } + total += positionBinarySize(); + return total; } @@ -75,6 +77,8 @@ void SQLJoin::toBinary(ByteBuffer* out) const { SQLJoinPart* part = this->list.get(i); part->toBinary(out); } + + positionToBinary(out); } void SQLJoin::fromBinary(ByteBuffer* in) { @@ -90,6 +94,8 @@ void SQLJoin::fromBinary(ByteBuffer* in) { this->list.addElement(part); } + + positionFromBinary(in); } void SQLJoin::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_join_parts/SQLJoinPart.cpp b/src_smartcontract/lang_sql/sql_join_parts/SQLJoinPart.cpp index e2a82fc..9af0627 100644 --- a/src_smartcontract/lang_sql/sql_join_parts/SQLJoinPart.cpp +++ b/src_smartcontract/lang_sql/sql_join_parts/SQLJoinPart.cpp @@ -46,6 +46,8 @@ int SQLJoinPart::binarySize() const { total += this->exp->binarySize(); } + total += positionBinarySize(); + return total; } @@ -60,6 +62,8 @@ void SQLJoinPart::toBinary(ByteBuffer* out) const { if(this->exp != nullptr){ this->exp->toBinary(out); } + + positionToBinary(out); } void SQLJoinPart::fromBinary(ByteBuffer* in) { @@ -75,6 +79,8 @@ void SQLJoinPart::fromBinary(ByteBuffer* in) { checkIsSQLExp(element); this->exp = dynamic_cast(element); } + + positionFromBinary(in); } void SQLJoinPart::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_join_parts/TableIdentifier.cpp b/src_smartcontract/lang_sql/sql_join_parts/TableIdentifier.cpp index 2cb08f1..252dec0 100644 --- a/src_smartcontract/lang_sql/sql_join_parts/TableIdentifier.cpp +++ b/src_smartcontract/lang_sql/sql_join_parts/TableIdentifier.cpp @@ -67,6 +67,8 @@ int TableIdentifier::binarySize() const { total += stringSize(this->alias); } + total += positionBinarySize(); + return total; } @@ -85,6 +87,8 @@ void TableIdentifier::toBinary(ByteBuffer* out) const { if(this->alias != nullptr){ putString(out, this->alias); } + + positionToBinary(out); } void TableIdentifier::fromBinary(ByteBuffer* in) { @@ -99,6 +103,8 @@ void TableIdentifier::fromBinary(ByteBuffer* in) { if(bl == 1){ this->alias = getString(in); } + + positionFromBinary(in); } void TableIdentifier::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract/lang_sql/sql_join_parts/TableList.cpp b/src_smartcontract/lang_sql/sql_join_parts/TableList.cpp index 792a4b9..d085e82 100644 --- a/src_smartcontract/lang_sql/sql_join_parts/TableList.cpp +++ b/src_smartcontract/lang_sql/sql_join_parts/TableList.cpp @@ -40,6 +40,8 @@ int TableList::binarySize() const { total += tableId->binarySize(); } + total += positionBinarySize(); + return total; } @@ -53,6 +55,8 @@ void TableList::toBinary(ByteBuffer* out) const { AbstractJoinPart* tableId = this->list.get(i); tableId->toBinary(out); } + + positionToBinary(out); } void TableList::fromBinary(ByteBuffer* in) { @@ -64,6 +68,8 @@ void TableList::fromBinary(ByteBuffer* in) { this->list.addElement(tableId); } + + positionFromBinary(in); } void TableList::preAnalyze(AnalyzeContext* actx) { diff --git a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h index dea265a..3887c80 100644 --- a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h +++ b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h @@ -34,6 +34,17 @@ class AbstractDependencyConfig { void setModuleName(const UnicodeString* name) noexcept; void setVersion(const ModularSmartcontractVersion* v) noexcept; + const UnicodeString* getModuleName() const noexcept { + return this->moduleName; + } + const ModularSmartcontractVersion* getVersion() const noexcept { + return this->version; + } + + bool isLocal() const noexcept { + return true; + } + private: UnicodeString* moduleName; ModularSmartcontractVersion* version; diff --git a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp index 2073972..e471f22 100644 --- a/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp +++ b/src_smartcontract_modular/modular_project/AbstractSmartcontractModule.cpp @@ -113,7 +113,10 @@ void AbstractSmartcontractModule::analyzeJsonObject(const JsonObject *object) { } void AbstractSmartcontractModule::setupInstance(AbstractExecutableModuleInstance *inst) const { - inst->setProjectRelativePath(this->projectRelativePath); + { + inst->setProjectRelativePath(this->projectRelativePath); + } + int maxLoop = this->sourceFolders->size(); for(int i = 0; i != maxLoop; ++i){ diff --git a/src_smartcontract_modular/modular_project/DependencyConfig.h b/src_smartcontract_modular/modular_project/DependencyConfig.h index 4de5640..06ac1c9 100644 --- a/src_smartcontract_modular/modular_project/DependencyConfig.h +++ b/src_smartcontract_modular/modular_project/DependencyConfig.h @@ -29,6 +29,10 @@ class DependencyConfig { void load(const JsonArrayObject* dependencies); + ArrayList* getList() const noexcept { + return this->list; + } + private: ArrayList* list; diff --git a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp index 9e0ca4c..68fc740 100644 --- a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp +++ b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.cpp @@ -58,6 +58,9 @@ void LibrarySmartcontractModule::load(const File *modulePath) { JsonStringValue* strValue = dynamic_cast(pair->getValue()); ExceptionThrower::throwExceptionIfCondition(strValue == nullptr, L"The libraryName must be String.", __FILE__, __LINE__); + + const UnicodeString* libname = strValue->getValue(); + setLibraryName(libname); } // exportClasses diff --git a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h index 39c62aa..f4206a2 100644 --- a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h +++ b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h @@ -59,7 +59,9 @@ class ModularInstanceConfig { void fromBinary(ByteBuffer* in); static ModularInstanceConfig* createFromBinary(ByteBuffer* in); - + ArrayList* getLibExport() const noexcept { + return this->libExport; + } private: void loadMainPackageAndClass(const JsonObject* instance); diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp index 2aee662..84fde07 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp @@ -92,6 +92,8 @@ void ModularSmartcontractProject::loadLibrary(const File* libraryPath, const Uni UnicodeString projectRelativePath(MODULE_DIR_NAME); projectRelativePath.append(L"/"); + projectRelativePath.append(libname); + projectRelativePath.append(L"/"); LibrarySmartcontractModule* libMod = new LibrarySmartcontractModule(&projectRelativePath); __STP(libMod); libMod->load(libPath); diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index 69a30a2..11a1c97 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -5,9 +5,11 @@ * Author: iizuka */ #include "smartcontract_instance/AbstractExecutableModuleInstance.h" +#include "smartcontract_instance/InstanceDependencyHandler.h" #include "modular_project/ModularInstanceConfig.h" #include "modular_project/DependencyConfig.h" +#include "modular_project/ModularConfigException.h" #include "base/UnicodeString.h" #include "base/StackRelease.h" @@ -23,9 +25,12 @@ #include "bc/SoftwareVersion.h" #include "engine/sc/SmartContract.h" +#include "engine/sc/CompilationUnit.h" #include "engine/compiler/CompileError.h" +#include "engine/sc_analyze/AnalyzeContext.h" + #include "vm/VirtualMachine.h" #include "json_object/AbstractJsonValue.h" @@ -34,6 +39,10 @@ #include "instance/instance_gc/GcManager.h" +#include "smartcontract_instance/ModuleInstanceClassLoader.h" + +#include "lang/sc_declare/ClassDeclare.h" + namespace codablecash { @@ -46,10 +55,10 @@ AbstractExecutableModuleInstance::AbstractExecutableModuleInstance() { this->instanceConfig = nullptr; this->dependencyConfig = nullptr; - this->contract = nullptr; this->vm = nullptr; this->compile_errors = nullptr; this->mainInst = nullptr; + this->dependencyHandler = new InstanceDependencyHandler(); } AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { @@ -66,9 +75,8 @@ AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { vm->destroy(); delete this->vm; - this->contract = nullptr; - this->mainInst = nullptr; + delete this->dependencyHandler; } void AbstractExecutableModuleInstance::setName(const UnicodeString *name) noexcept { @@ -107,12 +115,12 @@ void AbstractExecutableModuleInstance::setDependencyConfig(const DependencyConfi } void AbstractExecutableModuleInstance::resetContract() { - delete this->contract; - this->contract = new SmartContract(); - delete this->vm; this->vm = new VirtualMachine(1024*1024); + SmartContract* contract = new SmartContract(); + this->vm->loadSmartContract(contract); + this->compile_errors = nullptr; } @@ -125,18 +133,20 @@ void AbstractExecutableModuleInstance::parseSourceFolders(const File *projectBas int maxLoop = this->sourceFolders->size(); for(int i = 0; i != maxLoop; ++i){ const UnicodeString* folder = this->sourceFolders->get(i); - scanSourceFolder(baseDir, folder); + + scanSourceFolder(baseDir, folder, projectBaseDir); } } -void AbstractExecutableModuleInstance::scanSourceFolder(File *baseDir, const UnicodeString *folder) { +void AbstractExecutableModuleInstance::scanSourceFolder(File *baseDir, const UnicodeString *folder, const File *projectBaseDir) { File* dir = baseDir->get(folder); __STP(dir); - scanFiles(dir); + scanFiles(dir, projectBaseDir); - this->compile_errors = this->contract->getCompileErrors(); + SmartContract* contract = this->vm->getSmartContract(); + this->compile_errors = contract->getCompileErrors(); } -void AbstractExecutableModuleInstance::scanFiles(File *folder) { +void AbstractExecutableModuleInstance::scanFiles(File *folder, const File *projectBaseDir) { ArrayList* filesList = folder->list(); __STP(filesList); filesList->setDeleteOnExit(); @@ -146,35 +156,40 @@ void AbstractExecutableModuleInstance::scanFiles(File *folder) { File* f = folder->get(path); __STP(f); if(f->isDirectory()){ - scanFiles(f); + scanFiles(f, projectBaseDir); } else{ - addCompilantUnit(f, folder); + addCompilantUnit(f, folder, projectBaseDir); } } } -void AbstractExecutableModuleInstance::addCompilantUnit(File *file, File *base) { +void AbstractExecutableModuleInstance::addCompilantUnit(File *file, File *base, const File *projectBaseDir) { int length = file->length(); FileInputStream stream(file); - this->contract->addCompilationUnit(&stream, length, base, file); + SmartContract* contract = this->vm->getSmartContract(); + CompilationUnit* unit = contract->addCompilationUnit(&stream, length, base, file); + + const UnicodeString* projectPath = projectBaseDir->getAbsolutePath(); __STP(projectPath); + const UnicodeString* filePath = file->getAbsolutePath(); __STP(filePath); + + UnicodeString* path = filePath->substring(projectPath->length()); __STP(path); + + unit->setProjectRelativePath(path); } bool AbstractExecutableModuleInstance::hasCompileError() const noexcept { return !this->compile_errors->isEmpty(); } -bool AbstractExecutableModuleInstance::analyze() { - this->vm->analyze(); - return !this->vm->hasError(); -} void AbstractExecutableModuleInstance::setMainInstance() { const UnicodeString* mainPackage = this->instanceConfig->getMainPackage(); const UnicodeString* mainClass = this->instanceConfig->getMainClass(); const UnicodeString* initializerMethod = this->instanceConfig->getInitializerMethod(); - this->contract->setMainMethod(mainPackage, mainClass, initializerMethod); + SmartContract* contract = this->vm->getSmartContract(); + contract->setMainMethod(mainPackage, mainClass, initializerMethod); } bool AbstractExecutableModuleInstance::createMainInstance() { @@ -207,14 +222,133 @@ bool AbstractExecutableModuleInstance::interpretInitializer() { } void AbstractExecutableModuleInstance::resetRootReference() { - this->mainInst = nullptr; + SmartContract* contract = this->vm->getSmartContract(); + + if(contract->isInitialized()){ + this->mainInst = nullptr; + + contract->clearRootReference(this->vm); + + GcManager* gc = this->vm->getGc(); + gc->garbageCollect(); + + assert(gc->isEmpty()); + } +} + +bool AbstractExecutableModuleInstance::initBeforeAnalyze() { + SmartContract* contract = this->vm->getSmartContract(); + contract->initBeforeAnalyze(this->vm); + + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::preAnalyze() { + SmartContract* contract = this->vm->getSmartContract(); + contract->preAnalyze(this->vm); + + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} - this->contract->clearRootReference(this->vm); +bool AbstractExecutableModuleInstance::preAnalyzeGenerics() { + SmartContract* contract = this->vm->getSmartContract(); + contract->preAnalyzeGenerics(this->vm); - GcManager* gc = this->vm->getGc(); - gc->garbageCollect(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::analyzeType() { + SmartContract* contract = this->vm->getSmartContract(); + contract->analyzeType(this->vm); + + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} + + +bool AbstractExecutableModuleInstance::analyzeMetadata() { + SmartContract* contract = this->vm->getSmartContract(); + contract->analyzeMetadata(this->vm); + + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} - assert(gc->isEmpty()); +bool AbstractExecutableModuleInstance::analyzeFinal() { + SmartContract* contract = this->vm->getSmartContract(); + contract->analyzeFinal(this->vm); + + AnalyzeContext* actx = contract->getAnalyzeContext(); + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::loadDependency(ModularSmartcontractInstance* parent) { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + if(this->dependencyConfig != nullptr){ + ArrayList* list = this->dependencyConfig->getList(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractDependencyConfig* config = list->get(i); + + this->dependencyHandler->registerDependentInstance(config, parent, actx); + } + } + + + + this->dependencyHandler->importExportedClasses(actx); + + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::preAnalyzeDependency() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + this->dependencyHandler->preAnalyze(actx); + // FIXME analyzeTypeDependency() + + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::analyzeTypeDependency() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + this->dependencyHandler->analyzeType(actx); + + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::analyzeDependency() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + this->dependencyHandler->analyze(actx); + + return actx->hasError(); +} + +void AbstractExecutableModuleInstance::loadLibExportInterfaceUnits(ModuleInstanceClassLoader* clazzloader) { + SmartContract* contract = this->vm->getSmartContract(); + + ArrayList* liblist = this->instanceConfig->getLibExport(); + int maxLoop = liblist->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* fqn = liblist->get(i); + + // load class + clazzloader->loadClass(fqn); + + const ClassDeclare* dec = clazzloader->getClassDeclare(fqn); + ExceptionThrower::throwExceptionIfCondition(dec == nullptr, L"Module does not exists.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(!dec->isInterface(), L"libExport must be an interface, not a class.", __FILE__, __LINE__); + } } } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index a6cc1bc..719c53e 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -15,6 +15,7 @@ class SmartContract; class VirtualMachine; class CompileError; class VmClassInstance; +class CompilationUnit; } using namespace alinous; @@ -25,7 +26,9 @@ namespace codablecash { class SoftwareVersion; class ModularInstanceConfig; class DependencyConfig; - +class InstanceDependencyHandler; +class ModularSmartcontractInstance; +class ModuleInstanceClassLoader; class AbstractExecutableModuleInstance { public: @@ -42,20 +45,37 @@ class AbstractExecutableModuleInstance { virtual void loadCompilantUnits(const File* projectBaseDir) = 0; bool hasCompileError() const noexcept; - bool analyze(); void setMainInstance(); bool createMainInstance(); bool interpretInitializer(); void resetRootReference(); + bool initBeforeAnalyze(); + bool preAnalyze(); + bool preAnalyzeGenerics(); + bool analyzeType(); + bool analyzeMetadata(); + bool analyzeFinal(); + + bool loadDependency(ModularSmartcontractInstance* parent); + bool preAnalyzeDependency(); + bool analyzeTypeDependency(); + bool analyzeDependency(); + + void loadLibExportInterfaceUnits(ModuleInstanceClassLoader* clazzloader); + + VirtualMachine* getVM() const noexcept { + return this->vm; + } + protected: void resetContract(); void parseSourceFolders(const File *projectBaseDir); - void scanSourceFolder(File* baseDir, const UnicodeString* folder); + void scanSourceFolder(File* baseDir, const UnicodeString* folder, const File *projectBaseDir); - void scanFiles(File* folder); - void addCompilantUnit(File* file, File* base); + void scanFiles(File* folder, const File *projectBaseDir); + void addCompilantUnit(File* file, File* base, const File *projectBaseDir); protected: UnicodeString* name; @@ -68,12 +88,14 @@ class AbstractExecutableModuleInstance { DependencyConfig* dependencyConfig; protected: - SmartContract* contract; + // SmartContract* contract; VirtualMachine* vm; VmClassInstance* mainInst; const ArrayList* compile_errors; + + InstanceDependencyHandler* dependencyHandler; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt index 02b5840..37537ba 100644 --- a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt @@ -3,8 +3,11 @@ set(__src AbstractExecutableModuleInstance.cpp ExecutableModuleInstance.cpp + InstanceDependencyContext.cpp + InstanceDependencyHandler.cpp LibraryExectableModuleInstance.cpp ModularSmartcontractInstance.cpp + ModuleInstanceClassLoader.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_instance) diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp index 84c267c..6aae0ed 100644 --- a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp @@ -31,9 +31,6 @@ ExecutableModuleInstance::~ExecutableModuleInstance() { void ExecutableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { resetContract(); parseSourceFolders(projectBaseDir); - - this->vm->loadSmartContract(this->contract); - } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp new file mode 100644 index 0000000..1a62ca4 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp @@ -0,0 +1,38 @@ +/* + * InstanceDependencyContext.cpp + * + * Created on: Nov 21, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/InstanceDependencyContext.h" +#include "smartcontract_instance/ModuleInstanceClassLoader.h" + +#include "vm/VirtualMachine.h" + + +namespace codablecash { + +InstanceDependencyContext::InstanceDependencyContext() { + this->moduleInstance = nullptr; + this->uintsList = nullptr; + this->clazzLoader = new ModuleInstanceClassLoader(); +} + +InstanceDependencyContext::~InstanceDependencyContext() { + delete this->clazzLoader; +} + +void InstanceDependencyContext::setModuleInstance(AbstractExecutableModuleInstance *inst) noexcept { + this->moduleInstance = inst; +} + +void InstanceDependencyContext::setUnitsList(ArrayList *unitsList) noexcept { + this->uintsList = unitsList; +} + +void InstanceDependencyContext::setVm(VirtualMachine *vm) { + this->clazzLoader->setVm(vm); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h new file mode 100644 index 0000000..38f5dcc --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h @@ -0,0 +1,49 @@ +/* + * InstanceDependencyContext.h + * + * Created on: Nov 21, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYCONTEXT_H_ +#define SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYCONTEXT_H_ + +#include "base/ArrayList.h" + +namespace alinous { +class CompilationUnit; +class VirtualMachine; +} +using namespace alinous; + +namespace codablecash { + +class AbstractExecutableModuleInstance; +class ModuleInstanceClassLoader; + +class InstanceDependencyContext { +public: + InstanceDependencyContext(); + virtual ~InstanceDependencyContext(); + + void setModuleInstance(AbstractExecutableModuleInstance* inst) noexcept; + void setUnitsList(ArrayList* unitsList) noexcept; + + AbstractExecutableModuleInstance* getModuleInstance() const noexcept { + return this->moduleInstance; + } + + void setVm(VirtualMachine* vm); + ModuleInstanceClassLoader* getClassLoader() const noexcept { + return this->clazzLoader; + } + +private: + AbstractExecutableModuleInstance* moduleInstance; + ArrayList* uintsList; + ModuleInstanceClassLoader* clazzLoader; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYCONTEXT_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp new file mode 100644 index 0000000..4dd0c09 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp @@ -0,0 +1,117 @@ +/* + * InstanceDependencyHandler.cpp + * + * Created on: Nov 21, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/InstanceDependencyHandler.h" +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" +#include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "smartcontract_instance/LibraryExectableModuleInstance.h" +#include "smartcontract_instance/InstanceDependencyContext.h" +#include "smartcontract_instance/ModuleInstanceClassLoader.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "modular_project/AbstractDependencyConfig.h" +#include "modular_project/ModularSmartcontractVersion.h" +#include "modular_project/ModularConfigException.h" + +#include "engine/sc_analyze/AnalyzeContext.h" + +#include "bc/ExceptionThrower.h" + + +namespace codablecash { + +InstanceDependencyHandler::InstanceDependencyHandler() { + this->map = new HashMap(); +} + +InstanceDependencyHandler::~InstanceDependencyHandler() { + Iterator* it = this->map->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* name = it->next(); + InstanceDependencyContext* ctx = this->map->get(name); + + delete ctx; + } + + delete this->map; +} + +void InstanceDependencyHandler::registerDependentInstance(AbstractDependencyConfig *config, ModularSmartcontractInstance *parent, AnalyzeContext* actx) { + const UnicodeString* name = config->getModuleName(); + const ModularSmartcontractVersion* version = config->getVersion(); + bool local = config->isLocal(); + + if(local){ + InstanceDependencyContext* context = new InstanceDependencyContext(); + + LibraryExectableModuleInstance* inst = parent->getLibraryModuleInstance(name); + ExceptionThrower::throwExceptionIfCondition(inst == nullptr, L"Module does not exists.", __FILE__, __LINE__); + context->setModuleInstance(inst); + + VirtualMachine* vm = inst->getVM(); + context->setVm(vm); + + this->map->put(name, context); + } +} + +void InstanceDependencyHandler::importExportedClasses(AnalyzeContext *actx) { + Iterator* it = this->map->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + InstanceDependencyContext* context = this->map->get(key); + AbstractExecutableModuleInstance* inst = context->getModuleInstance(); + + ModuleInstanceClassLoader* loader = context->getClassLoader(); + + // "instance" -> "libExport" + inst->loadLibExportInterfaceUnits(loader); + + // if library instance, load "exportClasses" + LibraryExectableModuleInstance* libInst = dynamic_cast(inst); + if(libInst != nullptr){ + libInst->loadExportClasses(loader); + } + } +} + +void InstanceDependencyHandler::preAnalyze(AnalyzeContext *actx) { + Iterator* it = this->map->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + InstanceDependencyContext* context = this->map->get(key); + + ModuleInstanceClassLoader* loader = context->getClassLoader(); + loader->preAnalyze(actx); + } +} + +void InstanceDependencyHandler::analyzeType(AnalyzeContext *actx) { + Iterator* it = this->map->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + InstanceDependencyContext* context = this->map->get(key); + + ModuleInstanceClassLoader* loader = context->getClassLoader(); + loader->analyzeType(actx); + } +} + +void InstanceDependencyHandler::analyze(AnalyzeContext *actx) { + Iterator* it = this->map->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + InstanceDependencyContext* context = this->map->get(key); + + ModuleInstanceClassLoader* loader = context->getClassLoader(); + loader->analyze(actx); + } +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h new file mode 100644 index 0000000..f77e365 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h @@ -0,0 +1,46 @@ +/* + * InstanceDependencyHandler.h + * + * Created on: Nov 21, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYHANDLER_H_ +#define SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYHANDLER_H_ + +#include "base/HashMap.h" + +namespace alinous { +class UnicodeString; +class AnalyzeContext; +} +using namespace alinous; + + +namespace codablecash { + +class AbstractExecutableModuleInstance; +class AbstractDependencyConfig; +class InstanceDependencyContext; +class ModularSmartcontractInstance; + +class InstanceDependencyHandler { +public: + InstanceDependencyHandler(); + virtual ~InstanceDependencyHandler(); + + void registerDependentInstance(AbstractDependencyConfig* config, ModularSmartcontractInstance* parent, AnalyzeContext* actx); + void importExportedClasses(AnalyzeContext* actx); + + void preAnalyze(AnalyzeContext* actx); + void analyzeType(AnalyzeContext* actx); + void analyze(AnalyzeContext* actx); + +private: + HashMap* map; + +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_INSTANCEDEPENDENCYHANDLER_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp index f679b3a..2220c87 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp @@ -6,11 +6,13 @@ */ #include "smartcontract_instance/LibraryExectableModuleInstance.h" +#include "smartcontract_instance/ModuleInstanceClassLoader.h" #include "base/UnicodeString.h" #include "vm/VirtualMachine.h" + namespace codablecash { LibraryExectableModuleInstance::LibraryExectableModuleInstance() @@ -38,8 +40,17 @@ void LibraryExectableModuleInstance::addExportClass(const UnicodeString *clazz) void LibraryExectableModuleInstance::loadCompilantUnits(const File *projectBaseDir) { resetContract(); parseSourceFolders(projectBaseDir); +} + +void LibraryExectableModuleInstance::loadExportClasses(ModuleInstanceClassLoader *loader) { + SmartContract* contract = this->vm->getSmartContract(); + + int maxLoop = this->exportClasses->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* fqn = this->exportClasses->get(i); - this->vm->loadSmartContract(this->contract); + loader->loadClass(fqn); + } } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h index 27c36cd..cb1eb5a 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h @@ -31,6 +31,8 @@ class LibraryExectableModuleInstance : public AbstractExecutableModuleInstance { virtual void loadCompilantUnits(const File* projectBaseDir); + void loadExportClasses(ModuleInstanceClassLoader* loader); + private: UnicodeString* libraryName; ArrayList* exportClasses; diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index fdd8db2..48b1ec5 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -13,7 +13,10 @@ #include "base/StackRelease.h" #include "base/UnicodeString.h" +#include "base/Exception.h" +#include "base/exceptions.h" +#include "bc/ExceptionThrower.h" namespace codablecash { @@ -71,6 +74,11 @@ bool ModularSmartcontractInstance::libraryExists(const UnicodeString *name) cons return value != nullptr; } +LibraryExectableModuleInstance* ModularSmartcontractInstance::getLibraryModuleInstance(const UnicodeString *modName) const noexcept { + LibraryExectableModuleInstance* value = this->libraries->get(modName); + return value; +} + bool ModularSmartcontractInstance::hasCompileError() const noexcept { bool hasError = this->execModule->hasCompileError(); @@ -84,15 +92,153 @@ bool ModularSmartcontractInstance::hasCompileError() const noexcept { } bool ModularSmartcontractInstance::analyze() { - bool hasError = !this->execModule->analyze(); + bool hasError = false; + + try{ + initBeforeAnalyze(); + preAnalyze(); + preAnalyzeGenerics(); + loadDependency(); + preAnalyzeDependency(); + + analyzeType(); + analyzeTypeDependency(); + analyzeMetadata(); + analyzeFinal(); + analyzeDependency(); + } + catch(CompilantUnitAnalyzeException* e){ + delete e; + hasError = true; + } + + return hasError; +} + +void ModularSmartcontractInstance::initBeforeAnalyze() { + bool hasError = this->execModule->initBeforeAnalyze(); int maxLoop = this->libArray->size(); for(int i = 0; i != maxLoop; ++i){ LibraryExectableModuleInstance* inst = this->libArray->get(i); - hasError |= (!inst->analyze()); + hasError |= inst->initBeforeAnalyze(); } - return hasError; + ExceptionThrower::throwExceptionIfCondition(hasError, L"initBeforeAnalyze() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::preAnalyze() { + bool hasError = this->execModule->preAnalyze(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->preAnalyze(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"preAnalyze() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::preAnalyzeGenerics() { + bool hasError = this->execModule->preAnalyzeGenerics(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->preAnalyzeGenerics(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"preAnalyzeGenerics() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::analyzeType() { + bool hasError = this->execModule->analyzeType(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeType(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeType() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::analyzeMetadata() { + bool hasError = this->execModule->analyzeMetadata(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeMetadata(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeMetadata() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::analyzeFinal() { + bool hasError = this->execModule->analyzeFinal(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeFinal(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeFinal() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::loadDependency() { + bool hasError = false; + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->loadDependency(this); + } + + hasError = this->execModule->loadDependency(this); + + ExceptionThrower::throwExceptionIfCondition(hasError, L"loadDependency() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::preAnalyzeDependency() { + bool hasError = false; + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->preAnalyzeDependency(); + } + + hasError = this->execModule->preAnalyzeDependency(); + + ExceptionThrower::throwExceptionIfCondition(hasError, L"preAnalyzeDependency() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::analyzeTypeDependency() { + bool hasError = false; + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeTypeDependency(); + } + + hasError = this->execModule->analyzeTypeDependency(); + + ExceptionThrower::throwExceptionIfCondition(hasError, L"preAnalyzeDependency() failed.", __FILE__, __LINE__); +} + +void ModularSmartcontractInstance::analyzeDependency() { + bool hasError = this->execModule->analyzeDependency(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeDependency(); + } + + ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeDependency() failed.", __FILE__, __LINE__); } void ModularSmartcontractInstance::setMainInstance() { diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 888264b..0e021ee 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -13,6 +13,7 @@ namespace alinous { class File; +class VirtualMachine; } using namespace alinous; @@ -32,6 +33,7 @@ class ModularSmartcontractInstance { void addLibraryModuleInstance(const UnicodeString* name, LibraryExectableModuleInstance* inst); bool libraryExists(const UnicodeString* name) const noexcept; + LibraryExectableModuleInstance* getLibraryModuleInstance(const UnicodeString* modName) const noexcept; void loadCompilantUnits(const File* projectBaseDir); bool hasCompileError() const noexcept; @@ -43,6 +45,20 @@ class ModularSmartcontractInstance { void resetRootReference(); +private: + void initBeforeAnalyze(); + void preAnalyze(); + void preAnalyzeGenerics(); + void analyzeType(); + void analyzeMetadata(); + void analyzeFinal(); + + // dependency + void loadDependency(); + void preAnalyzeDependency(); + void analyzeTypeDependency(); + void analyzeDependency(); + private: ModularProjectConfig* config; @@ -50,7 +66,6 @@ class ModularSmartcontractInstance { HashMap* libraries; ArrayList* libArray; - }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp new file mode 100644 index 0000000..a270b08 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp @@ -0,0 +1,111 @@ +/* + * ModuleInstanceClassLoader.cpp + * + * Created on: Nov 22, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/ModuleInstanceClassLoader.h" + +#include "engine/sc/CompilationUnit.h" +#include "engine/sc/SmartContract.h" + +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/AnalyzeContext.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "vm/VirtualMachine.h" + +#include "lang/sc_declare/ClassDeclare.h" + +namespace codablecash { + +ModuleInstanceClassLoader::ModuleInstanceClassLoader() { + this->progs = new ArrayList(); + this->classFqnMap = new HashMap(); + this->filePathmap = new HashMap(); + this->vm = nullptr; +} + +ModuleInstanceClassLoader::~ModuleInstanceClassLoader() { + this->progs->deleteElements(); + delete this->progs; + + delete this->classFqnMap; + delete this->filePathmap; +} + +void ModuleInstanceClassLoader::setVm(VirtualMachine *vm) { + this->vm = vm; +} + +void ModuleInstanceClassLoader::loadClass(const UnicodeString *fqn) { + SmartContract* contarct = this->vm->getSmartContract(); + AnalyzeContext* actx = contarct->getAnalyzeContext(); + + const ClassDeclare* clazz = contarct->getClassDeclareByFqn(fqn); + if(!clazz->isReserved()){ + const CompilationUnit* unit = clazz->getCompilationUnit(); + + CompilationUnit* newUnit = unit->copy(); + addCompilationUnit(fqn, newUnit); + } +} + +void ModuleInstanceClassLoader::addCompilationUnit(const UnicodeString *fqn, CompilationUnit *unit) noexcept { + __STP(unit); + + bool addProg = false; + CompilationUnit* u = this->classFqnMap->get(fqn); + if(u == nullptr){ + this->classFqnMap->put(fqn, unit); + } + + const UnicodeString* path = unit->getProjectRelativePath(); + u = this->filePathmap->get(path); + if(u == nullptr){ + this->filePathmap->put(path, unit); + addProg = true; + } + + if(addProg){ + this->progs->addElement(__STP_MV(unit)); + } +} + +const ClassDeclare* ModuleInstanceClassLoader::getClassDeclare(const UnicodeString *fqn) const { + UnicodeString* className = TypeResolver::getClassName(fqn); __STP(className); + + CompilationUnit* unit = this->classFqnMap->get(fqn); + ClassDeclare* dec = unit->getClassDeclare(className); + + return dec; +} + +void ModuleInstanceClassLoader::preAnalyze(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->preAnalyze(actx); + } +} + +void ModuleInstanceClassLoader::analyzeType(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->analyzeType(actx); + } +} + +void ModuleInstanceClassLoader::analyze(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->analyze(actx); + } +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h new file mode 100644 index 0000000..ed48fe5 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h @@ -0,0 +1,52 @@ +/* + * ModuleInstanceClassLoader.h + * + * Created on: Nov 22, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_MODULEINSTANCECLASSLOADER_H_ +#define SMARTCONTRACT_INSTANCE_MODULEINSTANCECLASSLOADER_H_ + +#include "base/ArrayList.h" +#include "base/HashMap.h" + +namespace alinous { +class CompilationUnit; +class VirtualMachine; +class ClassDeclare; +class AnalyzeContext; +} +using namespace alinous; + + +namespace codablecash { + +class ModuleInstanceClassLoader { +public: + ModuleInstanceClassLoader(); + virtual ~ModuleInstanceClassLoader(); + + void setVm(VirtualMachine* vm); + + void loadClass(const UnicodeString* fqn); + const ClassDeclare* getClassDeclare(const UnicodeString* fqn) const; + + void preAnalyze(AnalyzeContext* actx); + void analyzeType(AnalyzeContext* actx); + void analyze(AnalyzeContext* actx); + +private: + void addCompilationUnit(const UnicodeString *fqn, CompilationUnit* unit) noexcept; + +private: + ArrayList* progs; + HashMap* classFqnMap; + HashMap* filePathmap; + + VirtualMachine* vm; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_MODULEINSTANCECLASSLOADER_H_ */ diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h index afc4e3b..54cdb0e 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h @@ -31,6 +31,10 @@ class AbstractReservedClassDeclare : public ClassDeclare { static AbstractReservedClassDeclare* createFromBinary(ByteBuffer* in); + virtual bool isReserved() const noexcept { + return true; + } + virtual void preAnalyze(AnalyzeContext* actx); virtual void analyzeTypeRef(AnalyzeContext* actx); virtual void analyze(AnalyzeContext* actx); diff --git a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h index 28a058a..a335bde 100644 --- a/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_generics/AbstractReservedGenericsClassDeclare.h @@ -23,6 +23,10 @@ class AbstractReservedGenericsClassDeclare : public GenericsClassDeclare { static AbstractReservedGenericsClassDeclare* createFromBinary(ByteBuffer* in); + virtual bool isReserved() const noexcept { + return true; + } + virtual uint16_t getGenericsClassType() const noexcept = 0; virtual int binarySize() const; diff --git a/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h index c06bb30..875fca8 100644 --- a/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h @@ -17,6 +17,10 @@ class ReservedGeneratedGenericsClassDeclare : public GenericsGeneratedClassDecla ReservedGeneratedGenericsClassDeclare(); virtual ~ReservedGeneratedGenericsClassDeclare(); + virtual bool isReserved() const noexcept { + return true; + } + virtual int binarySize() const; virtual void toBinary(ByteBuffer* out); virtual void fromBinary(ByteBuffer* in); diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index 5ffba57..c17fbe5 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -116,6 +116,8 @@ VirtualMachine::~VirtualMachine() { void VirtualMachine::loadSmartContract(SmartContract* sc) { this->sc = sc; + + delete this->stackManager; this->stackManager = new VmStackManager(); } diff --git a/src_test/smartcontract_modular/instance/resources/case01/project01/exec/config.json b/src_test/smartcontract_modular/instance/resources/case01/project01/exec/config.json index d67458b..4091915 100644 --- a/src_test/smartcontract_modular/instance/resources/case01/project01/exec/config.json +++ b/src_test/smartcontract_modular/instance/resources/case01/project01/exec/config.json @@ -9,7 +9,8 @@ "method" : "main", "args" : [] }, - "exportMethods" : [] + "libExport" : [], + "directAccess" : [] }, "dependencies": [] diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json new file mode 100644 index 0000000..0a8d506 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json @@ -0,0 +1,20 @@ +{ + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "sample", + "mainClass" : "Sample01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : [], + "directAccess" : [] + }, + + "dependencies": [ + {"name" : "module_01", "localloc": "mod01", "version" : "^1.0.0"} + ] +} + diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns new file mode 100644 index 0000000..debca82 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns @@ -0,0 +1,16 @@ +package sample; + + +class Sample01 { + public Sample01() { + this.count = 3 * 2; + stcount++; + } + + public int main(){ + + } + + private int count = 0; + public static int stcount = 10; +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/config.json b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/config.json new file mode 100644 index 0000000..fa02a1f --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/config.json @@ -0,0 +1,20 @@ +{ + "libraryName" : "module_01", + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "modsample", + "mainClass" : "Module01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : ["modsample.export.IExportMethods"], + "directAccess" : ["modsample.export.IDirectAccess"] + }, + + "exportClasses" : ["modsample.Result"], + + "dependencies": [] +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IDirectAccess.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IDirectAccess.alns new file mode 100644 index 0000000..ec4f07a --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IDirectAccess.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IDirectAccess { + +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IExportMethods.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IExportMethods.alns new file mode 100644 index 0000000..0982b39 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/IExportMethods.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IExportMethods { + +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Module01.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Module01.alns new file mode 100644 index 0000000..6b28532 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Module01.alns @@ -0,0 +1,23 @@ +package modsample; + +import modsample.export.IExportMethods; +import modsample.export.IDirectAccess; +import modsample.Result; + +class Module01 implements IExportMethods, IDirectAccess { + public Module01() { + this.count = 3 * 2; + } + + public int main(){ + this.res = new Result(); + } + + public void doubleup() { + int value = this.count * 2; + this.count = value; + } + + private int count = 0; + private Result res; +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Result.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Result.alns new file mode 100644 index 0000000..77b05d1 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/modules/mod01/src/Result.alns @@ -0,0 +1,9 @@ +package modsample; + +class Result { + public Result(){ + + } + + private int result = 0; +} diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/projectconfig.json b/src_test/smartcontract_modular/instance/resources/case02/project01/projectconfig.json new file mode 100644 index 0000000..d37fbf5 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/projectconfig.json @@ -0,0 +1,9 @@ +{ + "project" : "Sample01", + "executable" : "exec/", + + "libraries" : ["mod01"], + + "author": "Tomohiro Iizuka", + "license": "MIT" +} diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index e189cad..60069b0 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -41,7 +41,6 @@ TEST(TestModularInstanceGroup, case01){ bool res = inst->hasCompileError(); CHECK(res == false); - res = inst->analyze(); CHECK(res == false); @@ -51,7 +50,35 @@ TEST(TestModularInstanceGroup, case01){ inst->resetRootReference(); + inst->setMainInstance(); + res = inst->createMainInstance(); + CHECK(res == false); + + // FIXME TestModularInstanceGroup } +TEST(TestModularInstanceGroup, case02){ + const File* projectFolder = this->env->getProjectRoot(); + + ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case02/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + ModularSmartcontractInstance* inst = project.toInstance(); __STP(inst); + inst->loadCompilantUnits(baseDir); + + bool res = inst->hasCompileError(); + CHECK(res == false); + + res = inst->analyze(); + CHECK(res == false); + + inst->setMainInstance(); + res = inst->createMainInstance(); + CHECK(res == false); +} + From 79c53bd7b89f8a3f08f44f2c1b5bfbb0c6067c0c Mon Sep 17 00:00:00 2001 From: iizuka Date: Thu, 27 Nov 2025 21:02:53 +0800 Subject: [PATCH 06/11] Modular Smartcontract Registory --- src_blockchain/bc/SoftwareVersion.cpp | 20 +++ src_blockchain/bc/SoftwareVersion.h | 6 + src_smartcontract/engine/sc/CodeElement.cpp | 17 +++ src_smartcontract/engine/sc/CodeElement.h | 1 + src_smartcontract/engine/sc/SmartContract.cpp | 10 +- src_smartcontract/engine/sc/SmartContract.h | 5 +- .../lang/sc_declare/MethodDeclare.cpp | 6 - .../sc_statement/SubstitutionStatement.cpp | 7 +- src_smartcontract_modular/CMakeLists.txt | 1 + .../AbstractDependencyConfig.cpp | 43 +++++- .../AbstractDependencyConfig.h | 13 +- .../modular_project/CMakeLists.txt | 1 + .../modular_project/DependencyConfig.cpp | 41 ++++- .../modular_project/DependencyConfig.h | 8 + .../LibrarySmartcontractModule.h | 1 - .../LocalProjectModuleDependencyConfig.cpp | 24 ++- .../LocalProjectModuleDependencyConfig.h | 4 + .../modular_project/ModularProjectConfig.cpp | 2 +- .../ModularSmartcontractProject.cpp | 1 + .../ModularSmartcontractVersion.cpp | 23 ++- .../ModularSmartcontractVersion.h | 5 + .../SmartcontractProjectId.cpp | 57 +++++++ .../modular_project/SmartcontractProjectId.h | 31 ++++ .../modular_project_registory/CMakeLists.txt | 4 + .../ModularSmartcontractProjectRegistory.cpp | 75 +++++++++- .../ModularSmartcontractProjectRegistory.h | 31 +++- .../ProjectIdKey.cpp | 78 ++++++++++ .../modular_project_registory/ProjectIdKey.h | 42 ++++++ .../ProjectIdKeyFactory.cpp | 35 +++++ .../ProjectIdKeyFactory.h | 30 ++++ .../SmartcontractProjectData.cpp | 76 ++++++++++ .../SmartcontractProjectData.h | 46 ++++++ .../SmartcontractProjectDataFactory.cpp | 31 ++++ .../SmartcontractProjectDataFactory.h | 28 ++++ .../AbstractExecutableModuleInstance.cpp | 141 +++++++++++++++++- .../AbstractExecutableModuleInstance.h | 15 +- .../ExecutableModuleInstance.cpp | 2 +- .../LibraryExectableModuleInstance.cpp | 51 ++++++- .../LibraryExectableModuleInstance.h | 5 + .../ModularSmartcontractInstance.cpp | 105 +++++++++++++ .../ModularSmartcontractInstance.h | 12 ++ .../ModuleInstanceClassLoader.cpp | 2 +- src_test/smartcontract/test_class_fw.cpp | 16 ++ .../instance/test_modular_instance.cpp | 6 +- .../project/CMakeLists.txt | 1 + .../reg_case01/project01/exec/config.json | 20 +++ .../project01/exec/src/sample/Sample01.alns | 16 ++ .../project01/modules/mod01/config.json | 20 +++ .../modules/mod01/src/IDirectAccess.alns | 6 + .../modules/mod01/src/IExportMethods.alns | 6 + .../project01/modules/mod01/src/Module01.alns | 23 +++ .../project01/modules/mod01/src/Result.alns | 9 ++ .../reg_case01/project01/projectconfig.json | 9 ++ .../test_modular_project_registory.cpp | 102 +++++++++++++ 54 files changed, 1334 insertions(+), 36 deletions(-) create mode 100644 src_smartcontract_modular/modular_project/SmartcontractProjectId.cpp create mode 100644 src_smartcontract_modular/modular_project/SmartcontractProjectId.h create mode 100644 src_smartcontract_modular/modular_project_registory/ProjectIdKey.cpp create mode 100644 src_smartcontract_modular/modular_project_registory/ProjectIdKey.h create mode 100644 src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.cpp create mode 100644 src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.h create mode 100644 src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp create mode 100644 src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h create mode 100644 src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.cpp create mode 100644 src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.h create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/config.json create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/src/sample/Sample01.alns create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/config.json create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IDirectAccess.alns create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IExportMethods.alns create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Module01.alns create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Result.alns create mode 100644 src_test/smartcontract_modular/project/resources/reg_case01/project01/projectconfig.json create mode 100644 src_test/smartcontract_modular/project/test_modular_project_registory.cpp diff --git a/src_blockchain/bc/SoftwareVersion.cpp b/src_blockchain/bc/SoftwareVersion.cpp index 06db532..0a2f4dd 100644 --- a/src_blockchain/bc/SoftwareVersion.cpp +++ b/src_blockchain/bc/SoftwareVersion.cpp @@ -12,6 +12,8 @@ #include "base/StackRelease.h" #include "base/Integer.h" +#include "base_io/ByteBuffer.h" + namespace codablecash { @@ -82,4 +84,22 @@ SoftwareVersion* SoftwareVersion::parseString(const UnicodeString *str) { return new SoftwareVersion(major, minor, patch); } +int SoftwareVersion::binarySize() const { + return sizeof(uint8_t) * 3; +} + +void SoftwareVersion::toBinary(ByteBuffer *out) const { + out->put(this->major); + out->put(this->minor); + out->put(this->patch); +} + +SoftwareVersion* SoftwareVersion::createFromBinary(ByteBuffer *in) { + uint8_t major = in->get(); + uint8_t minor = in->get(); + uint8_t pathch = in->get(); + + return new SoftwareVersion(major, minor, pathch); +} + } /* namespace codablecash */ diff --git a/src_blockchain/bc/SoftwareVersion.h b/src_blockchain/bc/SoftwareVersion.h index 421eb15..2f51460 100644 --- a/src_blockchain/bc/SoftwareVersion.h +++ b/src_blockchain/bc/SoftwareVersion.h @@ -12,6 +12,7 @@ namespace alinous { class UnicodeString; +class ByteBuffer; } using namespace alinous; @@ -39,6 +40,11 @@ class SoftwareVersion { static SoftwareVersion* parseString(const UnicodeString* str); + // binary + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static SoftwareVersion* createFromBinary(ByteBuffer* in); + protected: int major; int minor; diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index bee03bc..725ef6a 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -728,6 +728,21 @@ void CodeElement::checkKind(CodeElement* element, short kind) { } } +void CodeElement::checkKind(CodeElement *element, short *kind, int length) { + bool result = false; + for(int i = 0; i != length; ++i){ + if(kind[i] == element->kind){ + result = true; + break; + } + } + + if(!result){ + delete element; + throw new MulformattedScBinaryException(__FILE__, __LINE__); + } +} + void CodeElement::checkIsType(CodeElement* element) { if(!(element->kind >= TYPE_BOOL && element->kind < STMT_BLOCK)){ delete element; @@ -876,4 +891,6 @@ void CodeElement::positionFromBinary(ByteBuffer *in) { this->endColumn = in->getInt(); } + + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/CodeElement.h b/src_smartcontract/engine/sc/CodeElement.h index ddfc58d..a85934b 100644 --- a/src_smartcontract/engine/sc/CodeElement.h +++ b/src_smartcontract/engine/sc/CodeElement.h @@ -211,6 +211,7 @@ class CodeElement { static void checkNotNull(void* ptr); static void checkKind(CodeElement* element, short kind); + static void checkKind(CodeElement* element, short* kind, int length); static void checkIsType(CodeElement* element); static void checkIsStatement(CodeElement* element); static void checkIsExp(CodeElement* element); diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index e001d0a..4050479 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -332,10 +332,18 @@ const ArrayList* SmartContract::getCompileErrors() const noexcept return &this->compileErrorList; } -CompilationUnit* SmartContract::getCompilationUnit(int pos) { +int SmartContract::getNumCompilationUnit() const noexcept { + return this->progs.size(); +} + +CompilationUnit* SmartContract::getCompilationUnit(int pos) const noexcept { return this->progs.get(pos); } +void SmartContract::addCompilationUnit(CompilationUnit *unit) { + this->progs.addElement(unit); +} + ReservedClassRegistory* SmartContract::getReservedClassRegistory() const noexcept { return this->reservedClassRegistory; } diff --git a/src_smartcontract/engine/sc/SmartContract.h b/src_smartcontract/engine/sc/SmartContract.h index d84d44d..33704e6 100644 --- a/src_smartcontract/engine/sc/SmartContract.h +++ b/src_smartcontract/engine/sc/SmartContract.h @@ -57,7 +57,10 @@ class SmartContract { const ArrayList* getCompileErrors() const noexcept; - CompilationUnit* getCompilationUnit(int pos); + int getNumCompilationUnit() const noexcept; + CompilationUnit* getCompilationUnit(int pos) const noexcept; + void addCompilationUnit(CompilationUnit* unit); + ReservedClassRegistory* getReservedClassRegistory() const noexcept; bool isInitialized() const noexcept { diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index 204763f..d1d190e 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -218,9 +218,6 @@ AnalyzedType* MethodDeclare::getReturnedType() const noexcept { int MethodDeclare::binarySize() const { checkNotNull(this->name); checkNotNull(this->ctrl); - if(!isConstructor()){ - checkNotNull(this->type); - } checkNotNull(this->args); int total = sizeof(uint16_t); @@ -248,9 +245,6 @@ int MethodDeclare::binarySize() const { void MethodDeclare::toBinary(ByteBuffer* out) const { checkNotNull(this->name); checkNotNull(this->ctrl); - if(!isConstructor()){ - checkNotNull(this->type); - } checkNotNull(this->args); out->putShort(CodeElement::METHOD_DECLARE); diff --git a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp index e8c9e23..0b9fd60 100644 --- a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp +++ b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp @@ -97,8 +97,11 @@ void SubstitutionStatement::toBinary(ByteBuffer* out) const { void SubstitutionStatement::fromBinary(ByteBuffer* in) { CodeElement* element = createFromBinary(in); - checkKind(element, CodeElement::EXP_VARIABLE_ID); - this->variable = dynamic_cast(element); + + short KINDS[2] = {CodeElement::EXP_MEMBER_REF, CodeElement::EXP_VARIABLE_ID}; + checkKind(element, KINDS, 2); + + this->variable = dynamic_cast(element); element = createFromBinary(in); checkIsExp(element); diff --git a/src_smartcontract_modular/CMakeLists.txt b/src_smartcontract_modular/CMakeLists.txt index e3d615a..ae425fd 100644 --- a/src_smartcontract_modular/CMakeLists.txt +++ b/src_smartcontract_modular/CMakeLists.txt @@ -3,6 +3,7 @@ set(__dirsrc "") # import source codes add_subdirectory(modular_project) +add_subdirectory(modular_project_registory) add_subdirectory(smartcontract_cache) add_subdirectory(smartcontract_executor) add_subdirectory(smartcontract_instance) diff --git a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp index ffbcc0d..64b8873 100644 --- a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp +++ b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.cpp @@ -8,6 +8,7 @@ #include "modular_project/AbstractDependencyConfig.h" #include "modular_project/ModularSmartcontractVersion.h" #include "modular_project/ModularConfigException.h" +#include "modular_project/LocalProjectModuleDependencyConfig.h" #include "base/UnicodeString.h" #include "base/StackRelease.h" @@ -18,16 +19,21 @@ #include "bc/ExceptionThrower.h" +#include "base_io/ByteBuffer.h" + +#include "bc_base/BinaryUtils.h" namespace codablecash { AbstractDependencyConfig::AbstractDependencyConfig(const AbstractDependencyConfig &inst) { + this->kind = inst.kind; this->moduleName = new UnicodeString(inst.moduleName); this->version = new ModularSmartcontractVersion(*inst.version); } -AbstractDependencyConfig::AbstractDependencyConfig() { +AbstractDependencyConfig::AbstractDependencyConfig(uint8_t kind) { + this->kind = kind; this->moduleName = nullptr; this->version = nullptr; } @@ -74,4 +80,39 @@ void AbstractDependencyConfig::setVersion(const ModularSmartcontractVersion *v) this->version = new ModularSmartcontractVersion(*v); } +int AbstractDependencyConfig::binarySize() const { + BinaryUtils::checkNotNull(this->moduleName); + BinaryUtils::checkNotNull(this->version); + + int total = sizeof(uint8_t); + total += BinaryUtils::stringSize(this->moduleName); + total += this->version->binarySize(); + + return total; +} + +void AbstractDependencyConfig::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->moduleName); + BinaryUtils::checkNotNull(this->version); + + out->put(this->kind); + BinaryUtils::putString(out, this->moduleName); + this->version->toBinary(out); +} + +void AbstractDependencyConfig::fromBinary(ByteBuffer *in) { + this->moduleName = BinaryUtils::getString(in); + this->version = ModularSmartcontractVersion::createFromBinary(in); +} + +AbstractDependencyConfig* AbstractDependencyConfig::createFromBinary(ByteBuffer *in) { + AbstractDependencyConfig* ret = nullptr; + + uint8_t kind = in->get(); + ret = new LocalProjectModuleDependencyConfig(); + + ret->fromBinary(in); + return ret; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h index 3887c80..1081c52 100644 --- a/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h +++ b/src_smartcontract_modular/modular_project/AbstractDependencyConfig.h @@ -7,9 +7,11 @@ #ifndef MODULAR_PROJECT_ABSTRACTDEPENDENCYCONFIG_H_ #define MODULAR_PROJECT_ABSTRACTDEPENDENCYCONFIG_H_ +#include namespace alinous { class UnicodeString; +class ByteBuffer; } using namespace alinous; @@ -23,8 +25,10 @@ class AbstractDependencyConfig { static constexpr const wchar_t* NAME = L"name"; static constexpr const wchar_t* VERSION = L"version"; + static constexpr const uint8_t TYPE_LOCAL_MODULE = 1; + AbstractDependencyConfig(const AbstractDependencyConfig& inst); - AbstractDependencyConfig(); + explicit AbstractDependencyConfig(uint8_t kind); virtual ~AbstractDependencyConfig(); virtual AbstractDependencyConfig* copy() const = 0; @@ -45,7 +49,14 @@ class AbstractDependencyConfig { return true; } + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + + static AbstractDependencyConfig* createFromBinary(ByteBuffer* in); + private: + uint8_t kind; UnicodeString* moduleName; ModularSmartcontractVersion* version; }; diff --git a/src_smartcontract_modular/modular_project/CMakeLists.txt b/src_smartcontract_modular/modular_project/CMakeLists.txt index e2a5568..60e3e3f 100644 --- a/src_smartcontract_modular/modular_project/CMakeLists.txt +++ b/src_smartcontract_modular/modular_project/CMakeLists.txt @@ -14,6 +14,7 @@ set(__src ModularSmartcontractProject.cpp ModularSmartcontractVersion.cpp ModularConfigException.cpp + SmartcontractProjectId.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular modular_project) diff --git a/src_smartcontract_modular/modular_project/DependencyConfig.cpp b/src_smartcontract_modular/modular_project/DependencyConfig.cpp index bf57bf1..5f3938b 100644 --- a/src_smartcontract_modular/modular_project/DependencyConfig.cpp +++ b/src_smartcontract_modular/modular_project/DependencyConfig.cpp @@ -8,6 +8,7 @@ #include "modular_project/DependencyConfig.h" #include "modular_project/AbstractDependencyConfig.h" #include "modular_project/ModularConfigException.h" +#include "modular_project/LocalProjectModuleDependencyConfig.h" #include "json_object/JsonArrayObject.h" #include "json_object/JsonValuePair.h" @@ -16,7 +17,10 @@ #include "bc/ExceptionThrower.h" -#include "modular_project/LocalProjectModuleDependencyConfig.h" +#include "base_io/ByteBuffer.h" + +#include "base/StackRelease.h" + namespace codablecash { @@ -55,4 +59,39 @@ void DependencyConfig::load(const JsonArrayObject *dependencies) { } } +int DependencyConfig::binarySize() const { + int total = 0; + + int maxLoop = this->list->size(); + total += sizeof(uint16_t); + for(int i = 0; i != maxLoop; ++i){ + AbstractDependencyConfig* conf = this->list->get(i); + total += conf->binarySize(); + } + + return total; +} + +void DependencyConfig::toBinary(ByteBuffer *out) const { + int maxLoop = this->list->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + AbstractDependencyConfig* conf = this->list->get(i); + conf->toBinary(out); + } +} + +DependencyConfig* DependencyConfig::createFromBinary(ByteBuffer *in) { + DependencyConfig* inst = new DependencyConfig(); __STP(inst); + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + AbstractDependencyConfig* conf = AbstractDependencyConfig::createFromBinary(in); + inst->list->addElement(conf); + } + + return __STP_MV(inst); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/DependencyConfig.h b/src_smartcontract_modular/modular_project/DependencyConfig.h index 06ac1c9..fd09299 100644 --- a/src_smartcontract_modular/modular_project/DependencyConfig.h +++ b/src_smartcontract_modular/modular_project/DependencyConfig.h @@ -10,6 +10,9 @@ #include "base/ArrayList.h" +namespace alinous { +class ByteBuffer; +} // namespace alinous using namespace alinous; @@ -33,6 +36,11 @@ class DependencyConfig { return this->list; } + // binary + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static DependencyConfig* createFromBinary(ByteBuffer* in); + private: ArrayList* list; diff --git a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h index 440fb05..394649d 100644 --- a/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h +++ b/src_smartcontract_modular/modular_project/LibrarySmartcontractModule.h @@ -24,7 +24,6 @@ class LibrarySmartcontractModule : public AbstractSmartcontractModule { void setLibraryName(const UnicodeString* str) noexcept; - virtual AbstractExecutableModuleInstance* toInstance() const; private: diff --git a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp index ed13ba7..46c80db 100644 --- a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp +++ b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.cpp @@ -14,6 +14,7 @@ #include "json_object/JsonValuePair.h" #include "json_object/JsonStringValue.h" +#include "bc_base/BinaryUtils.h" namespace codablecash { @@ -22,7 +23,7 @@ LocalProjectModuleDependencyConfig::LocalProjectModuleDependencyConfig(const Loc this->localloc = inst.localloc != nullptr ? new UnicodeString(inst.localloc) : nullptr; } -LocalProjectModuleDependencyConfig::LocalProjectModuleDependencyConfig() { +LocalProjectModuleDependencyConfig::LocalProjectModuleDependencyConfig() : AbstractDependencyConfig(TYPE_LOCAL_MODULE) { this->localloc = nullptr; } @@ -56,4 +57,25 @@ void LocalProjectModuleDependencyConfig::setLocalLoc(const UnicodeString *lloc) this->localloc = new UnicodeString(lloc); } +int LocalProjectModuleDependencyConfig::binarySize() const { + BinaryUtils::checkNotNull(this->localloc); + + int total = AbstractDependencyConfig::binarySize(); + total += BinaryUtils::stringSize(this->localloc); + + return total; +} + +void LocalProjectModuleDependencyConfig::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->localloc); + + AbstractDependencyConfig::toBinary(out); + BinaryUtils::putString(out, this->localloc); +} + +void LocalProjectModuleDependencyConfig::fromBinary(ByteBuffer *in) { + AbstractDependencyConfig::fromBinary(in); + this->localloc = BinaryUtils::getString(in); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h index 40d73cd..af8e133 100644 --- a/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h +++ b/src_smartcontract_modular/modular_project/LocalProjectModuleDependencyConfig.h @@ -29,6 +29,10 @@ class LocalProjectModuleDependencyConfig : public AbstractDependencyConfig { void setLocalLoc(const UnicodeString* lloc) noexcept; + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + private: UnicodeString* localloc; diff --git a/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp b/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp index b975734..7b1182e 100644 --- a/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp +++ b/src_smartcontract_modular/modular_project/ModularProjectConfig.cpp @@ -167,7 +167,7 @@ int ModularProjectConfig::binarySize() const { total += sizeof(uint8_t); if(this->license != nullptr){ - total += BinaryUtils::stringSize(this->author); + total += BinaryUtils::stringSize(this->license); } int maxLoop = this->libralies->size(); diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp index 84fde07..416f9ea 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp @@ -124,6 +124,7 @@ ModularSmartcontractInstance* ModularSmartcontractProject::toInstance() const { LibraryExectableModuleInstance* lib = dynamic_cast(inst); const UnicodeString* name = lib->getLibraryName(); + lib->setName(name); if(!instance->libraryExists(name)){ instance->addLibraryModuleInstance(name, lib); diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp index 366d48d..0c045d6 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.cpp @@ -12,9 +12,9 @@ #include "base/UnicodeString.h" #include "bc/SoftwareVersion.h" - #include "bc/ExceptionThrower.h" +#include "base_io/ByteBuffer.h" using namespace alinous; @@ -105,4 +105,25 @@ ModularSmartcontractVersion* ModularSmartcontractVersion::parseString(const Unic return new ModularSmartcontractVersion(version->getMajor(), version->getMinor(), version->getPatch(), verType); } +int ModularSmartcontractVersion::binarySize() const { + int total = SoftwareVersion::binarySize(); + total += sizeof(uint8_t); + + return total; +} + +void ModularSmartcontractVersion::toBinary(ByteBuffer *out) const { + SoftwareVersion::toBinary(out); + out->put(this->versionType); +} + +ModularSmartcontractVersion* ModularSmartcontractVersion::createFromBinary(ByteBuffer *in) { + uint8_t major = in->get(); + uint8_t minor = in->get(); + uint8_t pathch = in->get(); + uint8_t versionType = in->get(); + + return new ModularSmartcontractVersion(major, minor, pathch, versionType); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h index 3af054d..378d5cf 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractVersion.h @@ -30,6 +30,11 @@ class ModularSmartcontractVersion : public SoftwareVersion { return this->versionType; } + // binary + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static ModularSmartcontractVersion* createFromBinary(ByteBuffer* in); + private: bool validateCaret(const SoftwareVersion* other) const noexcept; SoftwareVersion* maxCaretVersion(const SoftwareVersion* other) const noexcept; diff --git a/src_smartcontract_modular/modular_project/SmartcontractProjectId.cpp b/src_smartcontract_modular/modular_project/SmartcontractProjectId.cpp new file mode 100644 index 0000000..76eb73c --- /dev/null +++ b/src_smartcontract_modular/modular_project/SmartcontractProjectId.cpp @@ -0,0 +1,57 @@ +/* + * ProjectId.cpp + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#include "modular_project/SmartcontractProjectId.h" + +#include "base/StackRelease.h" + +namespace codablecash { + +SmartcontractProjectId::SmartcontractProjectId(const SmartcontractProjectId &inst) : Abstract32BytesId(inst) { + +} + +SmartcontractProjectId::SmartcontractProjectId() { + +} + +SmartcontractProjectId::SmartcontractProjectId(const char *binary, int length) : Abstract32BytesId(binary, length) { +} + +SmartcontractProjectId::~SmartcontractProjectId() { + +} + +int SmartcontractProjectId::binarySize() const { + return Abstract32BytesId::binarySize(); +} + +void SmartcontractProjectId::toBinary(ByteBuffer *out) const { + Abstract32BytesId::toBinary(out); +} + +SmartcontractProjectId* SmartcontractProjectId::fromBinary(ByteBuffer *in) { + SmartcontractProjectId* projectId = new SmartcontractProjectId(); + + int cap = in->getInt(); + + uint8_t* buff = new uint8_t[cap]; + StackArrayRelease __st_buff(buff); + + in->get(buff, cap); + + projectId->id = ByteBuffer::wrapWithEndian(buff, cap, true); + projectId->id->position(0); + + return projectId; +} + +IBlockObject* SmartcontractProjectId::copyData() const noexcept { + return new SmartcontractProjectId(*this); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/SmartcontractProjectId.h b/src_smartcontract_modular/modular_project/SmartcontractProjectId.h new file mode 100644 index 0000000..7d57718 --- /dev/null +++ b/src_smartcontract_modular/modular_project/SmartcontractProjectId.h @@ -0,0 +1,31 @@ +/* + * ProjectId.h + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_SMARTCONTRACTPROJECTID_H_ +#define MODULAR_PROJECT_SMARTCONTRACTPROJECTID_H_ + +#include "bc_base/Abstract32BytesId.h" + +namespace codablecash { + +class SmartcontractProjectId : public Abstract32BytesId { +public: + SmartcontractProjectId(const SmartcontractProjectId& inst); + SmartcontractProjectId(); + SmartcontractProjectId(const char *binary, int length); + virtual ~SmartcontractProjectId(); + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static SmartcontractProjectId* fromBinary(ByteBuffer* in); + + virtual IBlockObject* copyData() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_SMARTCONTRACTPROJECTID_H_ */ diff --git a/src_smartcontract_modular/modular_project_registory/CMakeLists.txt b/src_smartcontract_modular/modular_project_registory/CMakeLists.txt index df89f4a..54a9b59 100644 --- a/src_smartcontract_modular/modular_project_registory/CMakeLists.txt +++ b/src_smartcontract_modular/modular_project_registory/CMakeLists.txt @@ -2,6 +2,10 @@ set(__src ModularSmartcontractProjectRegistory.cpp + ProjectIdKey.cpp + ProjectIdKeyFactory.cpp + SmartcontractProjectData.cpp + SmartcontractProjectDataFactory.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular modular_project_registory) diff --git a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp index 4fe7373..c55c364 100644 --- a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp +++ b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.cpp @@ -6,15 +6,82 @@ */ #include "modular_project_registory/ModularSmartcontractProjectRegistory.h" +#include "modular_project_registory/ProjectIdKeyFactory.h" +#include "modular_project_registory/SmartcontractProjectDataFactory.h" +#include "modular_project_registory/ProjectIdKey.h" +#include "modular_project_registory/SmartcontractProjectData.h" -namespace alinous { +#include "random_access_file/DiskCacheManager.h" -ModularSmartcontractProjectRegistory::ModularSmartcontractProjectRegistory() { +#include "btree/Btree.h" +#include "btree/BtreeConfig.h" +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "base_io/File.h" + + +namespace codablecash { + +ModularSmartcontractProjectRegistory::ModularSmartcontractProjectRegistory(const File* baseDir) { + this->baseDir = baseDir->get(DIR_NAME); + + this->cacheManager = new DiskCacheManager(); + this->dataStore = nullptr; } ModularSmartcontractProjectRegistory::~ModularSmartcontractProjectRegistory() { - // TODO Auto-generated destructor stub + close(); + + delete this->baseDir; + delete this->cacheManager; +} + +void ModularSmartcontractProjectRegistory::createBlankDatabase() { + UnicodeString fileName(MAIN_DATA); + + ProjectIdKeyFactory* keyFactory = new ProjectIdKeyFactory(); __STP(keyFactory); + SmartcontractProjectDataFactory* dataFactory = new SmartcontractProjectDataFactory(); __STP(dataFactory); + + Btree btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + + BtreeConfig config; + config.nodeNumber = 8; + config.defaultSize = 1024; + config.blockSize = 32; + btree.create(&config); +} + +void ModularSmartcontractProjectRegistory::open() { + UnicodeString fileName(MAIN_DATA); + + ProjectIdKeyFactory* keyFactory = new ProjectIdKeyFactory(); __STP(keyFactory); + SmartcontractProjectDataFactory* dataFactory = new SmartcontractProjectDataFactory(); __STP(dataFactory); + + this->dataStore = new Btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + BtreeOpenConfig opconf; + opconf.numDataBuffer = 256; + opconf.numNodeBuffer = 512; + this->dataStore->open(&opconf); +} + +void ModularSmartcontractProjectRegistory::close() { + if(this->dataStore != nullptr){ + this->dataStore->close(); + delete this->dataStore; + this->dataStore = nullptr; + } +} + +void ModularSmartcontractProjectRegistory::put(const ProjectIdKey *key, const SmartcontractProjectData *data) { + this->dataStore->putData(key, data); +} + +SmartcontractProjectData* ModularSmartcontractProjectRegistory::findProjectById(const ProjectIdKey *key) { + IBlockObject* obj = this->dataStore->findByKey(key); + + return dynamic_cast(obj); } -} /* namespace alinous */ +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h index a0b194d..0bd029b 100644 --- a/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h +++ b/src_smartcontract_modular/modular_project_registory/ModularSmartcontractProjectRegistory.h @@ -9,13 +9,40 @@ #define MODULAR_PROJECT_REGISTORY_MODULARSMARTCONTRACTPROJECTREGISTORY_H_ namespace alinous { +class UnicodeString; +class DiskCacheManager; +class Btree; +class BtreeScanner; +class File; +} +using namespace alinous; + +namespace codablecash { + +class ProjectIdKey; +class SmartcontractProjectData; class ModularSmartcontractProjectRegistory { public: - ModularSmartcontractProjectRegistory(); + static const constexpr wchar_t* DIR_NAME{L"smartcontract_projects"}; + static const constexpr wchar_t* MAIN_DATA{L"main_data"}; + + explicit ModularSmartcontractProjectRegistory(const File* baseDir); virtual ~ModularSmartcontractProjectRegistory(); + + void createBlankDatabase(); + void open(); + void close(); + + void put(const ProjectIdKey* key, const SmartcontractProjectData* data); + SmartcontractProjectData* findProjectById(const ProjectIdKey* key); + +private: + File* baseDir; + DiskCacheManager* cacheManager; + Btree* dataStore; }; -} /* namespace alinous */ +} /* namespace codablecash */ #endif /* MODULAR_PROJECT_REGISTORY_MODULARSMARTCONTRACTPROJECTREGISTORY_H_ */ diff --git a/src_smartcontract_modular/modular_project_registory/ProjectIdKey.cpp b/src_smartcontract_modular/modular_project_registory/ProjectIdKey.cpp new file mode 100644 index 0000000..6e4da85 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ProjectIdKey.cpp @@ -0,0 +1,78 @@ +/* + * ProjectIdKey.cpp + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#include "modular_project_registory/ProjectIdKey.h" +#include "modular_project_registory/ProjectIdKeyFactory.h" + +#include "modular_project/SmartcontractProjectId.h" + +#include "bc_base/BinaryUtils.h" + +#include "base/StackRelease.h" + + +namespace codablecash { + +ProjectIdKey::ProjectIdKey() { + this->projectId = nullptr; +} + +ProjectIdKey::~ProjectIdKey() { + delete this->projectId; +} + +int ProjectIdKey::binarySize() const { + BinaryUtils::checkNotNull(this->projectId); + + int size = sizeof(uint32_t); + size += this->projectId->binarySize(); + + return size; +} + +void ProjectIdKey::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->projectId); + + out->putInt(ProjectIdKeyFactory::PROJECT_ID_KEY); + this->projectId->toBinary(out); +} + +ProjectIdKey* ProjectIdKey::fromBinary(ByteBuffer *in) { + SmartcontractProjectId* id = SmartcontractProjectId::fromBinary(in); __STP(id); + + ProjectIdKey* key = new ProjectIdKey(); + key->setProjectId(id); + + return key; +} + +int ProjectIdKey::compareTo(const AbstractBtreeKey *key) const noexcept { + if(key->isInfinity()){ + return -1; + } + else if(key->isNull()){ + return 1; + } + + const ProjectIdKey* other = dynamic_cast(key); + assert(other != nullptr); + + return this->projectId->compareTo(other->projectId); +} + +AbstractBtreeKey* ProjectIdKey::clone() const noexcept { + ProjectIdKey* key = new ProjectIdKey(); + key->setProjectId(this->projectId); + return key; +} + +void ProjectIdKey::setProjectId(const SmartcontractProjectId *id) { + delete this->projectId; + this->projectId = new SmartcontractProjectId(*id); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/ProjectIdKey.h b/src_smartcontract_modular/modular_project_registory/ProjectIdKey.h new file mode 100644 index 0000000..1755f9b --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ProjectIdKey.h @@ -0,0 +1,42 @@ +/* + * ProjectIdKey.h + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_REGISTORY_PROJECTIDKEY_H_ +#define MODULAR_PROJECT_REGISTORY_PROJECTIDKEY_H_ + +#include "btree/AbstractBtreeKey.h" + +using namespace alinous; + +namespace codablecash { + +class SmartcontractProjectId; + +class ProjectIdKey : public AbstractBtreeKey { +public: + ProjectIdKey(); + virtual ~ProjectIdKey(); + + virtual bool isInfinity() const { return false; } + virtual bool isNull() const { return false; } + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static ProjectIdKey* fromBinary(ByteBuffer* in); + + virtual int compareTo(const AbstractBtreeKey* key) const noexcept; + virtual AbstractBtreeKey* clone() const noexcept; + + void setProjectId(const SmartcontractProjectId* id); + +private: + SmartcontractProjectId* projectId; +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_REGISTORY_PROJECTIDKEY_H_ */ diff --git a/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.cpp b/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.cpp new file mode 100644 index 0000000..2aab70d --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.cpp @@ -0,0 +1,35 @@ +/* + * ProjectIdKeyFactory.cpp + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#include "modular_project_registory/ProjectIdKeyFactory.h" +#include "modular_project_registory/ProjectIdKey.h" + + +namespace codablecash { + +ProjectIdKeyFactory::ProjectIdKeyFactory() { + + +} + +ProjectIdKeyFactory::~ProjectIdKeyFactory() { + +} + +AbstractBtreeKey* ProjectIdKeyFactory::fromBinary(uint32_t keyType, ByteBuffer *in) const { + if(keyType == PROJECT_ID_KEY){ + return ProjectIdKey::fromBinary(in); + } + + return BtreeKeyFactory::fromBinary(keyType, in); +} + +BtreeKeyFactory* ProjectIdKeyFactory::copy() const noexcept { + return new ProjectIdKeyFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.h b/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.h new file mode 100644 index 0000000..97b36e2 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/ProjectIdKeyFactory.h @@ -0,0 +1,30 @@ +/* + * ProjectIdKeyFactory.h + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_REGISTORY_PROJECTIDKEYFACTORY_H_ +#define MODULAR_PROJECT_REGISTORY_PROJECTIDKEYFACTORY_H_ + +#include "btreekey/BtreeKeyFactory.h" + +using namespace alinous; + +namespace codablecash { + +class ProjectIdKeyFactory : public BtreeKeyFactory { +public: + static const constexpr uint32_t PROJECT_ID_KEY{0x24}; + + ProjectIdKeyFactory(); + virtual ~ProjectIdKeyFactory(); + + virtual AbstractBtreeKey* fromBinary(uint32_t keyType, ByteBuffer* in) const; + virtual BtreeKeyFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_REGISTORY_PROJECTIDKEYFACTORY_H_ */ diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp new file mode 100644 index 0000000..dcad434 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp @@ -0,0 +1,76 @@ +/* + * SmartcontractProjectData.cpp + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#include "modular_project_registory/SmartcontractProjectData.h" +#include "modular_project_registory/ProjectIdKey.h" + +#include "base_io/ByteBuffer.h" + +#include "base/StackRelease.h" + + +namespace codablecash { + +SmartcontractProjectData::SmartcontractProjectData(const SmartcontractProjectData &inst) { + this->projectData = inst.projectData != nullptr ? inst.projectData->clone() : nullptr; + this->key = inst.key != nullptr ? dynamic_cast(inst.key->clone()) : nullptr; +} + +SmartcontractProjectData::SmartcontractProjectData() { + this->projectData = nullptr; + this->key = nullptr; +} + +SmartcontractProjectData::~SmartcontractProjectData() { + delete this->projectData; + delete this->key; +} + +int SmartcontractProjectData::binarySize() const { + int total = sizeof(uint64_t); + total += this->projectData->capacity(); + + return total; +} + +void SmartcontractProjectData::toBinary(ByteBuffer *out) const { + uint64_t cap = this->projectData->capacity(); + out->putLong(cap); + + out->put(this->projectData); +} + +SmartcontractProjectData* SmartcontractProjectData::createFromBinary(ByteBuffer *in) { + SmartcontractProjectData* inst = new SmartcontractProjectData(); __STP(inst); + + uint64_t length = in->getLong(); + + uint8_t* b = new uint8_t[length]; + StackArrayRelease __stp(b); + + in->get(b, length); + + inst->projectData = ByteBuffer::wrapWithEndian(b, length, true); + + return __STP_MV(inst); +} + +void SmartcontractProjectData::setData(const ByteBuffer *data) { + delete this->projectData; + this->projectData = data->clone(); +} + +void SmartcontractProjectData::setKey(const ProjectIdKey *key) { + delete this->key; + this->key = dynamic_cast(key->clone()); +} + +IBlockObject* SmartcontractProjectData::copyData() const noexcept { + return new SmartcontractProjectData(*this); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h new file mode 100644 index 0000000..0dff0c0 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h @@ -0,0 +1,46 @@ +/* + * SmartcontractProjectData.h + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATA_H_ +#define MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATA_H_ + +#include "filestore_block/IBlockObject.h" + +using namespace alinous; + +namespace codablecash { + +class ProjectIdKey; + +class SmartcontractProjectData : public IBlockObject { +public: + SmartcontractProjectData(const SmartcontractProjectData& inst); + SmartcontractProjectData(); + virtual ~SmartcontractProjectData(); + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static SmartcontractProjectData* createFromBinary(ByteBuffer *in); + + void setData(const ByteBuffer* data); + void setKey(const ProjectIdKey* key); + + const ProjectIdKey* getKey() const noexcept { + return this->key; + } + + virtual IBlockObject* copyData() const noexcept; + +private: + ByteBuffer* projectData; + ProjectIdKey* key; + +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATA_H_ */ diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.cpp b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.cpp new file mode 100644 index 0000000..bffb7a8 --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.cpp @@ -0,0 +1,31 @@ +/* + * SmartcontractProjectDataFactory.cpp + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#include "modular_project_registory/SmartcontractProjectDataFactory.h" +#include "modular_project_registory/SmartcontractProjectData.h" + + +namespace codablecash { + +SmartcontractProjectDataFactory::SmartcontractProjectDataFactory() { + + +} + +SmartcontractProjectDataFactory::~SmartcontractProjectDataFactory() { + +} + +IBlockObject* SmartcontractProjectDataFactory::makeDataFromBinary(ByteBuffer *in) { + return SmartcontractProjectData::createFromBinary(in); +} + +AbstractBtreeDataFactory* SmartcontractProjectDataFactory::copy() const noexcept { + return new SmartcontractProjectDataFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.h b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.h new file mode 100644 index 0000000..f562d7b --- /dev/null +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectDataFactory.h @@ -0,0 +1,28 @@ +/* + * SmartcontractProjectDataFactory.h + * + * Created on: Nov 27, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATAFACTORY_H_ +#define MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATAFACTORY_H_ + +#include "btree/AbstractBtreeDataFactory.h" + +using namespace alinous; + +namespace codablecash { + +class SmartcontractProjectDataFactory : public AbstractBtreeDataFactory { +public: + SmartcontractProjectDataFactory(); + virtual ~SmartcontractProjectDataFactory(); + + virtual IBlockObject* makeDataFromBinary(ByteBuffer* in); + virtual AbstractBtreeDataFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_PROJECT_REGISTORY_SMARTCONTRACTPROJECTDATAFACTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index 11a1c97..e0208fe 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -6,6 +6,9 @@ */ #include "smartcontract_instance/AbstractExecutableModuleInstance.h" #include "smartcontract_instance/InstanceDependencyHandler.h" +#include "smartcontract_instance/ExecutableModuleInstance.h" +#include "smartcontract_instance/LibraryExectableModuleInstance.h" +#include "smartcontract_instance/ModuleInstanceClassLoader.h" #include "modular_project/ModularInstanceConfig.h" #include "modular_project/DependencyConfig.h" @@ -39,14 +42,14 @@ #include "instance/instance_gc/GcManager.h" -#include "smartcontract_instance/ModuleInstanceClassLoader.h" - #include "lang/sc_declare/ClassDeclare.h" +#include "bc_base/BinaryUtils.h" namespace codablecash { -AbstractExecutableModuleInstance::AbstractExecutableModuleInstance() { +AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) { + this->kind = kind; this->name = nullptr; this->projectRelativePath = nullptr; @@ -299,8 +302,6 @@ bool AbstractExecutableModuleInstance::loadDependency(ModularSmartcontractInstan } } - - this->dependencyHandler->importExportedClasses(actx); return actx->hasError(); @@ -311,7 +312,6 @@ bool AbstractExecutableModuleInstance::preAnalyzeDependency() { AnalyzeContext* actx = contract->getAnalyzeContext(); this->dependencyHandler->preAnalyze(actx); - // FIXME analyzeTypeDependency() return actx->hasError(); } @@ -351,4 +351,133 @@ void AbstractExecutableModuleInstance::loadLibExportInterfaceUnits(ModuleInstanc } } +int AbstractExecutableModuleInstance::binarySize() const { + BinaryUtils::checkNotNull(this->name); + BinaryUtils::checkNotNull(this->projectRelativePath); + BinaryUtils::checkNotNull(this->version); + BinaryUtils::checkNotNull(this->instanceConfig); + + + int total = sizeof(uint8_t); + total += BinaryUtils::stringSize(this->name); + total += BinaryUtils::stringSize(this->projectRelativePath); + + int maxLoop = this->sourceFolders->size(); + total += sizeof(uint16_t); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* folder = this->sourceFolders->get(i); + total += BinaryUtils::stringSize(folder); + } + + total += this->version->binarySize(); + total += this->instanceConfig->binarySize(); + + total += sizeof(uint8_t); + if(this->dependencyConfig != nullptr){ + total += this->dependencyConfig->binarySize(); + } + + // vm to binary + SmartContract* contract = this->vm->getSmartContract(); + + maxLoop = contract->getNumCompilationUnit(); + total += sizeof(uint32_t); + + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = contract->getCompilationUnit(i); + total += unit->binarySize(); + } + + return total; +} + +void AbstractExecutableModuleInstance::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->name); + BinaryUtils::checkNotNull(this->projectRelativePath); + BinaryUtils::checkNotNull(this->version); + BinaryUtils::checkNotNull(this->instanceConfig); + + out->put(this->kind); + BinaryUtils::putString(out, this->name); + BinaryUtils::putString(out, this->projectRelativePath); + + int maxLoop = this->sourceFolders->size(); + out->putShort(maxLoop); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* folder = this->sourceFolders->get(i); + BinaryUtils::putString(out, folder); + } + + this->version->toBinary(out); + this->instanceConfig->toBinary(out); + + uint8_t bl = (this->dependencyConfig != nullptr) ? 1 : 0; + out->put(bl); + if(bl > 0){ + this->dependencyConfig->toBinary(out); + } + + // vm to binary + SmartContract* contract = this->vm->getSmartContract(); + + maxLoop = contract->getNumCompilationUnit(); + out->putInt(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = contract->getCompilationUnit(i); + unit->toBinary(out); + } + +} + +void AbstractExecutableModuleInstance::fromBinary(ByteBuffer *in) { + this->name = BinaryUtils::getString(in); + this->projectRelativePath = BinaryUtils::getString(in); + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* folder = BinaryUtils::getString(in); + this->sourceFolders->addElement(folder); + } + + this->version = SoftwareVersion::createFromBinary(in); + this->instanceConfig = ModularInstanceConfig::createFromBinary(in); + + uint8_t bl = in->get(); + if(bl > 0){ + this->dependencyConfig = DependencyConfig::createFromBinary(in); + } + + // vm + resetContract(); + SmartContract* contract = this->vm->getSmartContract(); + + maxLoop = in->getInt(); + for(int i = 0; i != maxLoop; ++i){ + CodeElement* element = CodeElement::createFromBinary(in); __STP(element); + CompilationUnit* unit = dynamic_cast(element); + BinaryUtils::checkNotNull(unit); + + __STP_MV(element); + contract->addCompilationUnit(unit); + } +} + +AbstractExecutableModuleInstance* AbstractExecutableModuleInstance::createFromBinary(ByteBuffer *in) { + AbstractExecutableModuleInstance* inst = nullptr; + + uint8_t kind = in->get(); + if(kind == TYPE_EXEC){ + inst = new ExecutableModuleInstance(); + } + else{ + inst = new LibraryExectableModuleInstance(); + } + __STP(inst); + + inst->fromBinary(in); + + return __STP_MV(inst); +} + } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index 719c53e..d3cab1d 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -7,6 +7,7 @@ #ifndef SMARTCONTRACT_INSTANCE_ABSTRACTEXECUTABLEMODULEINSTANCE_H_ #define SMARTCONTRACT_INSTANCE_ABSTRACTEXECUTABLEMODULEINSTANCE_H_ +#include namespace alinous { class UnicodeString; @@ -16,6 +17,7 @@ class VirtualMachine; class CompileError; class VmClassInstance; class CompilationUnit; +class ByteBuffer; } using namespace alinous; @@ -32,7 +34,10 @@ class ModuleInstanceClassLoader; class AbstractExecutableModuleInstance { public: - AbstractExecutableModuleInstance(); + static constexpr const uint8_t TYPE_EXEC = 1; + static constexpr const uint8_t TYPE_LIBRARY= 2; + + explicit AbstractExecutableModuleInstance(uint8_t kind); virtual ~AbstractExecutableModuleInstance(); void setName(const UnicodeString* name) noexcept; @@ -69,6 +74,13 @@ class AbstractExecutableModuleInstance { return this->vm; } + // binary + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + + static AbstractExecutableModuleInstance* createFromBinary(ByteBuffer* in); + protected: void resetContract(); void parseSourceFolders(const File *projectBaseDir); @@ -78,6 +90,7 @@ class AbstractExecutableModuleInstance { void addCompilantUnit(File* file, File* base, const File *projectBaseDir); protected: + uint8_t kind; UnicodeString* name; UnicodeString* projectRelativePath; diff --git a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp index 6aae0ed..19f318e 100644 --- a/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ExecutableModuleInstance.cpp @@ -19,7 +19,7 @@ namespace codablecash { -ExecutableModuleInstance::ExecutableModuleInstance() { +ExecutableModuleInstance::ExecutableModuleInstance() : AbstractExecutableModuleInstance(TYPE_EXEC) { } diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp index 2220c87..8ce9c8a 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.cpp @@ -12,11 +12,15 @@ #include "vm/VirtualMachine.h" +#include "bc_base/BinaryUtils.h" + +#include "base_io/ByteBuffer.h" + namespace codablecash { LibraryExectableModuleInstance::LibraryExectableModuleInstance() - : AbstractExecutableModuleInstance() { + : AbstractExecutableModuleInstance(TYPE_LIBRARY) { this->libraryName = nullptr; this->exportClasses = new ArrayList(); } @@ -53,4 +57,49 @@ void LibraryExectableModuleInstance::loadExportClasses(ModuleInstanceClassLoader } } +int LibraryExectableModuleInstance::binarySize() const { + BinaryUtils::checkNotNull(this->libraryName); + + int total = AbstractExecutableModuleInstance::binarySize(); + + total += BinaryUtils::stringSize(this->libraryName); + + int maxLoop = this->exportClasses->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* fqn = this->exportClasses->get(i); + total += BinaryUtils::stringSize(fqn); + } + + return total; +} + +void LibraryExectableModuleInstance::toBinary(ByteBuffer *out) const { + AbstractExecutableModuleInstance::toBinary(out); + + BinaryUtils::putString(out, this->libraryName); + + int maxLoop = this->exportClasses->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* fqn = this->exportClasses->get(i); + BinaryUtils::putString(out, fqn); + } +} + +void LibraryExectableModuleInstance::fromBinary(ByteBuffer *in) { + AbstractExecutableModuleInstance::fromBinary(in); + + this->libraryName = BinaryUtils::getString(in); + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* fqn = BinaryUtils::getString(in); + + this->exportClasses->addElement(fqn); + } +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h index cb1eb5a..926aff0 100644 --- a/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/LibraryExectableModuleInstance.h @@ -33,6 +33,11 @@ class LibraryExectableModuleInstance : public AbstractExecutableModuleInstance { void loadExportClasses(ModuleInstanceClassLoader* loader); + // binary + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + virtual void fromBinary(ByteBuffer* in); + private: UnicodeString* libraryName; ArrayList* exportClasses; diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 48b1ec5..8a8fb0a 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -9,6 +9,8 @@ #include "smartcontract_instance/ExecutableModuleInstance.h" #include "smartcontract_instance/LibraryExectableModuleInstance.h" +#include "modular_project_registory/SmartcontractProjectData.h" + #include "modular_project/ModularProjectConfig.h" #include "base/StackRelease.h" @@ -18,6 +20,15 @@ #include "bc/ExceptionThrower.h" +#include "bc_base/BinaryUtils.h" + +#include "base_io/ByteBuffer.h" + +#include "modular_project/SmartcontractProjectId.h" + +#include "crypto/Sha256.h" + +#include "modular_project_registory/ProjectIdKey.h" namespace codablecash { ModularSmartcontractInstance::ModularSmartcontractInstance() { @@ -285,4 +296,98 @@ void ModularSmartcontractInstance::resetRootReference() { } } +int ModularSmartcontractInstance::binarySize() const { + BinaryUtils::checkNotNull(this->config); + BinaryUtils::checkNotNull(this->execModule); + + int total = this->config->binarySize(); + total += this->execModule->binarySize(); + + int maxLoop = this->libArray->size(); + total += sizeof(uint16_t); + + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* libmod = this->libArray->get(i); + total += libmod->binarySize(); + } + + return total; +} + +void ModularSmartcontractInstance::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->config); + BinaryUtils::checkNotNull(this->execModule); + + this->config->toBinary(out); + this->execModule->toBinary(out); + + int maxLoop = this->libArray->size(); + out->putShort(maxLoop); + + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* libmod = this->libArray->get(i); + libmod->toBinary(out); + } +} + +ModularSmartcontractInstance* ModularSmartcontractInstance::createFromBinary(ByteBuffer *in) { + ModularSmartcontractInstance* inst = new ModularSmartcontractInstance(); __STP(inst); + + { + ModularProjectConfig* config = ModularProjectConfig::createFromBinary(in); __STP(config); + inst->setModularProjectConfig(config); + } + + { + AbstractExecutableModuleInstance* mod = AbstractExecutableModuleInstance::createFromBinary(in); __STP(mod); + ExecutableModuleInstance* exec = dynamic_cast(mod); + BinaryUtils::checkNotNull(exec); + __STP_MV(mod); + + inst->setExecutableModuleInstance(exec); + } + + int maxLoop = in->getShort(); + for(int i = 0; i != maxLoop; ++i){ + AbstractExecutableModuleInstance* mod = AbstractExecutableModuleInstance::createFromBinary(in); __STP(mod); + LibraryExectableModuleInstance* libmod = dynamic_cast(mod); + BinaryUtils::checkNotNull(libmod); + __STP_MV(mod); + + const UnicodeString* name = libmod->getLibraryName(); + inst->addLibraryModuleInstance(name, libmod); + } + + return __STP_MV(inst); +} + +SmartcontractProjectData* ModularSmartcontractInstance::createData() const { + SmartcontractProjectData* data = new SmartcontractProjectData(); __STP(data); + ByteBuffer* buff = createBinary(); __STP(buff); + buff->position(0); + + data->setData(buff); + + { + ByteBuffer* shaBuff = Sha256::sha256(buff, true); __STP(shaBuff); + + SmartcontractProjectId projectId((const char*)shaBuff->array(), shaBuff->capacity()); + ProjectIdKey key; + key.setProjectId(&projectId); + + data->setKey(&key); + } + + return __STP_MV(data); +} + +ByteBuffer* ModularSmartcontractInstance::createBinary() const { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + + toBinary(buff); + + return __STP_MV(buff); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 0e021ee..35231a3 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -12,6 +12,7 @@ #include "base/ArrayList.h" namespace alinous { +class ByteBuffer; class File; class VirtualMachine; } @@ -22,6 +23,7 @@ namespace codablecash { class ModularProjectConfig; class ExecutableModuleInstance; class LibraryExectableModuleInstance; +class SmartcontractProjectData; class ModularSmartcontractInstance { public: @@ -45,7 +47,17 @@ class ModularSmartcontractInstance { void resetRootReference(); + // binary + int binarySize() const; + void toBinary(ByteBuffer* out) const; + static ModularSmartcontractInstance* createFromBinary(ByteBuffer* in); + + // create data + SmartcontractProjectData* createData() const; + private: + ByteBuffer* createBinary() const; + void initBeforeAnalyze(); void preAnalyze(); void preAnalyzeGenerics(); diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp index a270b08..c246425 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp @@ -46,7 +46,7 @@ void ModuleInstanceClassLoader::loadClass(const UnicodeString *fqn) { AnalyzeContext* actx = contarct->getAnalyzeContext(); const ClassDeclare* clazz = contarct->getClassDeclareByFqn(fqn); - if(!clazz->isReserved()){ + if(clazz != nullptr && !clazz->isReserved()){ const CompilationUnit* unit = clazz->getCompilationUnit(); CompilationUnit* newUnit = unit->copy(); diff --git a/src_test/smartcontract/test_class_fw.cpp b/src_test/smartcontract/test_class_fw.cpp index 6f18338..9f033a2 100644 --- a/src_test/smartcontract/test_class_fw.cpp +++ b/src_test/smartcontract/test_class_fw.cpp @@ -79,6 +79,22 @@ TEST(TestClassFwGroup, exceptions04){ delete ex; } +TEST(TestClassFwGroup, exceptions04_1){ + CompilationUnit* element = new CompilationUnit(); + + Exception* ex = nullptr; + try{ + short KINDS[1] = {CodeElement::ARGUMENTS_LIST_DECLARE}; + CodeElement::checkKind(element, KINDS, 1); + } + catch(Exception* e){ + ex = e; + } + CHECK(ex != nullptr) + + delete ex; +} + TEST(TestClassFwGroup, exceptions05){ ByteBuffer* buff = ByteBuffer::allocateWithEndian(10, true); __STP(buff); buff->putShort(0xffff); diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index 60069b0..ae2c356 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -12,6 +12,9 @@ #include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "modular_project_registory/SmartcontractProjectData.h" +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" + using namespace codablecash; @@ -53,9 +56,6 @@ TEST(TestModularInstanceGroup, case01){ inst->setMainInstance(); res = inst->createMainInstance(); CHECK(res == false); - - - // FIXME TestModularInstanceGroup } TEST(TestModularInstanceGroup, case02){ diff --git a/src_test/smartcontract_modular/project/CMakeLists.txt b/src_test/smartcontract_modular/project/CMakeLists.txt index f0cb498..b24df4f 100644 --- a/src_test/smartcontract_modular/project/CMakeLists.txt +++ b/src_test/smartcontract_modular/project/CMakeLists.txt @@ -1,5 +1,6 @@ set(testsrc + test_modular_project_registory.cpp test_modular_project.cpp test_modular_version_string.cpp test_modular_version.cpp diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/config.json b/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/config.json new file mode 100644 index 0000000..0a8d506 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/config.json @@ -0,0 +1,20 @@ +{ + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "sample", + "mainClass" : "Sample01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : [], + "directAccess" : [] + }, + + "dependencies": [ + {"name" : "module_01", "localloc": "mod01", "version" : "^1.0.0"} + ] +} + diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/src/sample/Sample01.alns new file mode 100644 index 0000000..debca82 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/exec/src/sample/Sample01.alns @@ -0,0 +1,16 @@ +package sample; + + +class Sample01 { + public Sample01() { + this.count = 3 * 2; + stcount++; + } + + public int main(){ + + } + + private int count = 0; + public static int stcount = 10; +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/config.json b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/config.json new file mode 100644 index 0000000..fa02a1f --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/config.json @@ -0,0 +1,20 @@ +{ + "libraryName" : "module_01", + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "modsample", + "mainClass" : "Module01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : ["modsample.export.IExportMethods"], + "directAccess" : ["modsample.export.IDirectAccess"] + }, + + "exportClasses" : ["modsample.Result"], + + "dependencies": [] +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IDirectAccess.alns b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IDirectAccess.alns new file mode 100644 index 0000000..ec4f07a --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IDirectAccess.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IDirectAccess { + +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IExportMethods.alns b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IExportMethods.alns new file mode 100644 index 0000000..0982b39 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/IExportMethods.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IExportMethods { + +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Module01.alns b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Module01.alns new file mode 100644 index 0000000..6b28532 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Module01.alns @@ -0,0 +1,23 @@ +package modsample; + +import modsample.export.IExportMethods; +import modsample.export.IDirectAccess; +import modsample.Result; + +class Module01 implements IExportMethods, IDirectAccess { + public Module01() { + this.count = 3 * 2; + } + + public int main(){ + this.res = new Result(); + } + + public void doubleup() { + int value = this.count * 2; + this.count = value; + } + + private int count = 0; + private Result res; +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Result.alns b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Result.alns new file mode 100644 index 0000000..77b05d1 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/modules/mod01/src/Result.alns @@ -0,0 +1,9 @@ +package modsample; + +class Result { + public Result(){ + + } + + private int result = 0; +} diff --git a/src_test/smartcontract_modular/project/resources/reg_case01/project01/projectconfig.json b/src_test/smartcontract_modular/project/resources/reg_case01/project01/projectconfig.json new file mode 100644 index 0000000..d37fbf5 --- /dev/null +++ b/src_test/smartcontract_modular/project/resources/reg_case01/project01/projectconfig.json @@ -0,0 +1,9 @@ +{ + "project" : "Sample01", + "executable" : "exec/", + + "libraries" : ["mod01"], + + "author": "Tomohiro Iizuka", + "license": "MIT" +} diff --git a/src_test/smartcontract_modular/project/test_modular_project_registory.cpp b/src_test/smartcontract_modular/project/test_modular_project_registory.cpp new file mode 100644 index 0000000..cd3566b --- /dev/null +++ b/src_test/smartcontract_modular/project/test_modular_project_registory.cpp @@ -0,0 +1,102 @@ +/* + * test_modular_project_registory.cpp + * + * Created on: Nov 24, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "modular_project/ModularSmartcontractProject.h" +#include "modular_project/ModularConfigException.h" + +#include "smartcontract_instance/ModularSmartcontractInstance.h" + +#include "../utils/ModularProjectUtils.h" + +#include "base_io/ByteBuffer.h" + +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" +#include "modular_project_registory/SmartcontractProjectData.h" + + +using namespace codablecash; + + +TEST_GROUP(TestModularProjectRegisterGroup) { + TEST_SETUP() { + env->setup(); + } + TEST_TEARDOWN() { + env->teardown(); + } +}; + +TEST(TestModularProjectRegisterGroup, case01){ + const File* projectFolder = this->env->getProjectRoot(); + + ModularProjectUtils utils(L"src_test/smartcontract_modular/project/resources/reg_case01/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + ModularSmartcontractInstance* inst = project.toInstance(); __STP(inst); + inst->loadCompilantUnits(baseDir); + + bool res = inst->hasCompileError(); + CHECK(res == false); + + { + int cap = inst->binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + + inst->toBinary(buff); + CHECK(buff->position() == buff->capacity()); + + buff->position(0); + + ModularSmartcontractInstance* inst2 = ModularSmartcontractInstance::createFromBinary(buff); __STP(inst2); + ByteBuffer* buff2 = ByteBuffer::allocateWithEndian(cap, true); __STP(buff2); + inst2->toBinary(buff2); + + int cmp = buff->binaryCmp(buff2); + CHECK(cmp == 0); + } +} + +TEST(TestModularProjectRegisterGroup, case02){ + const File* projectFolder = this->env->getProjectRoot(); + + File projectTestFolder = this->env->testCaseDir(); + _ST(File, baseTestDir, projectTestFolder.get(L"store")) + + ModularProjectUtils utils(L"src_test/smartcontract_modular/project/resources/reg_case01/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + ModularSmartcontractInstance* inst = project.toInstance(); __STP(inst); + inst->loadCompilantUnits(baseDir); + + bool res = inst->hasCompileError(); + CHECK(res == false); + + { + ModularSmartcontractProjectRegistory registory(baseTestDir); + registory.createBlankDatabase(); + + registory.open(); + SmartcontractProjectData* data = inst->createData(); __STP(data); + + const ProjectIdKey* key = data->getKey(); + registory.put(key, data); + + SmartcontractProjectData* data2 = registory.findProjectById(key); __STP(data2); + CHECK(data != nullptr); + + registory.close(); + } + + +} From 59003a960dea054f4892f3b712647f015d08288c Mon Sep 17 00:00:00 2001 From: iizuka Date: Sat, 29 Nov 2025 23:20:12 +0800 Subject: [PATCH 07/11] executor framework --- src/ecda/Secp256k1CompressedPoint.cpp | 9 ++ src/ecda/Secp256k1CompressedPoint.h | 2 + src_db/btree/NodePosition.cpp | 14 ++- .../trx/session/base/CdbDatabaseSessionId.cpp | 11 ++- .../trx/session/base/CdbDatabaseSessionId.h | 3 +- .../trx/session/base/UndoIds.cpp | 2 +- .../trx/session/repo/UndoLogsIdkey.cpp | 2 +- src_smartcontract_modular/CMakeLists.txt | 1 + .../ModularSmartcontractProject.cpp | 7 +- .../ModularSmartcontractProject.h | 6 ++ .../smartcontract_cache/CMakeLists.txt | 1 + .../smartcontract_cache/InstanceSpace.cpp | 23 +++++ .../smartcontract_cache/InstanceSpace.h | 26 ++++++ .../MolularSmartcontractCacheManager.cpp | 2 +- .../smartcontract_executor/CMakeLists.txt | 5 ++ .../ModularSmartcontractExecutor.cpp | 35 +++++++- .../ModularSmartcontractExecutor.h | 23 ++++- .../SmartcontractExecContextData.cpp | 90 +++++++++++++++++++ .../SmartcontractExecContextData.h | 47 ++++++++++ .../SmartcontractExecContextDataFactory.cpp | 32 +++++++ .../SmartcontractExecContextDataFactory.h | 28 ++++++ .../SmartcontractExecContextKey.cpp | 79 ++++++++++++++++ .../SmartcontractExecContextKey.h | 45 ++++++++++ .../SmartcontractExecContextKeyFactory.cpp | 34 +++++++ .../SmartcontractExecContextKeyFactory.h | 30 +++++++ .../SmartcontractExecContextRegistory.cpp | 75 ++++++++++++++++ .../SmartcontractExecContextRegistory.h | 42 +++++++++ .../CMakeLists.txt | 11 +++ .../InstanceIdIndex.cpp | 75 ++++++++++++++++ .../InstanceIdIndex.h | 42 +++++++++ .../InstanceIdIndexData.cpp | 57 ++++++++++++ .../InstanceIdIndexData.h | 39 ++++++++ .../InstanceIdIndexDataFactory.cpp | 31 +++++++ .../InstanceIdIndexDataFactory.h | 28 ++++++ .../InstanceIdIndexKey.cpp | 90 +++++++++++++++++++ .../InstanceIdIndexKey.h | 48 ++++++++++ .../InstanceIdIndexKeyFactory.cpp | 34 +++++++ .../InstanceIdIndexKeyFactory.h | 30 +++++++ .../AbstractExecutableModuleInstance.cpp | 25 ++++++ .../AbstractExecutableModuleInstance.h | 12 +++ .../ModularSmartcontractInstance.cpp | 63 ++++++++++++- .../ModularSmartcontractInstance.h | 16 ++++ .../AbstractSmartcontractAddress.cpp | 4 + .../AbstractSmartcontractAddress.h | 2 + src_test/db/db_btree/test_reverse_scan.cpp | 30 ++++++- .../instance/CMakeLists.txt | 1 + .../instance/test_modular_instance.cpp | 16 ++++ .../instance/test_smartcontract_executor.cpp | 49 ++++++++++ 48 files changed, 1361 insertions(+), 16 deletions(-) create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpace.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.h create mode 100644 src_smartcontract_modular/smartcontract_executor_index/CMakeLists.txt create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.h create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.h create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.h create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.h create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.h create mode 100644 src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp diff --git a/src/ecda/Secp256k1CompressedPoint.cpp b/src/ecda/Secp256k1CompressedPoint.cpp index bd61495..048e097 100644 --- a/src/ecda/Secp256k1CompressedPoint.cpp +++ b/src/ecda/Secp256k1CompressedPoint.cpp @@ -133,4 +133,13 @@ IBlockObject* Secp256k1CompressedPoint::copyData() const noexcept { return new Secp256k1CompressedPoint(this->x, this->prefix); } +int Secp256k1CompressedPoint::compareTo(const Secp256k1CompressedPoint *other) { + int cmp = this->prefix - other->prefix; + if(cmp != 0){ + return cmp; + } + + return this->x.compareTo(other->x); +} + } /* namespace codablecash */ diff --git a/src/ecda/Secp256k1CompressedPoint.h b/src/ecda/Secp256k1CompressedPoint.h index d0c330e..c904efc 100644 --- a/src/ecda/Secp256k1CompressedPoint.h +++ b/src/ecda/Secp256k1CompressedPoint.h @@ -37,6 +37,8 @@ class Secp256k1CompressedPoint : public IBlockObject { virtual IBlockObject* copyData() const noexcept; + int compareTo(const Secp256k1CompressedPoint* other); + private: uint8_t prefix; BigInteger x; diff --git a/src_db/btree/NodePosition.cpp b/src_db/btree/NodePosition.cpp index 58ab958..89d4b99 100644 --- a/src_db/btree/NodePosition.cpp +++ b/src_db/btree/NodePosition.cpp @@ -143,11 +143,23 @@ uint64_t NodePosition::getNextChildPrevious(const AbstractBtreeKey* key) { for(int i = maxLoop - 1; i >= 0; --i){ NodeHandle* nh = this->innerNodes->get(i); - if(key->compareTo(nh->getKey()) <= 0){ + if(key->compareTo(nh->getKey()) == 0){ ret = nh->getFpos(); this->pos = i - 1; break; } + else if(key->compareTo(nh->getKey()) > 0){ + nh = this->innerNodes->get(i + 1); + ret = nh->getFpos(); + this->pos = i; + break; + } + } + + if(ret == 0){ + NodeHandle* nh = this->innerNodes->get(0); + ret = nh->getFpos(); + this->pos = -1; } return ret; diff --git a/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.cpp b/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.cpp index 6e4ef57..bb18d9b 100644 --- a/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.cpp +++ b/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.cpp @@ -47,6 +47,15 @@ CdbDatabaseSessionId* CdbDatabaseSessionId::createRandomId() { return id; } +CdbDatabaseSessionId* CdbDatabaseSessionId::from32BytesId(const Abstract32BytesId *id) { + ByteBuffer* buff = id->getByteBuffer(); + + char *binary = (char*)buff->array(); + int length = buff->capacity(); + + return new CdbDatabaseSessionId(binary, length); +} + int CdbDatabaseSessionId::binarySize() const { return Abstract32BytesId::binarySize(); } @@ -55,7 +64,7 @@ void CdbDatabaseSessionId::toBinary(ByteBuffer *out) const { Abstract32BytesId::toBinary(out); } -CdbDatabaseSessionId* CdbDatabaseSessionId::fromBinary(ByteBuffer *in) { +CdbDatabaseSessionId* CdbDatabaseSessionId::createFromBinary(ByteBuffer *in) { CdbDatabaseSessionId* sessionId = new CdbDatabaseSessionId(); int cap = in->getInt(); diff --git a/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.h b/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.h index 6688506..de986c6 100644 --- a/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.h +++ b/src_smartcontract_db/trx/session/base/CdbDatabaseSessionId.h @@ -20,10 +20,11 @@ class CdbDatabaseSessionId : public Abstract32BytesId { virtual ~CdbDatabaseSessionId(); static CdbDatabaseSessionId* createRandomId(); + static CdbDatabaseSessionId* from32BytesId(const Abstract32BytesId* id); virtual int binarySize() const; virtual void toBinary(ByteBuffer* out) const; - static CdbDatabaseSessionId* fromBinary(ByteBuffer* in); + static CdbDatabaseSessionId* createFromBinary(ByteBuffer* in); virtual IBlockObject* copyData() const noexcept; diff --git a/src_smartcontract_db/trx/session/base/UndoIds.cpp b/src_smartcontract_db/trx/session/base/UndoIds.cpp index e4293f4..8b542ce 100644 --- a/src_smartcontract_db/trx/session/base/UndoIds.cpp +++ b/src_smartcontract_db/trx/session/base/UndoIds.cpp @@ -70,7 +70,7 @@ void UndoIds::toBinary(ByteBuffer *out) const { } void UndoIds::fromBinary(ByteBuffer *in) { - this->lastSessionId = CdbDatabaseSessionId::fromBinary(in); + this->lastSessionId = CdbDatabaseSessionId::createFromBinary(in); BinaryUtils::checkNotNull(this->lastSessionId); this->maxTransactionId = in->getLong(); diff --git a/src_smartcontract_db/trx/session/repo/UndoLogsIdkey.cpp b/src_smartcontract_db/trx/session/repo/UndoLogsIdkey.cpp index 86ad465..2c5a212 100644 --- a/src_smartcontract_db/trx/session/repo/UndoLogsIdkey.cpp +++ b/src_smartcontract_db/trx/session/repo/UndoLogsIdkey.cpp @@ -57,7 +57,7 @@ void UndoLogsIdkey::toBinary(ByteBuffer *out) const { UndoLogsIdkey* UndoLogsIdkey::fromBinary(ByteBuffer *in) { UndoLogsIdkey* key = new UndoLogsIdkey(); - key->sessionId = CdbDatabaseSessionId::fromBinary(in); + key->sessionId = CdbDatabaseSessionId::createFromBinary(in); BinaryUtils::checkNotNull(key->sessionId); key->undoLogSerial = CdbOid::fromBinary(in); diff --git a/src_smartcontract_modular/CMakeLists.txt b/src_smartcontract_modular/CMakeLists.txt index ae425fd..7125e70 100644 --- a/src_smartcontract_modular/CMakeLists.txt +++ b/src_smartcontract_modular/CMakeLists.txt @@ -6,6 +6,7 @@ add_subdirectory(modular_project) add_subdirectory(modular_project_registory) add_subdirectory(smartcontract_cache) add_subdirectory(smartcontract_executor) +add_subdirectory(smartcontract_executor_index) add_subdirectory(smartcontract_instance) add_subdirectory(transaction) diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp index 416f9ea..f99ef5f 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp @@ -46,6 +46,12 @@ ModularSmartcontractProject::~ModularSmartcontractProject() { } void ModularSmartcontractProject::loadProject() { + if(this->config == nullptr){ + __loadProject(); + } +} + +void ModularSmartcontractProject::__loadProject() { File* projectConfig = this->baseDir->get(PROJECT_CONFIG_FILE_NAME); __STP(projectConfig); this->config = new ModularProjectConfig(); @@ -135,5 +141,4 @@ ModularSmartcontractInstance* ModularSmartcontractProject::toInstance() const { return __STP_MV(instance); } - } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h index 9366e9f..a007a3f 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h @@ -37,7 +37,13 @@ class ModularSmartcontractProject { ModularSmartcontractInstance* toInstance() const; + const File* getProjectBaseDir() const noexcept { + return this->baseDir; + } + private: + void __loadProject(); + void loadExecutable(const UnicodeString* path); void loadLibrary(const File* libraryPath, const UnicodeString* libname); diff --git a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt index d30afd4..a795117 100644 --- a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt @@ -1,6 +1,7 @@ set(__src + InstanceSpace.cpp MolularSmartcontractCacheManager.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_cache) diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp new file mode 100644 index 0000000..248e35c --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp @@ -0,0 +1,23 @@ +/* + * InstanceSpace.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_cache/InstanceSpace.h" + +namespace codablecash { + +InstanceSpace::InstanceSpace() { + this->instance = nullptr; + + // TODO Auto-generated constructor stub + +} + +InstanceSpace::~InstanceSpace() { + delete this->instance; +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h new file mode 100644 index 0000000..bd4b340 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h @@ -0,0 +1,26 @@ +/* + * InstanceSpace.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_CACHE_INSTANCESPACE_H_ +#define SMARTCONTRACT_CACHE_INSTANCESPACE_H_ + +namespace codablecash { + +class ModularSmartcontractInstance; + +class InstanceSpace { +public: + InstanceSpace(); + virtual ~InstanceSpace(); + +private: + ModularSmartcontractInstance* instance; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_CACHE_INSTANCESPACE_H_ */ diff --git a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp index 9ec5103..813b170 100644 --- a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp +++ b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp @@ -14,7 +14,7 @@ MolularSmartcontractCacheManager::MolularSmartcontractCacheManager() { } MolularSmartcontractCacheManager::~MolularSmartcontractCacheManager() { - // TODO Auto-generated destructor stub + } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt b/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt index f19b5d5..56cc3db 100644 --- a/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt @@ -2,6 +2,11 @@ set(__src ModularSmartcontractExecutor.cpp + SmartcontractExecContextData.cpp + SmartcontractExecContextDataFactory.cpp + SmartcontractExecContextKey.cpp + SmartcontractExecContextKeyFactory.cpp + SmartcontractExecContextRegistory.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_executor) diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp index 4241a10..6f13cdc 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp @@ -6,15 +6,44 @@ */ #include "smartcontract_executor/ModularSmartcontractExecutor.h" +#include "smartcontract_executor/SmartcontractExecContextRegistory.h" +#include "smartcontract_executor_index/InstanceIdIndex.h" + +#include "modular_project/ModularSmartcontractProject.h" + +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" + +#include "smartcontract_instance/ModularSmartcontractInstance.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "base_io/File.h" -namespace codablecash { -ModularSmartcontractExecutor::ModularSmartcontractExecutor() { +namespace codablecash { +ModularSmartcontractExecutor::ModularSmartcontractExecutor(const File* base) { + this->baseDir = base->get(DIR_NAME); + this->projectRegistory = new ModularSmartcontractProjectRegistory(this->baseDir); + this->execContextRegistory = new SmartcontractExecContextRegistory(this->baseDir); + this->instanceIndex = new InstanceIdIndex(this->baseDir); } ModularSmartcontractExecutor::~ModularSmartcontractExecutor() { - // TODO Auto-generated destructor stub + delete this->projectRegistory; + delete this->execContextRegistory; + delete this->instanceIndex; + delete this->baseDir; +} + +void ModularSmartcontractExecutor::registerModularSmartcontractProject(ModularSmartcontractProject *project) { + project->loadProject(); + + ModularSmartcontractInstance* inst = project->toInstance(); __STP(inst); + inst->loadCompilantUnits(this->baseDir); + + } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h index a25ed59..c0acdf8 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h @@ -8,12 +8,33 @@ #ifndef SMARTCONTRACT_EXECUTOR_MODULARSMARTCONTRACTEXECUTOR_H_ #define SMARTCONTRACT_EXECUTOR_MODULARSMARTCONTRACTEXECUTOR_H_ +namespace alinous { +class UnicodeString; +class File; +} +using namespace alinous; + namespace codablecash { +class ModularSmartcontractProjectRegistory; +class SmartcontractExecContextRegistory; +class InstanceIdIndex; +class ModularSmartcontractProject; + class ModularSmartcontractExecutor { public: - ModularSmartcontractExecutor(); + static const constexpr wchar_t* DIR_NAME{L"contract_exec"}; + + explicit ModularSmartcontractExecutor(const File* base); virtual ~ModularSmartcontractExecutor(); + + void registerModularSmartcontractProject(ModularSmartcontractProject* project); + +private: + File* baseDir; + ModularSmartcontractProjectRegistory* projectRegistory; + SmartcontractExecContextRegistory* execContextRegistory; + InstanceIdIndex* instanceIndex; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.cpp new file mode 100644 index 0000000..2dca601 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.cpp @@ -0,0 +1,90 @@ +/* + * SmartcontractExecContextData.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecContextData.h" + +#include "bc_trx/TransactionId.h" + +#include "trx/session/base/CdbDatabaseSessionId.h" + +#include "bc_block/BlockHeaderId.h" + +#include "bc_base/BinaryUtils.h" + +#include "base/StackRelease.h" + +namespace codablecash { + +SmartcontractExecContextData::SmartcontractExecContextData(const SmartcontractExecContextData &inst) { + this->height = inst.height; + + this->lastHeight = inst.lastHeight; + this->lastBlockHeaderId = inst.lastBlockHeaderId != nullptr ? dynamic_cast(inst.lastBlockHeaderId->copyData()) : nullptr; + this->lastTrxId = inst.lastTrxId != nullptr ? dynamic_cast(inst.lastTrxId->copyData()) : nullptr; + this->finalized = false; +} + +SmartcontractExecContextData::SmartcontractExecContextData() { + this->height = 0; + + this->lastHeight = 0; + this->lastBlockHeaderId = nullptr; + this->lastTrxId = nullptr; + this->finalized = false; +} + +SmartcontractExecContextData::~SmartcontractExecContextData() { + delete this->lastBlockHeaderId; + delete this->lastTrxId; +} + +int SmartcontractExecContextData::binarySize() const { + BinaryUtils::checkNotNull(this->lastBlockHeaderId); + BinaryUtils::checkNotNull(this->lastTrxId); + + int total = sizeof(this->height); + + total += sizeof(this->lastHeight); + total += this->lastBlockHeaderId->binarySize(); + total += this->lastTrxId->binarySize(); + total += sizeof(uint8_t); + + return total; +} + +void SmartcontractExecContextData::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->lastBlockHeaderId); + BinaryUtils::checkNotNull(this->lastTrxId); + + out->putLong(this->height); + + out->putLong(this->lastHeight); + this->lastBlockHeaderId->toBinary(out); + this->lastTrxId->toBinary(out); + out->put(this->finalized ? 1 : 0); +} + +SmartcontractExecContextData* SmartcontractExecContextData::createFromBinary(ByteBuffer *in) { + SmartcontractExecContextData* inst = new SmartcontractExecContextData(); __STP(inst); + + inst->height = in->getLong(); + + inst->lastHeight = in->getLong(); + inst->lastBlockHeaderId = BlockHeaderId::fromBinary(in); + inst->lastTrxId = CdbDatabaseSessionId::createFromBinary(in); + + uint8_t bl = in->get(); + inst->finalized = (bl > 0); + + return __STP_MV(inst); +} + +IBlockObject* SmartcontractExecContextData::copyData() const noexcept { + return new SmartcontractExecContextData(*this); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.h new file mode 100644 index 0000000..bf157cc --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextData.h @@ -0,0 +1,47 @@ +/* + * SmartcontractExecContextData.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATA_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATA_H_ +#include + +#include "filestore_block/IBlockObject.h" + +using namespace alinous; + +namespace codablecash { + +class CdbDatabaseSessionId; +class BlockHeaderId; + +class SmartcontractExecContextData : public IBlockObject { +public: + SmartcontractExecContextData(const SmartcontractExecContextData& inst); + SmartcontractExecContextData(); + virtual ~SmartcontractExecContextData(); + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static SmartcontractExecContextData* createFromBinary(ByteBuffer *in); + + virtual IBlockObject* copyData() const noexcept; + +private: + uint64_t height; + + uint64_t lastHeight; + BlockHeaderId* lastBlockHeaderId; + CdbDatabaseSessionId* lastTrxId; // = SessionId + + // snapshot + bool finalized; + +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATA_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.cpp new file mode 100644 index 0000000..780a754 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.cpp @@ -0,0 +1,32 @@ +/* + * SmartcontractExecContextDataFactory.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecContextDataFactory.h" +#include "smartcontract_executor/SmartcontractExecContextData.h" + +#include "base_io/ByteBuffer.h" + + +namespace codablecash { + +SmartcontractExecContextDataFactory::SmartcontractExecContextDataFactory() { + +} + +SmartcontractExecContextDataFactory::~SmartcontractExecContextDataFactory() { + +} + +IBlockObject* SmartcontractExecContextDataFactory::makeDataFromBinary(ByteBuffer *in) { + return SmartcontractExecContextData::createFromBinary(in); +} + +AbstractBtreeDataFactory* SmartcontractExecContextDataFactory::copy() const noexcept { + return new SmartcontractExecContextDataFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.h new file mode 100644 index 0000000..5e7ce4d --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextDataFactory.h @@ -0,0 +1,28 @@ +/* + * SmartcontractExecContextDataFactory.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATAFACTORY_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATAFACTORY_H_ + +#include "btree/AbstractBtreeDataFactory.h" + +using namespace alinous; + +namespace codablecash { + +class SmartcontractExecContextDataFactory : public AbstractBtreeDataFactory { +public: + SmartcontractExecContextDataFactory(); + virtual ~SmartcontractExecContextDataFactory(); + + virtual IBlockObject* makeDataFromBinary(ByteBuffer* in); + virtual AbstractBtreeDataFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTDATAFACTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.cpp new file mode 100644 index 0000000..9264d09 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.cpp @@ -0,0 +1,79 @@ +/* + * SmartcontractExecContextKey.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecContextKey.h" +#include "smartcontract_executor/SmartcontractExecContextKeyFactory.h" + +#include "trx/session/base/CdbDatabaseSessionId.h" + +#include "bc_base/BinaryUtils.h" + +#include "base/StackRelease.h" + +namespace codablecash { + +SmartcontractExecContextKey::SmartcontractExecContextKey(const SmartcontractExecContextKey &inst) { + this->trxId = inst.trxId != nullptr ? dynamic_cast(inst.trxId->copyData()) : nullptr; +} + +SmartcontractExecContextKey::SmartcontractExecContextKey() { + this->trxId = nullptr; +} + +SmartcontractExecContextKey::~SmartcontractExecContextKey() { + delete this->trxId; +} + +int SmartcontractExecContextKey::binarySize() const { + BinaryUtils::checkNotNull(this->trxId); + + int size = sizeof(uint32_t); + size += this->trxId->binarySize(); + + return size; +} + +void SmartcontractExecContextKey::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->trxId); + + out->putInt(SmartcontractExecContextKeyFactory::SMARTCONTRACT_EXEC_ID_KEY); + this->trxId->toBinary(out); +} + +SmartcontractExecContextKey* SmartcontractExecContextKey::fromBinary(ByteBuffer *in) { + CdbDatabaseSessionId* trxId = CdbDatabaseSessionId::createFromBinary(in); __STP(trxId); + + SmartcontractExecContextKey* key = new SmartcontractExecContextKey(); + key->setTransactionId(trxId); + + return key; +} + +int SmartcontractExecContextKey::compareTo(const AbstractBtreeKey *key) const noexcept { + if(key->isInfinity()){ + return -1; + } + else if(key->isNull()){ + return 1; + } + + const SmartcontractExecContextKey* other = dynamic_cast(key); + assert(other != nullptr); + + return this->trxId->compareTo(other->trxId); +} + +AbstractBtreeKey* SmartcontractExecContextKey::clone() const noexcept { + return new SmartcontractExecContextKey(*this); +} + +void SmartcontractExecContextKey::setTransactionId(const CdbDatabaseSessionId *trxId) { + delete this->trxId; + this->trxId = dynamic_cast(trxId->copyData()); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.h new file mode 100644 index 0000000..f6c2728 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKey.h @@ -0,0 +1,45 @@ +/* + * SmartcontractExecContextKey.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEY_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEY_H_ +#include + + +#include "btree/AbstractBtreeKey.h" + +using namespace alinous; + +namespace codablecash { + +class CdbDatabaseSessionId; + +class SmartcontractExecContextKey : public AbstractBtreeKey { +public: + SmartcontractExecContextKey(const SmartcontractExecContextKey& inst); + SmartcontractExecContextKey(); + virtual ~SmartcontractExecContextKey(); + + virtual bool isInfinity() const { return false; } + virtual bool isNull() const { return false; } + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static SmartcontractExecContextKey* fromBinary(ByteBuffer* in); + + virtual int compareTo(const AbstractBtreeKey* key) const noexcept; + virtual AbstractBtreeKey* clone() const noexcept; + + void setTransactionId(const CdbDatabaseSessionId* trxId); + +private: + CdbDatabaseSessionId* trxId; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.cpp new file mode 100644 index 0000000..2329504 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.cpp @@ -0,0 +1,34 @@ +/* + * SmartcontractExecContextKeyFactory.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecContextKeyFactory.h" +#include "smartcontract_executor/SmartcontractExecContextKey.h" + + +namespace codablecash { + +SmartcontractExecContextKeyFactory::SmartcontractExecContextKeyFactory() { + +} + +SmartcontractExecContextKeyFactory::~SmartcontractExecContextKeyFactory() { + +} + +AbstractBtreeKey* SmartcontractExecContextKeyFactory::fromBinary(uint32_t keyType, ByteBuffer *in) const { + if(keyType == SMARTCONTRACT_EXEC_ID_KEY){ + return SmartcontractExecContextKey::fromBinary(in); + } + + return BtreeKeyFactory::fromBinary(keyType, in); +} + +BtreeKeyFactory* SmartcontractExecContextKeyFactory::copy() const noexcept { + return new SmartcontractExecContextKeyFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.h new file mode 100644 index 0000000..e557a2b --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextKeyFactory.h @@ -0,0 +1,30 @@ +/* + * SmartcontractExecContextKeyFactory.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEYFACTORY_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEYFACTORY_H_ + +#include "btreekey/BtreeKeyFactory.h" + +using namespace alinous; + +namespace codablecash { + +class SmartcontractExecContextKeyFactory : public BtreeKeyFactory { +public: + static const constexpr uint32_t SMARTCONTRACT_EXEC_ID_KEY{0x24}; + + SmartcontractExecContextKeyFactory(); + virtual ~SmartcontractExecContextKeyFactory(); + + virtual AbstractBtreeKey* fromBinary(uint32_t keyType, ByteBuffer* in) const; + virtual BtreeKeyFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTKEYFACTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.cpp new file mode 100644 index 0000000..3a14aee --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.cpp @@ -0,0 +1,75 @@ +/* + * SmartcontractExecContextRegistory.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecContextRegistory.h" +#include "smartcontract_executor/SmartcontractExecContextKeyFactory.h" +#include "smartcontract_executor/SmartcontractExecContextDataFactory.h" + +#include "base/StackRelease.h" +#include "base/UnicodeString.h" + +#include "base_io/File.h" + +#include "random_access_file/DiskCacheManager.h" + +#include "btree/Btree.h" +#include "btree/BtreeConfig.h" + + +namespace codablecash { + +SmartcontractExecContextRegistory::SmartcontractExecContextRegistory(const File* baseDir) { + this->baseDir = baseDir->get(DIR_NAME); + + this->cacheManager = new DiskCacheManager(); + this->dataStore = nullptr; +} + +SmartcontractExecContextRegistory::~SmartcontractExecContextRegistory() { + close(); + + delete this->baseDir; + delete this->cacheManager; +} + +void SmartcontractExecContextRegistory::createBlankDatabase() { + UnicodeString fileName(MAIN_DATA); + + SmartcontractExecContextKeyFactory* keyFactory = new SmartcontractExecContextKeyFactory(); __STP(keyFactory); + SmartcontractExecContextDataFactory* dataFactory = new SmartcontractExecContextDataFactory(); __STP(dataFactory); + + Btree btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + + BtreeConfig config; + config.nodeNumber = 8; + config.defaultSize = 1024; + config.blockSize = 32; + btree.create(&config); +} + +void SmartcontractExecContextRegistory::open() { + UnicodeString fileName(MAIN_DATA); + + SmartcontractExecContextKeyFactory* keyFactory = new SmartcontractExecContextKeyFactory(); __STP(keyFactory); + SmartcontractExecContextDataFactory* dataFactory = new SmartcontractExecContextDataFactory(); __STP(dataFactory); + + this->dataStore = new Btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + BtreeOpenConfig opconf; + opconf.numDataBuffer = 256; + opconf.numNodeBuffer = 512; + this->dataStore->open(&opconf); +} + +void SmartcontractExecContextRegistory::close() { + if(this->dataStore != nullptr){ + this->dataStore->close(); + delete this->dataStore; + this->dataStore = nullptr; + } +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.h new file mode 100644 index 0000000..5855f7d --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecContextRegistory.h @@ -0,0 +1,42 @@ +/* + * SmartcontractExecContextRegistory.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTREGISTORY_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTREGISTORY_H_ + +namespace alinous { +class UnicodeString; +class DiskCacheManager; +class Btree; +class BtreeScanner; +class File; +} +using namespace alinous; + +namespace codablecash { + +class SmartcontractExecContextRegistory { +public: + static const constexpr wchar_t* DIR_NAME{L"contexts_registory"}; + static const constexpr wchar_t* MAIN_DATA{L"main_data"}; + + explicit SmartcontractExecContextRegistory(const File* baseDir); + virtual ~SmartcontractExecContextRegistory(); + + void createBlankDatabase(); + void open(); + void close(); + +private: + File* baseDir; + DiskCacheManager* cacheManager; + Btree* dataStore; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECCONTEXTREGISTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/CMakeLists.txt b/src_smartcontract_modular/smartcontract_executor_index/CMakeLists.txt new file mode 100644 index 0000000..a1fc700 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/CMakeLists.txt @@ -0,0 +1,11 @@ + + +set(__src + InstanceIdIndex.cpp + InstanceIdIndexData.cpp + InstanceIdIndexDataFactory.cpp + InstanceIdIndexKey.cpp + InstanceIdIndexKeyFactory.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_executor_index) + diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.cpp b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.cpp new file mode 100644 index 0000000..9dab467 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.cpp @@ -0,0 +1,75 @@ +/* + * InstanceIdIndex.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor_index/InstanceIdIndex.h" +#include "smartcontract_executor_index/InstanceIdIndexDataFactory.h" +#include "smartcontract_executor_index/InstanceIdIndexKey.h" +#include "smartcontract_executor_index/InstanceIdIndexKeyFactory.h" + +#include "random_access_file/DiskCacheManager.h" + +#include "btree/Btree.h" +#include "btree/BtreeConfig.h" + +#include "base/StackRelease.h" + +#include "base_io/File.h" + + +namespace codablecash { + +InstanceIdIndex::InstanceIdIndex(const File* baseDir) { + this->baseDir = baseDir->get(DIR_NAME); + + this->cacheManager = new DiskCacheManager(); + this->dataStore = nullptr; +} + +InstanceIdIndex::~InstanceIdIndex() { + close(); + + delete this->baseDir; + delete this->cacheManager; +} + +void InstanceIdIndex::createBlankDatabase() { + UnicodeString fileName(MAIN_DATA); + + InstanceIdIndexKeyFactory* keyFactory = new InstanceIdIndexKeyFactory(); __STP(keyFactory); + InstanceIdIndexDataFactory* dataFactory = new InstanceIdIndexDataFactory(); __STP(dataFactory); + + Btree btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + + BtreeConfig config; + config.nodeNumber = 8; + config.defaultSize = 1024; + config.blockSize = 32; + btree.create(&config); +} + +void InstanceIdIndex::open() { + UnicodeString fileName(MAIN_DATA); + + InstanceIdIndexKeyFactory* keyFactory = new InstanceIdIndexKeyFactory(); __STP(keyFactory); + InstanceIdIndexDataFactory* dataFactory = new InstanceIdIndexDataFactory(); __STP(dataFactory); + + this->dataStore = new Btree(this->baseDir, &fileName, this->cacheManager, keyFactory, dataFactory); + BtreeOpenConfig opconf; + opconf.numDataBuffer = 256; + opconf.numNodeBuffer = 512; + this->dataStore->open(&opconf); +} + +void InstanceIdIndex::close() { + if(this->dataStore != nullptr){ + this->dataStore->close(); + delete this->dataStore; + this->dataStore = nullptr; + } +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.h b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.h new file mode 100644 index 0000000..29a7886 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndex.h @@ -0,0 +1,42 @@ +/* + * InstanceIdIndex.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEX_H_ +#define SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEX_H_ + +namespace alinous { +class UnicodeString; +class DiskCacheManager; +class Btree; +class BtreeScanner; +class File; +} +using namespace alinous; + +namespace codablecash { + +class InstanceIdIndex { +public: + static const constexpr wchar_t* DIR_NAME{L"instanceid_index"}; + static const constexpr wchar_t* MAIN_DATA{L"main_data"}; + + explicit InstanceIdIndex(const File* baseDir); + virtual ~InstanceIdIndex(); + + void createBlankDatabase(); + void open(); + void close(); + +private: + File* baseDir; + DiskCacheManager* cacheManager; + Btree* dataStore; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEX_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.cpp b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.cpp new file mode 100644 index 0000000..61abecd --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.cpp @@ -0,0 +1,57 @@ +/* + * InstanceIdIndexData.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor_index/InstanceIdIndexData.h" + +#include "trx/session/base/CdbDatabaseSessionId.h" + +#include "bc_base/BinaryUtils.h" + +#include "base/StackRelease.h" + + +namespace codablecash { + +InstanceIdIndexData::InstanceIdIndexData(const InstanceIdIndexData &inst) { + this->trxId = inst.trxId != nullptr ? dynamic_cast(inst.trxId->copyData()) : nullptr; +} + +InstanceIdIndexData::InstanceIdIndexData() { + this->trxId = nullptr; +} + +InstanceIdIndexData::InstanceIdIndexData(CdbDatabaseSessionId *id) { + this->trxId = id != nullptr ? dynamic_cast(id->copyData()) : nullptr; +} + +InstanceIdIndexData::~InstanceIdIndexData() { + delete this->trxId; +} + +int InstanceIdIndexData::binarySize() const { + BinaryUtils::checkNotNull(this->trxId); + + return this->trxId->binarySize(); +} + +void InstanceIdIndexData::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->trxId); + + this->trxId->toBinary(out); +} + +InstanceIdIndexData* InstanceIdIndexData::createFromBinary(ByteBuffer *in) { + CdbDatabaseSessionId* id = CdbDatabaseSessionId::createFromBinary(in); __STP(id); + + return new InstanceIdIndexData(id); +} + +IBlockObject* InstanceIdIndexData::copyData() const noexcept { + return new InstanceIdIndexData(*this); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.h b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.h new file mode 100644 index 0000000..c4d14d9 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexData.h @@ -0,0 +1,39 @@ +/* + * InstanceIdIndexData.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATA_H_ +#define SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATA_H_ + +#include "filestore_block/IBlockObject.h" + +using namespace alinous; + +namespace codablecash { + +class CdbDatabaseSessionId; + +class InstanceIdIndexData : public IBlockObject { +public: + InstanceIdIndexData(const InstanceIdIndexData& inst); + InstanceIdIndexData(); + InstanceIdIndexData(CdbDatabaseSessionId* id); + + virtual ~InstanceIdIndexData(); + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static InstanceIdIndexData* createFromBinary(ByteBuffer *in); + + virtual IBlockObject* copyData() const noexcept; + +private: + CdbDatabaseSessionId* trxId; // = SessionId +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATA_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.cpp b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.cpp new file mode 100644 index 0000000..ff08014 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.cpp @@ -0,0 +1,31 @@ +/* + * InstanceIdIndexDataFactory.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor_index/InstanceIdIndexDataFactory.h" +#include "smartcontract_executor_index/InstanceIdIndexData.h" + + +namespace codablecash { + +InstanceIdIndexDataFactory::InstanceIdIndexDataFactory() { + + +} + +InstanceIdIndexDataFactory::~InstanceIdIndexDataFactory() { + +} + +IBlockObject* InstanceIdIndexDataFactory::makeDataFromBinary(ByteBuffer *in) { + return InstanceIdIndexData::createFromBinary(in); +} + +AbstractBtreeDataFactory* InstanceIdIndexDataFactory::copy() const noexcept { + return new InstanceIdIndexDataFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.h b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.h new file mode 100644 index 0000000..7a41716 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexDataFactory.h @@ -0,0 +1,28 @@ +/* + * InstanceIdIndexDataFactory.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATAFACTORY_H_ +#define SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATAFACTORY_H_ + +#include "btree/AbstractBtreeDataFactory.h" + +using namespace alinous; + +namespace codablecash { + +class InstanceIdIndexDataFactory : public AbstractBtreeDataFactory { +public: + InstanceIdIndexDataFactory(); + virtual ~InstanceIdIndexDataFactory(); + + virtual IBlockObject* makeDataFromBinary(ByteBuffer* in); + virtual AbstractBtreeDataFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXDATAFACTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.cpp b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.cpp new file mode 100644 index 0000000..96049cc --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.cpp @@ -0,0 +1,90 @@ +/* + * InstanceIdIndexKey.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor_index/InstanceIdIndexKey.h" +#include "smartcontract_executor_index/InstanceIdIndexKeyFactory.h" + +#include "transaction/SmartcontractInstanceAddress.h" + +#include "btree/AbstractBtreeKey.h" + +#include "btreekey/ULongKey.h" + +#include "bc_base/BinaryUtils.h" +#include "bc_base/AbstractAddress.h" + +#include "base_io/ByteBuffer.h" + +#include "base/StackRelease.h" + +namespace codablecash { + +InstanceIdIndexKey::InstanceIdIndexKey() { + this->instanceAddress = nullptr; + this->height = 0; +} + +InstanceIdIndexKey::InstanceIdIndexKey(const SmartcontractInstanceAddress *instanceAddress, uint64_t height) { + this->instanceAddress = instanceAddress != nullptr ? dynamic_cast(instanceAddress->copyData()) : nullptr; + this->height = height; +} + +InstanceIdIndexKey::~InstanceIdIndexKey() { + delete this->instanceAddress; +} + +int InstanceIdIndexKey::binarySize() const { + BinaryUtils::checkNotNull(this->instanceAddress); + + int size = sizeof(uint32_t); + size += this->instanceAddress->binarySize(); + size += sizeof(uint64_t); + + return size; +} + +void InstanceIdIndexKey::toBinary(ByteBuffer *out) const { + BinaryUtils::checkNotNull(this->instanceAddress); + + out->putInt(InstanceIdIndexKeyFactory::INSTANCE_INDEX_KEY); + this->instanceAddress->toBinary(out); + out->putLong(this->height); +} + +InstanceIdIndexKey* InstanceIdIndexKey::fromBinary(ByteBuffer *in) { + AbstractAddress* address = SmartcontractInstanceAddress::createFromBinary(in); __STP(address); + SmartcontractInstanceAddress* contractAddress = dynamic_cast(address); + BinaryUtils::checkNotNull(contractAddress); + + uint64_t height = in->getLong(); + + return new InstanceIdIndexKey(contractAddress, height); +} + +int InstanceIdIndexKey::compareTo(const AbstractBtreeKey *key) const noexcept { + if(key->isInfinity()){ + return -1; + } + else if(key->isNull()){ + return 1; + } + + const InstanceIdIndexKey* other = dynamic_cast(key); + assert(other != nullptr); + + return this->instanceAddress->compareTo(other->instanceAddress); +} + +AbstractBtreeKey* InstanceIdIndexKey::clone() const noexcept { + return new InstanceIdIndexKey(this->instanceAddress, this->height); +} + +void InstanceIdIndexKey::setHeight(uint64_t height) { + this->height = height; +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.h b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.h new file mode 100644 index 0000000..56ef71e --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKey.h @@ -0,0 +1,48 @@ +/* + * InstanceIdIndexKey.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEY_H_ +#define SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEY_H_ + +#include "btree/AbstractBtreeKey.h" + +namespace alinous { +class AbstractBtreeKey; +} +using namespace alinous; + +namespace codablecash { + +class SmartcontractInstanceAddress; + +class InstanceIdIndexKey : public AbstractBtreeKey { +public: + InstanceIdIndexKey(); + InstanceIdIndexKey(const SmartcontractInstanceAddress* instanceAddress, uint64_t height); + virtual ~InstanceIdIndexKey(); + + virtual bool isInfinity() const { return false; } + virtual bool isNull() const { return false; } + + virtual int binarySize() const; + virtual void toBinary(ByteBuffer* out) const; + static InstanceIdIndexKey* fromBinary(ByteBuffer* in); + + virtual int compareTo(const AbstractBtreeKey* key) const noexcept; + virtual AbstractBtreeKey* clone() const noexcept; + + void setHeight(uint64_t height); + + +private: + SmartcontractInstanceAddress* instanceAddress; + uint64_t height; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.cpp b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.cpp new file mode 100644 index 0000000..0f22d17 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.cpp @@ -0,0 +1,34 @@ +/* + * InstanceIdIndexKeyFactory.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor_index/InstanceIdIndexKeyFactory.h" +#include "smartcontract_executor_index/InstanceIdIndexKey.h" + + +namespace codablecash { + +InstanceIdIndexKeyFactory::InstanceIdIndexKeyFactory() { + +} + +InstanceIdIndexKeyFactory::~InstanceIdIndexKeyFactory() { + +} + +AbstractBtreeKey* InstanceIdIndexKeyFactory::fromBinary(uint32_t keyType, ByteBuffer *in) const { + if(keyType == INSTANCE_INDEX_KEY){ + return InstanceIdIndexKey::fromBinary(in); + } + + return BtreeKeyFactory::fromBinary(keyType, in); +} + +BtreeKeyFactory* InstanceIdIndexKeyFactory::copy() const noexcept { + return new InstanceIdIndexKeyFactory(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.h b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.h new file mode 100644 index 0000000..ad93f61 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor_index/InstanceIdIndexKeyFactory.h @@ -0,0 +1,30 @@ +/* + * InstanceIdIndexKeyFactory.h + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEYFACTORY_H_ +#define SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEYFACTORY_H_ + +#include "btreekey/BtreeKeyFactory.h" + +using namespace alinous; + +namespace codablecash { + +class InstanceIdIndexKeyFactory : public BtreeKeyFactory { +public: + static const constexpr uint32_t INSTANCE_INDEX_KEY{0x24}; + + InstanceIdIndexKeyFactory(); + virtual ~InstanceIdIndexKeyFactory(); + + virtual AbstractBtreeKey* fromBinary(uint32_t keyType, ByteBuffer* in) const; + virtual BtreeKeyFactory* copy() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_INDEX_INSTANCEIDINDEXKEYFACTORY_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index e0208fe..b5445a6 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -27,6 +27,8 @@ #include "bc/ExceptionThrower.h" #include "bc/SoftwareVersion.h" +#include "engine/CodableDatabase.h" + #include "engine/sc/SmartContract.h" #include "engine/sc/CompilationUnit.h" @@ -46,6 +48,7 @@ #include "bc_base/BinaryUtils.h" + namespace codablecash { AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) { @@ -62,6 +65,9 @@ AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) this->compile_errors = nullptr; this->mainInst = nullptr; this->dependencyHandler = new InstanceDependencyHandler(); + + this->dbDir = nullptr; + this->undodbDir = nullptr; } AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { @@ -80,6 +86,9 @@ AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { this->mainInst = nullptr; delete this->dependencyHandler; + + delete this->dbDir; + delete this->undodbDir; } void AbstractExecutableModuleInstance::setName(const UnicodeString *name) noexcept { @@ -480,4 +489,20 @@ AbstractExecutableModuleInstance* AbstractExecutableModuleInstance::createFromBi return __STP_MV(inst); } +void AbstractExecutableModuleInstance::setDatabaseDir(const File *baseDir) { + File* dbRoot = baseDir->get(this->name); __STP(dbRoot); + + this->dbDir = dbRoot->get(DB_DIR); + this->undodbDir = dbRoot->get(UNDO_DIR); +} + +void AbstractExecutableModuleInstance::createDatabase() { + CodableDatabase db; + db.createDatabase(this->dbDir, this->undodbDir); +} + +void AbstractExecutableModuleInstance::loadDatabase() { + this->vm->loadDatabase(this->dbDir, this->undodbDir); +} + } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index d3cab1d..e386de0 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -37,6 +37,9 @@ class AbstractExecutableModuleInstance { static constexpr const uint8_t TYPE_EXEC = 1; static constexpr const uint8_t TYPE_LIBRARY= 2; + static const constexpr wchar_t* DB_DIR{L"main_data"}; + static const constexpr wchar_t* UNDO_DIR{L"undo_data"}; + explicit AbstractExecutableModuleInstance(uint8_t kind); virtual ~AbstractExecutableModuleInstance(); @@ -81,6 +84,11 @@ class AbstractExecutableModuleInstance { static AbstractExecutableModuleInstance* createFromBinary(ByteBuffer* in); + // database + void setDatabaseDir(const File* baseDir); + void createDatabase(); + void loadDatabase(); + protected: void resetContract(); void parseSourceFolders(const File *projectBaseDir); @@ -109,6 +117,10 @@ class AbstractExecutableModuleInstance { const ArrayList* compile_errors; InstanceDependencyHandler* dependencyHandler; + + // database + File* dbDir; + File* undodbDir; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 8a8fb0a..9628a9a 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -12,6 +12,8 @@ #include "modular_project_registory/SmartcontractProjectData.h" #include "modular_project/ModularProjectConfig.h" +#include "modular_project/SmartcontractProjectId.h" +#include "modular_project_registory/ProjectIdKey.h" #include "base/StackRelease.h" #include "base/UnicodeString.h" @@ -23,12 +25,14 @@ #include "bc_base/BinaryUtils.h" #include "base_io/ByteBuffer.h" - -#include "modular_project/SmartcontractProjectId.h" +#include "base_io/File.h" #include "crypto/Sha256.h" -#include "modular_project_registory/ProjectIdKey.h" +#include "engine/CodableDatabase.h" + +#include "transaction/SmartcontractInstanceAddress.h" + namespace codablecash { ModularSmartcontractInstance::ModularSmartcontractInstance() { @@ -36,6 +40,7 @@ ModularSmartcontractInstance::ModularSmartcontractInstance() { this->execModule = nullptr; this->libraries = new HashMap(); this->libArray = new ArrayList(); + this->instanceAddress = nullptr; } ModularSmartcontractInstance::~ModularSmartcontractInstance() { @@ -54,6 +59,8 @@ ModularSmartcontractInstance::~ModularSmartcontractInstance() { delete this->libraries; delete this->libArray; + + delete this->instanceAddress; } void ModularSmartcontractInstance::setModularProjectConfig(const ModularProjectConfig *config) { @@ -381,6 +388,16 @@ SmartcontractProjectData* ModularSmartcontractInstance::createData() const { return __STP_MV(data); } +SmartcontractProjectId* ModularSmartcontractInstance::getProjectId() const { + ByteBuffer* buff = createBinary(); __STP(buff); + buff->position(0); + + ByteBuffer* shaBuff = Sha256::sha256(buff, true); __STP(shaBuff); + + SmartcontractProjectId* projectId = new SmartcontractProjectId((const char*)shaBuff->array(), shaBuff->capacity()); + return projectId; +} + ByteBuffer* ModularSmartcontractInstance::createBinary() const { int cap = binarySize(); ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); @@ -390,4 +407,44 @@ ByteBuffer* ModularSmartcontractInstance::createBinary() const { return __STP_MV(buff); } +void ModularSmartcontractInstance::setDatabaseDir(const File *baseDir) { + SmartcontractProjectId* projectId = getProjectId(); __STP(projectId); + UnicodeString* strProjectId = projectId->toString(); __STP(strProjectId); + + File* dbRoot = baseDir->get(strProjectId); __STP(dbRoot); + + this->execModule->setDatabaseDir(dbRoot); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = this->libArray->get(i); + lib->setDatabaseDir(dbRoot); + } +} + +void ModularSmartcontractInstance::createDatabase() { + this->execModule->createDatabase(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = this->libArray->get(i); + lib->createDatabase(); + } +} + +void ModularSmartcontractInstance::loadDatabase() { + this->execModule->loadDatabase(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = this->libArray->get(i); + lib->loadDatabase(); + } +} + +void ModularSmartcontractInstance::setSmartcontractInstanceAddress(const SmartcontractInstanceAddress *address) { + delete this->instanceAddress; + this->instanceAddress = dynamic_cast(address->copyData()); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 35231a3..4450e5b 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -24,9 +24,15 @@ class ModularProjectConfig; class ExecutableModuleInstance; class LibraryExectableModuleInstance; class SmartcontractProjectData; +class SmartcontractProjectId; +class SmartcontractInstanceAddress; + class ModularSmartcontractInstance { public: + static const constexpr wchar_t* DB_DIR{L"main_data"}; + static const constexpr wchar_t* UNDO_DIR{L"undo_data"}; + ModularSmartcontractInstance(); virtual ~ModularSmartcontractInstance(); @@ -47,6 +53,11 @@ class ModularSmartcontractInstance { void resetRootReference(); + // database + void setDatabaseDir(const File* baseDir); + void createDatabase(); + void loadDatabase(); + // binary int binarySize() const; void toBinary(ByteBuffer* out) const; @@ -54,6 +65,9 @@ class ModularSmartcontractInstance { // create data SmartcontractProjectData* createData() const; + SmartcontractProjectId* getProjectId() const; + + void setSmartcontractInstanceAddress(const SmartcontractInstanceAddress* address); private: ByteBuffer* createBinary() const; @@ -78,6 +92,8 @@ class ModularSmartcontractInstance { HashMap* libraries; ArrayList* libArray; + + SmartcontractInstanceAddress* instanceAddress; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.cpp b/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.cpp index e245f31..46c3e0d 100644 --- a/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.cpp +++ b/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.cpp @@ -64,4 +64,8 @@ void AbstractSmartcontractAddress::fromBinary(ByteBuffer *in) { this->pubkey = Secp256k1CompressedPoint::fromBinary(in); } +int AbstractSmartcontractAddress::compareTo(const AbstractSmartcontractAddress *other) const noexcept { + return this->pubkey->compareTo(other->pubkey); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.h b/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.h index 809ac25..7d122e6 100644 --- a/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.h +++ b/src_smartcontract_modular/transaction/AbstractSmartcontractAddress.h @@ -26,6 +26,8 @@ class AbstractSmartcontractAddress : public AbstractAddress { virtual void toBinary(ByteBuffer* out) const; virtual void fromBinary(ByteBuffer* in); + int compareTo(const AbstractSmartcontractAddress* other) const noexcept; + protected: Secp256k1CompressedPoint* pubkey; }; diff --git a/src_test/db/db_btree/test_reverse_scan.cpp b/src_test/db/db_btree/test_reverse_scan.cpp index 588d8c0..44e283c 100644 --- a/src_test/db/db_btree/test_reverse_scan.cpp +++ b/src_test/db/db_btree/test_reverse_scan.cpp @@ -62,12 +62,12 @@ static void setUpdate(Btree& btree, RawArrayPrimitive &answers){ answers.addElement(6); answers.addElement(7); answers.addElement(8); - answers.addElement(9); + answers.addElement(9); // 5 answers.addElement(10); answers.addElement(11); answers.addElement(12); answers.addElement(13); - answers.addElement(14); + answers.addElement(14); // 10 answers.addElement(50); answers.addElement(100); } @@ -178,6 +178,31 @@ TEST(TestBTreeReverseScanGroup, case02){ CHECK(i == -1); } + { + ULongKey lkey(10); + BtreeReverseScanner* scanner = btree.getReverseScanner(); + StackRelease __st_scanner(scanner); + + scanner->begin(&lkey); + int i = 6; + while(scanner->hasPrevious()){ + const AbstractBtreeKey* k = scanner->previousKey(); + const IBlockObject* obj = scanner->previous(); + + + const TempValue* tmp = dynamic_cast(obj); + uint64_t v = tmp->getValue(); + + const ULongKey* lk = dynamic_cast(k); + uint64_t kv = lk->getValue(); + + uint64_t a = answers.get(i--); + CHECK(v == a) + CHECK(kv == a) + } + CHECK(i == -1); + } + { ULongKey lkey(1); @@ -192,6 +217,7 @@ TEST(TestBTreeReverseScanGroup, case02){ btree.close(); } +// blank TEST(TestBTreeReverseScanGroup, case03){ File projectFolder = this->env->testCaseDir(); _ST(File, baseDir, projectFolder.get(L"store")) diff --git a/src_test/smartcontract_modular/instance/CMakeLists.txt b/src_test/smartcontract_modular/instance/CMakeLists.txt index 9d6c163..c50967b 100644 --- a/src_test/smartcontract_modular/instance/CMakeLists.txt +++ b/src_test/smartcontract_modular/instance/CMakeLists.txt @@ -1,5 +1,6 @@ set(testsrc test_modular_instance.cpp + test_smartcontract_executor.cpp ) handle_sub(testall "${testsrc}" test smartcontract_modular/instance) diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index ae2c356..a436d27 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -15,6 +15,8 @@ #include "modular_project_registory/SmartcontractProjectData.h" #include "modular_project_registory/ModularSmartcontractProjectRegistory.h" +#include "trx/session/base/CdbDatabaseSessionId.h" + using namespace codablecash; @@ -59,6 +61,9 @@ TEST(TestModularInstanceGroup, case01){ } TEST(TestModularInstanceGroup, case02){ + File projectTestFolder = this->env->testCaseDir(); + _ST(File, baseTestDir, projectTestFolder.get(L"store")) + const File* projectFolder = this->env->getProjectRoot(); ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case02/project01/", projectFolder); @@ -73,6 +78,10 @@ TEST(TestModularInstanceGroup, case02){ bool res = inst->hasCompileError(); CHECK(res == false); + inst->setDatabaseDir(baseTestDir); + inst->createDatabase(); + inst->loadDatabase(); + res = inst->analyze(); CHECK(res == false); @@ -81,4 +90,11 @@ TEST(TestModularInstanceGroup, case02){ CHECK(res == false); } +TEST(TestModularInstanceGroup, generateSession01){ + CdbDatabaseSessionId* baseId = CdbDatabaseSessionId::createRandomId(); __STP(baseId); + CdbDatabaseSessionId* copy = CdbDatabaseSessionId::from32BytesId(baseId); __STP(copy); + + int cmp = baseId->compareTo(copy); + CHECK(cmp == 0); +} diff --git a/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp new file mode 100644 index 0000000..ebd2a85 --- /dev/null +++ b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp @@ -0,0 +1,49 @@ +/* + * test_smartcontract_executor.cpp + * + * Created on: Nov 28, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "test_utils/t_macros.h" + +#include "../utils/ModularProjectUtils.h" + +#include "modular_project/ModularSmartcontractProject.h" + +#include "smartcontract_instance/ModularSmartcontractInstance.h" + +#include "modular_project_registory/SmartcontractProjectData.h" +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" + +#include "trx/session/base/CdbDatabaseSessionId.h" + +#include "smartcontract_executor/ModularSmartcontractExecutor.h" + + +using namespace codablecash; + +TEST_GROUP(TestSmartcontractExecutorGroup) { + TEST_SETUP() { + env->setup(); + } + TEST_TEARDOWN() { + env->teardown(); + } +}; + +TEST(TestSmartcontractExecutorGroup, case01){ + const File* projectFolder = this->env->getProjectRoot(); + ModularProjectUtils utils(L"src_test/smartcontract_modular/project/resources/reg_case01/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + // Executor + File projectTestFolder = this->env->testCaseDir(); + _ST(File, baseTestDir, projectTestFolder.get(L"exec")) + + ModularSmartcontractExecutor executopr(baseTestDir); +} From 91e0defcb4351fb592c7b028caf8681e6555426d Mon Sep 17 00:00:00 2001 From: iizuka Date: Sun, 30 Nov 2025 20:14:12 +0800 Subject: [PATCH 08/11] modular smartcontract execution framework --- .../ModularSmartcontractProject.cpp | 12 +++ .../ModularSmartcontractProject.h | 3 + .../SmartcontractProjectData.cpp | 9 ++ .../SmartcontractProjectData.h | 3 + .../smartcontract_cache/CMakeLists.txt | 2 + .../smartcontract_cache/InstanceSpace.cpp | 23 ++++- .../smartcontract_cache/InstanceSpace.h | 13 ++- .../InstanceSpacesManager.cpp | 60 ++++++++++++ .../InstanceSpacesManager.h | 44 +++++++++ .../MolularSmartcontractCacheManager.cpp | 94 ++++++++++++++++++- .../MolularSmartcontractCacheManager.h | 29 +++++- .../ProjectNotFoundException.cpp | 21 +++++ .../ProjectNotFoundException.h | 21 +++++ .../ModularSmartcontractExecutor.cpp | 40 +++++++- .../ModularSmartcontractExecutor.h | 11 +++ .../ModularSmartcontractInstance.cpp | 46 ++++++--- .../ModularSmartcontractInstance.h | 8 ++ .../SmartcontractInstanceAddress.cpp | 15 +++ .../SmartcontractInstanceAddress.h | 1 + .../instance/CMakeLists.txt | 1 + .../instance/test_instance_spaces.cpp | 52 ++++++++++ .../instance/test_modular_instance.cpp | 6 ++ .../instance/test_smartcontract_executor.cpp | 22 ++++- 23 files changed, 508 insertions(+), 28 deletions(-) create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h create mode 100644 src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp create mode 100644 src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h create mode 100644 src_test/smartcontract_modular/instance/test_instance_spaces.cpp diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp index f99ef5f..50c31ff 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.cpp @@ -141,4 +141,16 @@ ModularSmartcontractInstance* ModularSmartcontractProject::toInstance() const { return __STP_MV(instance); } +SmartcontractProjectId* ModularSmartcontractProject::getProjectId() const { + ModularSmartcontractInstance* instance = toInstance(); __STP(instance); + instance->loadCompilantUnits(this->baseDir); + + bool res = instance->hasCompileError(); + ExceptionThrower::throwExceptionIfCondition(res == true, L"Compile error exists.", __FILE__, __LINE__); + + SmartcontractProjectId* projectId = instance->getProjectId(); + + return projectId; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h index a007a3f..31c6014 100644 --- a/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h +++ b/src_smartcontract_modular/modular_project/ModularSmartcontractProject.h @@ -22,6 +22,7 @@ class ExecutableSmartcontractModule; class LibrarySmartcontractModule; class ModularProjectConfig; class ModularSmartcontractInstance; +class SmartcontractProjectId; class ModularSmartcontractProject { public: @@ -37,6 +38,8 @@ class ModularSmartcontractProject { ModularSmartcontractInstance* toInstance() const; + SmartcontractProjectId* getProjectId() const; + const File* getProjectBaseDir() const noexcept { return this->baseDir; } diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp index dcad434..e83563c 100644 --- a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.cpp @@ -8,6 +8,8 @@ #include "modular_project_registory/SmartcontractProjectData.h" #include "modular_project_registory/ProjectIdKey.h" +#include "smartcontract_instance/ModularSmartcontractInstance.h" + #include "base_io/ByteBuffer.h" #include "base/StackRelease.h" @@ -73,4 +75,11 @@ IBlockObject* SmartcontractProjectData::copyData() const noexcept { return new SmartcontractProjectData(*this); } +ModularSmartcontractInstance* SmartcontractProjectData::toSmartcontractInstance() const { + this->projectData->position(0); + ModularSmartcontractInstance* instance = ModularSmartcontractInstance::createFromBinary(this->projectData); + + return instance; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h index 0dff0c0..bb585e5 100644 --- a/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h +++ b/src_smartcontract_modular/modular_project_registory/SmartcontractProjectData.h @@ -15,6 +15,7 @@ using namespace alinous; namespace codablecash { class ProjectIdKey; +class ModularSmartcontractInstance; class SmartcontractProjectData : public IBlockObject { public: @@ -35,6 +36,8 @@ class SmartcontractProjectData : public IBlockObject { virtual IBlockObject* copyData() const noexcept; + ModularSmartcontractInstance* toSmartcontractInstance() const; + private: ByteBuffer* projectData; ProjectIdKey* key; diff --git a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt index a795117..3304f4c 100644 --- a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt @@ -2,7 +2,9 @@ set(__src InstanceSpace.cpp + InstanceSpacesManager.cpp MolularSmartcontractCacheManager.cpp + ProjectNotFoundException.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_cache) diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp index 248e35c..db72e7b 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp @@ -7,17 +7,32 @@ #include "smartcontract_cache/InstanceSpace.h" -namespace codablecash { +#include "smartcontract_instance/ModularSmartcontractInstance.h" + -InstanceSpace::InstanceSpace() { - this->instance = nullptr; +namespace codablecash { - // TODO Auto-generated constructor stub +InstanceSpace::InstanceSpace(const SmartcontractInstanceAddress *instAddress, ModularSmartcontractInstance* instance) { + this->instance = instance; + this->instance->setSmartcontractInstanceAddress(instAddress); + this->ref = 0; } InstanceSpace::~InstanceSpace() { delete this->instance; } +bool InstanceSpace::isDeletable() const noexcept { + return this->ref == 0; +} + +void InstanceSpace::beforeCacheOut() { + this->instance->cleanDbRoot(); +} + +const SmartcontractInstanceAddress* InstanceSpace::getSmartContractInstanceAddress() const noexcept { + return this->instance->getSmartContractInstanceAddress(); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h index bd4b340..9003f9c 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h @@ -11,14 +11,25 @@ namespace codablecash { class ModularSmartcontractInstance; +class SmartcontractInstanceAddress; class InstanceSpace { public: - InstanceSpace(); + InstanceSpace(const SmartcontractInstanceAddress *instAddress, ModularSmartcontractInstance* instance); virtual ~InstanceSpace(); + bool isDeletable() const noexcept; + void beforeCacheOut(); + + const SmartcontractInstanceAddress* getSmartContractInstanceAddress() const noexcept; + + + private: ModularSmartcontractInstance* instance; + + int ref; + }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp new file mode 100644 index 0000000..9a2b86c --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp @@ -0,0 +1,60 @@ +/* + * InstanceSpacesManager.cpp + * + * Created on: Nov 30, 2025 + * Author: iizuka + */ + +#include "smartcontract_cache/InstanceSpacesManager.h" +#include "smartcontract_cache/MolularSmartcontractCacheManager.h" + +#include "smartcontract_executor/SmartcontractExecContextRegistory.h" + +#include "smartcontract_executor_index/InstanceIdIndex.h" + +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" +#include "modular_project_registory/ProjectIdKey.h" +#include "modular_project_registory/SmartcontractProjectData.h" + +#include "smartcontract_cache/InstanceSpace.h" + +#include "base/StackRelease.h" + + +namespace codablecash { + +InstanceSpacesManager::InstanceSpacesManager(const File* baseDir, SmartcontractExecContextRegistory* execContextReg + , InstanceIdIndex* instanceIdIndex, ModularSmartcontractProjectRegistory* projectReg) { + this->execContextReg = execContextReg; + this->instanceIdIndex = instanceIdIndex; + this->projectReg = projectReg; + + this->cache = new MolularSmartcontractCacheManager(1024); +} + +InstanceSpacesManager::~InstanceSpacesManager() { + this->execContextReg = nullptr; + this->instanceIdIndex = nullptr; + this->projectReg = nullptr; + + delete this->cache; +} + +InstanceSpace* InstanceSpacesManager::createInstance(const SmartcontractInstanceAddress *instAddress, const SmartcontractProjectId *projectId) { + ProjectIdKey key; + key.setProjectId(projectId); + + SmartcontractProjectData* data = this->projectReg->findProjectById(&key); __STP(data); + if(data == nullptr){ // FIXME exception + return nullptr; + } + + ModularSmartcontractInstance* instance = data->toSmartcontractInstance(); + InstanceSpace* space = new InstanceSpace(instAddress, instance); __STP(space); + + this->cache->registerInstance(space); + + return __STP_MV(space); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h new file mode 100644 index 0000000..fceb7f4 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h @@ -0,0 +1,44 @@ +/* + * InstanceSpacesManager.h + * + * Created on: Nov 30, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_CACHE_INSTANCESPACESMANAGER_H_ +#define SMARTCONTRACT_CACHE_INSTANCESPACESMANAGER_H_ + +namespace alinous { +class File; +} +using namespace alinous; + +namespace codablecash { + +class MolularSmartcontractCacheManager; +class InstanceSpace; +class SmartcontractExecContextRegistory; +class InstanceIdIndex; +class SmartcontractInstanceAddress; +class SmartcontractProjectId; +class ModularSmartcontractProjectRegistory; + +class InstanceSpacesManager { +public: + InstanceSpacesManager(const File* baseDir, SmartcontractExecContextRegistory* execContextReg + , InstanceIdIndex* instanceIdIndex, ModularSmartcontractProjectRegistory* projectReg); + virtual ~InstanceSpacesManager(); + + InstanceSpace* createInstance(const SmartcontractInstanceAddress* instAddress, const SmartcontractProjectId* projectId); + +private: + MolularSmartcontractCacheManager* cache; + + SmartcontractExecContextRegistory* execContextReg; + InstanceIdIndex* instanceIdIndex; + ModularSmartcontractProjectRegistory* projectReg; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_CACHE_INSTANCESPACESMANAGER_H_ */ diff --git a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp index 813b170..df63d6d 100644 --- a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp +++ b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp @@ -6,15 +6,105 @@ */ #include "smartcontract_cache/MolularSmartcontractCacheManager.h" +#include "smartcontract_cache/InstanceSpace.h" -namespace codablecash { +#include "base_thread/SysMutex.h" +#include "base_thread/StackUnlocker.h" + +#include "transaction/SmartcontractInstanceAddress.h" -MolularSmartcontractCacheManager::MolularSmartcontractCacheManager() { +namespace codablecash { + +MolularSmartcontractCacheManager::MolularSmartcontractCacheManager(int cacheLimit) { + this->cacheLimit = cacheLimit; + this->list = new RawLinkedList(); + this->mutex = new SysMutex(); } MolularSmartcontractCacheManager::~MolularSmartcontractCacheManager() { + removeAll(); + + delete this->list; + delete this->mutex; +} + +void MolularSmartcontractCacheManager::registerInstance(InstanceSpace *instSpace) { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + + const SmartcontractInstanceAddress* address = instSpace->getSmartContractInstanceAddress(); + InstanceSpace* inst = __getInstanceSpace(address); + assert(inst == nullptr); + + this->list->add(0, instSpace); + + __removeLast(); +} + +InstanceSpace* MolularSmartcontractCacheManager::getInstanceSpace(const SmartcontractInstanceAddress *address) { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + + InstanceSpace* inst = __getInstanceSpace(address); + if(inst != nullptr){ + int index = this->list->indexOf(inst); + this->list->remove(index); + this->list->add(inst); + } + + return inst; +} + +InstanceSpace* MolularSmartcontractCacheManager::__getInstanceSpace(const SmartcontractInstanceAddress *address) const noexcept { + InstanceSpace* instance = nullptr; + + int maxLoop = this->list->size(); + for(int i = 0; i != maxLoop; ++i){ + InstanceSpace* inst = this->list->get(i); + const SmartcontractInstanceAddress* ad = inst->getSmartContractInstanceAddress(); + + if(address->compareTo(ad)){ + instance = inst; + break; + } + } + + return instance; +} + +void MolularSmartcontractCacheManager::__removeLast() { + int size = this->list->size(); + if(size > this->cacheLimit){ + int pos = 0; + while(pos < size){ + InstanceSpace* inst = this->list->get(pos); + + if(inst->isDeletable()){ + inst->beforeCacheOut(); + this->list->remove(pos); + delete inst; + break; + } + pos++; + } + } +} + +void MolularSmartcontractCacheManager::removeAll() { + int size = cacheSize(); + + while(size > 0){ + { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + __removeLast(); + } + size = cacheSize(); + } +} + +int MolularSmartcontractCacheManager::cacheSize() const noexcept { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + return this->list->size(); } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.h b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.h index b8c99cd..c3fa42e 100644 --- a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.h +++ b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.h @@ -8,12 +8,39 @@ #ifndef SMARTCONTRACT_CACHE_MOLULARSMARTCONTRACTCACHEMANAGER_H_ #define SMARTCONTRACT_CACHE_MOLULARSMARTCONTRACTCACHEMANAGER_H_ +#include "base/RawLinkedList.h" + +namespace alinous { +class SysMutex; +} +using namespace alinous; + namespace codablecash { +class InstanceSpace; +class SmartcontractInstanceAddress; + class MolularSmartcontractCacheManager { public: - MolularSmartcontractCacheManager(); + explicit MolularSmartcontractCacheManager(int cacheLimit); virtual ~MolularSmartcontractCacheManager(); + + void registerInstance(InstanceSpace* instSpace); + + InstanceSpace* getInstanceSpace(const SmartcontractInstanceAddress* address); + + void removeAll(); + int cacheSize() const noexcept; + +private: + InstanceSpace* __getInstanceSpace(const SmartcontractInstanceAddress* address) const noexcept; + void __removeLast(); + +private: + RawLinkedList* list; + int cacheLimit; + SysMutex* mutex; + }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp new file mode 100644 index 0000000..580a565 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp @@ -0,0 +1,21 @@ +/* + * ProjectNotFoundException.cpp + * + * Created on: Nov 30, 2025 + * Author: iizuka + */ + +#include + +namespace codablecash { + +ProjectNotFoundException::ProjectNotFoundException() { + // TODO Auto-generated constructor stub + +} + +ProjectNotFoundException::~ProjectNotFoundException() { + // TODO Auto-generated destructor stub +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h new file mode 100644 index 0000000..73b3425 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h @@ -0,0 +1,21 @@ +/* + * ProjectNotFoundException.h + * + * Created on: Nov 30, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_CACHE_PROJECTNOTFOUNDEXCEPTION_H_ +#define SMARTCONTRACT_CACHE_PROJECTNOTFOUNDEXCEPTION_H_ + +namespace codablecash { + +class ProjectNotFoundException { +public: + ProjectNotFoundException(); + virtual ~ProjectNotFoundException(); +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_CACHE_PROJECTNOTFOUNDEXCEPTION_H_ */ diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp index 6f13cdc..8f0311c 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp @@ -12,15 +12,20 @@ #include "modular_project/ModularSmartcontractProject.h" #include "modular_project_registory/ModularSmartcontractProjectRegistory.h" +#include "modular_project_registory/SmartcontractProjectData.h" +#include "modular_project_registory/ProjectIdKey.h" #include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "smartcontract_cache/InstanceSpacesManager.h" + #include "base/UnicodeString.h" #include "base/StackRelease.h" #include "base_io/File.h" + namespace codablecash { ModularSmartcontractExecutor::ModularSmartcontractExecutor(const File* base) { @@ -28,6 +33,8 @@ ModularSmartcontractExecutor::ModularSmartcontractExecutor(const File* base) { this->projectRegistory = new ModularSmartcontractProjectRegistory(this->baseDir); this->execContextRegistory = new SmartcontractExecContextRegistory(this->baseDir); this->instanceIndex = new InstanceIdIndex(this->baseDir); + + this->instanceSpace = new InstanceSpacesManager(this->baseDir, this->execContextRegistory, this->instanceIndex, this->projectRegistory); } ModularSmartcontractExecutor::~ModularSmartcontractExecutor() { @@ -35,15 +42,46 @@ ModularSmartcontractExecutor::~ModularSmartcontractExecutor() { delete this->execContextRegistory; delete this->instanceIndex; delete this->baseDir; + delete this->instanceSpace; +} + +void ModularSmartcontractExecutor::createExecutor() { + this->projectRegistory->createBlankDatabase(); + this->execContextRegistory->createBlankDatabase(); + this->instanceIndex->createBlankDatabase(); +} + +void ModularSmartcontractExecutor::open() { + this->projectRegistory->open(); + this->execContextRegistory->open(); + this->instanceIndex->open(); +} + +void ModularSmartcontractExecutor::close() noexcept { + this->projectRegistory->close(); + this->execContextRegistory->close(); + this->instanceIndex->close(); } void ModularSmartcontractExecutor::registerModularSmartcontractProject(ModularSmartcontractProject *project) { project->loadProject(); ModularSmartcontractInstance* inst = project->toInstance(); __STP(inst); - inst->loadCompilantUnits(this->baseDir); + inst->loadCompilantUnits(project->getProjectBaseDir()); + bool res = inst->hasCompileError(); + + SmartcontractProjectData* data = inst->createData(); __STP(data); + + const ProjectIdKey* key = data->getKey(); + this->projectRegistory->put(key, data); +} +SmartcontractProjectData* ModularSmartcontractExecutor::getProject(const SmartcontractProjectId *projectId) { + ProjectIdKey key; + key.setProjectId(projectId); + SmartcontractProjectData* data = this->projectRegistory->findProjectById(&key); + return data; } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h index c0acdf8..f5de1aa 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h @@ -20,6 +20,9 @@ class ModularSmartcontractProjectRegistory; class SmartcontractExecContextRegistory; class InstanceIdIndex; class ModularSmartcontractProject; +class SmartcontractProjectId; +class SmartcontractProjectData; +class InstanceSpacesManager; class ModularSmartcontractExecutor { public: @@ -28,13 +31,21 @@ class ModularSmartcontractExecutor { explicit ModularSmartcontractExecutor(const File* base); virtual ~ModularSmartcontractExecutor(); + void createExecutor(); + void open(); + void close() noexcept; + void registerModularSmartcontractProject(ModularSmartcontractProject* project); + SmartcontractProjectData* getProject(const SmartcontractProjectId* projectId); private: File* baseDir; ModularSmartcontractProjectRegistory* projectRegistory; SmartcontractExecContextRegistory* execContextRegistory; InstanceIdIndex* instanceIndex; + + InstanceSpacesManager* instanceSpace; + }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 9628a9a..9878764 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -23,6 +23,8 @@ #include "bc/ExceptionThrower.h" #include "bc_base/BinaryUtils.h" +#include "bc_base/AbstractAddress.h" +#include "bc_base/AddressDescriptor.h" #include "base_io/ByteBuffer.h" #include "base_io/File.h" @@ -33,6 +35,8 @@ #include "transaction/SmartcontractInstanceAddress.h" + + namespace codablecash { ModularSmartcontractInstance::ModularSmartcontractInstance() { @@ -41,6 +45,7 @@ ModularSmartcontractInstance::ModularSmartcontractInstance() { this->libraries = new HashMap(); this->libArray = new ArrayList(); this->instanceAddress = nullptr; + this->dbRoot = nullptr; } ModularSmartcontractInstance::~ModularSmartcontractInstance() { @@ -57,10 +62,10 @@ ModularSmartcontractInstance::~ModularSmartcontractInstance() { } } delete this->libraries; - delete this->libArray; - delete this->instanceAddress; + + delete this->dbRoot; } void ModularSmartcontractInstance::setModularProjectConfig(const ModularProjectConfig *config) { @@ -370,26 +375,27 @@ ModularSmartcontractInstance* ModularSmartcontractInstance::createFromBinary(Byt SmartcontractProjectData* ModularSmartcontractInstance::createData() const { SmartcontractProjectData* data = new SmartcontractProjectData(); __STP(data); + ByteBuffer* buff = createBinary(); __STP(buff); buff->position(0); - data->setData(buff); - { - ByteBuffer* shaBuff = Sha256::sha256(buff, true); __STP(shaBuff); + SmartcontractProjectId* projectId = __getProjectId(buff); __STP(projectId); + ProjectIdKey key; + key.setProjectId(projectId); - SmartcontractProjectId projectId((const char*)shaBuff->array(), shaBuff->capacity()); - ProjectIdKey key; - key.setProjectId(&projectId); - - data->setKey(&key); - } + data->setKey(&key); return __STP_MV(data); } SmartcontractProjectId* ModularSmartcontractInstance::getProjectId() const { ByteBuffer* buff = createBinary(); __STP(buff); + + return __getProjectId(buff); +} + +SmartcontractProjectId* ModularSmartcontractInstance::__getProjectId(ByteBuffer *buff) const { buff->position(0); ByteBuffer* shaBuff = Sha256::sha256(buff, true); __STP(shaBuff); @@ -408,17 +414,27 @@ ByteBuffer* ModularSmartcontractInstance::createBinary() const { } void ModularSmartcontractInstance::setDatabaseDir(const File *baseDir) { - SmartcontractProjectId* projectId = getProjectId(); __STP(projectId); - UnicodeString* strProjectId = projectId->toString(); __STP(strProjectId); + AddressDescriptor* desc = this->instanceAddress->toAddressDescriptor(); __STP(desc); - File* dbRoot = baseDir->get(strProjectId); __STP(dbRoot); + const char* cstr = desc->toCString(); + StackArrayRelease __st_cstr(cstr); + UnicodeString seg(cstr); + + delete this->dbRoot; + this->dbRoot = baseDir->get(&seg); this->execModule->setDatabaseDir(dbRoot); int maxLoop = this->libArray->size(); for(int i = 0; i != maxLoop; ++i){ LibraryExectableModuleInstance* lib = this->libArray->get(i); - lib->setDatabaseDir(dbRoot); + lib->setDatabaseDir(this->dbRoot); + } +} + +void ModularSmartcontractInstance::cleanDbRoot() { + if(this->dbRoot != nullptr && this->dbRoot->exists()){ + this->dbRoot->deleteDir(); } } diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 4450e5b..dadff52 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -57,6 +57,7 @@ class ModularSmartcontractInstance { void setDatabaseDir(const File* baseDir); void createDatabase(); void loadDatabase(); + void cleanDbRoot(); // binary int binarySize() const; @@ -68,8 +69,13 @@ class ModularSmartcontractInstance { SmartcontractProjectId* getProjectId() const; void setSmartcontractInstanceAddress(const SmartcontractInstanceAddress* address); + const SmartcontractInstanceAddress* getSmartContractInstanceAddress() const noexcept { + return this->instanceAddress; + } private: + SmartcontractProjectId* __getProjectId(ByteBuffer* buff) const; + ByteBuffer* createBinary() const; void initBeforeAnalyze(); @@ -94,6 +100,8 @@ class ModularSmartcontractInstance { ArrayList* libArray; SmartcontractInstanceAddress* instanceAddress; + + File* dbRoot; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.cpp b/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.cpp index 45765ed..d7b3fce 100644 --- a/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.cpp +++ b/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.cpp @@ -9,6 +9,11 @@ #include "ecda/Secp256k1CompressedPoint.h" #include "ecda/ScPublicKey.h" +#include "ecda/ScPrivateKey.h" + +#include "bc_wallet/HdWalletSeed.h" + +#include "base/StackRelease.h" namespace codablecash { @@ -43,4 +48,14 @@ SmartcontractInstanceAddress* SmartcontractInstanceAddress::createAddress(uint16 return address; } +SmartcontractInstanceAddress* SmartcontractInstanceAddress::createAddress(uint16_t zone) { + HdWalletSeed* seed = HdWalletSeed::newSeed(); __STP(seed); + BigInteger* bigInt = seed->toBigInteger(); __STP(bigInt); + + ScPrivateKey* privateKey = new ScPrivateKey(bigInt, 1); __STP(privateKey); + ScPublicKey publicKey = privateKey->generatePublicKey(); + + return createAddress(zone, &publicKey); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.h b/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.h index 893b679..6fde802 100644 --- a/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.h +++ b/src_smartcontract_modular/transaction/SmartcontractInstanceAddress.h @@ -30,6 +30,7 @@ class SmartcontractInstanceAddress : public AbstractSmartcontractAddress { virtual IBlockObject* copyData() const noexcept; + static SmartcontractInstanceAddress* createAddress(uint16_t zone); static SmartcontractInstanceAddress* createAddress(uint16_t zone, const ScPublicKey* publicKey); }; diff --git a/src_test/smartcontract_modular/instance/CMakeLists.txt b/src_test/smartcontract_modular/instance/CMakeLists.txt index c50967b..2627f4f 100644 --- a/src_test/smartcontract_modular/instance/CMakeLists.txt +++ b/src_test/smartcontract_modular/instance/CMakeLists.txt @@ -1,5 +1,6 @@ set(testsrc + test_instance_spaces.cpp test_modular_instance.cpp test_smartcontract_executor.cpp ) diff --git a/src_test/smartcontract_modular/instance/test_instance_spaces.cpp b/src_test/smartcontract_modular/instance/test_instance_spaces.cpp new file mode 100644 index 0000000..8cef22d --- /dev/null +++ b/src_test/smartcontract_modular/instance/test_instance_spaces.cpp @@ -0,0 +1,52 @@ +/* + * test_instance_spaces.cpp + * + * Created on: Nov 30, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "../utils/ModularProjectUtils.h" + +#include "modular_project/ModularSmartcontractProject.h" +#include "modular_project/SmartcontractProjectId.h" + +#include "smartcontract_instance/ModularSmartcontractInstance.h" + +#include "modular_project_registory/SmartcontractProjectData.h" +#include "modular_project_registory/ModularSmartcontractProjectRegistory.h" + +#include "trx/session/base/CdbDatabaseSessionId.h" + +#include "smartcontract_executor/ModularSmartcontractExecutor.h" + + +using namespace codablecash; + +TEST_GROUP(TestInstanceSpacesrGroup) { + TEST_SETUP() { + env->setup(); + } + TEST_TEARDOWN() { + env->teardown(); + } +}; + +TEST(TestInstanceSpacesrGroup, case01) { + const File* projectFolder = this->env->getProjectRoot(); + ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case02/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + // Executor + File projectTestFolder = this->env->testCaseDir(); + _ST(File, baseTestDir, projectTestFolder.get(L"exec")) + + ModularSmartcontractExecutor executor(baseTestDir); + executor.createExecutor(); + + +} + diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index a436d27..d196e4f 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -17,6 +17,9 @@ #include "trx/session/base/CdbDatabaseSessionId.h" +#include "transaction/SmartcontractInstanceAddress.h" + + using namespace codablecash; @@ -78,6 +81,9 @@ TEST(TestModularInstanceGroup, case02){ bool res = inst->hasCompileError(); CHECK(res == false); + SmartcontractInstanceAddress* address = SmartcontractInstanceAddress::createAddress(0); __STP(address); + inst->setSmartcontractInstanceAddress(address); + inst->setDatabaseDir(baseTestDir); inst->createDatabase(); inst->loadDatabase(); diff --git a/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp index ebd2a85..82a1480 100644 --- a/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp +++ b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp @@ -6,11 +6,10 @@ */ #include "test_utils/t_macros.h" -#include "test_utils/t_macros.h" - #include "../utils/ModularProjectUtils.h" #include "modular_project/ModularSmartcontractProject.h" +#include "modular_project/SmartcontractProjectId.h" #include "smartcontract_instance/ModularSmartcontractInstance.h" @@ -35,7 +34,7 @@ TEST_GROUP(TestSmartcontractExecutorGroup) { TEST(TestSmartcontractExecutorGroup, case01){ const File* projectFolder = this->env->getProjectRoot(); - ModularProjectUtils utils(L"src_test/smartcontract_modular/project/resources/reg_case01/project01/", projectFolder); + ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case02/project01/", projectFolder); const File* baseDir = utils.getFolder(); ModularSmartcontractProject project(baseDir); @@ -45,5 +44,20 @@ TEST(TestSmartcontractExecutorGroup, case01){ File projectTestFolder = this->env->testCaseDir(); _ST(File, baseTestDir, projectTestFolder.get(L"exec")) - ModularSmartcontractExecutor executopr(baseTestDir); + ModularSmartcontractExecutor executor(baseTestDir); + executor.createExecutor(); + + { + executor.open(); + + executor.registerModularSmartcontractProject(&project); + + SmartcontractProjectId* projectId = project.getProjectId(); __STP(projectId); + SmartcontractProjectData* data = executor.getProject(projectId); __STP(data); + + CHECK(data != nullptr); + + executor.close(); + } + } From 3770f253dc639e08c4a9c15a8e3874febc03b162 Mon Sep 17 00:00:00 2001 From: iizuka Date: Sat, 6 Dec 2025 16:35:14 +0800 Subject: [PATCH 09/11] inter modular smartcontract call --- src_smartcontract/engine/sc/CodeElement.cpp | 10 +- src_smartcontract/engine/sc/CodeElement.h | 2 + src_smartcontract/engine/sc/SmartContract.cpp | 13 ++ src_smartcontract/engine/sc/SmartContract.h | 2 + .../engine/sc_analyze/AnalyzeContext.cpp | 5 + .../engine/sc_analyze/AnalyzeContext.h | 1 + .../engine/sc_analyze/ValidationError.h | 1 + .../lang/sc_declare/ClassDeclare.cpp | 12 +- .../lang/sc_declare/ClassImplements.cpp | 5 + .../lang/sc_declare/MethodDeclare.cpp | 2 + .../lang/sc_declare/MethodDeclare.h | 7 + .../lang/sc_expression/ConstructorCall.cpp | 3 + .../sc_expression/FunctionCallExpression.cpp | 3 + .../sc_expression/FunctionCallExpression.h | 2 +- src_smartcontract_modular/CMakeLists.txt | 2 + .../inter_modular_access/CMakeLists.txt | 11 ++ .../InterModuleAccessException.cpp | 86 +++++++++ .../InterModuleAccessException.h | 45 +++++ .../ModularProxyClassDeclare.cpp | 37 ++++ .../ModularProxyClassDeclare.h | 48 +++++ .../ModularProxyMethodDeclare.cpp | 123 +++++++++++++ .../ModularProxyMethodDeclare.h | 37 ++++ .../ModularProxyObjectInstanceFactory.cpp | 137 ++++++++++++++ .../ModularProxyObjectInstanceFactory.h | 45 +++++ .../ModuleProxyInstance.cpp | 21 +++ .../ModuleProxyInstance.h | 25 +++ .../modular_interfaces/CMakeLists.txt | 7 + .../ModularProxyListnerClassDeclare.cpp | 20 ++ .../ModularProxyListnerClassDeclare.h | 21 +++ .../modular_project/ModularInstanceConfig.h | 4 + .../smartcontract_cache/CMakeLists.txt | 2 + .../smartcontract_cache/InstanceSpace.cpp | 77 ++++++++ .../smartcontract_cache/InstanceSpace.h | 35 ++++ .../InstanceSpaceReleaser.cpp | 22 +++ .../InstanceSpaceReleaser.h | 26 +++ .../InstanceSpacesManager.cpp | 15 +- .../InstanceSpacesManager.h | 3 + .../ModuleSetupException.cpp | 34 ++++ .../ModuleSetupException.h | 30 +++ .../MolularSmartcontractCacheManager.cpp | 5 +- .../ProjectNotFoundException.cpp | 22 ++- .../ProjectNotFoundException.h | 13 +- .../smartcontract_executor/CMakeLists.txt | 1 + .../ModularSmartcontractExecutor.cpp | 29 ++- .../ModularSmartcontractExecutor.h | 6 + .../SmartcontractExecResult.cpp | 27 +++ .../SmartcontractExecResult.h | 34 ++++ .../AbstractExecutableModuleInstance.cpp | 171 ++++++++++++++++++ .../AbstractExecutableModuleInstance.h | 28 +++ .../smartcontract_instance/CMakeLists.txt | 2 + .../ClassNotFoundException.cpp | 33 ++++ .../ClassNotFoundException.h | 29 +++ .../InstanceDependencyContext.cpp | 5 - .../InstanceDependencyContext.h | 2 - .../InstanceDependencyHandler.cpp | 4 + .../InstanceDependencyHandler.h | 5 + .../ModularSmartcontractInstance.cpp | 52 ++++++ .../ModularSmartcontractInstance.h | 11 +- .../ModuleInstanceClassLoader.cpp | 2 +- .../ModuleInstanceClassLoader.h | 2 +- .../SmartcontractExecutionException.cpp | 35 ++++ .../SmartcontractExecutionException.h | 30 +++ .../ext_binary/ExtNullPtrObject.cpp | 7 +- .../ext_binary/ExtNullPtrObject.h | 2 +- .../instance/AbstractVmInstance.cpp | 8 +- .../instance/AbstractVmInstance.h | 3 +- .../instance/VmClassInstance.cpp | 5 +- .../instance_array/ArrayReference.cpp | 7 +- .../instance_array/VmArrayInstance.cpp | 2 +- .../instance_dom/AbstractDomInstance.cpp | 2 +- .../instance_dom/AbstractDomInstance.h | 2 +- .../instance_dom/DomArrayVariable.cpp | 2 +- .../instance_dom/DomRuntimeReference.cpp | 4 +- .../instance_dom/DomVariableInstance.cpp | 2 +- .../instance_dom/DomVariableReference.cpp | 2 +- .../VmExceptionInstance.h | 2 + .../instance_ref/AbstractReference.cpp | 2 +- .../instance/instance_ref/AbstractReference.h | 2 +- .../instance_ref/ConstStaticPrimitive.cpp | 2 +- .../instance_ref/ConstStaticPrimitive.h | 2 +- .../instance/instance_ref/ObjectReference.cpp | 10 +- .../instance/instance_ref/ObjectReference.h | 2 +- .../instance_ref/PrimitiveReference.cpp | 16 +- .../instance_ref/PrimitiveReference.h | 2 +- .../instance/instance_ref/RefereceFactory.cpp | 8 +- .../instance/instance_ref/VmRootReference.cpp | 6 +- .../instance/instance_ref/VmRootReference.h | 5 + .../ClassTypeReference.cpp | 2 +- .../NumericConstHolder.cpp | 2 +- .../instance_string/VmStringInstance.cpp | 3 +- .../AbstractReservedClassDeclare.h | 4 +- .../AbstractReservedMethodDeclare.cpp | 8 + .../AbstractReservedMethodDeclare.h | 1 + .../ReservedClassRegistory.cpp | 7 + .../reserved_classes/list/ListListMethod.cpp | 1 + src_smartcontract_vm/vm/VirtualMachine.cpp | 117 +++++++++++- src_smartcontract_vm/vm/VirtualMachine.h | 21 ++- src_smartcontract_vm/vm/stack/VmStack.cpp | 15 +- src_smartcontract_vm/vm/stack/VmStack.h | 9 + .../vm/stack/VmStackManager.cpp | 21 ++- .../vm/stack/VmStackManager.h | 8 + .../instance/CMakeLists.txt | 2 + .../case02/project01/exec/config.json | 2 +- .../exec/src/sample/ISampleDirect.alns | 6 + .../project01/exec/src/sample/Sample01.alns | 8 +- .../case03/project01/exec/config.json | 20 ++ .../exec/src/sample/ISampleDirect.alns | 6 + .../project01/exec/src/sample/Sample01.alns | 22 +++ .../project01/modules/mod01/config.json | 20 ++ .../modules/mod01/src/IDirectAccess.alns | 6 + .../modules/mod01/src/IExportMethods.alns | 6 + .../project01/modules/mod01/src/Module01.alns | 23 +++ .../project01/modules/mod01/src/Result.alns | 9 + .../case03/project01/projectconfig.json | 9 + .../instance/test_exceptions.cpp | 37 ++++ .../instance/test_instance_spaces.cpp | 50 +++++ .../instance/test_inter_module_access.cpp | 21 +++ .../instance/test_smartcontract_executor.cpp | 4 + .../base/test_class_instance.cpp | 2 +- .../base/test_ext_objects.cpp | 2 +- 120 files changed, 2020 insertions(+), 90 deletions(-) create mode 100644 src_smartcontract_modular/inter_modular_access/CMakeLists.txt create mode 100644 src_smartcontract_modular/inter_modular_access/InterModuleAccessException.cpp create mode 100644 src_smartcontract_modular/inter_modular_access/InterModuleAccessException.h create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.h create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp create mode 100644 src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h create mode 100644 src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.cpp create mode 100644 src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.h create mode 100644 src_smartcontract_modular/modular_interfaces/CMakeLists.txt create mode 100644 src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp create mode 100644 src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.cpp create mode 100644 src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.h create mode 100644 src_smartcontract_modular/smartcontract_cache/ModuleSetupException.cpp create mode 100644 src_smartcontract_modular/smartcontract_cache/ModuleSetupException.h create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.cpp create mode 100644 src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.h create mode 100644 src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.h create mode 100644 src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.cpp create mode 100644 src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.h create mode 100644 src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/ISampleDirect.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/exec/config.json create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/ISampleDirect.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/config.json create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Result.alns create mode 100644 src_test/smartcontract_modular/instance/resources/case03/project01/projectconfig.json create mode 100644 src_test/smartcontract_modular/instance/test_exceptions.cpp create mode 100644 src_test/smartcontract_modular/instance/test_inter_module_access.cpp diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index 725ef6a..9d4286f 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -161,6 +161,7 @@ #include "lang_sql/sql_dml_parts/SQLWhere.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" #include "engine/sc/exceptions.h" @@ -170,9 +171,9 @@ #include "instance/reserved_classes/AbstractReservedMethodDeclare.h" #include "instance/reserved_generics/AbstractReservedGenericsClassDeclare.h" - #include "instance/reserved_generics/ReservedGeneratedGenericsClassDeclare.h" + namespace alinous { CodeElement::CodeElement(const CodeElement &inst) { @@ -891,6 +892,13 @@ void CodeElement::positionFromBinary(ByteBuffer *in) { this->endColumn = in->getInt(); } +CodeElement* CodeElement::binaryCopy() const { + int cap = binarySize(); + ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + buff->position(0); + CodeElement* element = createFromBinary(buff); + return element; +} } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/CodeElement.h b/src_smartcontract/engine/sc/CodeElement.h index a85934b..e7559d0 100644 --- a/src_smartcontract/engine/sc/CodeElement.h +++ b/src_smartcontract/engine/sc/CodeElement.h @@ -233,6 +233,8 @@ class CodeElement { void copyCodePositions(const CodeElement* other) noexcept; + CodeElement* binaryCopy() const; + protected: int positionBinarySize() const; void positionToBinary(ByteBuffer* out) const; diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index 4050479..ee8ca4a 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -373,4 +373,17 @@ ClassDeclare* SmartContract::getClassDeclareByFqn(const UnicodeString *fqn) cons return result; } +UnicodeString* SmartContract::getMainClassFqn() const noexcept { + UnicodeString* fqn = new UnicodeString(L""); + + if(this->mainPackage != nullptr){ + fqn->append(this->mainPackage); + fqn->append(L"."); + } + + fqn->append(this->mainClass); + + return fqn; +} + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc/SmartContract.h b/src_smartcontract/engine/sc/SmartContract.h index 33704e6..0a17180 100644 --- a/src_smartcontract/engine/sc/SmartContract.h +++ b/src_smartcontract/engine/sc/SmartContract.h @@ -69,6 +69,8 @@ class SmartContract { ClassDeclare* getClassDeclareByFqn(const UnicodeString* fqn) const; + UnicodeString* getMainClassFqn() const noexcept; + private: UnicodeString* mainPackage; UnicodeString* mainClass; diff --git a/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp b/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp index fa14f61..a55c006 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp +++ b/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp @@ -90,6 +90,11 @@ PackageSpace* AnalyzeContext::getPackegeSpace(const UnicodeString* spaceName) no } return space; +}void AnalyzeContext::addValidationError(bool condition, int errorCode, CodeElement *element, const wchar_t *msg, + std::initializer_list params) noexcept { + if(condition){ + addValidationError(errorCode, element, msg, params); + } } void AnalyzeContext::addValidationError(int errorCode, CodeElement* element, const UnicodeString* msg, std::initializer_list params) noexcept { diff --git a/src_smartcontract/engine/sc_analyze/AnalyzeContext.h b/src_smartcontract/engine/sc_analyze/AnalyzeContext.h index 397599b..8e52de0 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzeContext.h +++ b/src_smartcontract/engine/sc_analyze/AnalyzeContext.h @@ -46,6 +46,7 @@ class AnalyzeContext { PackageSpace* getPackegeSpace(const UnicodeString* spaceName) noexcept; + void addValidationError(bool condition, int errorCode, CodeElement* element, const wchar_t* msg, std::initializer_list params) noexcept; void addValidationError(int errorCode, CodeElement* element, const UnicodeString* msg, std::initializer_list params) noexcept; void addValidationError(int errorCode, CodeElement* element, const wchar_t* msg, std::initializer_list params) noexcept; diff --git a/src_smartcontract/engine/sc_analyze/ValidationError.h b/src_smartcontract/engine/sc_analyze/ValidationError.h index 2d93b57..1608cb4 100644 --- a/src_smartcontract/engine/sc_analyze/ValidationError.h +++ b/src_smartcontract/engine/sc_analyze/ValidationError.h @@ -42,6 +42,7 @@ class ValidationError { static constexpr int CODE_CLASS_MEMBER_AND_STACK_VARIABLE_DO_NOT_EXISTS = 32; static constexpr int CODE_CLASS_MEMBER_VOID = 33; static constexpr int CODE_CLASS_DOES_NOT_IMPLEMENET_METHOD = 34; + static constexpr int CODE_CLASS_IMPLEMENTS_NOT_INTERFACE_CLASS = 35; static constexpr int CODE_ALLOCATION_TYPE_DOES_NOT_EXISTS = 40; diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp index ebc8eb4..6e8bdd4 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp @@ -24,6 +24,7 @@ #include "engine/sc_analyze_functions/VTableMethodEntry.h" #include "engine/sc_analyze_functions/VTableClassEntry.h" +#include "lang/sc_declare/ClassName.h" namespace alinous { @@ -69,7 +70,6 @@ void ClassDeclare::preAnalyze(AnalyzeContext* actx) { addDefaultConstructor(); } - CompilationUnit* unit = getCompilationUnit(); PackageSpace* space = actx->getPackegeSpace(unit->getPackageName()); @@ -82,6 +82,14 @@ void ClassDeclare::preAnalyze(AnalyzeContext* actx) { space->addClassDeclare(this); + // Object as Extends + if(this->extends == nullptr){ + this->extends = new ClassExtends(); + ClassName* name = new ClassName(); + name->addStr("lang.Object"); + this->extends->setClassName(name); + } + if(this->extends != nullptr){ this->extends->setParent(this); this->extends->preAnalyze(actx); @@ -201,7 +209,7 @@ void ClassDeclare::setBlock(ClassDeclareBlock* block) noexcept { this->block = block; } -void alinous::ClassDeclare::setName(UnicodeString* name) noexcept { +void ClassDeclare::setName(UnicodeString* name) noexcept { this->name = name; } diff --git a/src_smartcontract/lang/sc_declare/ClassImplements.cpp b/src_smartcontract/lang/sc_declare/ClassImplements.cpp index edfb4af..c9525cc 100644 --- a/src_smartcontract/lang/sc_declare/ClassImplements.cpp +++ b/src_smartcontract/lang/sc_declare/ClassImplements.cpp @@ -12,6 +12,7 @@ #include "engine/sc_analyze/AnalyzedType.h" #include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/ValidationError.h" namespace alinous { ClassImplements::ClassImplements() : CodeElement(CodeElement::CLASS_IMPLEMENTS) { @@ -48,6 +49,10 @@ void ClassImplements::analyzeTypeRef(AnalyzeContext* actx) { const UnicodeString* name = n->getName(); AnalyzedType* type = res->findClassType(this, name); + + actx->addValidationError(!type->isInterface(), ValidationError::CODE_WRONG_CLASS_NAME, this, L"The {0} is not type.", {name}); + actx->addValidationError(!type->isInterface(), ValidationError::CODE_CLASS_IMPLEMENTS_NOT_INTERFACE_CLASS, this, L"The {0} must be interface.", {name}); + this->typelist.addElement(type); } } diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index d1d190e..b1b35d1 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -312,6 +312,8 @@ void MethodDeclare::interpret(FunctionArguments* args, VirtualMachine* vm) { MethodArgumentSetupper argSetup(args, vm); //vm->setFunctionArguments(args); + vm->markStackbyMethod(this); + block->interpret(vm); } diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.h b/src_smartcontract/lang/sc_declare/MethodDeclare.h index f9f0b37..fd92408 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.h +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.h @@ -44,6 +44,13 @@ class MethodDeclare : public CodeElement { void setArguments(ArgumentsListDeclare* args) noexcept; void setBlock(StatementBlock* block) noexcept; + AccessControlDeclare* getAccessControlDeclare() const noexcept { + return this->ctrl; + } + AbstractType* getType() const noexcept { + return this->type; + } + StatementBlock* getBlock() const noexcept; bool isConstructor() const; diff --git a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp index d275e8e..e84b7c5 100644 --- a/src_smartcontract/lang/sc_expression/ConstructorCall.cpp +++ b/src_smartcontract/lang/sc_expression/ConstructorCall.cpp @@ -226,6 +226,9 @@ AnalyzedType ConstructorCall::getType(AnalyzeContext* actx) { AbstractVmInstance* ConstructorCall::interpret(VirtualMachine* vm) { GcManager* gc = vm->getGc(); + // mark stack + vm->markStackEntryPoint(this); + AnalyzedClass* clazz = this->atype->getAnalyzedClass(); VmClassInstance* inst = VmClassInstance::createObject(clazz, vm); diff --git a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp index 66d6c23..e496312 100644 --- a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp +++ b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp @@ -358,6 +358,9 @@ AbstractVmInstance* FunctionCallExpression::interpret(VirtualMachine* vm) { FunctionArguments args; interpretThisPointer(vm, &args); + // mark stack + vm->markStackEntryPoint(this); + GcManager* gc = vm->getGc(); StackFloatingVariableHandler releaser(gc); interpretArguments(vm, &args, &releaser); diff --git a/src_smartcontract/lang/sc_expression/FunctionCallExpression.h b/src_smartcontract/lang/sc_expression/FunctionCallExpression.h index cc4a656..2fb42c0 100644 --- a/src_smartcontract/lang/sc_expression/FunctionCallExpression.h +++ b/src_smartcontract/lang/sc_expression/FunctionCallExpression.h @@ -71,7 +71,7 @@ class FunctionCallExpression : public AbstractExpression { const UnicodeString* callSignature; StackVariableAccess* thisAccess; - bool noVirtual; + bool noVirtual; // on static method }; } /* namespace alinous */ diff --git a/src_smartcontract_modular/CMakeLists.txt b/src_smartcontract_modular/CMakeLists.txt index 7125e70..24971ef 100644 --- a/src_smartcontract_modular/CMakeLists.txt +++ b/src_smartcontract_modular/CMakeLists.txt @@ -2,6 +2,8 @@ set(__dirsrc "") # import source codes +add_subdirectory(inter_modular_access) +add_subdirectory(modular_interfaces) add_subdirectory(modular_project) add_subdirectory(modular_project_registory) add_subdirectory(smartcontract_cache) diff --git a/src_smartcontract_modular/inter_modular_access/CMakeLists.txt b/src_smartcontract_modular/inter_modular_access/CMakeLists.txt new file mode 100644 index 0000000..0f099bd --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/CMakeLists.txt @@ -0,0 +1,11 @@ + + +set(__src + InterModuleAccessException.cpp + ModularProxyClassDeclare.cpp + ModularProxyMethodDeclare.cpp + ModularProxyObjectInstanceFactory.cpp + ModuleProxyInstance.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_modular inter_modular_access) + diff --git a/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.cpp b/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.cpp new file mode 100644 index 0000000..6b671a8 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.cpp @@ -0,0 +1,86 @@ +/* + * InterModuleAccessException.cpp + * + * Created on: Dec 6, 2025 + * Author: iizuka + */ + +#include "inter_modular_access/InterModuleAccessException.h" + +#include "base/UnicodeString.h" + +#include "vm/vm_ctrl/ExecControlManager.h" + +#include "vm/VirtualMachine.h" + +#include "instance/reserved_classes/ReservedClassRegistory.h" + +#include "instance/instance_exception_class/ExceptionInstanceFactory.h" +#include "instance/instance_exception_class/ExceptionClassDeclare.h" +#include "instance/instance_exception_class/VmExceptionInstance.h" + +#include "instance/VmClassInstance.h" + +#include "engine/sc_analyze/IVmInstanceFactory.h" +#include "engine/sc_analyze/AnalyzedType.h" +#include "engine/sc_analyze/AnalyzedClass.h" + +#include "lang/sc_declare/ClassExtends.h" + + +namespace codablecash { + +const UnicodeString InterModuleAccessException::NAME{L"InterModuleAccessException"}; +const UnicodeString InterModuleAccessException::FULL_QUALIFIED_NAME{L"lang.InterModuleAccessException"}; + +InterModuleAccessException::InterModuleAccessException() : AbstractExceptionClassDeclare() { + addDefaultConstructor(&NAME); + + this->name = new UnicodeString(&NAME); + + this->extends = new ClassExtends(); + this->extends->setClassName(&ExceptionClassDeclare::NAME); +} + +InterModuleAccessException::~InterModuleAccessException() { + +} + +AnalyzedClass* InterModuleAccessException::createAnalyzedClass() noexcept { + InterModuleAccessException* classDec = new InterModuleAccessException(); + AnalyzedClass* aclass = new AnalyzedClass(classDec); + + return aclass; +} + +void InterModuleAccessException::throwException(const UnicodeString *msg, VirtualMachine *vm, const CodeElement *element) noexcept { + ExecControlManager* ctrl = vm->getCtrl(); + IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); + + UnicodeString fqn(AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); + + VmClassInstance* inst = factory->createInstance(aclass, vm); + inst->init(vm); + + + VmExceptionInstance* exception = dynamic_cast(inst); + + vm->throwException(exception, element); +} + +ClassDeclare* InterModuleAccessException::getBaseClass() const noexcept { + AnalyzedType* atype = this->extends->getAnalyzedType(); + AnalyzedClass* aclass = atype->getAnalyzedClass(); + + return aclass->getClassDeclare(); +} + +IVmInstanceFactory* InterModuleAccessException::getFactory() const noexcept { + return ExceptionInstanceFactory::getInstance(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.h b/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.h new file mode 100644 index 0000000..c3352d4 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/InterModuleAccessException.h @@ -0,0 +1,45 @@ +/* + * InterModuleAccessException.h + * + * Created on: Dec 6, 2025 + * Author: iizuka + */ + +#ifndef INTER_MODULAR_ACCESS_INTERMODULEACCESSEXCEPTION_H_ +#define INTER_MODULAR_ACCESS_INTERMODULEACCESSEXCEPTION_H_ + +#include "instance/instance_exception_class/AbstractExceptionClassDeclare.h" + +namespace alinous { +class UnicodeString; +class AnalyzedClass; +class VirtualMachine; +class CodeElement; +} +using namespace alinous; + +namespace codablecash { + +class InterModuleAccessException : public AbstractExceptionClassDeclare { +public: + static const UnicodeString NAME; + static const UnicodeString FULL_QUALIFIED_NAME; + + static AnalyzedClass* createAnalyzedClass() noexcept; + static void throwException(const UnicodeString* msg, VirtualMachine* vm, const CodeElement* element) noexcept; + + InterModuleAccessException(); + virtual ~InterModuleAccessException(); + + virtual uint16_t getClassType() const noexcept { + return TYPE_INTER_MODULE_ACCESS_EXCEPTION; + } + + virtual ClassDeclare* getBaseClass() const noexcept; + + virtual IVmInstanceFactory* getFactory() const noexcept; +}; + +} /* namespace codablecash */ + +#endif /* INTER_MODULAR_ACCESS_INTERMODULEACCESSEXCEPTION_H_ */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp new file mode 100644 index 0000000..fe0e434 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp @@ -0,0 +1,37 @@ +/* + * ModularProxyClassDeclare.cpp + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#include "inter_modular_access/ModularProxyClassDeclare.h" + +#include "engine/sc_analyze/IVmInstanceFactory.h" + + +namespace codablecash { + +ModularProxyClassDeclare::ModularProxyClassDeclare() { + this->factory = nullptr; + this->dctx = nullptr; +} + +ModularProxyClassDeclare::~ModularProxyClassDeclare() { + delete this->factory; + this->dctx = nullptr; +} + +IVmInstanceFactory* ModularProxyClassDeclare::getFactory() const noexcept { + return this->factory; +} + +void ModularProxyClassDeclare::setFactory(IVmInstanceFactory *factory) { + this->factory = factory; +} + +void ModularProxyClassDeclare::setDependencyContext(InstanceDependencyContext *dctx) noexcept { + this->dctx; +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h new file mode 100644 index 0000000..77c238b --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h @@ -0,0 +1,48 @@ +/* + * ModularProxyClassDeclare.h + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#ifndef INTER_MODULAR_ACCESS_MODULARPROXYCLASSDECLARE_H_ +#define INTER_MODULAR_ACCESS_MODULARPROXYCLASSDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedClassDeclare.h" + +using namespace alinous; + +namespace codablecash { + +class InstanceDependencyContext; + +class ModularProxyClassDeclare : public AbstractReservedClassDeclare { +public: + ModularProxyClassDeclare(); + virtual ~ModularProxyClassDeclare(); + + static AnalyzedClass* createAnalyzedClass() noexcept; + + virtual uint16_t getClassType() const noexcept { + return AbstractReservedClassDeclare::TYPE_MODULAR_PROXY; + } + + //// use getName() and GetPackageName of ClassDeclare + /// use Extends + + void setFactory(IVmInstanceFactory* factory); + virtual IVmInstanceFactory* getFactory() const noexcept; + + void setDependencyContext(InstanceDependencyContext* dctx) noexcept; + InstanceDependencyContext* getInstanceDependencyContext() const noexcept { + return this->dctx; + } + +private: + IVmInstanceFactory* factory; + InstanceDependencyContext* dctx; +}; + +} /* namespace codablecash */ + +#endif /* INTER_MODULAR_ACCESS_MODULARPROXYCLASSDECLARE_H_ */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp new file mode 100644 index 0000000..d6b6eac --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp @@ -0,0 +1,123 @@ +/* + * ModularProxyMethodDeclare.cpp + * + * Created on: Dec 4, 2025 + * Author: iizuka + */ + +#include "inter_modular_access/ModularProxyMethodDeclare.h" + +#include "base/StackRelease.h" + +#include "lang/sc_declare/MethodDeclare.h" +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" +#include "lang/sc_declare_types/AbstractType.h" + +#include "engine/sc_analyze/AnalyzedType.h" +#include "engine/sc_analyze/AnalyzedClass.h" + +#include "vm/stack/MethodArgumentSetupper.h" +#include "vm/stack/StackPopper.h" + +#include "vm/VirtualMachine.h" + +#include "vm/variable_access/FunctionArguments.h" + +#include "inter_modular_access/ModuleProxyInstance.h" +#include "inter_modular_access/ModularProxyClassDeclare.h" + +#include "smartcontract_instance/InstanceDependencyContext.h" +#include "smartcontract_instance/AbstractExecutableModuleInstance.h" + +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "instance/instance_ref/ObjectReference.h" + +#include "instance/instance_exception_class/VmExceptionInstance.h" + +#include "ext_binary/AbstractExtObject.h" + +#include "inter_modular_access/InterModuleAccessException.h" + +#include "base/UnicodeString.h" +namespace codablecash { + +ModularProxyMethodDeclare::ModularProxyMethodDeclare() : AbstractReservedMethodDeclare(METHOD_MODULAR_INTERFACE) { + +} + +ModularProxyMethodDeclare::~ModularProxyMethodDeclare() { + +} + +void ModularProxyMethodDeclare::init(VirtualMachine *vm) { +} + +void ModularProxyMethodDeclare::interpret(FunctionArguments *args, VirtualMachine *vm) { + MethodArgumentSetupper argSetup(args, vm); + + // stack + vm->markStackbyMethod(this); + vm->newStack(); + StackPopper stackPopper(vm); + + doInterpret(args, vm); +} + +void ModularProxyMethodDeclare::doInterpret(FunctionArguments *args, VirtualMachine *vm) { + VmStack* stack = vm->topStack(); + + VmClassInstance* _this = args->getThisPtr(); + ModuleProxyInstance* proxyInstance = dynamic_cast(_this); + assert(proxyInstance != nullptr); + + AnalyzedClass* aclass = proxyInstance->getAnalyzedClass(); + ClassDeclare* dec = aclass->getClassDeclare(); + + ModularProxyClassDeclare* proxyClass = dynamic_cast(dec); + InstanceDependencyContext* dctx = proxyClass->getInstanceDependencyContext(); + + AbstractExecutableModuleInstance* moduleInstance = dctx->getModuleInstance(); + + AbstractExtObject* exceptionEx = moduleInstance->invokeMainObjectMethodProxy(this->name, args); __STP(exceptionEx); + if(exceptionEx != nullptr){ + + UnicodeString message(L""); + InterModuleAccessException::throwException(&message, vm, this); + + // FIXME error message + + // vm->throwException(ex, this); + } + + +} + +const UnicodeString* ModularProxyMethodDeclare::toString() { + return this->name; +} + +ModularProxyMethodDeclare* ModularProxyMethodDeclare::fromMethodDeclare(MethodDeclare *method) { + ModularProxyMethodDeclare* dec = new ModularProxyMethodDeclare(); __STP(dec); + + { + AccessControlDeclare* acdec = method->getAccessControlDeclare(); + AccessControlDeclare* copy = dynamic_cast(acdec->binaryCopy()); + dec->setAccessControl(copy); + } + { + AbstractType* type = method->getType(); + AbstractType* copy = dynamic_cast(type->binaryCopy()); + dec->setType(copy); + } + { + ArgumentsListDeclare* args = method->getArguments(); + ArgumentsListDeclare* copy = dynamic_cast(args); + dec->setArguments(copy); + } + + return __STP_MV(dec); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.h b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.h new file mode 100644 index 0000000..7058066 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.h @@ -0,0 +1,37 @@ +/* + * ModularProxyMethodDeclare.h + * + * Created on: Dec 4, 2025 + * Author: iizuka + */ + +#ifndef INTER_MODULAR_ACCESS_MODULARPROXYMETHODDECLARE_H_ +#define INTER_MODULAR_ACCESS_MODULARPROXYMETHODDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +namespace alinous { +class MethodDeclare; +} +using namespace alinous; + +namespace codablecash { + +class ModularProxyMethodDeclare : public AbstractReservedMethodDeclare { +public: + ModularProxyMethodDeclare(); + virtual ~ModularProxyMethodDeclare(); + + static ModularProxyMethodDeclare* fromMethodDeclare(MethodDeclare* method); + + virtual void init(VirtualMachine* vm); + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); + virtual const UnicodeString* toString(); + +private: + void doInterpret(FunctionArguments* args, VirtualMachine* vm); +}; + +} /* namespace codablecash */ + +#endif /* INTER_MODULAR_ACCESS_MODULARPROXYMETHODDECLARE_H_ */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp new file mode 100644 index 0000000..cf6d421 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp @@ -0,0 +1,137 @@ +/* + * ModularProxyObjectInstanceFactory.cpp + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#include "inter_modular_access/ModularProxyObjectInstanceFactory.h" +#include "inter_modular_access/ModularProxyClassDeclare.h" + +#include "engine/sc_analyze/TypeResolver.h" + +#include "engine/sc/CompilationUnit.h" + +#include "base/StackRelease.h" + +#include "lang/sc_declare/ClassExtends.h" +#include "lang/sc_declare/ClassName.h" + +#include "lang/sc_declare/ClassDeclare.h" + +#include "lang/sc_declare/ClassImplements.h" +#include "lang/sc_declare/MethodDeclare.h" +#include "lang/sc_declare/PackageDeclare.h" +#include "lang/sc_declare/PackageNameDeclare.h" +#include "lang/sc_declare/ImportsDeclare.h" + +#include "inter_modular_access/ModularProxyMethodDeclare.h" +#include "inter_modular_access/ModuleProxyInstance.h" + +#include "lang/sc_declare/ImportDeclare.h" + + +namespace codablecash { + +ModularProxyObjectInstanceFactory::ModularProxyObjectInstanceFactory() { + this->progs = new ArrayList(); +} + +ModularProxyObjectInstanceFactory::~ModularProxyObjectInstanceFactory() { + this->progs->deleteElements(); + delete this->progs; +} + +VmClassInstance* ModularProxyObjectInstanceFactory::createInstance(AnalyzedClass *clazz, VirtualMachine *vm) { + ModuleProxyInstance* inst = new(vm) ModuleProxyInstance(clazz, vm); + + return inst; +} + +void ModularProxyObjectInstanceFactory::generateModularClass(UnicodeString *mainFqn, ClassDeclare *ifdec, InstanceDependencyContext* dctx) { + ModularProxyClassDeclare* clazz = new ModularProxyClassDeclare(); + clazz->setFactory(this); + clazz->setDependencyContext(dctx); + + CompilationUnit* unit = new CompilationUnit(); + unit->addClassDeclare(clazz); + addCompilantUnit(unit); // Register compilant Unit + + // Unit + CompilationUnit* originalUnit = ifdec->getCompilationUnit(); + { + // package + const UnicodeString* pname = originalUnit->getPackageName(); + PackageDeclare* packageDec = new PackageDeclare(); + PackageNameDeclare* nameDec = new PackageNameDeclare(); + + UnicodeString pattern(L"\\."); + ArrayList* segs = pname->split(&pattern); __STP(segs); + + packageDec->setName(nameDec); + unit->setPackage(packageDec); + + + // import + ImportsDeclare* originalImports = originalUnit->getImportDeclare(); + if(originalImports != nullptr){ + ImportsDeclare* imports = new ImportsDeclare(); + unit->setImports(imports); + + const ArrayList* list = originalImports->getImports(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + ImportDeclare* dec = list->get(i); + + imports->addImport(new ImportDeclare(*dec)); + } + } + } + + { + UnicodeString* className = TypeResolver::getClassName(mainFqn); + className->append(L"Proxy"); + className->append(ifdec->getName()); + + clazz->setName(className); + } + + { + ClassExtends* extends = new ClassExtends(); + clazz->setExtends(extends); + + ClassName* className = new ClassName(); + extends->setClassName(className); + className->addStr(mainFqn); + } + + // interface + { + const UnicodeString* fqn = ifdec->getFullQualifiedName(); + + ClassImplements* implements = new ClassImplements(); + clazz->setImplements(implements); + + ClassName* className = new ClassName(); + className->addStr(fqn); + implements->addClassName(className); + } + + // methods + { + ArrayList* list = ifdec->getMethods(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + MethodDeclare* method = list->get(i); + + ModularProxyMethodDeclare* proxy = ModularProxyMethodDeclare::fromMethodDeclare(method); + clazz->addMethod(proxy); + } + } +} + +void ModularProxyObjectInstanceFactory::addCompilantUnit(CompilationUnit *unit) noexcept { + this->progs->addElement(unit); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h new file mode 100644 index 0000000..b9ca7cc --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h @@ -0,0 +1,45 @@ +/* + * ModularProxyObjectInstanceFactory.h + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#ifndef INTER_MODULAR_ACCESS_MODULARPROXYOBJECTINSTANCEFACTORY_H_ +#define INTER_MODULAR_ACCESS_MODULARPROXYOBJECTINSTANCEFACTORY_H_ + +#include "engine/sc_analyze/IVmInstanceFactory.h" + +#include "base/ArrayList.h" + + +namespace alinous { +class CompilationUnit; +class ClassDeclare; +} +using namespace alinous; + +namespace codablecash { + +class InstanceDependencyContext; + +class ModularProxyObjectInstanceFactory : public IVmInstanceFactory { +public: + ModularProxyObjectInstanceFactory(); + virtual ~ModularProxyObjectInstanceFactory(); + + virtual VmClassInstance* createInstance(AnalyzedClass* clazz, VirtualMachine* vm); + + // generate class + void generateModularClass(UnicodeString* mainFqn, ClassDeclare* ifdec, InstanceDependencyContext* dctx); + +private: + void addCompilantUnit(CompilationUnit* unit) noexcept; + +private: + ArrayList* progs; +}; + +} /* namespace codablecash */ + +#endif /* INTER_MODULAR_ACCESS_MODULARPROXYOBJECTINSTANCEFACTORY_H_ */ diff --git a/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.cpp b/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.cpp new file mode 100644 index 0000000..0427461 --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.cpp @@ -0,0 +1,21 @@ +/* + * ModuleProxyInstance.cpp + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#include "inter_modular_access/ModuleProxyInstance.h" + +namespace codablecash { + +ModuleProxyInstance::ModuleProxyInstance(AnalyzedClass* clazz, VirtualMachine* vm) + : AbstractVmReservedInstance(clazz, vm) { + +} + +ModuleProxyInstance::~ModuleProxyInstance() { + +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.h b/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.h new file mode 100644 index 0000000..8f2b0bd --- /dev/null +++ b/src_smartcontract_modular/inter_modular_access/ModuleProxyInstance.h @@ -0,0 +1,25 @@ +/* + * ModuleProxyInstance.h + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#ifndef INTER_MODULAR_ACCESS_MODULEPROXYINSTANCE_H_ +#define INTER_MODULAR_ACCESS_MODULEPROXYINSTANCE_H_ + +#include "instance/reserved_classes/AbstractVmReservedInstance.h" + +using namespace alinous; + +namespace codablecash { + +class ModuleProxyInstance : public AbstractVmReservedInstance { +public: + ModuleProxyInstance(AnalyzedClass* clazz, VirtualMachine* v); + virtual ~ModuleProxyInstance(); +}; + +} /* namespace codablecash */ + +#endif /* INTER_MODULAR_ACCESS_MODULEPROXYINSTANCE_H_ */ diff --git a/src_smartcontract_modular/modular_interfaces/CMakeLists.txt b/src_smartcontract_modular/modular_interfaces/CMakeLists.txt new file mode 100644 index 0000000..d4ad980 --- /dev/null +++ b/src_smartcontract_modular/modular_interfaces/CMakeLists.txt @@ -0,0 +1,7 @@ + + +set(__src + ModularProxyListnerClassDeclare.cpp +) +handle_sub(codablecashlib "${__src}" smartcontract_modular modular_interfaces) + diff --git a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp new file mode 100644 index 0000000..6b35412 --- /dev/null +++ b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp @@ -0,0 +1,20 @@ +/* + * ModularProxyListnerClassDeclare.cpp + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#include "modular_interfaces/ModularProxyListnerClassDeclare.h" + +namespace codablecash { + +ModularProxyListnerClassDeclare::ModularProxyListnerClassDeclare() { + +} + +ModularProxyListnerClassDeclare::~ModularProxyListnerClassDeclare() { + // TODO Auto-generated destructor stub +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h new file mode 100644 index 0000000..4e0ecab --- /dev/null +++ b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h @@ -0,0 +1,21 @@ +/* + * ModularProxyListnerClassDeclare.h + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_INTERFACES_MODULARPROXYLISTNERCLASSDECLARE_H_ +#define MODULAR_INTERFACES_MODULARPROXYLISTNERCLASSDECLARE_H_ + +namespace codablecash { + +class ModularProxyListnerClassDeclare { +public: + ModularProxyListnerClassDeclare(); + virtual ~ModularProxyListnerClassDeclare(); +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_INTERFACES_MODULARPROXYLISTNERCLASSDECLARE_H_ */ diff --git a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h index f4206a2..7ed5579 100644 --- a/src_smartcontract_modular/modular_project/ModularInstanceConfig.h +++ b/src_smartcontract_modular/modular_project/ModularInstanceConfig.h @@ -63,6 +63,10 @@ class ModularInstanceConfig { return this->libExport; } + ArrayList* getDirectAccess() const noexcept { + return this->directAccess; + } + private: void loadMainPackageAndClass(const JsonObject* instance); void loadInitializer(const JsonObject* initializer); diff --git a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt index 3304f4c..9beebbc 100644 --- a/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_cache/CMakeLists.txt @@ -2,7 +2,9 @@ set(__src InstanceSpace.cpp + InstanceSpaceReleaser.cpp InstanceSpacesManager.cpp + ModuleSetupException.cpp MolularSmartcontractCacheManager.cpp ProjectNotFoundException.cpp ) diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp index db72e7b..b5604fe 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp @@ -9,6 +9,14 @@ #include "smartcontract_instance/ModularSmartcontractInstance.h" +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "base_thread/SysMutex.h" +#include "base_thread/StackUnlocker.h" + +#include "base/UnicodeString.h" +#include "base/StackRelease.h" + namespace codablecash { @@ -16,17 +24,30 @@ InstanceSpace::InstanceSpace(const SmartcontractInstanceAddress *instAddress, Mo this->instance = instance; this->instance->setSmartcontractInstanceAddress(instAddress); + this->mutex = new SysMutex(); this->ref = 0; } InstanceSpace::~InstanceSpace() { delete this->instance; + delete this->mutex; } bool InstanceSpace::isDeletable() const noexcept { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); return this->ref == 0; } +void InstanceSpace::incRef() { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + this->ref++; +} + +void InstanceSpace::decRef() { + StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + this->ref--; +} + void InstanceSpace::beforeCacheOut() { this->instance->cleanDbRoot(); } @@ -35,4 +56,60 @@ const SmartcontractInstanceAddress* InstanceSpace::getSmartContractInstanceAddre return this->instance->getSmartContractInstanceAddress(); } +bool InstanceSpace::analyze() { + bool hasError = this->instance->analyze(); + + this->instance->setMainInstance(); + + // check direct Interface + if(!hasError){ + hasError |= this->instance->checkDirectAccess(); + } + + // generate connector class + if(!hasError){ + hasError |= this->instance->generateInterModularCommunicationClasses(); + } + + return hasError; +} + +void InstanceSpace::setMainInstance() { + this->instance->setMainInstance(); +} + +bool InstanceSpace::createMainInstance() { + return this->instance->createMainInstance(); +} + +bool InstanceSpace::interpretInitializer() { + return this->instance->interpretInitializer(); +} + +void InstanceSpace::resetRootReference() { + this->instance->resetRootReference(); +} + +void InstanceSpace::setDatabaseDir(const File *baseDir) { + this->instance->setDatabaseDir(baseDir); +} + +void InstanceSpace::createDatabase() { + this->instance->createDatabase(); +} + +void InstanceSpace::loadDatabase() { + this->instance->loadDatabase(); +} + +void InstanceSpace::cleanDbRoot() { + this->instance->cleanDbRoot(); +} + +SmartcontractExecResult* InstanceSpace::invokeMainObjectMethod(UnicodeString *moduleName, UnicodeString *methodName, ArrayList* args) { + SmartcontractExecResult* result = this->instance->invokeMainObjectMethod(moduleName, methodName, args); __STP(result); + + return __STP_MV(result); +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h index 9003f9c..41081a8 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h @@ -7,11 +7,23 @@ #ifndef SMARTCONTRACT_CACHE_INSTANCESPACE_H_ #define SMARTCONTRACT_CACHE_INSTANCESPACE_H_ +#include "base/ArrayList.h" + +namespace alinous { +class ByteBuffer; +class File; +class VirtualMachine; +class SysMutex; +class AbstractFunctionExtArguments; +} +using namespace alinous; + namespace codablecash { class ModularSmartcontractInstance; class SmartcontractInstanceAddress; +class SmartcontractExecResult; class InstanceSpace { public: @@ -23,11 +35,34 @@ class InstanceSpace { const SmartcontractInstanceAddress* getSmartContractInstanceAddress() const noexcept; + // language + bool analyze(); + void setMainInstance(); + + // before invoke + bool createMainInstance(); + bool interpretInitializer(); + void resetRootReference(); + + // databases + void setDatabaseDir(const File* baseDir); + void createDatabase(); + + // exec + void loadDatabase(); + void cleanDbRoot(); + + // ref + void incRef(); + void decRef(); + // invoke main instance + SmartcontractExecResult* invokeMainObjectMethod(UnicodeString *moduleName, UnicodeString* methodName, ArrayList* args); private: ModularSmartcontractInstance* instance; + SysMutex* mutex; int ref; }; diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.cpp new file mode 100644 index 0000000..49c66bb --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.cpp @@ -0,0 +1,22 @@ +/* + * InstanceSpaceReleaser.cpp + * + * Created on: Dec 1, 2025 + * Author: iizuka + */ + +#include "smartcontract_cache/InstanceSpaceReleaser.h" +#include "smartcontract_cache/InstanceSpace.h" + + +namespace codablecash { + +InstanceSpaceReleaser::InstanceSpaceReleaser(InstanceSpace* space) { + this->space = space; +} + +InstanceSpaceReleaser::~InstanceSpaceReleaser() { + this->space->decRef(); +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.h new file mode 100644 index 0000000..07f4b1f --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpaceReleaser.h @@ -0,0 +1,26 @@ +/* + * InstanceSpaceReleaser.h + * + * Created on: Dec 1, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_CACHE_INSTANCESPACERELEASER_H_ +#define SMARTCONTRACT_CACHE_INSTANCESPACERELEASER_H_ + +namespace codablecash { + +class InstanceSpace; + +class InstanceSpaceReleaser { +public: + explicit InstanceSpaceReleaser(InstanceSpace* space); + virtual ~InstanceSpaceReleaser(); + +private: + InstanceSpace* space; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_CACHE_INSTANCESPACERELEASER_H_ */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp index 9a2b86c..7c8c786 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.cpp @@ -17,9 +17,12 @@ #include "modular_project_registory/SmartcontractProjectData.h" #include "smartcontract_cache/InstanceSpace.h" +#include "smartcontract_cache/ProjectNotFoundException.h" #include "base/StackRelease.h" +#include "bc/ExceptionThrower.h" + namespace codablecash { @@ -45,16 +48,20 @@ InstanceSpace* InstanceSpacesManager::createInstance(const SmartcontractInstance key.setProjectId(projectId); SmartcontractProjectData* data = this->projectReg->findProjectById(&key); __STP(data); - if(data == nullptr){ // FIXME exception - return nullptr; - } + ExceptionThrower::throwExceptionIfCondition(data == nullptr, L"", __FILE__, __LINE__); ModularSmartcontractInstance* instance = data->toSmartcontractInstance(); InstanceSpace* space = new InstanceSpace(instAddress, instance); __STP(space); + return __STP_MV(space); +} + +void InstanceSpacesManager::registerCache(InstanceSpace *space) { this->cache->registerInstance(space); +} - return __STP_MV(space); +InstanceSpace* InstanceSpacesManager::loadFromCache(const SmartcontractInstanceAddress *instAddress) { + return this->cache->getInstanceSpace(instAddress); } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h index fceb7f4..b73f358 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpacesManager.h @@ -30,6 +30,9 @@ class InstanceSpacesManager { virtual ~InstanceSpacesManager(); InstanceSpace* createInstance(const SmartcontractInstanceAddress* instAddress, const SmartcontractProjectId* projectId); + void registerCache(InstanceSpace* space); + + InstanceSpace* loadFromCache(const SmartcontractInstanceAddress *instAddress); private: MolularSmartcontractCacheManager* cache; diff --git a/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.cpp b/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.cpp new file mode 100644 index 0000000..cd67c65 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.cpp @@ -0,0 +1,34 @@ +/* + * ModuleSetupException.cpp + * + * Created on: Dec 1, 2025 + * Author: iizuka + */ + +#include "smartcontract_cache/ModuleSetupException.h" + +#include "base/UnicodeString.h" + +namespace codablecash { + +const wchar_t* ModuleSetupException::defaultMessage = L"Smartcontract Project Setup Error."; + +ModuleSetupException::ModuleSetupException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ModuleSetupException::ModuleSetupException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ModuleSetupException::ModuleSetupException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +ModuleSetupException::ModuleSetupException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} + +ModuleSetupException::~ModuleSetupException() { +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.h b/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.h new file mode 100644 index 0000000..ece512b --- /dev/null +++ b/src_smartcontract_modular/smartcontract_cache/ModuleSetupException.h @@ -0,0 +1,30 @@ +/* + * ModuleSetupException.h + * + * Created on: Dec 1, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_CACHE_MODULESETUPEXCEPTION_H_ +#define SMARTCONTRACT_CACHE_MODULESETUPEXCEPTION_H_ + +#include "base/Exception.h" + +using namespace alinous; + +namespace codablecash { + +class ModuleSetupException : public Exception { +public: + ModuleSetupException(const char* srcfile, int srcline) noexcept; + ModuleSetupException(Exception* cause, const char* srcfile, int srcline) noexcept; + ModuleSetupException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + ModuleSetupException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; + virtual ~ModuleSetupException(); + + static const wchar_t* defaultMessage; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_CACHE_MODULESETUPEXCEPTION_H_ */ diff --git a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp index df63d6d..b87cbe5 100644 --- a/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp +++ b/src_smartcontract_modular/smartcontract_cache/MolularSmartcontractCacheManager.cpp @@ -49,6 +49,8 @@ InstanceSpace* MolularSmartcontractCacheManager::getInstanceSpace(const Smartcon int index = this->list->indexOf(inst); this->list->remove(index); this->list->add(inst); + + inst->incRef(); } return inst; @@ -62,7 +64,7 @@ InstanceSpace* MolularSmartcontractCacheManager::__getInstanceSpace(const Smartc InstanceSpace* inst = this->list->get(i); const SmartcontractInstanceAddress* ad = inst->getSmartContractInstanceAddress(); - if(address->compareTo(ad)){ + if(address->compareTo(ad) == 0){ instance = inst; break; } @@ -95,6 +97,7 @@ void MolularSmartcontractCacheManager::removeAll() { while(size > 0){ { StackUnlocker __lock(this->mutex, __FILE__, __LINE__); + this->cacheLimit = 0; __removeLast(); } size = cacheSize(); diff --git a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp index 580a565..de62bcf 100644 --- a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp +++ b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.cpp @@ -5,17 +5,31 @@ * Author: iizuka */ -#include +#include "smartcontract_cache/ProjectNotFoundException.h" + +#include "base/UnicodeString.h" + namespace codablecash { -ProjectNotFoundException::ProjectNotFoundException() { - // TODO Auto-generated constructor stub +const wchar_t* ProjectNotFoundException::defaultMessage = L"Smartcontract Project Error."; +ProjectNotFoundException::ProjectNotFoundException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ProjectNotFoundException::ProjectNotFoundException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ProjectNotFoundException::ProjectNotFoundException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +ProjectNotFoundException::ProjectNotFoundException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); } ProjectNotFoundException::~ProjectNotFoundException() { - // TODO Auto-generated destructor stub } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h index 73b3425..cd662de 100644 --- a/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h +++ b/src_smartcontract_modular/smartcontract_cache/ProjectNotFoundException.h @@ -8,12 +8,21 @@ #ifndef SMARTCONTRACT_CACHE_PROJECTNOTFOUNDEXCEPTION_H_ #define SMARTCONTRACT_CACHE_PROJECTNOTFOUNDEXCEPTION_H_ +#include "base/Exception.h" + +using namespace alinous; + namespace codablecash { -class ProjectNotFoundException { +class ProjectNotFoundException : public Exception { public: - ProjectNotFoundException(); + ProjectNotFoundException(const char* srcfile, int srcline) noexcept; + ProjectNotFoundException(Exception* cause, const char* srcfile, int srcline) noexcept; + ProjectNotFoundException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + ProjectNotFoundException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; virtual ~ProjectNotFoundException(); + + static const wchar_t* defaultMessage; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt b/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt index 56cc3db..407a55c 100644 --- a/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_executor/CMakeLists.txt @@ -7,6 +7,7 @@ set(__src SmartcontractExecContextKey.cpp SmartcontractExecContextKeyFactory.cpp SmartcontractExecContextRegistory.cpp + SmartcontractExecResult.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_executor) diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp index 8f0311c..474f764 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp @@ -18,14 +18,16 @@ #include "smartcontract_instance/ModularSmartcontractInstance.h" #include "smartcontract_cache/InstanceSpacesManager.h" +#include "smartcontract_cache/InstanceSpace.h" #include "base/UnicodeString.h" #include "base/StackRelease.h" #include "base_io/File.h" +#include "bc/ExceptionThrower.h" - +#include "smartcontract_cache/ModuleSetupException.h" namespace codablecash { ModularSmartcontractExecutor::ModularSmartcontractExecutor(const File* base) { @@ -84,4 +86,29 @@ SmartcontractProjectData* ModularSmartcontractExecutor::getProject(const Smartco return data; } +void ModularSmartcontractExecutor::createInstance(const SmartcontractInstanceAddress *instAddress, const SmartcontractProjectId *projectId) { + InstanceSpace* space = this->instanceSpace->createInstance(instAddress, projectId); __STP(space); + + // language + bool hasError = space->analyze(); + ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Analysis error.", __FILE__, __LINE__); + + space->setMainInstance(); + space->createMainInstance(); + hasError = space->interpretInitializer(); + ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Main object initialize error.", __FILE__, __LINE__); + + // database + File* instanceRootDir = this->baseDir->get(INSTANCES_DIR_NAME); __STP(instanceRootDir); + space->setDatabaseDir(instanceRootDir); + space->createDatabase(); + + this->instanceSpace->registerCache(__STP_MV(space)); +} + +InstanceSpace* ModularSmartcontractExecutor::loadFromCache(const SmartcontractInstanceAddress *instAddress) { + InstanceSpace* space = this->instanceSpace->loadFromCache(instAddress); + return space; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h index f5de1aa..b3ca6e0 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.h @@ -23,10 +23,13 @@ class ModularSmartcontractProject; class SmartcontractProjectId; class SmartcontractProjectData; class InstanceSpacesManager; +class InstanceSpace; +class SmartcontractInstanceAddress; class ModularSmartcontractExecutor { public: static const constexpr wchar_t* DIR_NAME{L"contract_exec"}; + static const constexpr wchar_t* INSTANCES_DIR_NAME{L"instances"}; explicit ModularSmartcontractExecutor(const File* base); virtual ~ModularSmartcontractExecutor(); @@ -38,6 +41,9 @@ class ModularSmartcontractExecutor { void registerModularSmartcontractProject(ModularSmartcontractProject* project); SmartcontractProjectData* getProject(const SmartcontractProjectId* projectId); + void createInstance(const SmartcontractInstanceAddress* instAddress, const SmartcontractProjectId* projectId); + InstanceSpace* loadFromCache(const SmartcontractInstanceAddress* instAddress); + private: File* baseDir; ModularSmartcontractProjectRegistory* projectRegistory; diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.cpp b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.cpp new file mode 100644 index 0000000..98f5966 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.cpp @@ -0,0 +1,27 @@ +/* + * SmartcontractExecResult.cpp + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "ext_binary/AbstractExtObject.h" + + +namespace codablecash { + +SmartcontractExecResult::SmartcontractExecResult() { + this->returnedValue = nullptr; +} + +SmartcontractExecResult::~SmartcontractExecResult() { + delete this->returnedValue; +} + +void SmartcontractExecResult::setReturnedValue(AbstractExtObject *value) noexcept { + this->returnedValue = value; +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.h b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.h new file mode 100644 index 0000000..0e78485 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_executor/SmartcontractExecResult.h @@ -0,0 +1,34 @@ +/* + * SmartcontractExecResult.h + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECRESULT_H_ +#define SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECRESULT_H_ + +namespace alinous { +class AbstractExtObject; +} +using namespace alinous; + +namespace codablecash { + +class SmartcontractExecResult { +public: + SmartcontractExecResult(); + virtual ~SmartcontractExecResult(); + + void setReturnedValue(AbstractExtObject* value) noexcept; + AbstractExtObject* getReturnedValue() const noexcept { + return this->returnedValue; + } + +private: + AbstractExtObject* returnedValue; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_EXECUTOR_SMARTCONTRACTEXECRESULT_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index b5445a6..db3767b 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -10,6 +10,8 @@ #include "smartcontract_instance/LibraryExectableModuleInstance.h" #include "smartcontract_instance/ModuleInstanceClassLoader.h" +#include "smartcontract_instance/ClassNotFoundException.h" + #include "modular_project/ModularInstanceConfig.h" #include "modular_project/DependencyConfig.h" #include "modular_project/ModularConfigException.h" @@ -35,20 +37,39 @@ #include "engine/compiler/CompileError.h" #include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/AnalyzedType.h" +#include "engine/sc_analyze/AnalyzedClass.h" #include "vm/VirtualMachine.h" #include "json_object/AbstractJsonValue.h" +#include "vm/variable_access/FunctionArguments.h" + #include "ext_arguments/AbstractFunctionExtArguments.h" #include "instance/instance_gc/GcManager.h" +#include "instance/AbstractVmInstance.h" +#include "instance/VmInstanceTypesConst.h" #include "lang/sc_declare/ClassDeclare.h" #include "bc_base/BinaryUtils.h" +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "lang/sc_declare/MethodDeclare.h" + +#include "ext_binary/ExtNullPtrObject.h" + +#include "smartcontract_instance/InstanceDependencyContext.h" +#include "inter_modular_access/ModularProxyObjectInstanceFactory.h" + +#include "instance/instance_ref/ObjectReference.h" + +#include "instance/instance_exception_class/VmExceptionInstance.h" namespace codablecash { AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) { @@ -65,6 +86,7 @@ AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) this->compile_errors = nullptr; this->mainInst = nullptr; this->dependencyHandler = new InstanceDependencyHandler(); + this->factory = new ModularProxyObjectInstanceFactory(); this->dbDir = nullptr; this->undodbDir = nullptr; @@ -505,4 +527,153 @@ void AbstractExecutableModuleInstance::loadDatabase() { this->vm->loadDatabase(this->dbDir, this->undodbDir); } +bool AbstractExecutableModuleInstance::checkDirectAccess() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + TypeResolver* resolver = actx->getTypeResolver(); + + // main instance class + UnicodeString* mainClassFqn = contract->getMainClassFqn(); __STP(mainClassFqn); + ClassDeclare* dec = contract->getClassDeclareByFqn(mainClassFqn); + ExceptionThrower::throwExceptionIfCondition(dec == nullptr, L"Main class does not exists.", __FILE__, __LINE__); + + AnalyzedType* atypeDec = resolver->getClassType(dec); __STP(atypeDec); + AnalyzedClass* aclazzDec = atypeDec->getAnalyzedClass(); + const ArrayList* implememtsList = aclazzDec->getImplements(); + + ArrayList* list = this->instanceConfig->getDirectAccess(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* clazzFqn = list->get(i); + + ClassDeclare* interface = contract->getClassDeclareByFqn(clazzFqn); + ExceptionThrower::throwExceptionIfCondition(interface == nullptr, L"Interface does not exists.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(!interface->isInterface(), L"Interface class must be interface.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(interface->isGenerics(), L"Interface class must not use Generics.", __FILE__, __LINE__); + + AnalyzedType* atype = resolver->getClassType(interface); __STP(atype); + AnalyzedClass* aclazz = atype->getAnalyzedClass(); + + bool bl = hasInterface(implememtsList, aclazz); + ExceptionThrower::throwExceptionIfCondition(!bl, L"The main class does not implements the directAccess Interface.", __FILE__, __LINE__); + } + + return false; +} + +bool AbstractExecutableModuleInstance::hasInterface(const ArrayList *implememtsList, AnalyzedClass *aclazz) { + bool result = false; + + int maxLoop = implememtsList->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* cls = implememtsList->get(i); + + if(aclazz->equals(cls)){ + result = true; + break; + } + } + + return result; +} + +SmartcontractExecResult* AbstractExecutableModuleInstance::invokeMainObjectMethodProxy(UnicodeString *methodName, + ArrayList *args) { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + TypeResolver* resolver = actx->getTypeResolver(); + + FunctionArguments innerArguments; + MethodDeclare* method = this->vm->interpretMainObjectMethod(methodName, args, &innerArguments); + + SmartcontractExecResult* result = new SmartcontractExecResult(); __STP(result); + + { + AnalyzedType* atype = method->getReturnedType(); + if(!atype->isVoid()){ + AbstractVmInstance* vminst = innerArguments.getReturnedValue(); + + UnicodeString name(L"ret"); + VTableRegistory* vreg = actx->getVtableRegistory(); + + AbstractExtObject* retObj = vminst != nullptr ? vminst->toClassExtObject(&name, vreg) : new ExtNullPtrObject(&name); + result->setReturnedValue(retObj); + } + } + + return __STP_MV(result); +} + + +AbstractExtObject* AbstractExecutableModuleInstance::invokeMainObjectMethodProxy(UnicodeString *methodName, FunctionArguments *args) { + AbstractExtObject* ret = nullptr; + + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + MethodDeclare* method = this->vm->interpretMainObjectMethodProxy(methodName, args); + + + AnalyzedType* atype = method->getReturnedType(); + ObjectReference* exObj = this->vm->getUncaughtExceptionProxy(); + if(!atype->isVoid() && exObj != nullptr){ + VTableRegistory* vreg = actx->getVtableRegistory(); + + UnicodeString name(L"exception"); + ret = exObj->toClassExtObject(&name, vreg); + + this->vm->clearUncoughtException(); + } + + return ret; +} + + +bool AbstractExecutableModuleInstance::generateInterModularCommunicationClasses() { + bool hasError = false; + + ArrayList* list = this->dependencyHandler->getContextList(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + InstanceDependencyContext* dctx = list->get(i); + + AbstractExecutableModuleInstance* importInst = dctx->getModuleInstance(); + const ModularInstanceConfig* instanceConfig = importInst->getInstanceConfig(); + + const UnicodeString* mainPackage = instanceConfig->getMainPackage(); + const UnicodeString* mainClass = instanceConfig->getMainClass(); + UnicodeString* mainFqn = new UnicodeString(L""); __STP(mainFqn); + if(mainPackage->length() > 0){ + mainFqn->append(mainPackage); + mainFqn->append(L"."); + } + mainFqn->append(mainClass); + + ArrayList* libExport = instanceConfig->getLibExport(); + + generateLibExport(mainFqn, libExport, dctx); + } + + + + return hasError; + // FIXME generateInterModularCommunicationClasses +} + +void AbstractExecutableModuleInstance::generateLibExport(UnicodeString* mainFqn, ArrayList *libExport, InstanceDependencyContext* dctx) { + ModuleInstanceClassLoader* classLoader = dctx->getClassLoader(); + + int maxLoop = libExport->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* ifFqn = libExport->get(i); + + ClassDeclare* ifdec = classLoader->getClassDeclare(ifFqn); + ExceptionThrower::throwExceptionIfCondition(ifdec == nullptr, L"The main class does not implements the directAccess Interface.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(ifdec->isGenerics(), L"The main class can not use Generics.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(!ifdec->isInterface(), L"The main class must be interface.", __FILE__, __LINE__); + + this->factory->generateModularClass(mainFqn, ifdec, dctx); + } +} + } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index e386de0..955334a 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -18,6 +18,10 @@ class CompileError; class VmClassInstance; class CompilationUnit; class ByteBuffer; +class AnalyzedClass; +class AbstractFunctionExtArguments; +class FunctionArguments; +class AbstractExtObject; } using namespace alinous; @@ -31,6 +35,10 @@ class DependencyConfig; class InstanceDependencyHandler; class ModularSmartcontractInstance; class ModuleInstanceClassLoader; +class SmartcontractExecResult; +class InstanceDependencyContext; +class ModularProxyObjectInstanceFactory; + class AbstractExecutableModuleInstance { public: @@ -66,6 +74,8 @@ class AbstractExecutableModuleInstance { bool analyzeMetadata(); bool analyzeFinal(); + bool checkDirectAccess(); + bool loadDependency(ModularSmartcontractInstance* parent); bool preAnalyzeDependency(); bool analyzeTypeDependency(); @@ -89,7 +99,24 @@ class AbstractExecutableModuleInstance { void createDatabase(); void loadDatabase(); + // invoke method + SmartcontractExecResult* invokeMainObjectMethodProxy(UnicodeString *methodName, ArrayList* args); + AbstractExtObject* invokeMainObjectMethodProxy(UnicodeString *methodName, FunctionArguments* args); + + const UnicodeString* getName() const noexcept { + return this->name; + } + const ModularInstanceConfig* getInstanceConfig() const noexcept { + return this->instanceConfig; + } + + // modular + bool generateInterModularCommunicationClasses(); + protected: + void generateLibExport(UnicodeString* mainFqn, ArrayList* libExport, InstanceDependencyContext* dctx); + + bool hasInterface(const ArrayList* implememtsList, AnalyzedClass* aclazz); void resetContract(); void parseSourceFolders(const File *projectBaseDir); void scanSourceFolder(File* baseDir, const UnicodeString* folder, const File *projectBaseDir); @@ -117,6 +144,7 @@ class AbstractExecutableModuleInstance { const ArrayList* compile_errors; InstanceDependencyHandler* dependencyHandler; + ModularProxyObjectInstanceFactory* factory; // database File* dbDir; diff --git a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt index 37537ba..97c8e1d 100644 --- a/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt +++ b/src_smartcontract_modular/smartcontract_instance/CMakeLists.txt @@ -2,12 +2,14 @@ set(__src AbstractExecutableModuleInstance.cpp + ClassNotFoundException.cpp ExecutableModuleInstance.cpp InstanceDependencyContext.cpp InstanceDependencyHandler.cpp LibraryExectableModuleInstance.cpp ModularSmartcontractInstance.cpp ModuleInstanceClassLoader.cpp + SmartcontractExecutionException.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular smartcontract_instance) diff --git a/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.cpp b/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.cpp new file mode 100644 index 0000000..4fc92a9 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.cpp @@ -0,0 +1,33 @@ +/* + * ClassNotFoundException.cpp + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/ClassNotFoundException.h" + +#include "base/UnicodeString.h" + +namespace codablecash { + +const wchar_t* ClassNotFoundException::defaultMessage = L"Class does not exists."; + +ClassNotFoundException::ClassNotFoundException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ClassNotFoundException::ClassNotFoundException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +ClassNotFoundException::ClassNotFoundException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +ClassNotFoundException::ClassNotFoundException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +ClassNotFoundException::~ClassNotFoundException() { +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.h b/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.h new file mode 100644 index 0000000..126b7df --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/ClassNotFoundException.h @@ -0,0 +1,29 @@ +/* + * ClassNotFoundException.h + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_CLASSNOTFOUNDEXCEPTION_H_ +#define SMARTCONTRACT_INSTANCE_CLASSNOTFOUNDEXCEPTION_H_ + +#include "base/Exception.h" + +using namespace alinous; + +namespace codablecash { + +class ClassNotFoundException : public alinous::Exception { +public: + ClassNotFoundException(const char* srcfile, int srcline) noexcept; + ClassNotFoundException(Exception* cause, const char* srcfile, int srcline) noexcept; + ClassNotFoundException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + ClassNotFoundException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; + virtual ~ClassNotFoundException(); + static const wchar_t* defaultMessage; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_CLASSNOTFOUNDEXCEPTION_H_ */ diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp index 1a62ca4..c817346 100644 --- a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.cpp @@ -15,7 +15,6 @@ namespace codablecash { InstanceDependencyContext::InstanceDependencyContext() { this->moduleInstance = nullptr; - this->uintsList = nullptr; this->clazzLoader = new ModuleInstanceClassLoader(); } @@ -27,10 +26,6 @@ void InstanceDependencyContext::setModuleInstance(AbstractExecutableModuleInstan this->moduleInstance = inst; } -void InstanceDependencyContext::setUnitsList(ArrayList *unitsList) noexcept { - this->uintsList = unitsList; -} - void InstanceDependencyContext::setVm(VirtualMachine *vm) { this->clazzLoader->setVm(vm); } diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h index 38f5dcc..5ceddf8 100644 --- a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyContext.h @@ -27,7 +27,6 @@ class InstanceDependencyContext { virtual ~InstanceDependencyContext(); void setModuleInstance(AbstractExecutableModuleInstance* inst) noexcept; - void setUnitsList(ArrayList* unitsList) noexcept; AbstractExecutableModuleInstance* getModuleInstance() const noexcept { return this->moduleInstance; @@ -40,7 +39,6 @@ class InstanceDependencyContext { private: AbstractExecutableModuleInstance* moduleInstance; - ArrayList* uintsList; ModuleInstanceClassLoader* clazzLoader; }; diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp index 4dd0c09..47448bf 100644 --- a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.cpp @@ -28,6 +28,7 @@ namespace codablecash { InstanceDependencyHandler::InstanceDependencyHandler() { this->map = new HashMap(); + this->list = new ArrayList(); } InstanceDependencyHandler::~InstanceDependencyHandler() { @@ -40,6 +41,8 @@ InstanceDependencyHandler::~InstanceDependencyHandler() { } delete this->map; + + delete this->list; } void InstanceDependencyHandler::registerDependentInstance(AbstractDependencyConfig *config, ModularSmartcontractInstance *parent, AnalyzeContext* actx) { @@ -58,6 +61,7 @@ void InstanceDependencyHandler::registerDependentInstance(AbstractDependencyConf context->setVm(vm); this->map->put(name, context); + this->list->addElement(context); } } diff --git a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h index f77e365..fea06b1 100644 --- a/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h +++ b/src_smartcontract_modular/smartcontract_instance/InstanceDependencyHandler.h @@ -36,8 +36,13 @@ class InstanceDependencyHandler { void analyzeType(AnalyzeContext* actx); void analyze(AnalyzeContext* actx); + ArrayList* getContextList() const noexcept { + return this->list; + } + private: HashMap* map; + ArrayList* list; }; diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index 9878764..e43671c 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -35,6 +35,7 @@ #include "transaction/SmartcontractInstanceAddress.h" +#include "smartcontract_instance/SmartcontractExecutionException.h" namespace codablecash { @@ -138,6 +139,18 @@ bool ModularSmartcontractInstance::analyze() { return hasError; } +bool ModularSmartcontractInstance::checkDirectAccess() { + bool hasError = this->execModule->checkDirectAccess(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->checkDirectAccess(); + } + + return hasError; +} + void ModularSmartcontractInstance::initBeforeAnalyze() { bool hasError = this->execModule->initBeforeAnalyze(); @@ -463,4 +476,43 @@ void ModularSmartcontractInstance::setSmartcontractInstanceAddress(const Smartco this->instanceAddress = dynamic_cast(address->copyData()); } +SmartcontractExecResult* ModularSmartcontractInstance::invokeMainObjectMethod(UnicodeString *moduleName, UnicodeString *methodName, + ArrayList* args) { + + AbstractExecutableModuleInstance* module = nullptr; + + const UnicodeString* name = this->execModule->getName(); + if(name->equals(moduleName)){ + module = this->execModule; + } + else{ + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + + name = lib->getName(); + if(name->equals(moduleName)){ + module = lib; + break; + } + } + } + ExceptionThrower::throwExceptionIfCondition(module == nullptr, L"Module name is wrong.", __FILE__, __LINE__); + + return module->invokeMainObjectMethodProxy(methodName, args); +} + +bool ModularSmartcontractInstance::generateInterModularCommunicationClasses() { + bool hasError = this->execModule->generateInterModularCommunicationClasses(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + + hasError |= lib->generateInterModularCommunicationClasses(); + } + + return hasError; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index dadff52..526219b 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -15,6 +15,7 @@ namespace alinous { class ByteBuffer; class File; class VirtualMachine; +class AbstractFunctionExtArguments; } using namespace alinous; @@ -26,7 +27,7 @@ class LibraryExectableModuleInstance; class SmartcontractProjectData; class SmartcontractProjectId; class SmartcontractInstanceAddress; - +class SmartcontractExecResult; class ModularSmartcontractInstance { public: @@ -47,6 +48,8 @@ class ModularSmartcontractInstance { bool hasCompileError() const noexcept; bool analyze(); + bool checkDirectAccess(); + void setMainInstance(); bool createMainInstance(); bool interpretInitializer(); @@ -64,6 +67,9 @@ class ModularSmartcontractInstance { void toBinary(ByteBuffer* out) const; static ModularSmartcontractInstance* createFromBinary(ByteBuffer* in); + // modular + bool generateInterModularCommunicationClasses(); + // create data SmartcontractProjectData* createData() const; SmartcontractProjectId* getProjectId() const; @@ -73,6 +79,9 @@ class ModularSmartcontractInstance { return this->instanceAddress; } + // invoke method + SmartcontractExecResult* invokeMainObjectMethod(UnicodeString *moduleName, UnicodeString *methodName, ArrayList* args); + private: SmartcontractProjectId* __getProjectId(ByteBuffer* buff) const; diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp index c246425..c146ec5 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp @@ -75,7 +75,7 @@ void ModuleInstanceClassLoader::addCompilationUnit(const UnicodeString *fqn, Com } } -const ClassDeclare* ModuleInstanceClassLoader::getClassDeclare(const UnicodeString *fqn) const { +ClassDeclare* ModuleInstanceClassLoader::getClassDeclare(const UnicodeString *fqn) const { UnicodeString* className = TypeResolver::getClassName(fqn); __STP(className); CompilationUnit* unit = this->classFqnMap->get(fqn); diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h index ed48fe5..b4c934a 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h @@ -30,7 +30,7 @@ class ModuleInstanceClassLoader { void setVm(VirtualMachine* vm); void loadClass(const UnicodeString* fqn); - const ClassDeclare* getClassDeclare(const UnicodeString* fqn) const; + ClassDeclare* getClassDeclare(const UnicodeString* fqn) const; void preAnalyze(AnalyzeContext* actx); void analyzeType(AnalyzeContext* actx); diff --git a/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.cpp b/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.cpp new file mode 100644 index 0000000..4f7a646 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.cpp @@ -0,0 +1,35 @@ +/* + * SmartcontractExecutionException.cpp + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#include "smartcontract_instance/SmartcontractExecutionException.h" + +#include "base/UnicodeString.h" + + +namespace codablecash { + +const wchar_t* SmartcontractExecutionException::defaultMessage = L"Smartcontract Project Error."; + +SmartcontractExecutionException::SmartcontractExecutionException(const char* srcfile, int srcline) noexcept : Exception(srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +SmartcontractExecutionException::SmartcontractExecutionException(Exception* cause, const char* srcfile, int srcline) noexcept : Exception(cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); +} +SmartcontractExecutionException::SmartcontractExecutionException(const wchar_t* message, const char* srcfile, int srcline) noexcept : Exception(message, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} +SmartcontractExecutionException::SmartcontractExecutionException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept : Exception(message, cause, srcfile, srcline) { + this->message = new UnicodeString(defaultMessage); + this->message->append(message); +} + +SmartcontractExecutionException::~SmartcontractExecutionException() { +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.h b/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.h new file mode 100644 index 0000000..b306c82 --- /dev/null +++ b/src_smartcontract_modular/smartcontract_instance/SmartcontractExecutionException.h @@ -0,0 +1,30 @@ +/* + * SmartcontractExecutionException.h + * + * Created on: Dec 2, 2025 + * Author: iizuka + */ + +#ifndef SMARTCONTRACT_INSTANCE_SMARTCONTRACTEXECUTIONEXCEPTION_H_ +#define SMARTCONTRACT_INSTANCE_SMARTCONTRACTEXECUTIONEXCEPTION_H_ + +#include "base/Exception.h" + +using namespace alinous; + +namespace codablecash { + +class SmartcontractExecutionException: public alinous::Exception { +public: + SmartcontractExecutionException(const char* srcfile, int srcline) noexcept; + SmartcontractExecutionException(Exception* cause, const char* srcfile, int srcline) noexcept; + SmartcontractExecutionException(const wchar_t* message, const char* srcfile, int srcline) noexcept; + SmartcontractExecutionException(const wchar_t* message, Exception* cause, const char* srcfile, int srcline) noexcept; + virtual ~SmartcontractExecutionException(); + + static const wchar_t* defaultMessage; +}; + +} /* namespace codablecash */ + +#endif /* SMARTCONTRACT_INSTANCE_SMARTCONTRACTEXECUTIONEXCEPTION_H_ */ diff --git a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp index aa33c6a..b2f0e58 100644 --- a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp @@ -7,11 +7,14 @@ #include "ext_binary/ExtNullPtrObject.h" +#include "instance/VmInstanceTypesConst.h" + #include "base/UnicodeString.h" + namespace alinous { -ExtNullPtrObject::ExtNullPtrObject(const UnicodeString* name, uint8_t type) : AbstractExtObject(name, type){ +ExtNullPtrObject::ExtNullPtrObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_NULL){ } ExtNullPtrObject::~ExtNullPtrObject() { @@ -22,7 +25,7 @@ bool ExtNullPtrObject::isNull() const noexcept { } AbstractExtObject* ExtNullPtrObject::copy() const noexcept { - return new ExtNullPtrObject(this->name, this->type); + return new ExtNullPtrObject(this->name); } const UnicodeString* ExtNullPtrObject::toString() const noexcept { diff --git a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h index 3b5d887..7cac9dd 100644 --- a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h +++ b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h @@ -14,7 +14,7 @@ namespace alinous { class ExtNullPtrObject : public AbstractExtObject { public: - ExtNullPtrObject(const UnicodeString* name, uint8_t type); + ExtNullPtrObject(const UnicodeString* name); virtual ~ExtNullPtrObject(); virtual bool isNull() const noexcept; diff --git a/src_smartcontract_vm/instance/AbstractVmInstance.cpp b/src_smartcontract_vm/instance/AbstractVmInstance.cpp index d6ef0bc..f7b63e4 100644 --- a/src_smartcontract_vm/instance/AbstractVmInstance.cpp +++ b/src_smartcontract_vm/instance/AbstractVmInstance.cpp @@ -13,8 +13,9 @@ namespace alinous { -AbstractVmInstance::AbstractVmInstance(uint8_t type) { +AbstractVmInstance::AbstractVmInstance(uint8_t type, uint64_t serial) { this->type = type; + this->serial = serial; } AbstractVmInstance::~AbstractVmInstance() { @@ -25,8 +26,9 @@ uint8_t AbstractVmInstance::getType() const noexcept { } int AbstractVmInstance::hashCode() const noexcept { - uint64_t addr = (uint64_t)this; - return (int)(addr >> 2); + // inst hash code + uint64_t addr = (uint64_t)serial; + return (int)(addr % 1024); } const VMemList* AbstractVmInstance::getReferences() const noexcept { diff --git a/src_smartcontract_vm/instance/AbstractVmInstance.h b/src_smartcontract_vm/instance/AbstractVmInstance.h index 3171456..1eecf63 100644 --- a/src_smartcontract_vm/instance/AbstractVmInstance.h +++ b/src_smartcontract_vm/instance/AbstractVmInstance.h @@ -28,7 +28,7 @@ class AbstractVmInstance { void* operator new(size_t size, VirtualMachine* vm); void operator delete(void* p, size_t size); - explicit AbstractVmInstance(uint8_t type); + AbstractVmInstance(uint8_t type, uint64_t serial); virtual ~AbstractVmInstance(); virtual uint8_t getType() const noexcept; @@ -46,6 +46,7 @@ class AbstractVmInstance { virtual AbstractExtObject* toClassExtObject(const UnicodeString* name, VTableRegistory* table); protected: uint8_t type; + uint64_t serial; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/VmClassInstance.cpp b/src_smartcontract_vm/instance/VmClassInstance.cpp index d5ba509..82ca79c 100644 --- a/src_smartcontract_vm/instance/VmClassInstance.cpp +++ b/src_smartcontract_vm/instance/VmClassInstance.cpp @@ -37,13 +37,14 @@ namespace alinous { + VmClassInstance::VmClassInstance(AnalyzedClass* clazz, VirtualMachine* vm) : - AbstractVmInstance(VmInstanceTypesConst::INST_OBJ), clazz(clazz), members(vm) { + AbstractVmInstance(VmInstanceTypesConst::INST_OBJ, vm->publishInstanceSerial()), clazz(clazz), members(vm) { } VmClassInstance::VmClassInstance(uint8_t type, AnalyzedClass* clazz, VirtualMachine* vm) : - AbstractVmInstance(type), clazz(clazz), members(vm) { + AbstractVmInstance(type, vm->publishInstanceSerial()), clazz(clazz), members(vm) { } VmClassInstance::~VmClassInstance() { diff --git a/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp b/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp index 049d9ce..e38cc6e 100644 --- a/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp +++ b/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp @@ -17,13 +17,14 @@ namespace alinous { -ArrayReference::ArrayReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) : AbstractReference(owner, VmInstanceTypesConst::REF_ARRAY) { +ArrayReference::ArrayReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) + : AbstractReference(owner, VmInstanceTypesConst::REF_ARRAY, vm->publishInstanceSerial()) { this->instArray = nullptr; } ArrayReference::ArrayReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm, VmArrayInstance* instArray) - : AbstractReference(owner, VmInstanceTypesConst::REF_ARRAY){ + : AbstractReference(owner, VmInstanceTypesConst::REF_ARRAY, vm->publishInstanceSerial()){ this->instArray = instArray; } @@ -74,7 +75,7 @@ int ArrayReference::valueCompare(const IAbstractVmInstanceSubstance* right) cons AbstractExtObject* ArrayReference::toClassExtObject(const UnicodeString* name, VTableRegistory* table) { return this->instArray != nullptr ? this->instArray->instToClassExtObject(name, table) - : new ExtNullPtrObject(name, VmInstanceTypesConst::INST_ARRAY); + : new ExtNullPtrObject(name); } void ArrayReference::resetOnGc() noexcept { diff --git a/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp b/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp index ab1cf8e..3bae6e5 100644 --- a/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp +++ b/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp @@ -20,7 +20,7 @@ namespace alinous { -VmArrayInstance::VmArrayInstance(VirtualMachine* vm, int length, const AnalyzedType& atype) : AbstractVmInstance(VmInstanceTypesConst::INST_ARRAY) { +VmArrayInstance::VmArrayInstance(VirtualMachine* vm, int length, const AnalyzedType& atype) : AbstractVmInstance(VmInstanceTypesConst::INST_ARRAY, vm->publishInstanceSerial()) { this->array = new(vm) VMemList(vm); this->length = length; this->atype = new AnalyzedType(atype); diff --git a/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.cpp b/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.cpp index bc207b9..9c58f4d 100644 --- a/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.cpp +++ b/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.cpp @@ -11,7 +11,7 @@ namespace alinous { -AbstractDomInstance::AbstractDomInstance(VirtualMachine* vm, uint8_t type) : AbstractVmInstance(type) { +AbstractDomInstance::AbstractDomInstance(VirtualMachine* vm, uint8_t type, uint64_t serial) : AbstractVmInstance(type, serial) { } diff --git a/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.h b/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.h index e527523..16ec284 100644 --- a/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.h +++ b/src_smartcontract_vm/instance/instance_dom/AbstractDomInstance.h @@ -17,7 +17,7 @@ class VirtualMachine; class AbstractDomInstance : public AbstractVmInstance, public IInstanceContainer { public: - AbstractDomInstance(VirtualMachine* vm, uint8_t type); + AbstractDomInstance(VirtualMachine* vm, uint8_t type, uint64_t serial); virtual ~AbstractDomInstance(); }; diff --git a/src_smartcontract_vm/instance/instance_dom/DomArrayVariable.cpp b/src_smartcontract_vm/instance/instance_dom/DomArrayVariable.cpp index 22697c7..a3f9a6a 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomArrayVariable.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomArrayVariable.cpp @@ -26,7 +26,7 @@ namespace alinous { const UnicodeString DomArrayVariable::LENGTH(L"length"); -DomArrayVariable::DomArrayVariable(VirtualMachine* vm) : AbstractDomInstance(vm, VmInstanceTypesConst::INST_DOM_ARRAY), list(vm, 1) { +DomArrayVariable::DomArrayVariable(VirtualMachine* vm) : AbstractDomInstance(vm, VmInstanceTypesConst::INST_DOM_ARRAY, vm->publishInstanceSerial()), list(vm, 1) { this->array = new(vm) VMemList(vm); this->str = nullptr; } diff --git a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp index 13e0d71..b0ae4a4 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp @@ -18,7 +18,7 @@ namespace alinous { DomRuntimeReference::DomRuntimeReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) - : AbstractReference(owner, VmInstanceTypesConst::REF_DOM_RUNTIME){ + : AbstractReference(owner, VmInstanceTypesConst::REF_DOM_RUNTIME, vm->publishInstanceSerial()){ this->reference = nullptr; } @@ -77,7 +77,7 @@ int DomRuntimeReference::valueCompare(const IAbstractVmInstanceSubstance* right) } AbstractExtObject* DomRuntimeReference::toClassExtObject(const UnicodeString* name, VTableRegistory* table) { - return this->reference == nullptr ? new ExtNullPtrObject(name, VmInstanceTypesConst::REF_DOM_RUNTIME) : this->reference->toClassExtObject(name, table); + return this->reference == nullptr ? new ExtNullPtrObject(name) : this->reference->toClassExtObject(name, table); } const UnicodeString* DomRuntimeReference::toString() const noexcept { diff --git a/src_smartcontract_vm/instance/instance_dom/DomVariableInstance.cpp b/src_smartcontract_vm/instance/instance_dom/DomVariableInstance.cpp index 681df15..3727d5c 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomVariableInstance.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomVariableInstance.cpp @@ -29,7 +29,7 @@ #include "instance/instance_parts/VMemHashMapKeySet.h" namespace alinous { -DomVariableInstance::DomVariableInstance(VirtualMachine* vm) : AbstractDomInstance(vm, VmInstanceTypesConst::INST_DOM) { +DomVariableInstance::DomVariableInstance(VirtualMachine* vm) : AbstractDomInstance(vm, VmInstanceTypesConst::INST_DOM, vm->publishInstanceSerial()) { this->properties = new(vm) VMemHashmap(vm); this->list = new(vm) VMemList(vm); this->str = nullptr; diff --git a/src_smartcontract_vm/instance/instance_dom/DomVariableReference.cpp b/src_smartcontract_vm/instance/instance_dom/DomVariableReference.cpp index 3e28ad1..8da5fc4 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomVariableReference.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomVariableReference.cpp @@ -20,7 +20,7 @@ namespace alinous { DomVariableReference::DomVariableReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm, AbstractDomInstance* inst) - : AbstractReference(owner, VmInstanceTypesConst::REF_DOM) { + : AbstractReference(owner, VmInstanceTypesConst::REF_DOM, vm->publishInstanceSerial()) { this->inst = inst; } diff --git a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h index 2c135a8..8d19984 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h +++ b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h @@ -27,6 +27,8 @@ class VmExceptionInstance : public VmClassInstance { virtual AbstractExtObject* toClassExtObject(const UnicodeString* name, VTableRegistory* reg); virtual const UnicodeString* toString() noexcept; + + private: const CodeElement* element; UnicodeString* message; diff --git a/src_smartcontract_vm/instance/instance_ref/AbstractReference.cpp b/src_smartcontract_vm/instance/instance_ref/AbstractReference.cpp index 111987d..e3d7db3 100644 --- a/src_smartcontract_vm/instance/instance_ref/AbstractReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/AbstractReference.cpp @@ -13,7 +13,7 @@ namespace alinous { const UnicodeString AbstractReference::NULL_STR(L"null"); -AbstractReference::AbstractReference(IAbstractVmInstanceSubstance* owner, uint8_t type) : AbstractVmInstance(type), owner(owner) { +AbstractReference::AbstractReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint64_t serial) : AbstractVmInstance(type, serial), owner(owner) { } diff --git a/src_smartcontract_vm/instance/instance_ref/AbstractReference.h b/src_smartcontract_vm/instance/instance_ref/AbstractReference.h index d7b147b..07a3061 100644 --- a/src_smartcontract_vm/instance/instance_ref/AbstractReference.h +++ b/src_smartcontract_vm/instance/instance_ref/AbstractReference.h @@ -18,7 +18,7 @@ class AbstractReference : public AbstractVmInstance { public: static const UnicodeString NULL_STR; - explicit AbstractReference(IAbstractVmInstanceSubstance* owner, uint8_t type); + explicit AbstractReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint64_t serial); virtual ~AbstractReference(); virtual IAbstractVmInstanceSubstance* getInstance() noexcept = 0; diff --git a/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.cpp b/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.cpp index 38471a5..9d38dbc 100644 --- a/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.cpp +++ b/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.cpp @@ -11,7 +11,7 @@ namespace alinous { -ConstStaticPrimitive::ConstStaticPrimitive(PrimitiveReference* primitiveObj) : PrimitiveReference(primitiveObj->getType()) { +ConstStaticPrimitive::ConstStaticPrimitive(PrimitiveReference* primitiveObj, uint64_t serial) : PrimitiveReference(primitiveObj->getType(), serial) { size_t size = primitiveObj->getDataSize(primitiveObj->getType()); this->type = primitiveObj->getType(); diff --git a/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.h b/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.h index 1b73878..becd32e 100644 --- a/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.h +++ b/src_smartcontract_vm/instance/instance_ref/ConstStaticPrimitive.h @@ -14,7 +14,7 @@ namespace alinous { class ConstStaticPrimitive : public PrimitiveReference { public: - ConstStaticPrimitive(PrimitiveReference* primitiveObj); + ConstStaticPrimitive(PrimitiveReference* primitiveObj, uint64_t serial); virtual ~ConstStaticPrimitive(); virtual bool isStaticConst() const noexcept; diff --git a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp index 6e8c144..53bc37a 100644 --- a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp @@ -23,7 +23,7 @@ namespace alinous { -ObjectReference::ObjectReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint8_t instanceType) : AbstractReference(owner, type) { +ObjectReference::ObjectReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint8_t instanceType, uint64_t serial) : AbstractReference(owner, type, serial) { this->instance = nullptr; this->instanceType = instanceType; } @@ -33,21 +33,21 @@ ObjectReference::~ObjectReference() { } ObjectReference* ObjectReference::createObjectReference(IAbstractVmInstanceSubstance* owner, VmClassInstance* clazzInst, VirtualMachine* vm) { - ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE); + ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE, vm->publishInstanceSerial()); ref->setInstance(clazzInst); return ref; } ObjectReference* ObjectReference::createStringReference(IAbstractVmInstanceSubstance* owner, VmStringInstance* clazzInst, VirtualMachine* vm) { - ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE); + ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE, vm->publishInstanceSerial()); ref->setInstance(clazzInst); return ref; } ObjectReference* ObjectReference::createReservedClassObjectReference(IAbstractVmInstanceSubstance *owner, AbstractVmReservedInstance *clazzInst, VirtualMachine *vm) { - ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE); + ObjectReference* ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE, vm->publishInstanceSerial()); ref->setInstance(clazzInst); return ref; @@ -108,7 +108,7 @@ AbstractExtObject* ObjectReference::createNullObject(const UnicodeString* name, uint8_t type = this->instanceType == ObjectReference::STRING_INSTANCE ? VmInstanceTypesConst::INST_STRING : VmInstanceTypesConst::INST_OBJ; - return new ExtNullPtrObject(name, type); + return new ExtNullPtrObject(name); } bool ObjectReference::isNull() const noexcept { diff --git a/src_smartcontract_vm/instance/instance_ref/ObjectReference.h b/src_smartcontract_vm/instance/instance_ref/ObjectReference.h index 16baf25..2ca09be 100644 --- a/src_smartcontract_vm/instance/instance_ref/ObjectReference.h +++ b/src_smartcontract_vm/instance/instance_ref/ObjectReference.h @@ -21,7 +21,7 @@ class ObjectReference : public AbstractReference { static constexpr uint8_t CLASS_INSTANCE {1}; static constexpr uint8_t STRING_INSTANCE {2}; - explicit ObjectReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint8_t instanceType); + explicit ObjectReference(IAbstractVmInstanceSubstance* owner, uint8_t type, uint8_t instanceType, uint64_t serial); virtual ~ObjectReference(); static ObjectReference* createObjectReference(IAbstractVmInstanceSubstance* owner, VmClassInstance* clazzInst, VirtualMachine* vm); diff --git a/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.cpp b/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.cpp index 8c5a3e7..fc1bd7f 100644 --- a/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.cpp @@ -24,7 +24,7 @@ #include "instance/instance_exception/ExceptionInterrupt.h" namespace alinous { -PrimitiveReference::PrimitiveReference(uint8_t type) : AbstractReference(nullptr, type) { +PrimitiveReference::PrimitiveReference(uint8_t type, uint64_t serial) : AbstractReference(nullptr, type, serial) { this->data = nullptr; this->malloc = nullptr; this->str = nullptr; @@ -354,7 +354,7 @@ AbstractExtObject* PrimitiveReference::toClassExtObject(const UnicodeString* nam PrimitiveReference* PrimitiveReference::createBoolReference(VirtualMachine* vm, int8_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_BOOL); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_BOOL, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -364,7 +364,7 @@ PrimitiveReference* PrimitiveReference::createBoolReference(VirtualMachine* vm, } PrimitiveReference* PrimitiveReference::createIntReference(VirtualMachine* vm, int32_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_INT); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_INT, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -374,7 +374,7 @@ PrimitiveReference* PrimitiveReference::createIntReference(VirtualMachine* vm, i } PrimitiveReference* PrimitiveReference::createByteReference(VirtualMachine* vm, int8_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_BYTE); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_BYTE, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -384,7 +384,7 @@ PrimitiveReference* PrimitiveReference::createByteReference(VirtualMachine* vm, } PrimitiveReference* PrimitiveReference::createCharReference(VirtualMachine* vm, int16_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_CHAR); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_CHAR, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -394,7 +394,7 @@ PrimitiveReference* PrimitiveReference::createCharReference(VirtualMachine* vm, } PrimitiveReference* PrimitiveReference::createShortReference(VirtualMachine* vm, int16_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_SHORT); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_SHORT, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -404,7 +404,7 @@ PrimitiveReference* PrimitiveReference::createShortReference(VirtualMachine* vm, } PrimitiveReference* PrimitiveReference::createLongReference(VirtualMachine* vm, int64_t value) { - PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_LONG); + PrimitiveReference* ref = new(vm) PrimitiveReference(VmInstanceTypesConst::REF_LONG, vm->publishInstanceSerial()); ref->malloc = vm->getAlloc(); ref->data = ref->malloc->mallocPtrArray(getDataSize(ref->type)); @@ -443,7 +443,7 @@ size_t PrimitiveReference::getDataSize(int8_t type) noexcept { } PrimitiveReference* PrimitiveReference::copy(VirtualMachine* vm) const noexcept { - PrimitiveReference* ref = new(vm) PrimitiveReference(this->type); + PrimitiveReference* ref = new(vm) PrimitiveReference(this->type, vm->publishInstanceSerial()); size_t size = this->getDataSize(this->type); diff --git a/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.h b/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.h index 36ac527..68021de 100644 --- a/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.h +++ b/src_smartcontract_vm/instance/instance_ref/PrimitiveReference.h @@ -15,7 +15,7 @@ namespace alinous { class PrimitiveReference : public AbstractReference, public IAbstractVmInstanceSubstance { public: - explicit PrimitiveReference(uint8_t type); + PrimitiveReference(uint8_t type, uint64_t serial); virtual ~PrimitiveReference(); static PrimitiveReference* createBoolReference(VirtualMachine* vm, int8_t value); diff --git a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp index c14bd66..466164d 100644 --- a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp +++ b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp @@ -74,9 +74,9 @@ AbstractReference* RefereceFactory::createObjectReferenceFromDefinition(IAbstrac ObjectReference* ref = nullptr; if(type == AnalyzedType::TYPE_STRING){ - ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE); + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE, vm->publishInstanceSerial()); }else{ - ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE); + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE, vm->publishInstanceSerial()); } return ref; @@ -111,14 +111,14 @@ AbstractReference* RefereceFactory::createReferenceFromAnalyzedType(IAbstractVmI ref = PrimitiveReference::createLongReference(vm, 0); break; case AnalyzedType::TYPE_STRING: - ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE); + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE, vm->publishInstanceSerial()); break; case AnalyzedType::TYPE_DOM: ref = new(vm) DomRuntimeReference(owner, vm); break; case AnalyzedType::TYPE_OBJECT: default: - ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE); + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE, vm->publishInstanceSerial()); break; } diff --git a/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp b/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp index 5eb2423..c0e3dfb 100644 --- a/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/VmRootReference.cpp @@ -21,11 +21,12 @@ namespace alinous { -VmRootReference::VmRootReference(VirtualMachine* vm) : AbstractReference(this, VmInstanceTypesConst::REF_ROOT) { +VmRootReference::VmRootReference(VirtualMachine* vm) : AbstractReference(this, VmInstanceTypesConst::REF_ROOT, 0) { this->vm = vm; this->mainInst = nullptr; this->staticHolder = new StaticConstInstanceHolder(); this->classStaticHolder = new StaticClassReferenceHolder(); + this->instanceSerial = 1; } VmRootReference::~VmRootReference() { @@ -126,5 +127,8 @@ StaticClassReferenceHolder* VmRootReference::getStaticClassReferenceHolder() con void VmRootReference::resetOnGc() noexcept { } +uint64_t VmRootReference::publishInstanceSerial() noexcept { + return this->instanceSerial++; +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_ref/VmRootReference.h b/src_smartcontract_vm/instance/instance_ref/VmRootReference.h index 729975b..b0f404c 100644 --- a/src_smartcontract_vm/instance/instance_ref/VmRootReference.h +++ b/src_smartcontract_vm/instance/instance_ref/VmRootReference.h @@ -53,12 +53,17 @@ class VmRootReference : public AbstractReference, public IAbstractVmInstanceSubs StaticClassReferenceHolder* getStaticClassReferenceHolder() const noexcept; virtual int valueCompare(const IAbstractVmInstanceSubstance* right) const noexcept; + + uint64_t publishInstanceSerial() noexcept; + private: VirtualMachine* vm; AbstractReference* mainInst; StaticConstInstanceHolder* staticHolder; StaticClassReferenceHolder* classStaticHolder; + uint64_t instanceSerial; + }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_ref_class_static/ClassTypeReference.cpp b/src_smartcontract_vm/instance/instance_ref_class_static/ClassTypeReference.cpp index 7853927..6e45ebb 100644 --- a/src_smartcontract_vm/instance/instance_ref_class_static/ClassTypeReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref_class_static/ClassTypeReference.cpp @@ -18,7 +18,7 @@ namespace alinous { ClassTypeReference::ClassTypeReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm, const AnalyzedType* type) - : AbstractReference(owner, VmInstanceTypesConst::REF_CLASS_TYPE) { + : AbstractReference(owner, VmInstanceTypesConst::REF_CLASS_TYPE, vm->publishInstanceSerial()) { this->atype = new AnalyzedType(*type); } diff --git a/src_smartcontract_vm/instance/instance_ref_static/NumericConstHolder.cpp b/src_smartcontract_vm/instance/instance_ref_static/NumericConstHolder.cpp index dcd9274..ff9ad4f 100644 --- a/src_smartcontract_vm/instance/instance_ref_static/NumericConstHolder.cpp +++ b/src_smartcontract_vm/instance/instance_ref_static/NumericConstHolder.cpp @@ -54,7 +54,7 @@ PrimitiveReference* NumericConstHolder::newNumericConstReferenece(int64_t value, ConstStaticPrimitive* NumericConstHolder::makeConstStaticPrimitive(int64_t value, uint8_t type, VirtualMachine* vm) { PrimitiveReference* referene = RefereceFactory::createNumericReference(value, type, vm); __STP(referene); - return new(vm) ConstStaticPrimitive(referene); + return new(vm) ConstStaticPrimitive(referene, vm->publishInstanceSerial()); } void NumericConstHolder::removeInnerReferences(VmRootReference* rootRef, VirtualMachine* vm) noexcept { diff --git a/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp b/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp index 7c09df4..9082ef7 100644 --- a/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp +++ b/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp @@ -21,7 +21,8 @@ namespace alinous { const VmString::ValueCompare VmStringInstance::compareFunctor; -VmStringInstance::VmStringInstance(VirtualMachine* vm, const UnicodeString* str) : AbstractVmInstance(VmInstanceTypesConst::INST_STRING) { +VmStringInstance::VmStringInstance(VirtualMachine* vm, const UnicodeString* str) + : AbstractVmInstance(VmInstanceTypesConst::INST_STRING, vm->publishInstanceSerial()) { this->value = new(vm) VmString(vm, str); this->str = nullptr; } diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h index 54cdb0e..7dd863c 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h @@ -22,9 +22,11 @@ class AbstractReservedClassDeclare : public ClassDeclare { static constexpr const uint16_t TYPE_NULL_POINTER_EXCEPTION = 5; static constexpr const uint16_t TYPE_TYPE_CAST_EXCEPTION = 6; static constexpr const uint16_t TYPE_ZERO_DIVISION_EXCEPTION = 7; + static constexpr const uint16_t TYPE_INTER_MODULE_ACCESS_EXCEPTION = 8; - static constexpr const uint16_t TYPE_OBJECT = 8; + static constexpr const uint16_t TYPE_OBJECT = 10; + static constexpr const uint16_t TYPE_MODULAR_PROXY = 11; AbstractReservedClassDeclare(); virtual ~AbstractReservedClassDeclare(); diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp index e50b125..930302b 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp @@ -30,6 +30,9 @@ #include "instance/reserved_classes/list/ListListMethod.h" #include "lang/sc_declare/AccessControlDeclare.h" + +#include "inter_modular_access/ModularProxyMethodDeclare.h" + namespace alinous { AbstractReservedMethodDeclare::AbstractReservedMethodDeclare(uint32_t methodId) : MethodDeclare(RESERVED_METHOD_DECLARE) { @@ -48,6 +51,9 @@ AbstractReservedMethodDeclare* AbstractReservedMethodDeclare::createMethodFromBi case METHOD_OBJECT_OBJECT: method = new ObjectObjectMethod(); break; + case METHOD_MODULAR_INTERFACE: + method = new ModularProxyMethodDeclare(); + break; case METHOD_LIST_LIST: method = new ListListMethod(); break; @@ -117,6 +123,8 @@ void AbstractReservedMethodDeclare::init(VirtualMachine *vm) { void AbstractReservedMethodDeclare::interpret(FunctionArguments *args, VirtualMachine *vm) { MethodArgumentSetupper argSetup(args, vm); { + // stack + vm->markStackbyMethod(this); vm->newStack(); StackPopper stackPopper(vm); diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h index ef81570..7fbf542 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h @@ -15,6 +15,7 @@ namespace alinous { class AbstractReservedMethodDeclare : public MethodDeclare { public: static constexpr const uint32_t METHOD_OBJECT_OBJECT = 1; + static constexpr const uint32_t METHOD_MODULAR_INTERFACE = 2; static constexpr const uint32_t METHOD_LIST_LIST = 100; diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp index dd0b5b2..e5c942a 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp @@ -32,6 +32,10 @@ #include "lang/sc_declare/PackageNameDeclare.h" +#include "inter_modular_access/InterModuleAccessException.h" + +using namespace codablecash; + namespace alinous { ReservedClassRegistory::ReservedClassRegistory() { @@ -58,6 +62,9 @@ ReservedClassRegistory::ReservedClassRegistory() { aclass = DatabaseExceptionClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); + aclass = InterModuleAccessException::createAnalyzedClass(); + addAnalyzedClass(aclass); + // Object Class aclass = ObjectClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); diff --git a/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp index 5bbf1a5..3e9b365 100644 --- a/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/list/ListListMethod.cpp @@ -12,6 +12,7 @@ #include "lang/sc_declare/AccessControlDeclare.h" #include "lang/sc_declare/ArgumentsListDeclare.h" +#include "vm/VirtualMachine.h" namespace alinous { diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index c17fbe5..c511991 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -146,7 +146,13 @@ void VirtualMachine::interpret(const UnicodeString* method) { interpretMainObjectMethod(method, &list); } -void VirtualMachine::interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments) { +MethodDeclare* VirtualMachine::interpretMainObjectMethod(const UnicodeString *method, ArrayList *arguments) { + FunctionArguments args; + return interpretMainObjectMethod(method, arguments, &args); +} + + +MethodDeclare* VirtualMachine::interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments, FunctionArguments* args) { VmClassInstance* _this = dynamic_cast(this->sc->getRootReference()->getInstance()); AnalyzedClass* aclass = _this->getAnalyzedClass(); @@ -170,23 +176,19 @@ void VirtualMachine::interpretMainObjectMethod(const UnicodeString* method, Arra typeList.addElement(new AnalyzedType(at)); } - MethodScore* score = calc.findMethod(method, &typeList); - if(score == nullptr){ - throw new VmMethodNotFoundException(__FILE__, __LINE__); - } + MethodScore* score = calcScore(&calc, method, &typeList); VTableMethodEntry* methodEntry = score->getEntry(); MethodDeclare* methodDeclare = methodEntry->getMethod(); - FunctionArguments args; - args.setThisPtr(_this); + args->setThisPtr(_this); for(int i = 0; i != maxLoop; ++i){ AbstractFunctionExtArguments* extArg = arguments->get(i); AbstractVmInstance* inst = extArg->interpret(this); - args.addSubstance(inst != nullptr ? inst->getInstance() : nullptr); + args->addSubstance(inst != nullptr ? inst->getInstance() : nullptr); } @@ -195,10 +197,74 @@ void VirtualMachine::interpretMainObjectMethod(const UnicodeString* method, Arra StackPopper popStack(this); VmStack* stack = this->topStack(); - methodDeclare->interpret(&args, this); + methodDeclare->interpret(args, this); // uncaught exception checkUncaughtException(); + + return methodDeclare; +} + + +MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(const UnicodeString *method, FunctionArguments *args) { + VmClassInstance* _this = dynamic_cast(this->sc->getRootReference()->getInstance()); + AnalyzedClass* aclass = _this->getAnalyzedClass(); + + const UnicodeString* fqn = aclass->getFullQualifiedName(); + + AnalyzeContext* actx = this->sc->getAnalyzeContext(); + VTableRegistory* vreg = actx->getVtableRegistory(); + VTableClassEntry* classEntry = vreg->getClassEntry(fqn, aclass); + + // calc type + FunctionScoreCalc calc(classEntry); + + ArrayList typeList; + typeList.setDeleteOnExit(); + + const ArrayList* list = args->getArguments(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + IAbstractVmInstanceSubstance* vminst = list->get(i); + + AnalyzedType at = vminst->getRuntimeType(); + typeList.addElement(new AnalyzedType(at)); + } + + // score + MethodScore* score = calcScore(&calc, method, &typeList); + + VTableMethodEntry* methodEntry = score->getEntry(); + MethodDeclare* methodDeclare = methodEntry->getMethod(); + + // FIXME + FunctionArguments localArguments; + for(int i = 0; i != maxLoop; ++i){ + IAbstractVmInstanceSubstance* vminst = list->get(i); + localArguments.addSubstance(vminst); + } + localArguments.setThisPtr(_this); + + // top stack + this->newStack(); + StackPopper popStack(this); + VmStack* stack = this->topStack(); + + methodDeclare->interpret(&localArguments, this); + + // uncaught exception + checkUncaughtException(); + + return methodDeclare; +} + + +MethodScore* VirtualMachine::calcScore(FunctionScoreCalc *calc, const UnicodeString *method, ArrayList *typeList) { + MethodScore* score = calc->findMethod(method, typeList); + if(score == nullptr){ + throw new VmMethodNotFoundException(__FILE__, __LINE__); + } + return score; } void VirtualMachine::interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments) { @@ -216,6 +282,8 @@ void VirtualMachine::interpret(MethodDeclare* method, VmClassInstance* _this, Ar checkUncaughtException(); } + + ReservedClassRegistory* VirtualMachine::getReservedClassRegistory() const noexcept { return this->sc->getReservedClassRegistory(); } @@ -284,6 +352,14 @@ bool VirtualMachine::hasAnalyzeError(int code, AnalyzeContext* actx) noexcept { return ret; } +void VirtualMachine::markStackbyMethod(MethodDeclare *method) { + this->stackManager->markStackbyMethod(method); +} + +void VirtualMachine::markStackEntryPoint(AbstractExpression *exp) { + this->markStackEntryPoint(exp); +} + void VirtualMachine::newStack() { VmRootReference* root = this->sc->getRootReference(); @@ -438,6 +514,18 @@ ExtExceptionObject* VirtualMachine::getUncaughtException() noexcept { return dynamic_cast(extObj); } +ObjectReference* VirtualMachine::getUncaughtExceptionProxy() noexcept { + return this->uncaughtException; +} + +void VirtualMachine::clearUncoughtException() noexcept { + if(this->uncaughtException != nullptr){ + this->gc->removeObject(this->uncaughtException); + delete this->uncaughtException; + this->uncaughtException = nullptr; + } +} + void VirtualMachine::setCaught(bool caught) noexcept { this->caught = caught; } @@ -474,4 +562,15 @@ void VirtualMachine::setEscapeTargetCondition(EscapeTargetCondition* cond) noexc this->espaceTargetCondition = cond; } +uint64_t VirtualMachine::publishInstanceSerial() noexcept { + uint64_t serial = 0; + + if(this->sc != nullptr && this->rootReference != nullptr){ + VmRootReference* rootReference = this->sc->getRootReference(); + serial = rootReference->publishInstanceSerial(); + } + + return serial; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/VirtualMachine.h b/src_smartcontract_vm/vm/VirtualMachine.h index 4f4c9f3..2bd352b 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.h +++ b/src_smartcontract_vm/vm/VirtualMachine.h @@ -50,6 +50,10 @@ class VmTransactionHandler; class File; class AnalyzeContext; +class FunctionScoreCalc; +class MethodScore; +class AnalyzedType; +class AbstractExpression; class VirtualMachine { public: @@ -64,10 +68,16 @@ class VirtualMachine { VmClassInstance* createScInstance(); - void interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments); + MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments); + MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments, FunctionArguments* args); + MethodDeclare* interpretMainObjectMethodProxy(const UnicodeString* method, FunctionArguments* args); + void interpret(const UnicodeString* method); void interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments); + void markStackbyMethod(MethodDeclare* method); + void markStackEntryPoint(AbstractExpression* exp); + void newStack(); void popStack(); VmStack* topStack() const noexcept; @@ -97,6 +107,8 @@ class VirtualMachine { ArrayList& getExceptions() noexcept; ExtExceptionObject* getUncaughtException() noexcept; + ObjectReference* getUncaughtExceptionProxy() noexcept; + void clearUncoughtException() noexcept; ReservedClassRegistory* getReservedClassRegistory() const noexcept; @@ -133,11 +145,18 @@ class VirtualMachine { return this->espaceTargetCondition; } void setEscapeTargetCondition(EscapeTargetCondition* cond) noexcept; + + uint64_t publishInstanceSerial() noexcept; + +private: + MethodScore* calcScore(FunctionScoreCalc* calc, const UnicodeString *method, ArrayList* typeList); + private: SmartContract* sc; VmMemoryManager* memory; VmStackManager* stackManager; + VmMalloc* alloc; GcManager* gc; ExecControlManager* ctrl; diff --git a/src_smartcontract_vm/vm/stack/VmStack.cpp b/src_smartcontract_vm/vm/stack/VmStack.cpp index 1898fd0..f303b77 100644 --- a/src_smartcontract_vm/vm/stack/VmStack.cpp +++ b/src_smartcontract_vm/vm/stack/VmStack.cpp @@ -19,13 +19,18 @@ namespace alinous { VmStack::VmStack(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) - : AbstractReference(owner, VmInstanceTypesConst::STACK), IInstanceContainer() { + : AbstractReference(owner, VmInstanceTypesConst::STACK, vm->publishInstanceSerial()), IInstanceContainer() { this->stack = new(vm) VMemList(vm); this->vm = vm; + this->currentMethod = nullptr; + this->entryPoint = nullptr; } VmStack::~VmStack() { delete this->stack; + + this->currentMethod = nullptr; + this->entryPoint = nullptr; } void VmStack::addInnerReference(AbstractReference* ref) { @@ -118,4 +123,12 @@ void VmStack::resetOnGc() noexcept { this->stack->reset(); } +void VmStack::setCurrentMethod(MethodDeclare *currentMethod) noexcept { + this->currentMethod = currentMethod; +} + +void VmStack::setEntryPoint(AbstractExpression *entryPoint) noexcept { + this->entryPoint = entryPoint; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/stack/VmStack.h b/src_smartcontract_vm/vm/stack/VmStack.h index f947678..321dcaf 100644 --- a/src_smartcontract_vm/vm/stack/VmStack.h +++ b/src_smartcontract_vm/vm/stack/VmStack.h @@ -18,6 +18,7 @@ namespace alinous { class AbstractReference; class VirtualMachine; class VmRootReference; +class AbstractExpression; class VmStack : public AbstractReference, public IInstanceContainer { public: @@ -46,9 +47,17 @@ class VmStack : public AbstractReference, public IInstanceContainer { virtual void resetOnGc() noexcept; + void setCurrentMethod(MethodDeclare* currentMethod) noexcept; + void setEntryPoint(AbstractExpression* entryPoint) noexcept; + private: VMemList* stack; VirtualMachine* vm; + + MethodDeclare* currentMethod; + AbstractExpression* entryPoint; + + }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/stack/VmStackManager.cpp b/src_smartcontract_vm/vm/stack/VmStackManager.cpp index eda320a..1aa03d7 100644 --- a/src_smartcontract_vm/vm/stack/VmStackManager.cpp +++ b/src_smartcontract_vm/vm/stack/VmStackManager.cpp @@ -10,7 +10,8 @@ namespace alinous { VmStackManager::VmStackManager() { - + this->currentMethod = nullptr; + this->entryPoint = nullptr; } VmStackManager::~VmStackManager() { @@ -18,6 +19,16 @@ VmStackManager::~VmStackManager() { } void VmStackManager::addStack(VmStack* stack) noexcept { + if(this->currentMethod != nullptr){ + stack->setCurrentMethod(this->currentMethod); + this->currentMethod = nullptr; + } + + if(this->entryPoint != nullptr){ + stack->setEntryPoint(this->entryPoint); + this->entryPoint = nullptr; + } + this->list.addElement(stack); } @@ -44,4 +55,12 @@ VmStack* VmStackManager::get(int pos) const noexcept { return this->list.get(pos); } +void VmStackManager::markStackbyMethod(MethodDeclare *method) { + this->currentMethod = method; +} + +void VmStackManager::markStackEntryPoint(AbstractExpression *exp) { + this->entryPoint = exp; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/stack/VmStackManager.h b/src_smartcontract_vm/vm/stack/VmStackManager.h index 82af6d5..c1e41a2 100644 --- a/src_smartcontract_vm/vm/stack/VmStackManager.h +++ b/src_smartcontract_vm/vm/stack/VmStackManager.h @@ -13,12 +13,17 @@ namespace alinous { class VmStack; +class AbstractExpression; +class MethodDeclare; class VmStackManager { public: VmStackManager(); virtual ~VmStackManager(); + void markStackbyMethod(MethodDeclare* method); + void markStackEntryPoint(AbstractExpression* exp); + void addStack(VmStack* stack) noexcept; void popStack() noexcept; VmStack* top() const noexcept; @@ -28,6 +33,9 @@ class VmStackManager { private: ArrayList list; + + MethodDeclare* currentMethod; + AbstractExpression* entryPoint; }; } /* namespace alinous */ diff --git a/src_test/smartcontract_modular/instance/CMakeLists.txt b/src_test/smartcontract_modular/instance/CMakeLists.txt index 2627f4f..4f014bc 100644 --- a/src_test/smartcontract_modular/instance/CMakeLists.txt +++ b/src_test/smartcontract_modular/instance/CMakeLists.txt @@ -1,6 +1,8 @@ set(testsrc + test_exceptions.cpp test_instance_spaces.cpp + test_inter_module_access.cpp test_modular_instance.cpp test_smartcontract_executor.cpp ) diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json index 0a8d506..2e65c1e 100644 --- a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/config.json @@ -10,7 +10,7 @@ "args" : [] }, "libExport" : [], - "directAccess" : [] + "directAccess" : ["sample.ISampleDirect"] }, "dependencies": [ diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/ISampleDirect.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/ISampleDirect.alns new file mode 100644 index 0000000..a9ee67a --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/ISampleDirect.alns @@ -0,0 +1,6 @@ +package sample; + +interface ISampleDirect { + public int setCount(int count); +} + diff --git a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns index debca82..eb85a1e 100644 --- a/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns +++ b/src_test/smartcontract_modular/instance/resources/case02/project01/exec/src/sample/Sample01.alns @@ -1,7 +1,8 @@ package sample; +import sample.ISampleDirect; -class Sample01 { +class Sample01 implements ISampleDirect { public Sample01() { this.count = 3 * 2; stcount++; @@ -11,6 +12,11 @@ class Sample01 { } + public int setCount(int count) { + this.count = count; + return this.count; + } + private int count = 0; public static int stcount = 10; } diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/exec/config.json b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/config.json new file mode 100644 index 0000000..2e65c1e --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/config.json @@ -0,0 +1,20 @@ +{ + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "sample", + "mainClass" : "Sample01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : [], + "directAccess" : ["sample.ISampleDirect"] + }, + + "dependencies": [ + {"name" : "module_01", "localloc": "mod01", "version" : "^1.0.0"} + ] +} + diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/ISampleDirect.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/ISampleDirect.alns new file mode 100644 index 0000000..a9ee67a --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/ISampleDirect.alns @@ -0,0 +1,6 @@ +package sample; + +interface ISampleDirect { + public int setCount(int count); +} + diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns new file mode 100644 index 0000000..eb85a1e --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns @@ -0,0 +1,22 @@ +package sample; + +import sample.ISampleDirect; + +class Sample01 implements ISampleDirect { + public Sample01() { + this.count = 3 * 2; + stcount++; + } + + public int main(){ + + } + + public int setCount(int count) { + this.count = count; + return this.count; + } + + private int count = 0; + public static int stcount = 10; +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/config.json b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/config.json new file mode 100644 index 0000000..fa02a1f --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/config.json @@ -0,0 +1,20 @@ +{ + "libraryName" : "module_01", + "sourceFolders" : ["src/"], + "version" : "1.0.0", + + "instance" : { + "mainPackage": "modsample", + "mainClass" : "Module01", + "initializer" : { + "method" : "main", + "args" : [] + }, + "libExport" : ["modsample.export.IExportMethods"], + "directAccess" : ["modsample.export.IDirectAccess"] + }, + + "exportClasses" : ["modsample.Result"], + + "dependencies": [] +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns new file mode 100644 index 0000000..ec4f07a --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IDirectAccess { + +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns new file mode 100644 index 0000000..0982b39 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns @@ -0,0 +1,6 @@ +package modsample.export; + + +interface IExportMethods { + +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns new file mode 100644 index 0000000..6b28532 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns @@ -0,0 +1,23 @@ +package modsample; + +import modsample.export.IExportMethods; +import modsample.export.IDirectAccess; +import modsample.Result; + +class Module01 implements IExportMethods, IDirectAccess { + public Module01() { + this.count = 3 * 2; + } + + public int main(){ + this.res = new Result(); + } + + public void doubleup() { + int value = this.count * 2; + this.count = value; + } + + private int count = 0; + private Result res; +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Result.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Result.alns new file mode 100644 index 0000000..77b05d1 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Result.alns @@ -0,0 +1,9 @@ +package modsample; + +class Result { + public Result(){ + + } + + private int result = 0; +} diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/projectconfig.json b/src_test/smartcontract_modular/instance/resources/case03/project01/projectconfig.json new file mode 100644 index 0000000..d37fbf5 --- /dev/null +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/projectconfig.json @@ -0,0 +1,9 @@ +{ + "project" : "Sample01", + "executable" : "exec/", + + "libraries" : ["mod01"], + + "author": "Tomohiro Iizuka", + "license": "MIT" +} diff --git a/src_test/smartcontract_modular/instance/test_exceptions.cpp b/src_test/smartcontract_modular/instance/test_exceptions.cpp new file mode 100644 index 0000000..a8f4be4 --- /dev/null +++ b/src_test/smartcontract_modular/instance/test_exceptions.cpp @@ -0,0 +1,37 @@ +/* + * test_exceptions.cpp + * + * Created on: Dec 1, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +#include "smartcontract_cache/ProjectNotFoundException.h" +#include "smartcontract_cache/ModuleSetupException.h" + +#include "smartcontract_instance/SmartcontractExecutionException.h" + +using codablecash::ModuleSetupException; +using codablecash::ProjectNotFoundException; +using codablecash::SmartcontractExecutionException; + + +TEST_GROUP(TestModularExceptionsGroup) { + TEST_SETUP() { + } + TEST_TEARDOWN() { + } +}; + +TEST(TestModularExceptionsGroup, case01) { + testException(); +} + +TEST(TestModularExceptionsGroup, case02) { + testException(); +} + +TEST(TestModularExceptionsGroup, case03) { + testException(); +} + diff --git a/src_test/smartcontract_modular/instance/test_instance_spaces.cpp b/src_test/smartcontract_modular/instance/test_instance_spaces.cpp index 8cef22d..26f06d3 100644 --- a/src_test/smartcontract_modular/instance/test_instance_spaces.cpp +++ b/src_test/smartcontract_modular/instance/test_instance_spaces.cpp @@ -19,9 +19,24 @@ #include "trx/session/base/CdbDatabaseSessionId.h" #include "smartcontract_executor/ModularSmartcontractExecutor.h" +#include "smartcontract_executor/SmartcontractExecResult.h" +#include "transaction/SmartcontractInstanceAddress.h" + +#include "smartcontract_cache/InstanceSpaceReleaser.h" +#include "smartcontract_cache/InstanceSpace.h" + +#include "base/ArrayList.h" + +#include "ext_arguments/AbstractFunctionExtArguments.h" +#include "ext_arguments/NumericArgument.h" + +#include "engine/sc_analyze/AnalyzedType.h" + +#include "ext_binary/ExtPrimitiveObject.h" using namespace codablecash; +using namespace alinous; TEST_GROUP(TestInstanceSpacesrGroup) { TEST_SETUP() { @@ -47,6 +62,41 @@ TEST(TestInstanceSpacesrGroup, case01) { ModularSmartcontractExecutor executor(baseTestDir); executor.createExecutor(); + { + executor.open(); + + executor.registerModularSmartcontractProject(&project); + + SmartcontractProjectId* projectId = project.getProjectId(); __STP(projectId); + SmartcontractProjectData* data = executor.getProject(projectId); __STP(data); + + CHECK(data != nullptr); + SmartcontractInstanceAddress* address = SmartcontractInstanceAddress::createAddress(0); __STP(address); + executor.createInstance(address, projectId); + + InstanceSpace* space = executor.loadFromCache(address); + InstanceSpaceReleaser __space(space); + + CHECK(space != nullptr); + + { + ArrayList args; + args.setDeleteOnExit(); + args.addElement(new NumericArgument(100, AnalyzedType::TYPE_INT)); + + UnicodeString module(L"exec"); + UnicodeString methodName(L"setCount"); + + SmartcontractExecResult* result = space->invokeMainObjectMethod(&module, &methodName, &args); __STP(result); + AbstractExtObject* obj = result->getReturnedValue(); + + ExtPrimitiveObject* count = dynamic_cast(obj); + int value = count->getIntValue(); + CHECK(value == 100); + } + + executor.close(); + } } diff --git a/src_test/smartcontract_modular/instance/test_inter_module_access.cpp b/src_test/smartcontract_modular/instance/test_inter_module_access.cpp new file mode 100644 index 0000000..62e603b --- /dev/null +++ b/src_test/smartcontract_modular/instance/test_inter_module_access.cpp @@ -0,0 +1,21 @@ +/* + * test_inter_module_access.cpp + * + * Created on: Dec 3, 2025 + * Author: iizuka + */ +#include "test_utils/t_macros.h" + +TEST_GROUP(TestInterModuleAccessGroup) { + TEST_SETUP() { + env->setup(); + } + TEST_TEARDOWN() { + env->teardown(); + } +}; + +TEST(TestInterModuleAccessGroup, case01){ + +} + diff --git a/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp index 82a1480..81c2d49 100644 --- a/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp +++ b/src_test/smartcontract_modular/instance/test_smartcontract_executor.cpp @@ -20,6 +20,7 @@ #include "smartcontract_executor/ModularSmartcontractExecutor.h" +#include "smartcontract_cache/ProjectNotFoundException.h" using namespace codablecash; @@ -59,5 +60,8 @@ TEST(TestSmartcontractExecutorGroup, case01){ executor.close(); } +} +TEST(TestSmartcontractExecutorGroup, exceptions01){ + testException(); } diff --git a/src_test/smartcontract_vm/base/test_class_instance.cpp b/src_test/smartcontract_vm/base/test_class_instance.cpp index 38ebadd..478de89 100644 --- a/src_test/smartcontract_vm/base/test_class_instance.cpp +++ b/src_test/smartcontract_vm/base/test_class_instance.cpp @@ -56,5 +56,5 @@ TEST(TestInstanceGroup, constructError){ } TEST(TestInstanceGroup, constructRef){ - PrimitiveReference ref(VmInstanceTypesConst::REF_BYTE); + PrimitiveReference ref(VmInstanceTypesConst::REF_BYTE, 0); } diff --git a/src_test/smartcontract_vm/base/test_ext_objects.cpp b/src_test/smartcontract_vm/base/test_ext_objects.cpp index f843556..a9d804a 100644 --- a/src_test/smartcontract_vm/base/test_ext_objects.cpp +++ b/src_test/smartcontract_vm/base/test_ext_objects.cpp @@ -166,7 +166,7 @@ TEST(TestExtObjects, extExceptionCopy){ TEST(TestExtObjects, nullObj01){ UnicodeString name(L"name"); - ExtNullPtrObject obj(&name, 0); + ExtNullPtrObject obj(&name); ExtNullPtrObject* obj1 = dynamic_cast(obj.copy()); __STP(obj1); CHECK(obj1 != nullptr) From 5f5446e65d1115f5429682d3c8e9097d795e3633 Mon Sep 17 00:00:00 2001 From: iizuka Date: Fri, 9 Jan 2026 21:36:38 +0800 Subject: [PATCH 10/11] modular contract --- .../bc_blockstore/CodablecashBlockchain.cpp | 4 +- src_smartcontract/engine/sc/CodeElement.cpp | 1 + src_smartcontract/engine/sc/SmartContract.cpp | 22 +- src_smartcontract/engine/sc/SmartContract.h | 8 +- .../engine/sc_analyze/AnalyzeContext.cpp | 1 + .../engine/sc_analyze/AnalyzedClass.cpp | 85 +++++++- .../engine/sc_analyze/AnalyzedClass.h | 17 +- .../engine/sc_analyze/AnalyzedType.h | 11 +- .../engine/sc_analyze/PackageSpace.cpp | 55 ++++- .../engine/sc_analyze/PackageSpace.h | 4 + .../engine/sc_analyze/TypeResolver.cpp | 13 +- .../engine/sc_analyze/ValidationError.h | 1 + .../sc_analyze_functions/VTableClassEntry.cpp | 45 +++- .../sc_analyze_functions/VTableClassEntry.h | 1 + .../lang/sc_declare/ClassDeclare.cpp | 15 +- .../lang/sc_declare/ClassDeclare.h | 3 + .../lang/sc_declare/MemberVariableDeclare.cpp | 2 +- .../lang/sc_declare/MethodDeclare.cpp | 12 +- .../lang/sc_declare/MethodDeclare.h | 1 + .../lang/sc_declare/PackageNameDeclare.cpp | 15 ++ .../lang/sc_declare/PackageNameDeclare.h | 2 + .../lang/sc_expression/CastExpression.cpp | 7 +- .../sc_expression/FunctionCallExpression.cpp | 9 +- .../EqualityExpression.cpp | 2 +- .../sc_statement/SubstitutionStatement.cpp | 2 +- .../sc_statement/VariableDeclareStatement.cpp | 2 +- .../DatabaseExceptionClassDeclare.cpp | 1 + .../ModularProxyClassDeclare.cpp | 47 +++- .../ModularProxyClassDeclare.h | 6 +- .../ModularProxyMethodDeclare.cpp | 27 +-- .../ModularProxyObjectInstanceFactory.cpp | 89 ++++++-- .../ModularProxyObjectInstanceFactory.h | 12 +- .../modular_interfaces/CMakeLists.txt | 1 + .../ModularProxyListnerClassDeclare.cpp | 25 ++- .../ModularProxyListnerClassDeclare.h | 17 +- .../ModuleDetectedMethodDeclare.cpp | 75 +++++++ .../ModuleDetectedMethodDeclare.h | 27 +++ .../smartcontract_cache/InstanceSpace.cpp | 29 ++- .../smartcontract_cache/InstanceSpace.h | 3 + .../ModularSmartcontractExecutor.cpp | 38 ++-- .../AbstractExecutableModuleInstance.cpp | 206 +++++++++++++++++- .../AbstractExecutableModuleInstance.h | 10 + .../ModularSmartcontractInstance.cpp | 104 +++++++-- .../ModularSmartcontractInstance.h | 13 +- .../ModuleInstanceClassLoader.cpp | 8 + .../ModuleInstanceClassLoader.h | 6 +- .../ext_binary/AbstractExtObject.h | 5 + .../ext_binary/ExtArrayObject.cpp | 4 + .../ext_binary/ExtArrayObject.h | 2 + .../ext_binary/ExtClassObject.cpp | 56 ++++- .../ext_binary/ExtClassObject.h | 5 +- .../ext_binary/ExtDomArrayObject.cpp | 4 + .../ext_binary/ExtDomArrayObject.h | 1 + .../ext_binary/ExtDomObject.cpp | 4 + .../ext_binary/ExtDomObject.h | 1 + .../ext_binary/ExtExceptionObject.cpp | 14 ++ .../ext_binary/ExtExceptionObject.h | 5 + .../ext_binary/ExtNullPtrObject.cpp | 11 +- .../ext_binary/ExtNullPtrObject.h | 7 +- .../ext_binary/ExtPrimitiveObject.cpp | 3 + .../ext_binary/ExtPrimitiveObject.h | 1 + .../ext_binary/ExtStringClass.cpp | 5 + .../ext_binary/ExtStringClass.h | 2 + .../instance/AbstractVmInstance.h | 2 + src_smartcontract_vm/instance/CMakeLists.txt | 1 + .../instance/VmClassInstance.cpp | 5 +- .../instance/VmInstanceTypesConst.h | 1 + .../instance/VmNullprtInstance.cpp | 99 +++++++++ .../instance/VmNullprtInstance.h | 46 ++++ .../instance_array/ArrayReference.cpp | 3 +- .../instance_dom/DomRuntimeReference.cpp | 4 +- .../ArrayOutOfBoundsExceptionClassDeclare.cpp | 1 - .../NullPointerExceptionClassDeclare.cpp | 26 ++- .../NullPointerExceptionClassDeclare.h | 1 + .../TypeCastExceptionClassDeclare.cpp | 25 ++- .../TypeCastExceptionClassDeclare.h | 1 + .../instance_exception_class/CMakeLists.txt | 1 + .../StackTraceElement.cpp | 45 ++++ .../StackTraceElement.h | 40 ++++ .../VmExceptionInstance.cpp | 24 +- .../VmExceptionInstance.h | 22 +- .../instance/instance_ref/ObjectReference.cpp | 5 +- .../instance/instance_ref/RefereceFactory.cpp | 3 +- .../instance/instance_ref/RefereceFactory.h | 2 + .../instance/instance_string/VmString.cpp | 5 + .../instance/instance_string/VmString.h | 3 + .../instance_string/VmStringInstance.cpp | 3 +- .../instance_string/VmStringInstance.h | 11 +- .../AbstractReservedClassDeclare.cpp | 48 ++++ .../AbstractReservedClassDeclare.h | 3 + .../AbstractReservedMethodDeclare.cpp | 16 +- .../AbstractReservedMethodDeclare.h | 5 + .../ReservedClassRegistory.cpp | 13 ++ .../reserved_classes/ReservedClassRegistory.h | 6 +- .../reserved_classes_string/CMakeLists.txt | 1 + .../StringClassDeclare.cpp | 11 + .../StringClassDeclare.h | 3 +- .../StringEqualsMethodDeclare.cpp | 94 ++++++++ .../StringEqualsMethodDeclare.h | 28 +++ src_smartcontract_vm/vm/CMakeLists.txt | 1 + .../vm/IInitializeCompilantUnitProvidor.cpp | 20 ++ .../vm/IInitializeCompilantUnitProvidor.h | 25 +++ src_smartcontract_vm/vm/VirtualMachine.cpp | 81 +++++-- src_smartcontract_vm/vm/VirtualMachine.h | 8 +- src_smartcontract_vm/vm/stack/VmStack.h | 6 + .../vm/type_check/AnalyzedTypeChecker.cpp | 14 +- .../vm/type_check/AnalyzedTypeChecker.h | 6 +- .../vm/type_check/InternalTypeChecker.cpp | 9 +- .../vm/type_check/InternalTypeChecker.h | 4 +- .../vm/type_check/LeftType.cpp | 4 +- src_smartcontract_vm/vm/type_check/LeftType.h | 2 +- .../vm/type_check/RightType.cpp | 4 +- .../vm/type_check/RightType.h | 2 +- .../variable_access/ArrayReferenceAccess.cpp | 2 +- .../MemberFunctionCallAccess.cpp | 2 + .../variable_access/MemberVariableAccess.cpp | 2 +- .../toolkit/TestDbSchemaBase.cpp | 2 +- .../variable/test_dom_base.cpp | 2 +- .../variable/test_vm_hash.cpp | 4 +- .../project01/exec/src/sample/Sample01.alns | 19 +- .../modules/mod01/src/IDirectAccess.alns | 2 +- .../modules/mod01/src/IExportMethods.alns | 3 +- .../project01/modules/mod01/src/Module01.alns | 4 + .../instance/test_inter_module_access.cpp | 67 ++++++ .../instance/test_modular_instance.cpp | 16 +- src_test/smartcontract_vm/VmTestUtils.cpp | 2 +- .../base/test_ext_objects.cpp | 13 +- .../smartcontract_vm/base/test_main_vm.cpp | 6 +- .../smartcontract_vm/exp/test_cast_exp.cpp | 6 +- .../instance/test_exception_inst.cpp | 10 +- .../resources/vfunc/case03/base/base.alns | 13 ++ .../resources/vfunc/case03/base/base2.alns | 7 + .../resources/vfunc/case03/main.alns | 19 ++ .../method_invoke/test_call_maininst.cpp | 2 +- .../method_invoke/test_virtual_func_call.cpp | 12 + .../reserved_classes/test_string_class.cpp | 2 +- .../variables/test_local_variavle.cpp | 6 +- .../variables/test_string_variables.cpp | 2 +- .../variables/test_type_checker.cpp | 18 +- .../variables/test_variables.cpp | 2 +- 140 files changed, 1985 insertions(+), 267 deletions(-) create mode 100644 src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.cpp create mode 100644 src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.h create mode 100644 src_smartcontract_vm/instance/VmNullprtInstance.cpp create mode 100644 src_smartcontract_vm/instance/VmNullprtInstance.h create mode 100644 src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.cpp create mode 100644 src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.h create mode 100644 src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.cpp create mode 100644 src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.h create mode 100644 src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.cpp create mode 100644 src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.h create mode 100644 src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base.alns create mode 100644 src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base2.alns create mode 100644 src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/main.alns diff --git a/src_blockchain/bc_blockstore/CodablecashBlockchain.cpp b/src_blockchain/bc_blockstore/CodablecashBlockchain.cpp index 3775eb9..444f329 100644 --- a/src_blockchain/bc_blockstore/CodablecashBlockchain.cpp +++ b/src_blockchain/bc_blockstore/CodablecashBlockchain.cpp @@ -150,8 +150,8 @@ void CodablecashBlockchain::initZonesStore() { } void CodablecashBlockchain::initZone(uint16_t zone) { - char tmp[4]; - Mem::memset(tmp, 0, 4); + char tmp[6]; + Mem::memset(tmp, 0, 6); ::sprintf(tmp, "%03d", zone); diff --git a/src_smartcontract/engine/sc/CodeElement.cpp b/src_smartcontract/engine/sc/CodeElement.cpp index 9d4286f..d27a92a 100644 --- a/src_smartcontract/engine/sc/CodeElement.cpp +++ b/src_smartcontract/engine/sc/CodeElement.cpp @@ -895,6 +895,7 @@ void CodeElement::positionFromBinary(ByteBuffer *in) { CodeElement* CodeElement::binaryCopy() const { int cap = binarySize(); ByteBuffer* buff = ByteBuffer::allocateWithEndian(cap, true); __STP(buff); + toBinary(buff); buff->position(0); CodeElement* element = createFromBinary(buff); diff --git a/src_smartcontract/engine/sc/SmartContract.cpp b/src_smartcontract/engine/sc/SmartContract.cpp index ee8ca4a..d502335 100644 --- a/src_smartcontract/engine/sc/SmartContract.cpp +++ b/src_smartcontract/engine/sc/SmartContract.cpp @@ -56,6 +56,7 @@ #include "base/StackRelease.h" +#include "vm/IInitializeCompilantUnitProvidor.h" namespace alinous { SmartContract::SmartContract() { @@ -259,8 +260,8 @@ void SmartContract::releaseMainInstance(GcManager* gc) noexcept { } -VmClassInstance* SmartContract::createInstance(VirtualMachine* vm) { - initialize(vm); +VmClassInstance* SmartContract::createInstance(VirtualMachine* vm, ArrayList* exprogs) { + initialize(vm, exprogs); PackageSpace* space = this->actx->getPackegeSpace(this->mainPackage); ExceptionThrower::throwExceptionIfCondition(space == nullptr, L"The package space does not exist.", __FILE__, __LINE__); @@ -294,7 +295,7 @@ VmClassInstance* SmartContract::createInstance(VirtualMachine* vm) { // exec constructor try{ ArrayList arguments; - vm->interpret(defConstructor, inst, &arguments); + vm->interpret(defConstructor, inst, &arguments, exprogs); } catch(Exception* e){ throw e; @@ -304,7 +305,7 @@ VmClassInstance* SmartContract::createInstance(VirtualMachine* vm) { return inst; } -void SmartContract::initialize(VirtualMachine* vm) { +void SmartContract::initialize(VirtualMachine* vm, ArrayList* exprogs) { if(this->initialized){ return; } @@ -318,12 +319,25 @@ void SmartContract::initialize(VirtualMachine* vm) { unit->init(vm); } + if(exprogs != nullptr){ + initializeExprogs(vm, exprogs); + } + StaticClassReferenceHolder* staticClassHolder = this->rootReference->getStaticClassReferenceHolder(); staticClassHolder->init(vm, actx); this->initialized = true; } +void SmartContract::initializeExprogs(VirtualMachine *vm, ArrayList *exprogs) { + int maxLoop = exprogs->size(); + for(int i = 0; i != maxLoop; ++i){ + IInitializeCompilantUnitProvidor* providor = exprogs->get(i); + + providor->initCompilantUnits(vm); + } +} + AnalyzeContext* SmartContract::getAnalyzeContext() const noexcept { return this->actx; } diff --git a/src_smartcontract/engine/sc/SmartContract.h b/src_smartcontract/engine/sc/SmartContract.h index 0a17180..5c02b40 100644 --- a/src_smartcontract/engine/sc/SmartContract.h +++ b/src_smartcontract/engine/sc/SmartContract.h @@ -26,6 +26,7 @@ class CompileError; class ReservedClassRegistory; class GcManager; class ClassDeclare; +class IInitializeCompilantUnitProvidor; class SmartContract { public: @@ -50,8 +51,8 @@ class SmartContract { void clearRootReference(VirtualMachine* vm) noexcept; void releaseMainInstance(GcManager* gc) noexcept; - VmClassInstance* createInstance(VirtualMachine* vm); - void initialize(VirtualMachine* vm); + VmClassInstance* createInstance(VirtualMachine* vm, ArrayList* exprogs); + void initialize(VirtualMachine* vm, ArrayList* exprogs); AnalyzeContext* getAnalyzeContext() const noexcept; @@ -71,6 +72,9 @@ class SmartContract { UnicodeString* getMainClassFqn() const noexcept; +private: + void initializeExprogs(VirtualMachine* vm, ArrayList* exprogs); + private: UnicodeString* mainPackage; UnicodeString* mainClass; diff --git a/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp b/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp index a55c006..d652ef9 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp +++ b/src_smartcontract/engine/sc_analyze/AnalyzeContext.cpp @@ -158,6 +158,7 @@ void AnalyzeContext::popThisClass() noexcept { } void AnalyzeContext::analyzeClassInheritance() { + // super classes Iterator* it = this->packageSpaces->keySet()->iterator(); while(it->hasNext()){ const UnicodeString* packageName = it->next(); diff --git a/src_smartcontract/engine/sc_analyze/AnalyzedClass.cpp b/src_smartcontract/engine/sc_analyze/AnalyzedClass.cpp index 7933231..85f77f4 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzedClass.cpp +++ b/src_smartcontract/engine/sc_analyze/AnalyzedClass.cpp @@ -26,6 +26,8 @@ #include "engine/sc_analyze_functions/VTableClassEntry.h" #include "engine/sc_analyze/IVmInstanceFactory.h" + + namespace alinous { AnalyzedClass::AnalyzedClass(const AnalyzedClass& inst) { @@ -141,6 +143,22 @@ const ArrayList* AnalyzedClass::getImplements() const noexcept { return &this->implements; } +bool AnalyzedClass::hasImplements(AnalyzedClass *interface) noexcept { + bool result = false; + + int maxLoop = this->implements.size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* cls = this->implements.get(i); + + if(interface->equals(cls)){ + result = true; + break; + } + } + + return result; +} + MethodDeclare* AnalyzedClass::getDefaultConstructor() noexcept { MethodDeclare* ret = nullptr; @@ -175,7 +193,7 @@ MethodDeclare* AnalyzedClass::findMethod(const UnicodeString* name, ArrayListget(i); AnalyzedType* atype2 = argumentTypeList2->get(i); - if(!atype->equals(atype2)){ + if(!(atype->equals(atype2))){ return nullptr; } } @@ -274,4 +292,69 @@ bool AnalyzedClass::isInterface() const noexcept { return this->clazz->isInterface(); } +void AnalyzedClass::addDelivedImplementClass(AnalyzedClass *clazz) { + if(!hasDeliveredImplClass(clazz) && hasDelivedImplementClass(clazz)){ + this->delivedImplClasses.addElement(clazz); + } +} + +bool AnalyzedClass::hasDeliveredImplClass(AnalyzedClass *clazz) { + bool ret = false; + + int maxLoop = this->delivedImplClasses.size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* cls = this->delivedImplClasses.get(i); + + if(cls->equals(clazz)){ + ret = true; + break; + } + } + + return ret; +} + +bool AnalyzedClass::hasDelivedImplementClass(AnalyzedClass *clazz) { + return followExtends(clazz); +} + +bool AnalyzedClass::followExtends(AnalyzedClass *clazz) { + if(clazz->equals(this)){ + return true; + } + + AnalyzedClass* extendsClazz = clazz->getExtends(); + if(extendsClazz != nullptr && followExtends(extendsClazz)){ + return true; + } + + bool result = false; + if(isInterface()){ + const ArrayList* list = clazz->getImplements(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* ifclazz = list->get(i); + if(ifclazz != nullptr && followImplements(ifclazz)){ + result = true; + break; + } + } + } + + return result; +} + +bool AnalyzedClass::followImplements(AnalyzedClass *ifclazz) { + if(ifclazz->equals(this)){ + return true; + } + + AnalyzedClass* extendsClazz = ifclazz->getExtends(); + if(extendsClazz != nullptr && followExtends(extendsClazz)){ + return true; + } + + return false; +} + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc_analyze/AnalyzedClass.h b/src_smartcontract/engine/sc_analyze/AnalyzedClass.h index 7bab77c..8289f22 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzedClass.h +++ b/src_smartcontract/engine/sc_analyze/AnalyzedClass.h @@ -40,6 +40,8 @@ class AnalyzedClass { AnalyzedClass* getExtends() const noexcept; void addImplements(AnalyzedClass* clazz) noexcept; const ArrayList* getImplements() const noexcept; + bool hasImplements(AnalyzedClass* interface) noexcept; + MethodDeclare* getDefaultConstructor() noexcept; MethodDeclare* findMethod(const UnicodeString* name, ArrayList* argumentTypeList) noexcept; @@ -66,17 +68,26 @@ class AnalyzedClass { bool isReserved() const noexcept; bool isInterface() const noexcept; -private: - //void bulidMethodVTable(AnalyzeContext* actx, MethodDeclare* method) noexcept; - //AnalyzedClass* findBaseClassOfMethod(AnalyzedClass* currentClass, MethodDeclare* method) noexcept; + + void addDelivedImplementClass(AnalyzedClass* clazz); + bool hasDeliveredImplClass(AnalyzedClass* clazz); + const ArrayList* getDelivedImplClasse() const noexcept { + return &this->delivedImplClasses; + } +private: + bool hasDelivedImplementClass(AnalyzedClass* clazz); + bool followExtends(AnalyzedClass* clazz); + bool followImplements(AnalyzedClass* ifclazz); private: ClassDeclare* clazz; AnalyzedClass* extends; ArrayList implements; + ArrayList delivedImplClasses; + HashMap* variables; ArrayList variablesList; diff --git a/src_smartcontract/engine/sc_analyze/AnalyzedType.h b/src_smartcontract/engine/sc_analyze/AnalyzedType.h index f613ef1..42fba64 100644 --- a/src_smartcontract/engine/sc_analyze/AnalyzedType.h +++ b/src_smartcontract/engine/sc_analyze/AnalyzedType.h @@ -28,10 +28,13 @@ class AnalyzedType { static const constexpr uint8_t TYPE_STRING{26}; static const constexpr uint8_t TYPE_VOID{27}; static const constexpr uint8_t TYPE_OBJECT{28}; - static const constexpr uint8_t TYPE_DOM{29}; - static const constexpr uint8_t TYPE_DOM_ARRAY{30}; - static const constexpr uint8_t TYPE_DOM_VALUE_PAIR{31}; - static const constexpr uint8_t TYPE_DOM_VALUE{32}; + static const constexpr uint8_t TYPE_OBJECT_ARRAY{29}; + + // check InternalTypeChecker#analyzeCompatibility() + static const constexpr uint8_t TYPE_DOM{30}; // var [id] meaning DOM_VALUE JsonInitializerExpression + static const constexpr uint8_t TYPE_DOM_ARRAY{31}; + static const constexpr uint8_t TYPE_DOM_VALUE_PAIR{32}; + static const constexpr uint8_t TYPE_DOM_VALUE{33}; // wildcard of DOM relevant values static const constexpr uint8_t TYPE_GENERICS_TYPE{101}; diff --git a/src_smartcontract/engine/sc_analyze/PackageSpace.cpp b/src_smartcontract/engine/sc_analyze/PackageSpace.cpp index 62ea21d..86bc7bb 100644 --- a/src_smartcontract/engine/sc_analyze/PackageSpace.cpp +++ b/src_smartcontract/engine/sc_analyze/PackageSpace.cpp @@ -77,6 +77,7 @@ void PackageSpace::analyzeClassInheritance(AnalyzeContext* actx) noexcept { AnalyzedClass* cls = this->classes->get(n); doAnalyzeClassInheritance(cls); + doAnalyzeDeliverClasses(cls); } delete it; @@ -106,6 +107,58 @@ void PackageSpace::doAnalyzeClassInheritance(AnalyzedClass* cls) noexcept { } } +void PackageSpace::doAnalyzeDeliverClasses(AnalyzedClass *cls) noexcept { + // down analysis + ArrayList list; + + { + AnalyzedClass* clazz = cls; + while(clazz != nullptr){ + const ArrayList* interfaces = clazz->getImplements(); + int maxLoop = interfaces->size(); + + list.addElement(clazz, 0); + + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* ifclazz = interfaces->get(i); + + analyzeInterfaceInheritance(ifclazz, &list); + } + + clazz = clazz->getExtends(); + } + } + + + // up analysis + { + int maxLoop = list.size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* clazz = list.get(i); + + addDeliverClasses(clazz, &list, i+1); + } + } +} + +void PackageSpace::addDeliverClasses(AnalyzedClass *targetClazz, ArrayList *list, int pos) { + int maxLoop = list->size(); + for(int i = pos; i < maxLoop; ++i){ + AnalyzedClass* clazz = list->get(i); + + if(!clazz->isInterface()){ + targetClazz->addDelivedImplementClass(clazz); + } + } +} + +void PackageSpace::analyzeInterfaceInheritance(AnalyzedClass *ifclazz, ArrayList *list) { + while(ifclazz != nullptr && ifclazz->isInterface()){ + list->addElement(ifclazz, 0); + ifclazz = ifclazz->getExtends(); + } +} + void PackageSpace::buildVTables(AnalyzeContext* actx) noexcept { Iterator* it = this->classes->keySet()->iterator(); __STP(it); while(it->hasNext()){ @@ -120,8 +173,6 @@ HashMap* PackageSpace::getMap() const noexcept { return this->classes; } - - bool PackageSpace::isEmpty() const noexcept { return this->classes->isEmpty(); } diff --git a/src_smartcontract/engine/sc_analyze/PackageSpace.h b/src_smartcontract/engine/sc_analyze/PackageSpace.h index 47fb7c7..ca1026b 100644 --- a/src_smartcontract/engine/sc_analyze/PackageSpace.h +++ b/src_smartcontract/engine/sc_analyze/PackageSpace.h @@ -32,8 +32,12 @@ class PackageSpace { HashMap* getMap() const noexcept; bool isEmpty() const noexcept; + private: void doAnalyzeClassInheritance(AnalyzedClass* cls) noexcept; + void doAnalyzeDeliverClasses(AnalyzedClass* cls) noexcept; + void analyzeInterfaceInheritance(AnalyzedClass* ifclazz, ArrayList* list); + void addDeliverClasses(AnalyzedClass* targetClazz, ArrayList* list, int pos); private: UnicodeString* name; HashMap* classes; diff --git a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp index 5325abe..89765fa 100644 --- a/src_smartcontract/engine/sc_analyze/TypeResolver.cpp +++ b/src_smartcontract/engine/sc_analyze/TypeResolver.cpp @@ -28,6 +28,7 @@ #include "instance/reserved_classes/object/ObjectClassDeclare.h" +#include "instance/reserved_classes_string/StringClassDeclare.h" namespace alinous { const UnicodeString TypeResolver::DOT(L"."); @@ -83,7 +84,13 @@ AnalyzedType* TypeResolver::resolveType(CodeElement* element, AbstractType* type result = new AnalyzedType(AnalyzedType::TYPE_LONG); break; case CodeElement::TYPE_STRING: - result = new AnalyzedType(AnalyzedType::TYPE_STRING); + { + result = new AnalyzedType(AnalyzedType::TYPE_STRING); + + PackageSpace* space = this->ctx->getPackegeSpace(nullptr); + AnalyzedClass* clazz = space->getClass(&StringClassDeclare::NAME); + result->setAnalyzedClass(clazz); + } break; case CodeElement::TYPE_VOID: result = new AnalyzedType(AnalyzedType::TYPE_VOID); @@ -163,6 +170,10 @@ AnalyzedType* TypeResolver::findBasicType(const UnicodeString* name) const { } else if(name->equals(STRING)){ result = new AnalyzedType(AnalyzedType::TYPE_STRING); + + PackageSpace* space = this->ctx->getPackegeSpace(nullptr); + AnalyzedClass* clazz = space->getClass(&StringClassDeclare::NAME); + result->setAnalyzedClass(clazz); } return result; diff --git a/src_smartcontract/engine/sc_analyze/ValidationError.h b/src_smartcontract/engine/sc_analyze/ValidationError.h index 1608cb4..268b640 100644 --- a/src_smartcontract/engine/sc_analyze/ValidationError.h +++ b/src_smartcontract/engine/sc_analyze/ValidationError.h @@ -26,6 +26,7 @@ class ValidationError { static constexpr int CODE_WRONG_TYPE_NAME = 4; static constexpr int CODE_NO_RETURN_METHOD_VALUE = 5; static constexpr int CODE_CYCRIC_TYPE_REFERENCE = 6; + static constexpr int CODE_INTERFACE_CANNOT_IMPLEMENTS = 7; static constexpr int CODE_VIRTUAL_FUNC_WITH_DIFFERENT_RETURN = 10; static constexpr int CODE_VIRTUAL_FUNC_WITH_DIFFERENT_STATIC = 11; diff --git a/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.cpp b/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.cpp index fa01307..fc04649 100644 --- a/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.cpp +++ b/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.cpp @@ -128,11 +128,24 @@ void VTableClassEntry::dobuildMethodSuperClass(ClassDeclare* clazz, AnalyzeConte } MethodDeclare* superMethod = getSuperClassMethod(method); - if(superMethod == nullptr){ + // add checking deliver class method + MethodDeclare* deliveredMethod = getDeliverClassMethod(method); + if(superMethod == nullptr && deliveredMethod == nullptr){ addSuperMethodEntry(method); continue; } + if(superMethod != nullptr && superMethod->isStatic() != method->isStatic()){ + actx->addValidationError(ValidationError::CODE_VIRTUAL_FUNC_WITH_DIFFERENT_STATIC, method, L"The method '{0}()' has supuer class method with different static type.", {method->getName()}); + continue; + } + + AnalyzedType* retTypeSuper = deliveredMethod != nullptr ? deliveredMethod->getReturnedType(): superMethod->getReturnedType(); + if(!retType->equals(retTypeSuper)){ + actx->addValidationError(ValidationError::CODE_VIRTUAL_FUNC_WITH_DIFFERENT_RETURN, method, L"The method '{0}()' has supuer class method with different return type.", {method->getName()}); + continue; + } + addSuperVirtualMethodImplEntry(method); } } @@ -167,17 +180,19 @@ void VTableClassEntry::buildMethodSelf(ClassDeclare* clazz, AnalyzeContext* actx }*/ MethodDeclare* superMethod = getSuperClassMethod(method); - if(superMethod == nullptr){ + // check Delived classes + MethodDeclare* deliveredMethod = getDeliverClassMethod(method); + if(superMethod == nullptr && deliveredMethod == nullptr){ addMethodEntry(method); continue; } - if(superMethod->isStatic() != method->isStatic()){ + if(superMethod != nullptr && superMethod->isStatic() != method->isStatic()){ actx->addValidationError(ValidationError::CODE_VIRTUAL_FUNC_WITH_DIFFERENT_STATIC, method, L"The method '{0}()' has supuer class method with different static type.", {method->getName()}); continue; } - AnalyzedType* retTypeSuper = superMethod->getReturnedType(); + AnalyzedType* retTypeSuper = deliveredMethod != nullptr ? deliveredMethod->getReturnedType(): superMethod->getReturnedType(); if(!retType->equals(retTypeSuper)){ actx->addValidationError(ValidationError::CODE_VIRTUAL_FUNC_WITH_DIFFERENT_RETURN, method, L"The method '{0}()' has supuer class method with different return type.", {method->getName()}); continue; @@ -252,6 +267,27 @@ MethodDeclare* VTableClassEntry::getSuperClassMethod(MethodDeclare* method) noex return nullptr; } +MethodDeclare* VTableClassEntry::getDeliverClassMethod(MethodDeclare *method) noexcept { + const UnicodeString* name = method->getName(); + ArgumentsListDeclare* argList = method->getArguments(); + ArrayList* typeList = argList->getArgumentsAnalyzedType(); + + MethodDeclare* deliverMethod = nullptr; + + const ArrayList* list = this->aclass->getDelivedImplClasse(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedClass* deliverClazz = list->get(i); + + deliverMethod = deliverClazz->findMethod(name, typeList); + if(deliverMethod != nullptr){ + return deliverMethod; + } + } + + return nullptr; +} + void VTableClassEntry::addMethodNameEntry(VTableMethodEntry* entry) noexcept { const UnicodeString* methodName = entry->getName(); @@ -277,4 +313,5 @@ VTableMethodEntry* VTableClassEntry::getVTableMethodEntry(const UnicodeString* c } + } /* namespace alinous */ diff --git a/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.h b/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.h index dd090e9..52ca573 100644 --- a/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.h +++ b/src_smartcontract/engine/sc_analyze_functions/VTableClassEntry.h @@ -46,6 +46,7 @@ class VTableClassEntry { void addSuperVirtualMethodImplEntry(MethodDeclare* method); MethodDeclare* getSuperClassMethod(MethodDeclare* method) noexcept; + MethodDeclare* getDeliverClassMethod(MethodDeclare* method) noexcept; void addMethodNameEntry(VTableMethodEntry* entry) noexcept; diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp index 6e8bdd4..4e14c1c 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.cpp @@ -136,10 +136,17 @@ void ClassDeclare::analyzeTypeRef(AnalyzeContext* actx) { if(this->implements != nullptr){ const ArrayList* list = this->implements->getAnalyzedTypes(); - int maxLoop = list->size(); - for(int i = 0; i != maxLoop; ++i){ - AnalyzedType* cls = list->get(i); - dec->addImplements(cls->getAnalyzedClass()); + // interface can't implements other interfaces + if(!list->isEmpty() && isInterface()){ + actx->addValidationError(ValidationError::CODE_INTERFACE_CANNOT_IMPLEMENTS, this, L"Class {0} is interface. It can't implement other interfaces.", {this->name}); + } + + if(!actx->hasError()){ + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedType* cls = list->get(i); + dec->addImplements(cls->getAnalyzedClass()); + } } } diff --git a/src_smartcontract/lang/sc_declare/ClassDeclare.h b/src_smartcontract/lang/sc_declare/ClassDeclare.h index 63c5707..feb4ccb 100644 --- a/src_smartcontract/lang/sc_declare/ClassDeclare.h +++ b/src_smartcontract/lang/sc_declare/ClassDeclare.h @@ -68,6 +68,9 @@ class ClassDeclare : public CodeElement { virtual ClassDeclare* generateGenericsImplement(HashMap* input); + ClassImplements* getImplements() const noexcept { + return this->implements; + } protected: void toBinaryCheck(ByteBuffer* out) const; diff --git a/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp b/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp index b6338ab..d50c99a 100644 --- a/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MemberVariableDeclare.cpp @@ -104,7 +104,7 @@ void MemberVariableDeclare::analyze(AnalyzeContext* actx) { AnalyzedTypeChecker checker; AnalyzedType exAt = this->exp->getType(actx); - int result = checker.checkCompatibility(actx, this->atype, &exAt); + int result = checker.checkCompatibility(actx, this->atype, &exAt, true); if(result == InternalTypeChecker::INCOMPATIBLE){ actx->addValidationError(ValidationError::CODE_TYPE_INCOMPATIBLE, this, L"Initial variable is incompatible with variable declare .", {}); diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp index b1b35d1..99d6c51 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.cpp @@ -112,10 +112,7 @@ void MethodDeclare::analyzeTypeRefBody(AnalyzeContext *actx, TypeResolver* typeR actx->addValidationError(ValidationError::CODE_NO_RETURN_METHOD_VALUE, this, L"Return type of method '{0}()' does not exists.", {this->name}); } else { - this->atype = typeResolver->resolveType(this, this->type); - if(this->atype == nullptr){ - actx->addValidationError(ValidationError::CODE_WRONG_TYPE_NAME, this, L"The type '{0}' does not exists.", {this->type->toString()}); - } + analyzeReturnedValue(actx, typeResolver); } } @@ -126,6 +123,13 @@ void MethodDeclare::analyzeTypeRefBody(AnalyzeContext *actx, TypeResolver* typeR } } +void MethodDeclare::analyzeReturnedValue(AnalyzeContext *actx, TypeResolver *typeResolver) { + this->atype = typeResolver->resolveType(this, this->type); + if(this->atype == nullptr){ + actx->addValidationError(ValidationError::CODE_WRONG_TYPE_NAME, this, L"The type '{0}' does not exists.", {this->type->toString()}); + } +} + void MethodDeclare::analyze(AnalyzeContext* actx) { this->args->analyze(actx); diff --git a/src_smartcontract/lang/sc_declare/MethodDeclare.h b/src_smartcontract/lang/sc_declare/MethodDeclare.h index fd92408..2359c55 100644 --- a/src_smartcontract/lang/sc_declare/MethodDeclare.h +++ b/src_smartcontract/lang/sc_declare/MethodDeclare.h @@ -74,6 +74,7 @@ class MethodDeclare : public CodeElement { protected: void analyzeTypeRefBody(AnalyzeContext* actx, TypeResolver* typeResolver); + void analyzeReturnedValue(AnalyzeContext *actx, TypeResolver* typeResolver); protected: AccessControlDeclare* ctrl; diff --git a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp index 7281792..7fdc988 100644 --- a/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp +++ b/src_smartcontract/lang/sc_declare/PackageNameDeclare.cpp @@ -10,6 +10,7 @@ #include "lang/sc_declare_types/AbstractType.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" namespace alinous { @@ -98,4 +99,18 @@ PackageNameDeclare* PackageNameDeclare::generateGenericsImplement(HashMap* list = str->split(&pattern); __STP(list); + + PackageNameDeclare* dec = new PackageNameDeclare(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* seg = list->get(i); + dec->addSegment(seg); + } + + return dec; +} + } /* namespace alinous */ diff --git a/src_smartcontract/lang/sc_declare/PackageNameDeclare.h b/src_smartcontract/lang/sc_declare/PackageNameDeclare.h index 470e2c6..8f4b3d1 100644 --- a/src_smartcontract/lang/sc_declare/PackageNameDeclare.h +++ b/src_smartcontract/lang/sc_declare/PackageNameDeclare.h @@ -24,6 +24,8 @@ class PackageNameDeclare : public CodeElement { PackageNameDeclare(); virtual ~PackageNameDeclare(); + static PackageNameDeclare* makeFromString(const UnicodeString* str); + void addSegment(UnicodeString* seg); const UnicodeString* getName() noexcept; diff --git a/src_smartcontract/lang/sc_expression/CastExpression.cpp b/src_smartcontract/lang/sc_expression/CastExpression.cpp index 5ef23eb..3c4daa6 100644 --- a/src_smartcontract/lang/sc_expression/CastExpression.cpp +++ b/src_smartcontract/lang/sc_expression/CastExpression.cpp @@ -78,9 +78,9 @@ void CastExpression::analyze(AnalyzeContext* actx) { } } else{ - int result = InternalTypeChecker::analyzeCompatibility(this->atype, &at); + int result = InternalTypeChecker::analyzeCompatibility(this->atype, &at, false); if(InternalTypeChecker::INCOMPATIBLE == result){ - result = InternalTypeChecker::analyzeCompatibility(&at, this->atype); + result = InternalTypeChecker::analyzeCompatibility(&at, this->atype, false); if(InternalTypeChecker::INCOMPATIBLE == result){ actx->addValidationError(ValidationError::CODE_CAST_TYPE_INCOMPATIBLE, this, L"Can not cast because of type incompatible.", {}); } @@ -166,7 +166,8 @@ AbstractVmInstance* CastExpression::interpret(VirtualMachine* vm) { AnalyzedClass* expClazz = this->atype->getAnalyzedClass(); - if(!expClazz->hasBaseClass(clazz)){ + //if(!expClazz->hasBaseClass(clazz)){ + if(!clazz->hasBaseClass(expClazz)){ releaser.registerInstance(inst); TypeCastExceptionClassDeclare::throwException(vm, this); diff --git a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp index e496312..209f826 100644 --- a/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp +++ b/src_smartcontract/lang/sc_expression/FunctionCallExpression.cpp @@ -196,12 +196,15 @@ void FunctionCallExpression::analyze(AnalyzeContext* actx, AnalyzedClass* athisC analyzeArguments(actx); analyzeMethodEntry(actx, athisClass, staticMode); + if(this->methodEntry == nullptr){ + return; + } MethodDeclare* methodDeclare = this->methodEntry->getMethod(); staticMode = isStaticMode(); - uint8_t instType = lastInst->getType(); - if(instType == AbstractVariableInstraction::INSTRUCTION_CLASS_TYPE && !methodDeclare->isStatic()){ + uint8_t lastInstType = lastInst->getType(); + if(lastInstType == AbstractVariableInstraction::INSTRUCTION_CLASS_TYPE && !methodDeclare->isStatic()){ if(staticMode){ // error actx->addValidationError(ValidationError::CODE_WRONG_FUNC_CALL_CANT_CALL_NOSTATIC, actx->getCurrentElement(), L"The method can't invoke non-static method '{0}()'.", {this->strName}); @@ -221,7 +224,7 @@ void FunctionCallExpression::analyze(AnalyzeContext* actx, AnalyzedClass* athisC } } - if(instType == AbstractVariableInstraction::INSTRUCTION_CLASS_TYPE){ + if(lastInstType == AbstractVariableInstraction::INSTRUCTION_CLASS_TYPE){ // static method this->noVirtual = true; } } diff --git a/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp b/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp index 6e9f066..227e08e 100644 --- a/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp +++ b/src_smartcontract/lang/sc_expression_logical/EqualityExpression.cpp @@ -50,7 +50,7 @@ void EqualityExpression::analyze(AnalyzeContext* actx) { this->right->analyze(actx); AnalyzedTypeChecker checker; - checker.checkCompatibility(actx, this->left, this->right, true); + checker.checkCompatibility(actx, this->left, this->right, false); } void EqualityExpression::setLeft(AbstractExpression* exp) noexcept { diff --git a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp index 0b9fd60..243d68f 100644 --- a/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp +++ b/src_smartcontract/lang/sc_statement/SubstitutionStatement.cpp @@ -56,7 +56,7 @@ void SubstitutionStatement::analyze(AnalyzeContext* actx) { this->exp->analyze(actx); if(!actx->hasError()){ - bool result = typeChecker.checkCompatibility(actx, this->variable, this->exp); + bool result = typeChecker.checkCompatibility(actx, this->variable, this->exp, true); } this->bctrl = this->variable->throwsException() || this->exp->throwsException(); diff --git a/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp b/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp index 656b204..c0c82f6 100644 --- a/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp +++ b/src_smartcontract/lang/sc_statement/VariableDeclareStatement.cpp @@ -109,7 +109,7 @@ void VariableDeclareStatement::analyze(AnalyzeContext* actx) { if(this->exp != nullptr){ AnalyzedTypeChecker checker; AnalyzedType exAt = this->exp->getType(actx); - int result = checker.checkCompatibility(actx, this->atype, &exAt); + int result = checker.checkCompatibility(actx, this->atype, &exAt, true); if(result == InternalTypeChecker::INCOMPATIBLE){ actx->addValidationError(ValidationError::CODE_TYPE_INCOMPATIBLE, this, L"Initial variable is incompatible with variable declare .", {}); diff --git a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp index cb5fcfe..a292c68 100644 --- a/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp +++ b/src_smartcontract_db/trx/transaction_exception/DatabaseExceptionClassDeclare.cpp @@ -54,6 +54,7 @@ void DatabaseExceptionClassDeclare::throwException(const UnicodeString* msg, Vir VmExceptionInstance* exception = dynamic_cast(inst); + exception->setMessage(msg, vm); vm->throwException(exception, element); } diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp index fe0e434..8b2b763 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.cpp @@ -8,7 +8,15 @@ #include "inter_modular_access/ModularProxyClassDeclare.h" #include "engine/sc_analyze/IVmInstanceFactory.h" +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/PackageSpace.h" +#include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc/CompilationUnit.h" + +#include "base/StackRelease.h" + +#include "engine/sc_analyze/ValidationError.h" namespace codablecash { @@ -18,7 +26,7 @@ ModularProxyClassDeclare::ModularProxyClassDeclare() { } ModularProxyClassDeclare::~ModularProxyClassDeclare() { - delete this->factory; + this->factory = nullptr; this->dctx = nullptr; } @@ -31,7 +39,42 @@ void ModularProxyClassDeclare::setFactory(IVmInstanceFactory *factory) { } void ModularProxyClassDeclare::setDependencyContext(InstanceDependencyContext *dctx) noexcept { - this->dctx; + this->dctx = dctx; +} + +const UnicodeString* ModularProxyClassDeclare::getPackageFromIf(ClassDeclare *ifdec) { + CompilationUnit* originalUnit = ifdec->getCompilationUnit(); + + const UnicodeString* pname = originalUnit->getPackageName(); + + return pname; +} + +UnicodeString* ModularProxyClassDeclare::getNameFromInterface(const UnicodeString *mainFqn, const UnicodeString *ifName) { + UnicodeString* className = TypeResolver::getClassName(mainFqn); + UnicodeString* name = TypeResolver::getClassName(ifName); __STP(name); + + className->append(L"Proxy"); + className->append(name); + + return className; +} + +void ModularProxyClassDeclare::preAnalyze(AnalyzeContext *actx) { + CompilationUnit* unit = getCompilationUnit(); + PackageSpace* space = actx->getPackegeSpace(unit->getPackageName()); + + AnalyzedClass* dec = space->getClass(this->name); + if(dec != nullptr){ + actx->addValidationError(ValidationError::CODE_CLASS_ALREADY_EXISTS, this, L"Class {0} is already registered", {this->name}); + + return; + } + + space->addClassDeclare(this); + + + AbstractReservedClassDeclare::preAnalyze(actx); } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h index 77c238b..d95e0eb 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyClassDeclare.h @@ -21,7 +21,7 @@ class ModularProxyClassDeclare : public AbstractReservedClassDeclare { ModularProxyClassDeclare(); virtual ~ModularProxyClassDeclare(); - static AnalyzedClass* createAnalyzedClass() noexcept; +// static AnalyzedClass* createAnalyzedClass() noexcept; virtual uint16_t getClassType() const noexcept { return AbstractReservedClassDeclare::TYPE_MODULAR_PROXY; @@ -29,6 +29,8 @@ class ModularProxyClassDeclare : public AbstractReservedClassDeclare { //// use getName() and GetPackageName of ClassDeclare /// use Extends + static const UnicodeString* getPackageFromIf(ClassDeclare *ifdec); + static UnicodeString* getNameFromInterface(const UnicodeString* mainFqn, const UnicodeString* ifName); void setFactory(IVmInstanceFactory* factory); virtual IVmInstanceFactory* getFactory() const noexcept; @@ -38,6 +40,8 @@ class ModularProxyClassDeclare : public AbstractReservedClassDeclare { return this->dctx; } + virtual void preAnalyze(AnalyzeContext* actx); + private: IVmInstanceFactory* factory; InstanceDependencyContext* dctx; diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp index d6b6eac..69915d8 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp @@ -7,8 +7,6 @@ #include "inter_modular_access/ModularProxyMethodDeclare.h" -#include "base/StackRelease.h" - #include "lang/sc_declare/MethodDeclare.h" #include "lang/sc_declare/AccessControlDeclare.h" #include "lang/sc_declare/ArgumentsListDeclare.h" @@ -26,6 +24,7 @@ #include "inter_modular_access/ModuleProxyInstance.h" #include "inter_modular_access/ModularProxyClassDeclare.h" +#include "inter_modular_access/InterModuleAccessException.h" #include "smartcontract_instance/InstanceDependencyContext.h" #include "smartcontract_instance/AbstractExecutableModuleInstance.h" @@ -37,10 +36,12 @@ #include "instance/instance_exception_class/VmExceptionInstance.h" #include "ext_binary/AbstractExtObject.h" - -#include "inter_modular_access/InterModuleAccessException.h" +#include "ext_binary/ExtExceptionObject.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" + + namespace codablecash { ModularProxyMethodDeclare::ModularProxyMethodDeclare() : AbstractReservedMethodDeclare(METHOD_MODULAR_INTERFACE) { @@ -82,16 +83,11 @@ void ModularProxyMethodDeclare::doInterpret(FunctionArguments *args, VirtualMach AbstractExtObject* exceptionEx = moduleInstance->invokeMainObjectMethodProxy(this->name, args); __STP(exceptionEx); if(exceptionEx != nullptr){ + ExtExceptionObject* exExtObject = dynamic_cast(exceptionEx); - UnicodeString message(L""); - InterModuleAccessException::throwException(&message, vm, this); - - // FIXME error message - - // vm->throwException(ex, this); + const UnicodeString* message = exExtObject->getMessage(); + InterModuleAccessException::throwException(message, vm, this); } - - } const UnicodeString* ModularProxyMethodDeclare::toString() { @@ -101,6 +97,11 @@ const UnicodeString* ModularProxyMethodDeclare::toString() { ModularProxyMethodDeclare* ModularProxyMethodDeclare::fromMethodDeclare(MethodDeclare *method) { ModularProxyMethodDeclare* dec = new ModularProxyMethodDeclare(); __STP(dec); + { + const UnicodeString* name = method->getName(); + dec->setName(new UnicodeString(name)); + } + { AccessControlDeclare* acdec = method->getAccessControlDeclare(); AccessControlDeclare* copy = dynamic_cast(acdec->binaryCopy()); @@ -113,7 +114,7 @@ ModularProxyMethodDeclare* ModularProxyMethodDeclare::fromMethodDeclare(MethodDe } { ArgumentsListDeclare* args = method->getArguments(); - ArgumentsListDeclare* copy = dynamic_cast(args); + ArgumentsListDeclare* copy = dynamic_cast(args->binaryCopy()); dec->setArguments(copy); } diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp index cf6d421..fac61d1 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.cpp @@ -7,6 +7,10 @@ #include "inter_modular_access/ModularProxyObjectInstanceFactory.h" #include "inter_modular_access/ModularProxyClassDeclare.h" +#include "inter_modular_access/ModularProxyMethodDeclare.h" +#include "inter_modular_access/ModuleProxyInstance.h" + +#include "modular_project/ModularConfigException.h" #include "engine/sc_analyze/TypeResolver.h" @@ -16,20 +20,16 @@ #include "lang/sc_declare/ClassExtends.h" #include "lang/sc_declare/ClassName.h" - #include "lang/sc_declare/ClassDeclare.h" - #include "lang/sc_declare/ClassImplements.h" #include "lang/sc_declare/MethodDeclare.h" #include "lang/sc_declare/PackageDeclare.h" #include "lang/sc_declare/PackageNameDeclare.h" #include "lang/sc_declare/ImportsDeclare.h" - -#include "inter_modular_access/ModularProxyMethodDeclare.h" -#include "inter_modular_access/ModuleProxyInstance.h" - #include "lang/sc_declare/ImportDeclare.h" +#include "bc/ExceptionThrower.h" + namespace codablecash { @@ -61,17 +61,26 @@ void ModularProxyObjectInstanceFactory::generateModularClass(UnicodeString *main CompilationUnit* originalUnit = ifdec->getCompilationUnit(); { // package - const UnicodeString* pname = originalUnit->getPackageName(); + const UnicodeString* pname = ModularProxyClassDeclare::getPackageFromIf(ifdec); + ExceptionThrower::throwExceptionIfCondition(pname == nullptr, L"Modular interface must have package declare.", __FILE__, __LINE__); + ExceptionThrower::throwExceptionIfCondition(pname->equals(L""), L"Modular interface must have package declare.", __FILE__, __LINE__); + PackageDeclare* packageDec = new PackageDeclare(); PackageNameDeclare* nameDec = new PackageNameDeclare(); UnicodeString pattern(L"\\."); ArrayList* segs = pname->split(&pattern); __STP(segs); + { + int maxLoop = segs->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* seg = segs->get(i); + nameDec->addSegment(seg); + } + } packageDec->setName(nameDec); unit->setPackage(packageDec); - // import ImportsDeclare* originalImports = originalUnit->getImportDeclare(); if(originalImports != nullptr){ @@ -89,22 +98,12 @@ void ModularProxyObjectInstanceFactory::generateModularClass(UnicodeString *main } { - UnicodeString* className = TypeResolver::getClassName(mainFqn); - className->append(L"Proxy"); - className->append(ifdec->getName()); + const UnicodeString* ifName = ifdec->getName(); + UnicodeString* className = ModularProxyClassDeclare::getNameFromInterface(mainFqn, ifName); clazz->setName(className); } - { - ClassExtends* extends = new ClassExtends(); - clazz->setExtends(extends); - - ClassName* className = new ClassName(); - extends->setClassName(className); - className->addStr(mainFqn); - } - // interface { const UnicodeString* fqn = ifdec->getFullQualifiedName(); @@ -134,4 +133,54 @@ void ModularProxyObjectInstanceFactory::addCompilantUnit(CompilationUnit *unit) this->progs->addElement(unit); } +void ModularProxyObjectInstanceFactory::preAnalyze(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->preAnalyze(actx); + } +} + +void ModularProxyObjectInstanceFactory::analyzeType(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->analyzeType(actx); + } +} + +void ModularProxyObjectInstanceFactory::analyze(AnalyzeContext *actx) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->analyze(actx); + } +} + +void ModularProxyObjectInstanceFactory::initCompilantUnits(VirtualMachine *vm) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->init(vm); + } +} + +CompilationUnit* ModularProxyObjectInstanceFactory::getCompilantUnit(const UnicodeString *fqn) { + CompilationUnit* ret = nullptr; + + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + ClassDeclare* dec = unit->getClassDeclare(0); + + const UnicodeString* name = dec->getFullQualifiedName(); + if(fqn->equals(name)){ + ret = unit; + break; + } + } + + return ret; +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h index b9ca7cc..0720433 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyObjectInstanceFactory.h @@ -12,10 +12,12 @@ #include "base/ArrayList.h" +#include "vm/IInitializeCompilantUnitProvidor.h" namespace alinous { class CompilationUnit; class ClassDeclare; +class AnalyzeContext; } using namespace alinous; @@ -23,7 +25,7 @@ namespace codablecash { class InstanceDependencyContext; -class ModularProxyObjectInstanceFactory : public IVmInstanceFactory { +class ModularProxyObjectInstanceFactory : public IVmInstanceFactory, public IInitializeCompilantUnitProvidor { public: ModularProxyObjectInstanceFactory(); virtual ~ModularProxyObjectInstanceFactory(); @@ -33,6 +35,14 @@ class ModularProxyObjectInstanceFactory : public IVmInstanceFactory { // generate class void generateModularClass(UnicodeString* mainFqn, ClassDeclare* ifdec, InstanceDependencyContext* dctx); + void preAnalyze(AnalyzeContext* actx); + void analyzeType(AnalyzeContext* actx); + void analyze(AnalyzeContext* actx); + + virtual void initCompilantUnits(VirtualMachine *vm); + + CompilationUnit* getCompilantUnit(const UnicodeString* fqn); + private: void addCompilantUnit(CompilationUnit* unit) noexcept; diff --git a/src_smartcontract_modular/modular_interfaces/CMakeLists.txt b/src_smartcontract_modular/modular_interfaces/CMakeLists.txt index d4ad980..b1bfaff 100644 --- a/src_smartcontract_modular/modular_interfaces/CMakeLists.txt +++ b/src_smartcontract_modular/modular_interfaces/CMakeLists.txt @@ -2,6 +2,7 @@ set(__src ModularProxyListnerClassDeclare.cpp + ModuleDetectedMethodDeclare.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_modular modular_interfaces) diff --git a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp index 6b35412..0188492 100644 --- a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp +++ b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.cpp @@ -6,15 +6,38 @@ */ #include "modular_interfaces/ModularProxyListnerClassDeclare.h" +#include "modular_interfaces/ModuleDetectedMethodDeclare.h" + +#include "base/UnicodeString.h" + +#include "engine/sc_analyze/AnalyzedClass.h" + namespace codablecash { +const UnicodeString ModularProxyListnerClassDeclare::PACKAGE_NAME(L"lang"); +const UnicodeString ModularProxyListnerClassDeclare::NAME(L"ModularProxyListner"); + ModularProxyListnerClassDeclare::ModularProxyListnerClassDeclare() { + this->name = new UnicodeString(&NAME); + this->interface = true; + addMethod(new ModuleDetectedMethodDeclare()); } ModularProxyListnerClassDeclare::~ModularProxyListnerClassDeclare() { - // TODO Auto-generated destructor stub + +} + +AnalyzedClass* ModularProxyListnerClassDeclare::createAnalyzedClass() noexcept { + ModularProxyListnerClassDeclare* classDec = new ModularProxyListnerClassDeclare(); + AnalyzedClass* aclass = new AnalyzedClass(classDec); + + return aclass; +} + +const UnicodeString* ModularProxyListnerClassDeclare::getPackageName() const noexcept { + return &PACKAGE_NAME; } } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h index 4e0ecab..1ee6b33 100644 --- a/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h +++ b/src_smartcontract_modular/modular_interfaces/ModularProxyListnerClassDeclare.h @@ -8,12 +8,27 @@ #ifndef MODULAR_INTERFACES_MODULARPROXYLISTNERCLASSDECLARE_H_ #define MODULAR_INTERFACES_MODULARPROXYLISTNERCLASSDECLARE_H_ +#include "instance/reserved_classes/AbstractReservedClassDeclare.h" + +using namespace alinous; + namespace codablecash { -class ModularProxyListnerClassDeclare { +class ModularProxyListnerClassDeclare : public AbstractReservedClassDeclare { public: + static const UnicodeString PACKAGE_NAME; + static const UnicodeString NAME; + + static AnalyzedClass* createAnalyzedClass() noexcept; + ModularProxyListnerClassDeclare(); virtual ~ModularProxyListnerClassDeclare(); + + virtual uint16_t getClassType() const noexcept { + return TYPE_MODULAR_PROXY_LISTNER; + } + + virtual const UnicodeString* getPackageName() const noexcept; }; } /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.cpp b/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.cpp new file mode 100644 index 0000000..818d32f --- /dev/null +++ b/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.cpp @@ -0,0 +1,75 @@ +/* + * ModuleDetectedMethodDeclare.cpp + * + * Created on: Dec 7, 2025 + * Author: iizuka + */ + +#include "modular_interfaces/ModuleDetectedMethodDeclare.h" + +#include "base/UnicodeString.h" + +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare_types/VoidType.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" +#include "lang/sc_declare/ArgumentDeclare.h" + +#include "lang/sc_declare_types/AbstractType.h" +#include "lang/sc_declare_types/ObjectType.h" +#include "lang/sc_declare_types/StringType.h" + +#include "engine/sc_analyze/AnalyzedType.h" + +#include "lang/sc_declare/PackageNameDeclare.h" + + +using namespace alinous; + +namespace codablecash { + +const UnicodeString ModuleDetectedMethodDeclare::METHOD_NAME(L"moduleDetected"); + +ModuleDetectedMethodDeclare::ModuleDetectedMethodDeclare() : AbstractReservedMethodDeclare(METHOD_MODULE_PROXY_LISTNER_MODULE_DETECTED) { + AccessControlDeclare* access = new AccessControlDeclare(); + access->setCtrl(AccessControlDeclare::PUBLIC); + setAccessControl(access); + + setType(new VoidType()); + setName(new UnicodeString(&METHOD_NAME)); + + ArgumentsListDeclare* args = new ArgumentsListDeclare(); + setArguments(args); + + { + ArgumentDeclare* module = new ArgumentDeclare(); + + ObjectType* type = new ObjectType(); + UnicodeString lang(L"lang"); + + PackageNameDeclare* pkg = PackageNameDeclare::makeFromString(&lang); + type->setPackageName(pkg); + type->setName(new UnicodeString(L"Object")); + + module->setType(type); + module->setName(new UnicodeString(L"module")); + + args->addArgument(module); + } + + { + ArgumentDeclare* moduleName = new ArgumentDeclare(); + + StringType* type = new StringType(); + moduleName->setType(type); + + moduleName->setName(new UnicodeString(L"name")); + + args->addArgument(moduleName); + } +} + +ModuleDetectedMethodDeclare::~ModuleDetectedMethodDeclare() { + +} + +} /* namespace codablecash */ diff --git a/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.h b/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.h new file mode 100644 index 0000000..7c44a2a --- /dev/null +++ b/src_smartcontract_modular/modular_interfaces/ModuleDetectedMethodDeclare.h @@ -0,0 +1,27 @@ +/* + * ModuleDetectedMethodDeclare.h + * + * Created on: Dec 7, 2025 + * Author: iizuka + */ + +#ifndef MODULAR_INTERFACES_MODULEDETECTEDMETHODDECLARE_H_ +#define MODULAR_INTERFACES_MODULEDETECTEDMETHODDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + +using namespace alinous; + +namespace codablecash { + +class ModuleDetectedMethodDeclare : public AbstractReservedMethodDeclare { +public: + static const UnicodeString METHOD_NAME; + + ModuleDetectedMethodDeclare(); + virtual ~ModuleDetectedMethodDeclare(); +}; + +} /* namespace codablecash */ + +#endif /* MODULAR_INTERFACES_MODULEDETECTEDMETHODDECLARE_H_ */ diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp index b5604fe..a7a603e 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.cpp @@ -57,7 +57,8 @@ const SmartcontractInstanceAddress* InstanceSpace::getSmartContractInstanceAddre } bool InstanceSpace::analyze() { - bool hasError = this->instance->analyze(); + bool hasError = this->instance->preAnalyzeGoup(); + hasError |= this->instance->analyzeTypeRefGroup(); this->instance->setMainInstance(); @@ -71,6 +72,28 @@ bool InstanceSpace::analyze() { hasError |= this->instance->generateInterModularCommunicationClasses(); } + // pre analyze connector class + if(!hasError){ + hasError |= this->instance->preAnalyzeInterModularCommunicationClasses(); + } + if(!hasError){ + hasError |= this->instance->analyzeTypeRefInterModularCommunicationClasses(); + } + + // metadata + if(!hasError){ + hasError |= this->instance->analyzeMetadataGroup(); + } + + // analyze + if(!hasError){ + hasError |= this->instance->analyzeGroup(); + } + + if(!hasError){ + hasError |= this->instance->analyzeInterModularCommunicationClasses(); + } + return hasError; } @@ -106,6 +129,10 @@ void InstanceSpace::cleanDbRoot() { this->instance->cleanDbRoot(); } +void InstanceSpace::invokeModularProxyListnerMethod() { + this->instance->invokeModularProxyListnerMethod(); +} + SmartcontractExecResult* InstanceSpace::invokeMainObjectMethod(UnicodeString *moduleName, UnicodeString *methodName, ArrayList* args) { SmartcontractExecResult* result = this->instance->invokeMainObjectMethod(moduleName, methodName, args); __STP(result); diff --git a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h index 41081a8..0c0479f 100644 --- a/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h +++ b/src_smartcontract_modular/smartcontract_cache/InstanceSpace.h @@ -44,6 +44,9 @@ class InstanceSpace { bool interpretInitializer(); void resetRootReference(); + // dependent modules + void invokeModularProxyListnerMethod(); + // databases void setDatabaseDir(const File* baseDir); void createDatabase(); diff --git a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp index 474f764..b133c00 100644 --- a/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp +++ b/src_smartcontract_modular/smartcontract_executor/ModularSmartcontractExecutor.cpp @@ -28,6 +28,8 @@ #include "bc/ExceptionThrower.h" #include "smartcontract_cache/ModuleSetupException.h" + +#include "smartcontract_cache/InstanceSpaceReleaser.h" namespace codablecash { ModularSmartcontractExecutor::ModularSmartcontractExecutor(const File* base) { @@ -87,23 +89,33 @@ SmartcontractProjectData* ModularSmartcontractExecutor::getProject(const Smartco } void ModularSmartcontractExecutor::createInstance(const SmartcontractInstanceAddress *instAddress, const SmartcontractProjectId *projectId) { - InstanceSpace* space = this->instanceSpace->createInstance(instAddress, projectId); __STP(space); + { + InstanceSpace* space = this->instanceSpace->createInstance(instAddress, projectId); __STP(space); + + // language + bool hasError = space->analyze(); + ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Analysis error.", __FILE__, __LINE__); + + space->setMainInstance(); + space->createMainInstance(); + hasError = space->interpretInitializer(); + ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Main object initialize error.", __FILE__, __LINE__); - // language - bool hasError = space->analyze(); - ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Analysis error.", __FILE__, __LINE__); + // database + File* instanceRootDir = this->baseDir->get(INSTANCES_DIR_NAME); __STP(instanceRootDir); + space->setDatabaseDir(instanceRootDir); + space->createDatabase(); - space->setMainInstance(); - space->createMainInstance(); - hasError = space->interpretInitializer(); - ExceptionThrower::throwExceptionIfCondition(hasError == true, L"Main object initialize error.", __FILE__, __LINE__); + this->instanceSpace->registerCache(__STP_MV(space)); + } - // database - File* instanceRootDir = this->baseDir->get(INSTANCES_DIR_NAME); __STP(instanceRootDir); - space->setDatabaseDir(instanceRootDir); - space->createDatabase(); + // dependency module objects + { + InstanceSpace* space = this->instanceSpace->loadFromCache(instAddress); + InstanceSpaceReleaser __releaser(space); - this->instanceSpace->registerCache(__STP_MV(space)); + space->invokeModularProxyListnerMethod(); + } } InstanceSpace* ModularSmartcontractExecutor::loadFromCache(const SmartcontractInstanceAddress *instAddress) { diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index db3767b..2ab25fc 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -9,13 +9,19 @@ #include "smartcontract_instance/ExecutableModuleInstance.h" #include "smartcontract_instance/LibraryExectableModuleInstance.h" #include "smartcontract_instance/ModuleInstanceClassLoader.h" - +#include "smartcontract_instance/InstanceDependencyContext.h" #include "smartcontract_instance/ClassNotFoundException.h" #include "modular_project/ModularInstanceConfig.h" #include "modular_project/DependencyConfig.h" #include "modular_project/ModularConfigException.h" +#include "instance/instance_exception_class/VmExceptionInstance.h" + +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "inter_modular_access/ModularProxyObjectInstanceFactory.h" + #include "base/UnicodeString.h" #include "base/StackRelease.h" #include "base/ArrayList.h" @@ -42,6 +48,7 @@ #include "engine/sc_analyze/AnalyzedClass.h" #include "vm/VirtualMachine.h" +#include "vm/stack/StackPopper.h" #include "json_object/AbstractJsonValue.h" @@ -54,22 +61,28 @@ #include "instance/VmInstanceTypesConst.h" #include "lang/sc_declare/ClassDeclare.h" +#include "lang/sc_declare/MethodDeclare.h" #include "bc_base/BinaryUtils.h" -#include "smartcontract_executor/SmartcontractExecResult.h" +#include "ext_binary/ExtNullPtrObject.h" -#include "lang/sc_declare/MethodDeclare.h" +#include "instance/instance_ref/ObjectReference.h" -#include "ext_binary/ExtNullPtrObject.h" +#include "instance/reserved_classes/ReservedClassRegistory.h" +#include "instance/reserved_classes/object/ObjectClassDeclare.h" -#include "smartcontract_instance/InstanceDependencyContext.h" +#include "inter_modular_access/ModularProxyClassDeclare.h" -#include "inter_modular_access/ModularProxyObjectInstanceFactory.h" +#include "instance/instance_gc/StackFloatingVariableHandler.h" -#include "instance/instance_ref/ObjectReference.h" +#include "instance/instance_string/VmStringInstance.h" + +#include "modular_interfaces/ModularProxyListnerClassDeclare.h" +#include "modular_interfaces/ModuleDetectedMethodDeclare.h" + +#include "instance/instance_exception/ExceptionInterrupt.h" -#include "instance/instance_exception_class/VmExceptionInstance.h" namespace codablecash { AbstractExecutableModuleInstance::AbstractExecutableModuleInstance(uint8_t kind) { @@ -108,6 +121,7 @@ AbstractExecutableModuleInstance::~AbstractExecutableModuleInstance() { this->mainInst = nullptr; delete this->dependencyHandler; + delete this->factory; delete this->dbDir; delete this->undodbDir; @@ -227,7 +241,27 @@ void AbstractExecutableModuleInstance::setMainInstance() { } bool AbstractExecutableModuleInstance::createMainInstance() { - this->mainInst = this->vm->createScInstance(); + // init modular classes + + ArrayList exprogs; + { + ReservedClassRegistory* reservedReg = this->vm->getReservedClassRegistory(); + exprogs.addElement(reservedReg); + exprogs.addElement(this->factory); + + ArrayList* list = this->dependencyHandler->getContextList(); + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + InstanceDependencyContext* dctx = list->get(i); + ModuleInstanceClassLoader* loader = dctx->getClassLoader(); + + exprogs.addElement(loader); + } + } + + + // init in the Smartcontract::createInstance(VirtualMachine* vm) by initialize(vm); + this->mainInst = this->vm->createScInstance(&exprogs); ArrayList& exceptions = this->vm->getExceptions(); return !this->vm->hasError() && exceptions.isEmpty(); @@ -596,7 +630,7 @@ SmartcontractExecResult* AbstractExecutableModuleInstance::invokeMainObjectMetho UnicodeString name(L"ret"); VTableRegistory* vreg = actx->getVtableRegistory(); - AbstractExtObject* retObj = vminst != nullptr ? vminst->toClassExtObject(&name, vreg) : new ExtNullPtrObject(&name); + AbstractExtObject* retObj = vminst != nullptr ? vminst->toClassExtObject(&name, vreg) : new ExtNullPtrObject(&name, atype->getType()); result->setReturnedValue(retObj); } } @@ -654,10 +688,36 @@ bool AbstractExecutableModuleInstance::generateInterModularCommunicationClasses( generateLibExport(mainFqn, libExport, dctx); } + return hasError; +} +bool AbstractExecutableModuleInstance::preAnalyzeInterModularCommunicationClasses() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); - return hasError; - // FIXME generateInterModularCommunicationClasses + this->factory->preAnalyze(actx); + + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::analyzeTypeRefInterModularCommunicationClasses() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + this->factory->analyzeType(actx); + + + + return actx->hasError(); +} + +bool AbstractExecutableModuleInstance::analyzeInterModularCommunicationClasses() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + this->factory->analyze(actx); + + return actx->hasError(); } void AbstractExecutableModuleInstance::generateLibExport(UnicodeString* mainFqn, ArrayList *libExport, InstanceDependencyContext* dctx) { @@ -676,4 +736,126 @@ void AbstractExecutableModuleInstance::generateLibExport(UnicodeString* mainFqn, } } +void AbstractExecutableModuleInstance::invokeModularProxyListnerMethod() { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + TypeResolver* typeResolver = actx->getTypeResolver(); + + AnalyzedType* modularProxyListnerType = typeResolver->findClassType(&ModularProxyListnerClassDeclare::PACKAGE_NAME, &ModularProxyListnerClassDeclare::NAME); __STP(modularProxyListnerType); + AnalyzedClass* modularProxyListnerAclass = modularProxyListnerType->getAnalyzedClass(); + + // get main instance's runtime class + AnalyzedClass* aclazz = this->mainInst->getAnalyzedClass(); + ClassDeclare* dec = aclazz->getClassDeclare(); + + bool bl = aclazz->hasImplements(modularProxyListnerAclass); + if(bl){ + ArrayList* list = this->dependencyHandler->getContextList(); + + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + InstanceDependencyContext* dctx = list->get(i); + fireListner(dctx); + } + } +} + +void AbstractExecutableModuleInstance::fireListner(InstanceDependencyContext *dctx) { + AbstractExecutableModuleInstance* libInst = dctx->getModuleInstance(); + const ModularInstanceConfig* instanceConfig = libInst->getInstanceConfig(); + + ArrayList* list = instanceConfig->getLibExport(); + + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + UnicodeString* exportInterface = list->get(i); + + doFireListner(dctx, exportInterface, instanceConfig); + } +} + +void AbstractExecutableModuleInstance::doFireListner(InstanceDependencyContext *dctx, const UnicodeString *exportInterface, const ModularInstanceConfig* instanceConfig) { + AnalyzedClass* mainAclazz = this->mainInst->getAnalyzedClass(); + + ClassDeclare* ifdec = dctx->getClassLoader()->getClassDeclare(exportInterface); + ExceptionThrower::throwExceptionIfCondition(ifdec == nullptr, L"The main class does not implements the directAccess Interface.", __FILE__, __LINE__); + + const UnicodeString* ifpackage = ModularProxyClassDeclare::getPackageFromIf(ifdec); + + const UnicodeString* mainClassName = instanceConfig->getMainClass(); + UnicodeString* className = ModularProxyClassDeclare::getNameFromInterface(mainClassName, exportInterface); __STP(className); + + UnicodeString fqn(ifpackage); + fqn.append(L"."); + fqn.append(className); + + CompilationUnit* unit = this->factory->getCompilantUnit(&fqn); + ExceptionThrower::throwExceptionIfCondition(unit == nullptr, L"It can't find generated proxy class declare.", __FILE__, __LINE__); + + ClassDeclare* proxyClass = unit->getClassDeclare(0); + IVmInstanceFactory* instFactory = proxyClass->getFactory(); + + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + AnalyzedClass* aclazz = actx->getAnalyzedClass(proxyClass); + VmClassInstance* proxyInstance = instFactory->createInstance(aclazz, this->vm); + + callModuleDetectedMethod(proxyClass, proxyInstance, &fqn); +} + +void AbstractExecutableModuleInstance::callModuleDetectedMethod(ClassDeclare* proxyClass, VmClassInstance *proxyInstance, const UnicodeString* ifname) { + SmartContract* contract = this->vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + TypeResolver* typeResolver = actx->getTypeResolver(); + + // arguments + StackFloatingVariableHandler releaser(this->vm->getGc()); + releaser.registerInstance(proxyInstance); + + VmStringInstance* vmstr = new(vm) VmStringInstance(vm, ifname); + releaser.registerInstance(vmstr); + + FunctionArguments args; + args.addSubstance(proxyInstance); + args.addSubstance(vmstr); + + // this pointer + args.setThisPtr(this->mainInst); + + // find method + AnalyzedClass* aclazzThis = this->mainInst->getAnalyzedClass(); + + MethodDeclare* method = nullptr; + { + ArrayList list; + + + UnicodeString objfqn(&ObjectClassDeclare::PACKAGE); + objfqn.append(L"."); + objfqn.append(&ObjectClassDeclare::NAME); + + AnalyzedType* proxtType = typeResolver->findClassType(&ObjectClassDeclare::PACKAGE, &ObjectClassDeclare::NAME); __STP(proxtType); + list.addElement(proxtType); + + AnalyzedType stringType = vmstr->getRuntimeType(); + list.addElement(&stringType); + + method = aclazzThis->findMethod(&ModuleDetectedMethodDeclare::METHOD_NAME, &list); + } + + assert(method != nullptr); + + { + // top stack + this->vm->newStack(); + StackPopper popStack(this->vm); + VmStack* stack = this->vm->topStack(); + + method->interpret(&args, this->vm); + + ExceptionInterrupt::interruptPoint(this->vm); + } +} + } /* namespace alinous */ diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index 955334a..1e3caf7 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -22,6 +22,7 @@ class AnalyzedClass; class AbstractFunctionExtArguments; class FunctionArguments; class AbstractExtObject; +class ClassDeclare; } using namespace alinous; @@ -112,8 +113,17 @@ class AbstractExecutableModuleInstance { // modular bool generateInterModularCommunicationClasses(); + bool preAnalyzeInterModularCommunicationClasses(); + bool analyzeTypeRefInterModularCommunicationClasses(); + bool analyzeInterModularCommunicationClasses(); + + void invokeModularProxyListnerMethod(); protected: + void callModuleDetectedMethod(ClassDeclare* proxyClass, VmClassInstance* proxyInstance, const UnicodeString* ifname); + void fireListner(InstanceDependencyContext* dctx); + void doFireListner(InstanceDependencyContext *dctx, const UnicodeString* exportInterface, const ModularInstanceConfig* instanceConfig); + void generateLibExport(UnicodeString* mainFqn, ArrayList* libExport, InstanceDependencyContext* dctx); bool hasInterface(const ArrayList* implememtsList, AnalyzedClass* aclazz); diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp index e43671c..76af0df 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.cpp @@ -115,19 +115,56 @@ bool ModularSmartcontractInstance::hasCompileError() const noexcept { return hasError; } -bool ModularSmartcontractInstance::analyze() { - bool hasError = false; + +bool ModularSmartcontractInstance::preAnalyzeGoup() { + bool hasError = false; try{ initBeforeAnalyze(); preAnalyze(); preAnalyzeGenerics(); loadDependency(); preAnalyzeDependency(); + } + catch(CompilantUnitAnalyzeException* e){ + delete e; + hasError = true; + } + + return hasError; +} +bool ModularSmartcontractInstance::analyzeTypeRefGroup() { + bool hasError = false; + try{ analyzeType(); analyzeTypeDependency(); - analyzeMetadata(); + } + catch(CompilantUnitAnalyzeException* e){ + delete e; + hasError = true; + } + + return hasError; +} + +bool ModularSmartcontractInstance::analyzeMetadataGroup() { + bool hasError = this->execModule->analyzeMetadata(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* inst = this->libArray->get(i); + hasError |= inst->analyzeMetadata(); + } + + return hasError; +} + + +bool ModularSmartcontractInstance::analyzeGroup() { + bool hasError = false; + + try{ analyzeFinal(); analyzeDependency(); } @@ -199,18 +236,6 @@ void ModularSmartcontractInstance::analyzeType() { ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeType() failed.", __FILE__, __LINE__); } -void ModularSmartcontractInstance::analyzeMetadata() { - bool hasError = this->execModule->analyzeMetadata(); - - int maxLoop = this->libArray->size(); - for(int i = 0; i != maxLoop; ++i){ - LibraryExectableModuleInstance* inst = this->libArray->get(i); - hasError |= inst->analyzeMetadata(); - } - - ExceptionThrower::throwExceptionIfCondition(hasError, L"analyzeMetadata() failed.", __FILE__, __LINE__); -} - void ModularSmartcontractInstance::analyzeFinal() { bool hasError = this->execModule->analyzeFinal(); @@ -515,4 +540,53 @@ bool ModularSmartcontractInstance::generateInterModularCommunicationClasses() { return hasError; } +bool ModularSmartcontractInstance::preAnalyzeInterModularCommunicationClasses() { + bool hasError = this->execModule->preAnalyzeInterModularCommunicationClasses(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + + hasError |= lib->preAnalyzeInterModularCommunicationClasses(); + } + + return hasError; +} + +bool ModularSmartcontractInstance::analyzeTypeRefInterModularCommunicationClasses() { + bool hasError = this->execModule->analyzeTypeRefInterModularCommunicationClasses(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + + hasError |= lib->analyzeTypeRefInterModularCommunicationClasses(); + } + + return hasError; +} + +bool ModularSmartcontractInstance::analyzeInterModularCommunicationClasses() { + bool hasError = this->execModule->analyzeInterModularCommunicationClasses(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + + hasError |= lib->analyzeInterModularCommunicationClasses(); + } + + return hasError; +} + +void ModularSmartcontractInstance::invokeModularProxyListnerMethod() { + this->execModule->invokeModularProxyListnerMethod(); + + int maxLoop = this->libArray->size(); + for(int i = 0; i != maxLoop; ++i){ + LibraryExectableModuleInstance* lib = libArray->get(i); + lib->invokeModularProxyListnerMethod(); + } +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h index 526219b..9a550f9 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/ModularSmartcontractInstance.h @@ -47,7 +47,11 @@ class ModularSmartcontractInstance { void loadCompilantUnits(const File* projectBaseDir); bool hasCompileError() const noexcept; - bool analyze(); + bool preAnalyzeGoup(); + bool analyzeTypeRefGroup(); + bool analyzeMetadataGroup(); + bool analyzeGroup(); + bool checkDirectAccess(); void setMainInstance(); @@ -69,6 +73,12 @@ class ModularSmartcontractInstance { // modular bool generateInterModularCommunicationClasses(); + bool preAnalyzeInterModularCommunicationClasses(); + bool analyzeTypeRefInterModularCommunicationClasses(); + bool analyzeInterModularCommunicationClasses(); + + void invokeModularProxyListnerMethod(); + // create data SmartcontractProjectData* createData() const; @@ -91,7 +101,6 @@ class ModularSmartcontractInstance { void preAnalyze(); void preAnalyzeGenerics(); void analyzeType(); - void analyzeMetadata(); void analyzeFinal(); // dependency diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp index c146ec5..7ca493e 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.cpp @@ -108,4 +108,12 @@ void ModuleInstanceClassLoader::analyze(AnalyzeContext *actx) { } } +void ModuleInstanceClassLoader::initCompilantUnits(VirtualMachine *vm) { + int maxLoop = this->progs->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->progs->get(i); + unit->init(vm); + } +} + } /* namespace codablecash */ diff --git a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h index b4c934a..3eb1481 100644 --- a/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h +++ b/src_smartcontract_modular/smartcontract_instance/ModuleInstanceClassLoader.h @@ -11,6 +11,8 @@ #include "base/ArrayList.h" #include "base/HashMap.h" +#include "vm/IInitializeCompilantUnitProvidor.h" + namespace alinous { class CompilationUnit; class VirtualMachine; @@ -22,7 +24,7 @@ using namespace alinous; namespace codablecash { -class ModuleInstanceClassLoader { +class ModuleInstanceClassLoader : public IInitializeCompilantUnitProvidor { public: ModuleInstanceClassLoader(); virtual ~ModuleInstanceClassLoader(); @@ -36,6 +38,8 @@ class ModuleInstanceClassLoader { void analyzeType(AnalyzeContext* actx); void analyze(AnalyzeContext* actx); + virtual void initCompilantUnits(VirtualMachine *vm); + private: void addCompilationUnit(const UnicodeString *fqn, CompilationUnit* unit) noexcept; diff --git a/src_smartcontract_vm/ext_binary/AbstractExtObject.h b/src_smartcontract_vm/ext_binary/AbstractExtObject.h index c68a11f..b740e36 100644 --- a/src_smartcontract_vm/ext_binary/AbstractExtObject.h +++ b/src_smartcontract_vm/ext_binary/AbstractExtObject.h @@ -12,6 +12,8 @@ namespace alinous { class UnicodeString; +class AbstractVmInstance; +class VirtualMachine; class AbstractExtObject { public: @@ -27,6 +29,9 @@ class AbstractExtObject { virtual AbstractExtObject* copy() const noexcept = 0; virtual const UnicodeString* toString() const noexcept = 0; + + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm) = 0; + protected: uint8_t type; UnicodeString* name; diff --git a/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp b/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp index 29976ff..c8b03d7 100644 --- a/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp @@ -66,4 +66,8 @@ const UnicodeString* ExtArrayObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtArrayObject::toVmInstance(VirtualMachine *vm) { + // FIXME toVmInstance +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtArrayObject.h b/src_smartcontract_vm/ext_binary/ExtArrayObject.h index fbe04d8..eb4af61 100644 --- a/src_smartcontract_vm/ext_binary/ExtArrayObject.h +++ b/src_smartcontract_vm/ext_binary/ExtArrayObject.h @@ -27,6 +27,8 @@ class ExtArrayObject : public AbstractExtObject { virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); + private: ArrayList array; int length; diff --git a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp index 8b09983..643b6c8 100644 --- a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp @@ -14,15 +14,34 @@ #include "ext_binary/ExtDomArrayObject.h" #include "base/UnicodeString.h" +#include "base/StackRelease.h" #include "instance/VmInstanceTypesConst.h" +#include "instance/VmClassInstance.h" +#include "instance/instance_ref/ObjectReference.h" + +#include "vm/VirtualMachine.h" +#include "vm/exceptions.h" + +#include "engine/sc/SmartContract.h" + +#include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/PackageSpace.h" + +#include "bc/ExceptionThrower.h" + +#include "instance/IAbstractVmInstanceSubstance.h" + +using namespace codablecash; namespace alinous { -ExtClassObject::ExtClassObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_OBJ) { +ExtClassObject::ExtClassObject(const UnicodeString* name, const UnicodeString* fqn) : AbstractExtObject(name, VmInstanceTypesConst::INST_OBJ) { this->list = new ArrayList(); this->map = new HashMap(); + this->fqn = new UnicodeString(fqn); } ExtClassObject::~ExtClassObject() { @@ -30,6 +49,8 @@ ExtClassObject::~ExtClassObject() { delete this->list; delete this->map; + + delete this->fqn; } void ExtClassObject::add(AbstractExtObject* obj) noexcept { @@ -95,7 +116,7 @@ ExtDomArrayObject* ExtClassObject::getExtDomArrayObject(const UnicodeString* nam } AbstractExtObject* ExtClassObject::copy() const noexcept { - ExtClassObject* newObj = new ExtClassObject(this->name); + ExtClassObject* newObj = new ExtClassObject(this->name, this->fqn); int maxLoop = this->list->size(); for(int i = 0; i != maxLoop; ++i){ @@ -127,4 +148,35 @@ const UnicodeString* ExtClassObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtClassObject::toVmInstance(VirtualMachine *vm) { + SmartContract* contract = vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + UnicodeString* packageName = TypeResolver::getPackageName(this->fqn); __STP(packageName); + PackageSpace* space = actx->getPackegeSpace(packageName); + ExceptionThrower::throwExceptionIfCondition(space == nullptr, L"The package was not found.", __FILE__, __LINE__); + + UnicodeString* className = TypeResolver::getClassName(this->fqn); __STP(className); + AnalyzedClass* aclass = space->getClass(className); + ExceptionThrower::throwExceptionIfCondition(aclass == nullptr, L"The class was not found.", __FILE__, __LINE__); + + VmClassInstance* inst = new(vm) VmClassInstance(aclass, vm); __STP(inst); + + int maxLoop = this->list->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractExtObject* obj = this->list->get(i); + + AbstractVmInstance* memberValue = obj->toVmInstance(vm); __STP(memberValue); + const UnicodeString* name = obj->getName(); + + IAbstractVmInstanceSubstance* substance = memberValue->getInstance(); __STP(substance); + + AbstractReference* ref = substance->wrap(inst, vm); + + // FIXME toVmInstance + } + + return __STP_MV(inst); +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtClassObject.h b/src_smartcontract_vm/ext_binary/ExtClassObject.h index cbd931e..3f3e2e3 100644 --- a/src_smartcontract_vm/ext_binary/ExtClassObject.h +++ b/src_smartcontract_vm/ext_binary/ExtClassObject.h @@ -25,7 +25,7 @@ class ExtDomArrayObject; class ExtClassObject : public AbstractExtObject { public: - explicit ExtClassObject(const UnicodeString* name); + explicit ExtClassObject(const UnicodeString* name, const UnicodeString* fqn); virtual ~ExtClassObject(); void add(AbstractExtObject* obj) noexcept; @@ -41,10 +41,13 @@ class ExtClassObject : public AbstractExtObject { virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); private: ArrayList* list; HashMap* map; + + UnicodeString* fqn; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp index 2d2807c..4305ec7 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp @@ -65,4 +65,8 @@ const UnicodeString* ExtDomArrayObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtDomArrayObject::toVmInstance(VirtualMachine *vm) { + // FIXME toVmInstance(VirtualMachine* vm); +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.h b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.h index a0dbfef..31b81a0 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.h +++ b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.h @@ -26,6 +26,7 @@ class ExtDomArrayObject : public AbstractExtObject { virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); private: ArrayList* list; diff --git a/src_smartcontract_vm/ext_binary/ExtDomObject.cpp b/src_smartcontract_vm/ext_binary/ExtDomObject.cpp index e911ca4..d49cd27 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtDomObject.cpp @@ -86,4 +86,8 @@ const UnicodeString* ExtDomObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtDomObject::toVmInstance(VirtualMachine *vm) { + // FIXME toVmInstance +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtDomObject.h b/src_smartcontract_vm/ext_binary/ExtDomObject.h index 12c3442..2dae392 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomObject.h +++ b/src_smartcontract_vm/ext_binary/ExtDomObject.h @@ -26,6 +26,7 @@ class ExtDomObject : public AbstractExtObject { virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); private: HashMap* properties; diff --git a/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp b/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp index 3090b35..8db2843 100644 --- a/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp @@ -17,17 +17,20 @@ namespace alinous { ExtExceptionObject::ExtExceptionObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_EXCEPTION) { this->element = nullptr; this->className = nullptr; + this->message = nullptr; } ExtExceptionObject::~ExtExceptionObject() { this->element = nullptr; delete this->className; + delete this->message; } AbstractExtObject* ExtExceptionObject::copy() const noexcept { ExtExceptionObject* newObj = new ExtExceptionObject(this->name); newObj->element = this->element; newObj->className = this->className == nullptr ? nullptr : new UnicodeString(this->className); + newObj->message = this->message == nullptr ? nullptr : new UnicodeString(this->message); return newObj; } @@ -48,6 +51,10 @@ const UnicodeString* ExtExceptionObject::getClassName() const noexcept { return this->className; } +void ExtExceptionObject::setMessage(const UnicodeString *message) noexcept { + this->message = new UnicodeString(message); +} + const UnicodeString* ExtExceptionObject::toString() const noexcept { delete this->str; this->str = new UnicodeString(L"@"); @@ -57,5 +64,12 @@ const UnicodeString* ExtExceptionObject::toString() const noexcept { return this->str; } +const UnicodeString* ExtExceptionObject::getMessage() const noexcept { + return this->message; +} + +AbstractVmInstance* ExtExceptionObject::toVmInstance(VirtualMachine *vm) { + // FIXME toVmInstance +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtExceptionObject.h b/src_smartcontract_vm/ext_binary/ExtExceptionObject.h index 241e176..1e5ec39 100644 --- a/src_smartcontract_vm/ext_binary/ExtExceptionObject.h +++ b/src_smartcontract_vm/ext_binary/ExtExceptionObject.h @@ -25,13 +25,18 @@ class ExtExceptionObject : public AbstractExtObject { void setClassName(const UnicodeString* className) noexcept; const UnicodeString* getClassName() const noexcept; + void setMessage(const UnicodeString* message) noexcept; + const UnicodeString* getMessage() const noexcept; + virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); private: const CodeElement* element; UnicodeString* className; + UnicodeString* message; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp index b2f0e58..26bd048 100644 --- a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.cpp @@ -8,13 +8,16 @@ #include "ext_binary/ExtNullPtrObject.h" #include "instance/VmInstanceTypesConst.h" +#include "instance/VmNullprtInstance.h" #include "base/UnicodeString.h" +#include "vm/VirtualMachine.h" namespace alinous { -ExtNullPtrObject::ExtNullPtrObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_NULL){ +ExtNullPtrObject::ExtNullPtrObject(const UnicodeString* name, uint8_t atype) : AbstractExtObject(name, VmInstanceTypesConst::INST_NULL){ + this->atype = atype; } ExtNullPtrObject::~ExtNullPtrObject() { @@ -25,7 +28,7 @@ bool ExtNullPtrObject::isNull() const noexcept { } AbstractExtObject* ExtNullPtrObject::copy() const noexcept { - return new ExtNullPtrObject(this->name); + return new ExtNullPtrObject(this->name, this->atype); } const UnicodeString* ExtNullPtrObject::toString() const noexcept { @@ -35,4 +38,8 @@ const UnicodeString* ExtNullPtrObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtNullPtrObject::toVmInstance(VirtualMachine *vm) { + return new(vm) VmNullprtInstance(vm->publishInstanceSerial(), this->atype); +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h index 7cac9dd..13019a2 100644 --- a/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h +++ b/src_smartcontract_vm/ext_binary/ExtNullPtrObject.h @@ -14,13 +14,18 @@ namespace alinous { class ExtNullPtrObject : public AbstractExtObject { public: - ExtNullPtrObject(const UnicodeString* name); + ExtNullPtrObject(const UnicodeString* name, uint8_t atype); virtual ~ExtNullPtrObject(); virtual bool isNull() const noexcept; virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); + +private: + uint8_t atype; }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp index ed3da87..5a44444 100644 --- a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp @@ -133,5 +133,8 @@ const UnicodeString* ExtPrimitiveObject::toString() const noexcept { return this->str; } +AbstractVmInstance* ExtPrimitiveObject::toVmInstance(VirtualMachine *vm) { + // FIXME toVmInstance +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.h b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.h index db1783c..a4841a2 100644 --- a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.h +++ b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.h @@ -42,6 +42,7 @@ class ExtPrimitiveObject : public AbstractExtObject { virtual AbstractExtObject* copy() const noexcept; virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); private: uint8_t data[8]; diff --git a/src_smartcontract_vm/ext_binary/ExtStringClass.cpp b/src_smartcontract_vm/ext_binary/ExtStringClass.cpp index b98e49d..9910f47 100644 --- a/src_smartcontract_vm/ext_binary/ExtStringClass.cpp +++ b/src_smartcontract_vm/ext_binary/ExtStringClass.cpp @@ -11,6 +11,7 @@ #include "base/UnicodeString.h" +#include "instance/instance_string/VmStringInstance.h" namespace alinous { ExtStringClass::ExtStringClass(const UnicodeString* name, const UnicodeString* value) @@ -45,5 +46,9 @@ const UnicodeString* ExtStringClass::toString() const noexcept { } +AbstractVmInstance* ExtStringClass::toVmInstance(VirtualMachine *vm) { + VmStringInstance* inst = new(vm) VmStringInstance(vm, this->value); + return inst; +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtStringClass.h b/src_smartcontract_vm/ext_binary/ExtStringClass.h index 21f26ec..e4562cc 100644 --- a/src_smartcontract_vm/ext_binary/ExtStringClass.h +++ b/src_smartcontract_vm/ext_binary/ExtStringClass.h @@ -25,6 +25,8 @@ class ExtStringClass : public AbstractExtObject { virtual const UnicodeString* toString() const noexcept; + virtual AbstractVmInstance* toVmInstance(VirtualMachine* vm); + private: UnicodeString* value; }; diff --git a/src_smartcontract_vm/instance/AbstractVmInstance.h b/src_smartcontract_vm/instance/AbstractVmInstance.h index 1eecf63..90b4ca8 100644 --- a/src_smartcontract_vm/instance/AbstractVmInstance.h +++ b/src_smartcontract_vm/instance/AbstractVmInstance.h @@ -44,6 +44,8 @@ class AbstractVmInstance { virtual const UnicodeString* toString() const noexcept = 0; virtual AbstractExtObject* toClassExtObject(const UnicodeString* name, VTableRegistory* table); + + protected: uint8_t type; uint64_t serial; diff --git a/src_smartcontract_vm/instance/CMakeLists.txt b/src_smartcontract_vm/instance/CMakeLists.txt index 7885269..439268e 100644 --- a/src_smartcontract_vm/instance/CMakeLists.txt +++ b/src_smartcontract_vm/instance/CMakeLists.txt @@ -6,6 +6,7 @@ set(__src IInstanceContainer.cpp VmAllocatee.cpp VmClassInstance.cpp + VmNullprtInstance.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance) diff --git a/src_smartcontract_vm/instance/VmClassInstance.cpp b/src_smartcontract_vm/instance/VmClassInstance.cpp index 82ca79c..ccece8f 100644 --- a/src_smartcontract_vm/instance/VmClassInstance.cpp +++ b/src_smartcontract_vm/instance/VmClassInstance.cpp @@ -193,9 +193,10 @@ AnalyzedType VmClassInstance::getRuntimeType() const noexcept { } AbstractExtObject* VmClassInstance::toClassExtObject(const UnicodeString* name, VTableRegistory* reg) { - ExtClassObject* extObj = new ExtClassObject(name); - const UnicodeString* fqn = this->clazz->getFullQualifiedName(); + + ExtClassObject* extObj = new ExtClassObject(name, fqn); + VTableClassEntry* classEntry = reg->getClassEntry(fqn, this->clazz); MemberVariableTable* table = classEntry->getMemberVariableTable(); diff --git a/src_smartcontract_vm/instance/VmInstanceTypesConst.h b/src_smartcontract_vm/instance/VmInstanceTypesConst.h index 4eb432c..f7e7f23 100644 --- a/src_smartcontract_vm/instance/VmInstanceTypesConst.h +++ b/src_smartcontract_vm/instance/VmInstanceTypesConst.h @@ -22,6 +22,7 @@ class VmInstanceTypesConst { static constexpr uint8_t INST_DOM_ARRAY{6}; static constexpr uint8_t INST_EXCEPTION{10}; + static constexpr uint8_t INST_EXCEPTION_STACK_TRACE{11}; static constexpr uint8_t REF_ROOT{100}; static constexpr uint8_t REF_OBJ{101}; diff --git a/src_smartcontract_vm/instance/VmNullprtInstance.cpp b/src_smartcontract_vm/instance/VmNullprtInstance.cpp new file mode 100644 index 0000000..d1e088e --- /dev/null +++ b/src_smartcontract_vm/instance/VmNullprtInstance.cpp @@ -0,0 +1,99 @@ +/* + * VmNullprtInstance.cpp + * + * Created on: Jan 8, 2026 + * Author: iizuka + */ + +#include "instance/VmNullprtInstance.h" +#include "instance/VmInstanceTypesConst.h" + +#include "instance/instance_array/ArrayReference.h" + +#include "instance/instance_ref/ObjectReference.h" + +#include "instance/instance_dom/DomRuntimeReference.h" + +#include "engine/sc_analyze/AnalyzedType.h" + +#include "ext_binary/ExtNullPtrObject.h" + +#include "vm/VirtualMachine.h" + +#include "base/UnicodeString.h" + +namespace alinous { + +const UnicodeString VmNullprtInstance::NULL_STR(L"null"); + +VmNullprtInstance::VmNullprtInstance(uint64_t serial, uint8_t atype) : AbstractVmInstance(VmInstanceTypesConst::INST_NULL, serial) { + this->atype = atype; +} + +VmNullprtInstance::~VmNullprtInstance() { + +} + +AbstractReference* VmNullprtInstance::wrap(IAbstractVmInstanceSubstance *owner, VirtualMachine *vm) { + AbstractReference* ref = nullptr; + if(this->atype == AnalyzedType::TYPE_OBJECT){ + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::CLASS_INSTANCE, vm->publishInstanceSerial()); + } + else if(this->atype == AnalyzedType::TYPE_STRING){ + ref = new(vm) ObjectReference(owner, VmInstanceTypesConst::REF_OBJ, ObjectReference::STRING_INSTANCE, vm->publishInstanceSerial()); + } + else if(this->atype == AnalyzedType::TYPE_OBJECT_ARRAY){ + ref = new(vm) ArrayReference(owner, vm, nullptr); + } + else if(this->atype == AnalyzedType::TYPE_NONE){ + ref = new(vm) DomRuntimeReference(owner, vm); + } + + return ref; +} + +uint8_t VmNullprtInstance::getInstType() const noexcept { + return getType(); +} + +AnalyzedType VmNullprtInstance::getRuntimeType() const noexcept { + return AnalyzedType(AnalyzedType::TYPE_NULL); +} + +const VMemList* VmNullprtInstance::getInstReferences() const noexcept { + return nullptr; +} + +int VmNullprtInstance::instHashCode() const noexcept { + return 0; +} + +bool VmNullprtInstance::instIsPrimitive() const noexcept { + return false; +} + +bool VmNullprtInstance::instIsNull() const noexcept { + return true; +} + +int VmNullprtInstance::instValueCompare(const IAbstractVmInstanceSubstance *right) const noexcept { + return right->instIsNull() ? 0 : -1; +} + +AbstractExtObject* VmNullprtInstance::instToClassExtObject(const UnicodeString *name, VTableRegistory *table) { + return new ExtNullPtrObject(name, this->atype); +} + +IAbstractVmInstanceSubstance* VmNullprtInstance::getInstance() noexcept { + return this; +} + +int VmNullprtInstance::valueCompare(const IAbstractVmInstanceSubstance *right) const noexcept { + return instValueCompare(right); +} + +const UnicodeString* VmNullprtInstance::toString() const noexcept { + return &VmNullprtInstance::NULL_STR; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/VmNullprtInstance.h b/src_smartcontract_vm/instance/VmNullprtInstance.h new file mode 100644 index 0000000..ca577fc --- /dev/null +++ b/src_smartcontract_vm/instance/VmNullprtInstance.h @@ -0,0 +1,46 @@ +/* + * VmNullprtInstance.h + * + * Created on: Jan 8, 2026 + * Author: iizuka + */ + +#ifndef INSTANCE_VMNULLPRTINSTANCE_H_ +#define INSTANCE_VMNULLPRTINSTANCE_H_ + +#include "instance/AbstractVmInstance.h" +#include "instance/IAbstractVmInstanceSubstance.h" + +namespace alinous { + +class VmNullprtInstance : public AbstractVmInstance, public IAbstractVmInstanceSubstance { +public: + static const UnicodeString NULL_STR; + + VmNullprtInstance(uint64_t serial, uint8_t atype); + virtual ~VmNullprtInstance(); + + virtual AbstractReference* wrap(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm); + virtual uint8_t getInstType() const noexcept; + + virtual AnalyzedType getRuntimeType() const noexcept; + + virtual const VMemList* getInstReferences() const noexcept; + virtual int instHashCode() const noexcept; + virtual bool instIsPrimitive() const noexcept; + virtual bool instIsNull() const noexcept; + + virtual int instValueCompare(const IAbstractVmInstanceSubstance* right) const noexcept; + virtual AbstractExtObject* instToClassExtObject(const UnicodeString* name, VTableRegistory* table); + + virtual IAbstractVmInstanceSubstance* getInstance() noexcept; + virtual int valueCompare(const IAbstractVmInstanceSubstance* right) const noexcept; + virtual const UnicodeString* toString() const noexcept; + +private: + uint8_t atype; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_VMNULLPRTINSTANCE_H_ */ diff --git a/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp b/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp index e38cc6e..ea83ff5 100644 --- a/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp +++ b/src_smartcontract_vm/instance/instance_array/ArrayReference.cpp @@ -15,6 +15,7 @@ #include "ext_binary/ExtNullPtrObject.h" +#include "engine/sc_analyze/AnalyzedType.h" namespace alinous { ArrayReference::ArrayReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) @@ -75,7 +76,7 @@ int ArrayReference::valueCompare(const IAbstractVmInstanceSubstance* right) cons AbstractExtObject* ArrayReference::toClassExtObject(const UnicodeString* name, VTableRegistory* table) { return this->instArray != nullptr ? this->instArray->instToClassExtObject(name, table) - : new ExtNullPtrObject(name); + : new ExtNullPtrObject(name, AnalyzedType::TYPE_OBJECT_ARRAY); } void ArrayReference::resetOnGc() noexcept { diff --git a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp index b0ae4a4..d2ace40 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp @@ -15,6 +15,8 @@ #include "ext_binary/ExtNullPtrObject.h" #include "instance/instance_gc/GcManager.h" + +#include "engine/sc_analyze/AnalyzedType.h" namespace alinous { DomRuntimeReference::DomRuntimeReference(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm) @@ -77,7 +79,7 @@ int DomRuntimeReference::valueCompare(const IAbstractVmInstanceSubstance* right) } AbstractExtObject* DomRuntimeReference::toClassExtObject(const UnicodeString* name, VTableRegistory* table) { - return this->reference == nullptr ? new ExtNullPtrObject(name) : this->reference->toClassExtObject(name, table); + return this->reference == nullptr ? new ExtNullPtrObject(name, AnalyzedType::TYPE_NONE) : this->reference->toClassExtObject(name, table); } const UnicodeString* DomRuntimeReference::toString() const noexcept { diff --git a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp index 914b4aa..bb50298 100644 --- a/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/ArrayOutOfBoundsExceptionClassDeclare.cpp @@ -59,7 +59,6 @@ void ArrayOutOfBoundsExceptionClassDeclare::throwException(VirtualMachine* vm, c VmClassInstance* inst = factory->createInstance(aclass, vm); inst->init(vm); - VmExceptionInstance* exception = dynamic_cast(inst); vm->throwException(exception, element); diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp index ded514d..a91a527 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.cpp @@ -48,22 +48,28 @@ AnalyzedClass* NullPointerExceptionClassDeclare::createAnalyzedClass() noexcept } void NullPointerExceptionClassDeclare::throwException(VirtualMachine* vm, const CodeElement* element) noexcept { - ExecControlManager* ctrl = vm->getCtrl(); - IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); + throwException(true, vm, element); +} + +void NullPointerExceptionClassDeclare::throwException(bool cond, VirtualMachine *vm, const CodeElement *element) noexcept { + if(cond){ + ExecControlManager* ctrl = vm->getCtrl(); + IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); - fqn.append(L"."); - fqn.append(&NAME); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); - VmClassInstance* inst = factory->createInstance(aclass, vm); - inst->init(vm); + VmClassInstance* inst = factory->createInstance(aclass, vm); + inst->init(vm); - VmExceptionInstance* exception = dynamic_cast(inst); + VmExceptionInstance* exception = dynamic_cast(inst); - vm->throwException(exception, element); + vm->throwException(exception, element); + } } NullPointerExceptionClassDeclare::~NullPointerExceptionClassDeclare() { diff --git a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h index edbc974..cbdfa39 100644 --- a/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/NullPointerExceptionClassDeclare.h @@ -19,6 +19,7 @@ class NullPointerExceptionClassDeclare : public AbstractExceptionClassDeclare { static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(VirtualMachine* vm, const CodeElement* element) noexcept; + static void throwException(bool cond, VirtualMachine* vm, const CodeElement* element) noexcept; NullPointerExceptionClassDeclare(); virtual ~NullPointerExceptionClassDeclare(); diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp index 6976fd1..1edf8b3 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.cpp @@ -47,21 +47,26 @@ AnalyzedClass* TypeCastExceptionClassDeclare::createAnalyzedClass() noexcept { } void TypeCastExceptionClassDeclare::throwException(VirtualMachine* vm, const CodeElement* element) noexcept { - ExecControlManager* ctrl = vm->getCtrl(); - IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); + throwException(true, vm, element); +} - UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); - fqn.append(L"."); - fqn.append(&NAME); - AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); +void TypeCastExceptionClassDeclare::throwException(bool cond,VirtualMachine *vm, const CodeElement *element) noexcept { + if(cond){ + ExecControlManager* ctrl = vm->getCtrl(); + IVmInstanceFactory* factory = ExceptionInstanceFactory::getInstance(); - VmClassInstance* inst = factory->createInstance(aclass, vm); - inst->init(vm); + UnicodeString fqn(&AbstractExceptionClassDeclare::PACKAGE_NAME); + fqn.append(L"."); + fqn.append(&NAME); + AnalyzedClass* aclass = vm->getReservedClassRegistory()->getAnalyzedClass(&fqn); + VmClassInstance* inst = factory->createInstance(aclass, vm); + inst->init(vm); - VmExceptionInstance* exception = dynamic_cast(inst); + VmExceptionInstance* exception = dynamic_cast(inst); - vm->throwException(exception, element); + vm->throwException(exception, element); + } } TypeCastExceptionClassDeclare::~TypeCastExceptionClassDeclare() { diff --git a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h index 84d49da..588157b 100644 --- a/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h +++ b/src_smartcontract_vm/instance/instance_exception/TypeCastExceptionClassDeclare.h @@ -18,6 +18,7 @@ class TypeCastExceptionClassDeclare : public AbstractExceptionClassDeclare { static const UnicodeString FULL_QUALIFIED_NAME; static AnalyzedClass* createAnalyzedClass() noexcept; static void throwException(VirtualMachine* vm, const CodeElement* element) noexcept; + static void throwException(bool cond, VirtualMachine* vm, const CodeElement* element) noexcept; TypeCastExceptionClassDeclare(); virtual ~TypeCastExceptionClassDeclare(); diff --git a/src_smartcontract_vm/instance/instance_exception_class/CMakeLists.txt b/src_smartcontract_vm/instance/instance_exception_class/CMakeLists.txt index 43b2417..0c6eedc 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/CMakeLists.txt +++ b/src_smartcontract_vm/instance/instance_exception_class/CMakeLists.txt @@ -4,6 +4,7 @@ set(__src AbstractExceptionClassDeclare.cpp ExceptionClassDeclare.cpp ExceptionInstanceFactory.cpp + StackTraceElement.cpp VmExceptionInstance.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/instance_exception_class) diff --git a/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.cpp b/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.cpp new file mode 100644 index 0000000..5047edb --- /dev/null +++ b/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.cpp @@ -0,0 +1,45 @@ +/* + * StackTraceElement.cpp + * + * Created on: Dec 6, 2025 + * Author: iizuka + */ + +#include "instance/instance_exception_class/StackTraceElement.h" + +#include "instance/VmInstanceTypesConst.h" + + +namespace alinous { + +StackTraceElement::StackTraceElement(uint64_t serial) : AbstractVmInstance(VmInstanceTypesConst::INST_EXCEPTION_STACK_TRACE, serial) { + this->currentMethod = nullptr; + this->entryPoint = nullptr; +} + +StackTraceElement::~StackTraceElement() { + this->currentMethod = nullptr; + this->entryPoint = nullptr; +} + +void StackTraceElement::setCurrentMethod(MethodDeclare *currentMethod) { + this->currentMethod = currentMethod; +} + +void StackTraceElement::setEntryPoint(AbstractExpression *entryPoint) { + this->entryPoint = entryPoint; +} + +IAbstractVmInstanceSubstance* StackTraceElement::getInstance() noexcept { + return nullptr; +} + +int StackTraceElement::valueCompare(const IAbstractVmInstanceSubstance *right) const noexcept { + return 0; +} + +const UnicodeString* StackTraceElement::toString() const noexcept { + return nullptr; +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.h b/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.h new file mode 100644 index 0000000..32a35d2 --- /dev/null +++ b/src_smartcontract_vm/instance/instance_exception_class/StackTraceElement.h @@ -0,0 +1,40 @@ +/* + * StackTraceElement.h + * + * Created on: Dec 6, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_INSTANCE_EXCEPTION_CLASS_STACKTRACEELEMENT_H_ +#define INSTANCE_INSTANCE_EXCEPTION_CLASS_STACKTRACEELEMENT_H_ + +#include "instance/AbstractVmInstance.h" + +namespace alinous { +class MethodDeclare; +class AbstractExpression; +} +using namespace alinous; + +namespace alinous { + +class StackTraceElement : public AbstractVmInstance { +public: + StackTraceElement(uint64_t serial); + virtual ~StackTraceElement(); + + virtual IAbstractVmInstanceSubstance* getInstance() noexcept; + virtual int valueCompare(const IAbstractVmInstanceSubstance* right) const noexcept; + virtual const UnicodeString* toString() const noexcept; + + void setCurrentMethod(MethodDeclare* currentMethod); + void setEntryPoint(AbstractExpression* entryPoint); + +private: + MethodDeclare* currentMethod; + AbstractExpression* entryPoint; +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_INSTANCE_EXCEPTION_CLASS_STACKTRACEELEMENT_H_ */ diff --git a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.cpp b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.cpp index d7479ff..3fa92b0 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.cpp +++ b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.cpp @@ -6,6 +6,7 @@ */ #include "instance/instance_exception_class/VmExceptionInstance.h" +#include "instance/instance_exception_class/StackTraceElement.h" #include "instance/VmInstanceTypesConst.h" @@ -15,17 +16,22 @@ #include "base/UnicodeString.h" +#include "instance/instance_string/VmString.h" + namespace alinous { VmExceptionInstance::VmExceptionInstance(AnalyzedClass* clazz, VirtualMachine* vm) : VmClassInstance(VmInstanceTypesConst::INST_EXCEPTION, clazz, vm) { this->element = nullptr; this->message = nullptr; + this->stacktrace = new(vm) VMemList(vm); } VmExceptionInstance::~VmExceptionInstance() { this->element = nullptr; delete this->message; + + delete this->stacktrace; } void VmExceptionInstance::setCodeElement(const CodeElement* element) noexcept { @@ -36,20 +42,26 @@ const CodeElement* VmExceptionInstance::getElement() const noexcept { return this->element; } -void VmExceptionInstance::setMessage(const UnicodeString* message) noexcept { - this->message = new UnicodeString(message); -} - AbstractExtObject* VmExceptionInstance::toClassExtObject(const UnicodeString* name, VTableRegistory* reg) { ExtExceptionObject* extObj = new ExtExceptionObject(name); extObj->setCodeElement(getElement()); extObj->setClassName(this->clazz->getFullQualifiedName()); + if(this->message != nullptr){ + UnicodeString message(this->message->towString()); + extObj->setMessage(&message); + } + return extObj; } -const UnicodeString* VmExceptionInstance::toString() noexcept { - return this->message; +void VmExceptionInstance::addStacktrace(StackTraceElement *stack) { + this->stacktrace->addElement(stack); +} + +void VmExceptionInstance::setMessage(const UnicodeString *message, VirtualMachine *vm) { + delete this->message; + this->message = new(vm) VmString(vm, message); } } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h index 8d19984..eca02bd 100644 --- a/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h +++ b/src_smartcontract_vm/instance/instance_exception_class/VmExceptionInstance.h @@ -9,9 +9,15 @@ #define INSTANCE_EXCEPTION_CLASS_VMEXCEPTIONINSTANCE_H_ #include "instance/VmClassInstance.h" +#include "instance/IInstanceContainer.h" + +#include "instance/instance_parts/VMemList.h" namespace alinous { +class StackTraceElement; +class VmString; + class VmExceptionInstance : public VmClassInstance { public: VmExceptionInstance(AnalyzedClass* clazz, VirtualMachine* vm); @@ -20,18 +26,20 @@ class VmExceptionInstance : public VmClassInstance { void setCodeElement(const CodeElement* element) noexcept; const CodeElement* getElement() const noexcept; - void setMessage(const UnicodeString* message) noexcept; - const UnicodeString* getMessage() const noexcept { - return this->message; - } - virtual AbstractExtObject* toClassExtObject(const UnicodeString* name, VTableRegistory* reg); - virtual const UnicodeString* toString() noexcept; + void addStacktrace(StackTraceElement* stack); + + void setMessage(const UnicodeString* message, VirtualMachine* vm); + const VmString* getMessage() const noexcept { + return this->message; + } private: const CodeElement* element; - UnicodeString* message; + VmString* message; + + VMemList* stacktrace; }; diff --git a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp index 53bc37a..25dcf2b 100644 --- a/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp +++ b/src_smartcontract_vm/instance/instance_ref/ObjectReference.cpp @@ -20,6 +20,7 @@ #include "ext_binary/ExtStringClass.h" #include "ext_binary/ExtNullPtrObject.h" +#include "engine/sc_analyze/AnalyzedType.h" namespace alinous { @@ -106,9 +107,9 @@ AbstractExtObject* ObjectReference::createNullObject(const UnicodeString* name, // return new ExtStringClass(name); //} - uint8_t type = this->instanceType == ObjectReference::STRING_INSTANCE ? VmInstanceTypesConst::INST_STRING : VmInstanceTypesConst::INST_OBJ; + uint8_t atype = this->instanceType == ObjectReference::STRING_INSTANCE ? AnalyzedType::TYPE_STRING : AnalyzedType::TYPE_OBJECT; - return new ExtNullPtrObject(name); + return new ExtNullPtrObject(name, atype); } bool ObjectReference::isNull() const noexcept { diff --git a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp index 466164d..ec12e90 100644 --- a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp +++ b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.cpp @@ -54,7 +54,7 @@ AbstractReference* RefereceFactory::createReferenceFromDefinition(IAbstractVmIns case CodeElement::TYPE_LONG: ref = PrimitiveReference::createLongReference(vm, 0); break; - case AnalyzedType::TYPE_DOM: + case CodeElement::TYPE_DOM: ref = new(vm) DomRuntimeReference(owner, vm); break; case CodeElement::TYPE_OBJECT: @@ -149,5 +149,4 @@ PrimitiveReference* RefereceFactory::createNumericReference(int64_t value, uint8 return ref; } - } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.h b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.h index d495ca8..c7d932a 100644 --- a/src_smartcontract_vm/instance/instance_ref/RefereceFactory.h +++ b/src_smartcontract_vm/instance/instance_ref/RefereceFactory.h @@ -17,12 +17,14 @@ class MemberVariableDeclare; class VirtualMachine; class AnalyzedType; class IAbstractVmInstanceSubstance; +class AbstractVmInstance; class RefereceFactory { public: static AbstractReference* createReferenceFromDefinition(IAbstractVmInstanceSubstance* owner, MemberVariableDeclare* dec, VirtualMachine* vm); static PrimitiveReference* createNumericReference(int64_t value, uint8_t type, VirtualMachine* vm); static AbstractReference* createReferenceFromAnalyzedType(IAbstractVmInstanceSubstance* owner, const AnalyzedType* atype, VirtualMachine* vm); + private: static AbstractReference* createObjectReferenceFromDefinition(IAbstractVmInstanceSubstance* owner, MemberVariableDeclare* dec, VirtualMachine* vm); static AbstractReference* createArrayReferenceFromAnalyzedType(IAbstractVmInstanceSubstance* owner,const AnalyzedType* atype, VirtualMachine* vm); diff --git a/src_smartcontract_vm/instance/instance_string/VmString.cpp b/src_smartcontract_vm/instance/instance_string/VmString.cpp index 713cd4e..c1c74a8 100644 --- a/src_smartcontract_vm/instance/instance_string/VmString.cpp +++ b/src_smartcontract_vm/instance/instance_string/VmString.cpp @@ -77,5 +77,10 @@ int VmString::ValueCompare::operator ()(const VmString* const a, const VmString* return res; } +int VmString::compareTo(const VmString *other) const noexcept { + static VmString::ValueCompare cmp; + + return cmp(this, other); +} } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/instance_string/VmString.h b/src_smartcontract_vm/instance/instance_string/VmString.h index 13f5de8..de9578d 100644 --- a/src_smartcontract_vm/instance/instance_string/VmString.h +++ b/src_smartcontract_vm/instance/instance_string/VmString.h @@ -27,6 +27,9 @@ class VmString : public VmAllocatee { const wchar_t* towString() const noexcept; int hashCode() const noexcept; + + int compareTo(const VmString* other) const noexcept; + private: VmString* __append(wchar_t ch) noexcept; void __closeString() noexcept; diff --git a/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp b/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp index 9082ef7..be3de8b 100644 --- a/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp +++ b/src_smartcontract_vm/instance/instance_string/VmStringInstance.cpp @@ -21,8 +21,9 @@ namespace alinous { const VmString::ValueCompare VmStringInstance::compareFunctor; + VmStringInstance::VmStringInstance(VirtualMachine* vm, const UnicodeString* str) - : AbstractVmInstance(VmInstanceTypesConst::INST_STRING, vm->publishInstanceSerial()) { + : VmClassInstance(VmInstanceTypesConst::INST_STRING, vm->getStringAnalyzedClass(), vm) { this->value = new(vm) VmString(vm, str); this->str = nullptr; } diff --git a/src_smartcontract_vm/instance/instance_string/VmStringInstance.h b/src_smartcontract_vm/instance/instance_string/VmStringInstance.h index 0a7dbbc..98ea56e 100644 --- a/src_smartcontract_vm/instance/instance_string/VmStringInstance.h +++ b/src_smartcontract_vm/instance/instance_string/VmStringInstance.h @@ -9,7 +9,7 @@ #define INSTANCE_VMSTRINGINSTANCE_H_ #include "instance/IAbstractVmInstanceSubstance.h" -#include "instance/AbstractVmInstance.h" +#include "instance/VmClassInstance.h" #include "instance/instance_string/VmString.h" @@ -17,8 +17,10 @@ namespace alinous { class VirtualMachine; +class StringClassDeclare; +class AnalyzedClass; -class VmStringInstance : public AbstractVmInstance, public IAbstractVmInstanceSubstance { +class VmStringInstance : public VmClassInstance { public: VmStringInstance(const VmStringInstance& inst) = delete; VmStringInstance(VirtualMachine* vm, const UnicodeString* str); @@ -50,6 +52,11 @@ class VmStringInstance : public AbstractVmInstance, public IAbstractVmInstanceSu public: int operator() (const VmStringInstance* const _this, const VmStringInstance* const object) const noexcept; }; + + VmString* getValue() const noexcept { + return this->value; + } + private: VmString* value; static const VmString::ValueCompare compareFunctor; diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp index 39b4757..bb6ad3c 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.cpp @@ -22,6 +22,7 @@ #include "lang/sc_declare/ClassExtends.h" #include "lang/sc_declare/ClassDeclareBlock.h" #include "lang/sc_declare/ClassImplements.h" +#include "lang/sc_declare/ClassName.h" #include "lang/sc_statement/StatementBlock.h" @@ -44,6 +45,12 @@ #include "instance/reserved_classes/object/ObjectClassDeclare.h" +#include "modular_interfaces/ModularProxyListnerClassDeclare.h" + +#include "inter_modular_access/ModularProxyClassDeclare.h" + + +using namespace codablecash; namespace alinous { @@ -69,10 +76,24 @@ ArrayList* AbstractReservedClassDeclare::getMemberVariabl } void AbstractReservedClassDeclare::preAnalyze(AnalyzeContext* actx) { + // Object as Extends + const UnicodeString* packageName = getPackageName(); + if(this->extends == nullptr && + !(packageName != nullptr && packageName->equals(&ObjectClassDeclare::PACKAGE) + && this->name->equals(ObjectClassDeclare::NAME))){ + this->extends = new ClassExtends(); + ClassName* name = new ClassName(); + name->addStr("lang.Object"); + this->extends->setClassName(name); + } if(this->extends != nullptr){ this->extends->setParent(this); this->extends->preAnalyze(actx); } + if(this->implements != nullptr){ + this->implements->setParent(this); + this->implements->preAnalyze(actx); + } int maxLoop = this->methods->size(); for(int i = 0; i != maxLoop; ++i){ @@ -95,6 +116,13 @@ void AbstractReservedClassDeclare::analyzeTypeRef(AnalyzeContext* actx) { if(this->extends != nullptr){ this->extends->analyzeTypeRef(actx); } + if(this->implements != nullptr){ + this->implements->analyzeTypeRef(actx); + } + + if(actx->hasError()){ + return; + } int maxLoop = this->methods->size(); for(int i = 0; i != maxLoop; ++i){ @@ -120,6 +148,16 @@ void AbstractReservedClassDeclare::analyzeTypeRef(AnalyzeContext* actx) { AnalyzedType* cls = this->extends->getAnalyzedType(); dec->setExtends(cls->getAnalyzedClass()); } + + if(this->implements != nullptr){ + const ArrayList* list = this->implements->getAnalyzedTypes(); + + int maxLoop = list->size(); + for(int i = 0; i != maxLoop; ++i){ + AnalyzedType* cls = list->get(i); + dec->addImplements(cls->getAnalyzedClass()); + } + } } void AbstractReservedClassDeclare::analyze(AnalyzeContext* actx) { @@ -138,6 +176,10 @@ void AbstractReservedClassDeclare::analyze(AnalyzeContext* actx) { } } +void AbstractReservedClassDeclare::init(VirtualMachine *vm) { + +} + void AbstractReservedClassDeclare::addDefaultConstructor(const UnicodeString* className) noexcept { MethodDeclare* m = new MethodDeclare(); this->methods->addElement(m); @@ -186,6 +228,12 @@ AbstractReservedClassDeclare* AbstractReservedClassDeclare::createFromBinary(Byt case TYPE_OBJECT: ret = new ObjectClassDeclare(); break; + case TYPE_MODULAR_PROXY: + ret = new ModularProxyClassDeclare(); + break; + case TYPE_MODULAR_PROXY_LISTNER: + ret = new ModularProxyListnerClassDeclare(); + break; default: throw new BinaryFormatException(__FILE__, __LINE__); } diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h index 7dd863c..0b83bb9 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedClassDeclare.h @@ -27,6 +27,7 @@ class AbstractReservedClassDeclare : public ClassDeclare { static constexpr const uint16_t TYPE_OBJECT = 10; static constexpr const uint16_t TYPE_MODULAR_PROXY = 11; + static constexpr const uint16_t TYPE_MODULAR_PROXY_LISTNER = 12; AbstractReservedClassDeclare(); virtual ~AbstractReservedClassDeclare(); @@ -41,6 +42,8 @@ class AbstractReservedClassDeclare : public ClassDeclare { virtual void analyzeTypeRef(AnalyzeContext* actx); virtual void analyze(AnalyzeContext* actx); + virtual void init(VirtualMachine *vm); + virtual ArrayList* getMethods() noexcept; virtual ArrayList* getMemberVariables() noexcept; diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp index 930302b..968c9da 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.cpp @@ -18,10 +18,9 @@ #include "engine/sc_analyze/AnalyzedClass.h" #include "engine/sc_analyze/AnalyzedThisClassStackPopper.h" -#include "vm/VirtualMachine.h" - #include "vm/variable_access/FunctionArguments.h" +#include "vm/VirtualMachine.h" #include "vm/stack/VmStack.h" #include "vm/stack/MethodArgumentSetupper.h" #include "vm/stack/StackPopper.h" @@ -33,6 +32,10 @@ #include "inter_modular_access/ModularProxyMethodDeclare.h" +#include "modular_interfaces/ModuleDetectedMethodDeclare.h" + +#include "instance/reserved_classes_string/StringEqualsMethodDeclare.h" + namespace alinous { AbstractReservedMethodDeclare::AbstractReservedMethodDeclare(uint32_t methodId) : MethodDeclare(RESERVED_METHOD_DECLARE) { @@ -57,6 +60,12 @@ AbstractReservedMethodDeclare* AbstractReservedMethodDeclare::createMethodFromBi case METHOD_LIST_LIST: method = new ListListMethod(); break; + case METHOD_MODULE_PROXY_LISTNER_MODULE_DETECTED: + method = new ModuleDetectedMethodDeclare(); + break; + case METHOD_STRING_EQUALS: + method = new StringEqualsMethodDeclare(); + break; default: return nullptr; } @@ -99,10 +108,13 @@ void AbstractReservedMethodDeclare::preAnalyze(AnalyzeContext *actx) { } void AbstractReservedMethodDeclare::analyzeTypeRef(AnalyzeContext *actx) { + TypeResolver* typeResolver = actx->getTypeResolver(); + this->args->analyzeTypeRef(actx); if(this->type != nullptr){ this->type->analyzeTypeRef(actx); + analyzeReturnedValue(actx, typeResolver); } } diff --git a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h index 7fbf542..dcd6810 100644 --- a/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes/AbstractReservedMethodDeclare.h @@ -19,6 +19,11 @@ class AbstractReservedMethodDeclare : public MethodDeclare { static constexpr const uint32_t METHOD_LIST_LIST = 100; + static constexpr const uint32_t METHOD_MODULE_PROXY_LISTNER_MODULE_DETECTED = 200; + + static constexpr const uint32_t METHOD_STRING_EQUALS = 300; + + explicit AbstractReservedMethodDeclare(uint32_t methodId); virtual ~AbstractReservedMethodDeclare(); diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp index e5c942a..08b9a15 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.cpp @@ -34,6 +34,7 @@ #include "inter_modular_access/InterModuleAccessException.h" +#include "modular_interfaces/ModularProxyListnerClassDeclare.h" using namespace codablecash; namespace alinous { @@ -72,6 +73,10 @@ ReservedClassRegistory::ReservedClassRegistory() { // List Class (Generics) aclass = ListClassDeclare::createAnalyzedClass(); addAnalyzedClass(aclass); + + // ModularProxyListnerClassDeclare + aclass = ModularProxyListnerClassDeclare::createAnalyzedClass(); + addAnalyzedClass(aclass); } AnalyzedClass* ReservedClassRegistory::getAnalyzedClass(const UnicodeString* fqn) const noexcept { @@ -126,4 +131,12 @@ CompilationUnit* ReservedClassRegistory::makeCompilantUnit(const UnicodeString * return unit; } +void ReservedClassRegistory::initCompilantUnits(VirtualMachine *vm) { + int maxLoop = this->unitlist->size(); + for(int i = 0; i != maxLoop; ++i){ + CompilationUnit* unit = this->unitlist->get(i); + unit->init(vm); + } +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h index 1743d4b..3f532b0 100644 --- a/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h +++ b/src_smartcontract_vm/instance/reserved_classes/ReservedClassRegistory.h @@ -11,12 +11,14 @@ #include "base/ArrayList.h" #include "base/HashMap.h" +#include "vm/IInitializeCompilantUnitProvidor.h" + namespace alinous { class AnalyzedClass; class CompilationUnit; class UnicodeString; -class ReservedClassRegistory { +class ReservedClassRegistory : public IInitializeCompilantUnitProvidor { public: ReservedClassRegistory(); virtual ~ReservedClassRegistory(); @@ -27,6 +29,8 @@ class ReservedClassRegistory { CompilationUnit* makeCompilantUnit(const UnicodeString* packageName) noexcept; + virtual void initCompilantUnits(VirtualMachine *vm); + private: void addAnalyzedClass(AnalyzedClass* aclass) noexcept; diff --git a/src_smartcontract_vm/instance/reserved_classes_string/CMakeLists.txt b/src_smartcontract_vm/instance/reserved_classes_string/CMakeLists.txt index 10647dd..7e870c4 100644 --- a/src_smartcontract_vm/instance/reserved_classes_string/CMakeLists.txt +++ b/src_smartcontract_vm/instance/reserved_classes_string/CMakeLists.txt @@ -2,6 +2,7 @@ set(__src StringClassDeclare.cpp + StringEqualsMethodDeclare.cpp ) handle_sub(codablecashlib "${__src}" smartcontract_vm instance/reserved_classes_string) diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp index 9e7c701..a1101a4 100644 --- a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.cpp @@ -6,17 +6,21 @@ */ #include "instance/reserved_classes_string/StringClassDeclare.h" +#include "instance/reserved_classes_string/StringEqualsMethodDeclare.h" #include "base/UnicodeString.h" #include "engine/sc_analyze/AnalyzedClass.h" + namespace alinous { UnicodeString StringClassDeclare::NAME{L"String"}; StringClassDeclare::StringClassDeclare() : AbstractReservedClassDeclare() { this->name = new UnicodeString(&NAME); + + addMethod(new StringEqualsMethodDeclare()); } StringClassDeclare::~StringClassDeclare() { @@ -37,4 +41,11 @@ const UnicodeString* StringClassDeclare::getPackageName() const noexcept { return nullptr; } +AnalyzedClass* StringClassDeclare::getStaticAnalyzedClass() { + static StringClassDeclare classDec; + static AnalyzedClass aclass(&classDec); + + return &aclass; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h index b937f2a..a193681 100644 --- a/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringClassDeclare.h @@ -21,6 +21,8 @@ class StringClassDeclare : public AbstractReservedClassDeclare { static AnalyzedClass* createAnalyzedClass() noexcept; + static AnalyzedClass* getStaticAnalyzedClass(); + StringClassDeclare(); virtual ~StringClassDeclare(); @@ -29,7 +31,6 @@ class StringClassDeclare : public AbstractReservedClassDeclare { } virtual ClassDeclare* getBaseClass() const noexcept; - virtual const UnicodeString* getPackageName() const noexcept; }; diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.cpp b/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.cpp new file mode 100644 index 0000000..69985df --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.cpp @@ -0,0 +1,94 @@ +/* + * StringEqualsMethodDeclare.cpp + * + * Created on: Dec 23, 2025 + * Author: iizuka + */ + +#include "instance/reserved_classes_string/StringEqualsMethodDeclare.h" + +#include "lang/sc_declare/AccessControlDeclare.h" +#include "lang/sc_declare/ArgumentDeclare.h" +#include "lang/sc_declare/ArgumentsListDeclare.h" + +#include "lang/sc_declare_types/StringType.h" +#include "lang/sc_declare_types/BoolType.h" + +#include "base/UnicodeString.h" + +#include "vm/VirtualMachine.h" + +#include "vm/stack/MethodArgumentSetupper.h" +#include "vm/stack/StackPopper.h" + +#include "vm/variable_access/FunctionArguments.h" + +#include "instance/instance_string/VmStringInstance.h" + +#include "instance/instance_exception/NullPointerExceptionClassDeclare.h" +#include "instance/instance_exception/TypeCastExceptionClassDeclare.h" + +#include "instance/instance_ref/PrimitiveReference.h" + +namespace alinous { + +const UnicodeString StringEqualsMethodDeclare::METHOD_NAME(L"equals"); + +StringEqualsMethodDeclare::StringEqualsMethodDeclare() : AbstractReservedMethodDeclare(METHOD_STRING_EQUALS) { + AccessControlDeclare* access = new AccessControlDeclare(); + access->setCtrl(AccessControlDeclare::PUBLIC); + setAccessControl(access); + + setType(new BoolType()); + setName(new UnicodeString(&METHOD_NAME)); + + ArgumentsListDeclare* args = new ArgumentsListDeclare(); + setArguments(args); + + { + ArgumentDeclare* other = new ArgumentDeclare(); + + StringType* type = new StringType(); + other->setType(type); + other->setName(new UnicodeString(L"other")); + + args->addArgument(other); + } +} + +StringEqualsMethodDeclare::~StringEqualsMethodDeclare() { + +} + +void StringEqualsMethodDeclare::interpret(FunctionArguments *args, VirtualMachine *vm) { + MethodArgumentSetupper argSetup(args, vm); + { + // stack + vm->markStackbyMethod(this); + vm->newStack(); + StackPopper stackPopper(vm); + + interpretFunctionArguments(vm); + } + + const ArrayList* list = args->getArguments(); + + VmClassInstance* _this = args->getThisPtr(); + IAbstractVmInstanceSubstance* _other = list->get(0); + NullPointerExceptionClassDeclare::throwException(_other == nullptr, vm, this); + + VmStringInstance* _thisstr = dynamic_cast(_this); + VmStringInstance* other = dynamic_cast(_other); + + TypeCastExceptionClassDeclare::throwException(other == nullptr, vm, this); + + VmString* left = _thisstr->getValue(); + VmString* right = other->getValue(); + + int cmp = left->compareTo(right); + + PrimitiveReference* boolRef = PrimitiveReference::createBoolReference(vm, cmp == 0 ? 1 : 0); + args->setReturnedValue(boolRef); +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.h b/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.h new file mode 100644 index 0000000..e54ca36 --- /dev/null +++ b/src_smartcontract_vm/instance/reserved_classes_string/StringEqualsMethodDeclare.h @@ -0,0 +1,28 @@ +/* + * StringEqualsMethodDeclare.h + * + * Created on: Dec 23, 2025 + * Author: iizuka + */ + +#ifndef INSTANCE_RESERVED_CLASSES_STRING_STRINGEQUALSMETHODDECLARE_H_ +#define INSTANCE_RESERVED_CLASSES_STRING_STRINGEQUALSMETHODDECLARE_H_ + +#include "instance/reserved_classes/AbstractReservedMethodDeclare.h" + + +namespace alinous { + +class StringEqualsMethodDeclare : public AbstractReservedMethodDeclare { +public: + static const UnicodeString METHOD_NAME; + + StringEqualsMethodDeclare(); + virtual ~StringEqualsMethodDeclare(); + + virtual void interpret(FunctionArguments* args, VirtualMachine* vm); +}; + +} /* namespace alinous */ + +#endif /* INSTANCE_RESERVED_CLASSES_STRING_STRINGEQUALSMETHODDECLARE_H_ */ diff --git a/src_smartcontract_vm/vm/CMakeLists.txt b/src_smartcontract_vm/vm/CMakeLists.txt index 2c3f613..c2eb444 100644 --- a/src_smartcontract_vm/vm/CMakeLists.txt +++ b/src_smartcontract_vm/vm/CMakeLists.txt @@ -2,6 +2,7 @@ set(__src exceptions.cpp + IInitializeCompilantUnitProvidor.cpp VirtualMachine.cpp VmSelectPlannerSetter.cpp ) diff --git a/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.cpp b/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.cpp new file mode 100644 index 0000000..9ead532 --- /dev/null +++ b/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.cpp @@ -0,0 +1,20 @@ +/* + * IInitializeCompilantUnitProvidor.cpp + * + * Created on: Dec 8, 2025 + * Author: iizuka + */ + +#include "vm/IInitializeCompilantUnitProvidor.h" + +namespace alinous { + +IInitializeCompilantUnitProvidor::IInitializeCompilantUnitProvidor() { + +} + +IInitializeCompilantUnitProvidor::~IInitializeCompilantUnitProvidor() { + +} + +} /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.h b/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.h new file mode 100644 index 0000000..8c739dc --- /dev/null +++ b/src_smartcontract_vm/vm/IInitializeCompilantUnitProvidor.h @@ -0,0 +1,25 @@ +/* + * IInitializeCompilantUnitProvidor.h + * + * Created on: Dec 8, 2025 + * Author: iizuka + */ + +#ifndef VM_IINITIALIZECOMPILANTUNITPROVIDOR_H_ +#define VM_IINITIALIZECOMPILANTUNITPROVIDOR_H_ + +namespace alinous { + +class VirtualMachine; + +class IInitializeCompilantUnitProvidor { +public: + IInitializeCompilantUnitProvidor(); + virtual ~IInitializeCompilantUnitProvidor(); + + virtual void initCompilantUnits(VirtualMachine *vm) = 0; +}; + +} /* namespace alinous */ + +#endif /* VM_IINITIALIZECOMPILANTUNITPROVIDOR_H_ */ diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index c511991..c97e637 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -18,9 +18,6 @@ #include "instance/instance_ref/AbstractReference.h" #include "instance/instance_ref/ObjectReference.h" -#include "vm/stack/VmStackManager.h" -#include "vm/stack/VmStack.h" - #include "instance/instance_ref/VmRootReference.h" #include "lang/sc_declare/MethodDeclare.h" @@ -31,33 +28,34 @@ #include "engine/sc_analyze_functions/VTableMethodEntry.h" #include "engine/sc_analyze_functions/MethodScore.h" -#include "vm/variable_access/FunctionArguments.h" - #include "engine/sc_analyze/AnalyzedClass.h" #include "engine/sc_analyze/AnalyzeContext.h" #include "engine/sc_analyze/AnalyzedType.h" #include "engine/sc_analyze/ValidationError.h" - -#include "instance/instance_exception_class/VmExceptionInstance.h" +#include "engine/sc_analyze/TypeResolver.h" #include "ext_arguments/AbstractFunctionExtArguments.h" #include "ext_binary/ExtExceptionObject.h" #include "vm/exceptions.h" +#include "vm/IInitializeCompilantUnitProvidor.h" #include "vm/stack/StackPopper.h" +#include "vm/stack/VmStackManager.h" +#include "vm/stack/VmStack.h" #include "vm/vm_ctrl/ExecControlManager.h" #include "vm/vm_ctrl/ExceptionControl.h" -#include "base/Exception.h" +#include "vm/variable_access/FunctionArguments.h" #include "instance/reserved_classes/ReservedClassRegistory.h" +#include "instance/reserved_classes_string/StringClassDeclare.h" #include "instance/instance_exception_class/ExceptionClassDeclare.h" - -#include "base/UnicodeString.h" +#include "instance/instance_exception_class/StackTraceElement.h" +#include "instance/instance_exception_class/VmExceptionInstance.h" #include "engine/CodableDatabase.h" @@ -67,6 +65,11 @@ #include "scan_select/scan_condition/exp_escape/EscapeTargetCondition.h" +#include "base/Exception.h" +#include "base/StackRelease.h" +#include "base/UnicodeString.h" + + namespace alinous { VirtualMachine::VirtualMachine(uint64_t memCapacity) { @@ -125,11 +128,13 @@ void VirtualMachine::loadDatabase(const File* dbdir, const File* undoDir) { this->db->loadDatabase(dbdir, undoDir); } -VmClassInstance* VirtualMachine::createScInstance() { +VmClassInstance* VirtualMachine::createScInstance(ArrayList* exprogs) { VmClassInstance* retInst = nullptr; - initialize(); + + initialize(exprogs); + try{ - retInst = this->sc->createInstance(this); + retInst = this->sc->createInstance(this, exprogs); } catch(Exception* e){ this->exceptions.addElement(e); @@ -237,7 +242,6 @@ MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(const UnicodeStrin VTableMethodEntry* methodEntry = score->getEntry(); MethodDeclare* methodDeclare = methodEntry->getMethod(); - // FIXME FunctionArguments localArguments; for(int i = 0; i != maxLoop; ++i){ IAbstractVmInstanceSubstance* vminst = list->get(i); @@ -252,6 +256,15 @@ MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(const UnicodeStrin methodDeclare->interpret(&localArguments, this); + // FIXME set return value local to arg + { + AbstractVmInstance* returnedValue = localArguments.getReturnedValue(); + if(returnedValue != nullptr){ + IAbstractVmInstanceSubstance* sub = returnedValue->getInstance(); + } + + } + // uncaught exception checkUncaughtException(); @@ -267,11 +280,11 @@ MethodScore* VirtualMachine::calcScore(FunctionScoreCalc *calc, const UnicodeStr return score; } -void VirtualMachine::interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments) { +void VirtualMachine::interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments, ArrayList* exprogs) { ERROR_POINT(L"VirtualMachine::interpret"); CAUSE_ERROR_BY_THROW(L"VirtualMachine::interpret", new Exception(__FILE__, __LINE__)); - initialize(); + initialize(exprogs); FunctionArguments args; args.setThisPtr(_this); @@ -357,7 +370,7 @@ void VirtualMachine::markStackbyMethod(MethodDeclare *method) { } void VirtualMachine::markStackEntryPoint(AbstractExpression *exp) { - this->markStackEntryPoint(exp); + this->stackManager->markStackEntryPoint(exp); } void VirtualMachine::newStack() { @@ -413,12 +426,12 @@ void VirtualMachine::setFunctionArguments(FunctionArguments* args) noexcept { this->argsRegister = args; } -void VirtualMachine::initialize() { +void VirtualMachine::initialize(ArrayList* exprogs) { if(this->initialized){ return; } - this->sc->initialize(this); + this->sc->initialize(this, exprogs); this->initialized = true; } @@ -464,6 +477,23 @@ ExecControlManager* VirtualMachine::getCtrl() const noexcept { void VirtualMachine::throwException(VmExceptionInstance* exception, const CodeElement* element) noexcept { ExecControlManager* ctrl = this->ctrl; + // make stack trace + int maxLoop = this->stackManager->size(); + for(int i = maxLoop - 1; i != -1; --i){ + VmStack* stack = this->stackManager->get(i); + + StackTraceElement* element = new(this) StackTraceElement(publishInstanceSerial()); + + MethodDeclare* currentMethod = stack->getCurrentMethod(); + AbstractExpression* exp = stack->getEntryPoint(); + + if(currentMethod != nullptr){ + element->setCurrentMethod(currentMethod); + element->setEntryPoint(exp); + exception->addStacktrace(element); + } + } + exception->setCodeElement(element); VmRootReference* rootRef = this->sc->getRootReference(); @@ -573,4 +603,17 @@ uint64_t VirtualMachine::publishInstanceSerial() noexcept { return serial; } +AnalyzedClass* VirtualMachine::getStringAnalyzedClass() const noexcept { + if(this->sc == nullptr){ + return StringClassDeclare::getStaticAnalyzedClass(); + } + AnalyzeContext* actx = this->sc->getAnalyzeContext(); + TypeResolver* resolver = actx->getTypeResolver(); + + AnalyzedType* atype = resolver->findBasicType(&StringClassDeclare::NAME); __STP(atype); + AnalyzedClass* clazz = atype->getAnalyzedClass(); + + return clazz; +} + } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/VirtualMachine.h b/src_smartcontract_vm/vm/VirtualMachine.h index 2bd352b..0d600b3 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.h +++ b/src_smartcontract_vm/vm/VirtualMachine.h @@ -54,6 +54,7 @@ class FunctionScoreCalc; class MethodScore; class AnalyzedType; class AbstractExpression; +class IInitializeCompilantUnitProvidor; class VirtualMachine { public: @@ -66,14 +67,14 @@ class VirtualMachine { bool hasAnalyzeError(int code) noexcept; bool hasAnalyzeError(int code, AnalyzeContext* actx) noexcept; - VmClassInstance* createScInstance(); + VmClassInstance* createScInstance(ArrayList* exprogs); MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments); MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments, FunctionArguments* args); MethodDeclare* interpretMainObjectMethodProxy(const UnicodeString* method, FunctionArguments* args); void interpret(const UnicodeString* method); - void interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments); + void interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments, ArrayList* exprogs); void markStackbyMethod(MethodDeclare* method); void markStackEntryPoint(AbstractExpression* exp); @@ -102,7 +103,7 @@ class VirtualMachine { SmartContract* getSmartContract() const noexcept; - void initialize(); + void initialize(ArrayList* exprogs); void destroy() noexcept; ArrayList& getExceptions() noexcept; @@ -147,6 +148,7 @@ class VirtualMachine { void setEscapeTargetCondition(EscapeTargetCondition* cond) noexcept; uint64_t publishInstanceSerial() noexcept; + AnalyzedClass* getStringAnalyzedClass() const noexcept; private: MethodScore* calcScore(FunctionScoreCalc* calc, const UnicodeString *method, ArrayList* typeList); diff --git a/src_smartcontract_vm/vm/stack/VmStack.h b/src_smartcontract_vm/vm/stack/VmStack.h index 321dcaf..27a8c96 100644 --- a/src_smartcontract_vm/vm/stack/VmStack.h +++ b/src_smartcontract_vm/vm/stack/VmStack.h @@ -49,6 +49,12 @@ class VmStack : public AbstractReference, public IInstanceContainer { void setCurrentMethod(MethodDeclare* currentMethod) noexcept; void setEntryPoint(AbstractExpression* entryPoint) noexcept; + MethodDeclare* getCurrentMethod() const noexcept { + return this->currentMethod; + } + AbstractExpression* getEntryPoint() const noexcept { + return this->entryPoint; + } private: VMemList* stack; diff --git a/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.cpp b/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.cpp index e8ababd..64a4841 100644 --- a/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.cpp +++ b/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.cpp @@ -32,20 +32,20 @@ AnalyzedTypeChecker::~AnalyzedTypeChecker() { delete this->right; } -bool AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp) { - return checkCompatibility(actx, leftExp, rightExp, false); +bool AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool downCastOnly) { + return checkCompatibility(actx, leftExp, rightExp, false, downCastOnly); } -bool AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool compare) { +bool AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool compare, bool downCastOnly) { this->left = new LeftType(leftExp); this->left->init(actx); this->right = new RightType(rightExp); this->right->init(actx); - int result = this->left->checkTypeCompatibility(actx, this->right, compare); + int result = this->left->checkTypeCompatibility(actx, this->right, compare, downCastOnly); if(compare && (result == InternalTypeChecker::INCOMPATIBLE || result == InternalTypeChecker::WARN_PRECISION)){ - result = this->right->checkTypeCompatibility(actx, this->left); + result = this->right->checkTypeCompatibility(actx, this->left, downCastOnly); } bool ret = true; @@ -63,8 +63,8 @@ bool AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AbstractExpre return ret; } -int AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AnalyzedType* leftType, AnalyzedType* rightType) { - int result = InternalTypeChecker::analyzeCompatibility(leftType, rightType); +int AnalyzedTypeChecker::checkCompatibility(AnalyzeContext* actx, AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly) { + int result = InternalTypeChecker::analyzeCompatibility(leftType, rightType, downCastOnly); return result; } diff --git a/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.h b/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.h index 2773cb8..6cfce1e 100644 --- a/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.h +++ b/src_smartcontract_vm/vm/type_check/AnalyzedTypeChecker.h @@ -21,10 +21,10 @@ class AnalyzedTypeChecker { AnalyzedTypeChecker(); virtual ~AnalyzedTypeChecker(); - bool checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp); - bool checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool compare); + bool checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool downCastOnly); + bool checkCompatibility(AnalyzeContext* actx, AbstractExpression* leftExp, AbstractExpression* rightExp, bool compare, bool downCastOnly); - int checkCompatibility(AnalyzeContext* actx, AnalyzedType* leftType, AnalyzedType* rightType); + int checkCompatibility(AnalyzeContext* actx, AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly); private: LeftType* left; RightType* right; diff --git a/src_smartcontract_vm/vm/type_check/InternalTypeChecker.cpp b/src_smartcontract_vm/vm/type_check/InternalTypeChecker.cpp index a3c9837..8882826 100644 --- a/src_smartcontract_vm/vm/type_check/InternalTypeChecker.cpp +++ b/src_smartcontract_vm/vm/type_check/InternalTypeChecker.cpp @@ -16,7 +16,7 @@ namespace alinous { -int InternalTypeChecker::analyzeCompatibility(AnalyzedType* leftType, AnalyzedType* rightType) { +int InternalTypeChecker::analyzeCompatibility(AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly) { uint8_t leftTypeCode = leftType->getType(); int dim = leftType->getDim(); @@ -44,7 +44,7 @@ int InternalTypeChecker::analyzeCompatibility(AnalyzedType* leftType, AnalyzedTy retcode = checkString(leftType, rightType); break; case AnalyzedType::TYPE_OBJECT: - retcode = checkObject(leftType, rightType); + retcode = checkObject(leftType, rightType, downCastOnly); break; case AnalyzedType::TYPE_DOM: retcode = checkDomObject(leftType, rightType); @@ -102,7 +102,7 @@ int InternalTypeChecker::checkBool(AnalyzedType* leftType, AnalyzedType* rightTy return INCOMPATIBLE; } -int InternalTypeChecker::checkObject(AnalyzedType* leftType, AnalyzedType* rightType) { +int InternalTypeChecker::checkObject(AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly) { uint8_t rightTypeCode = rightType->getType(); if(rightTypeCode != AnalyzedType::TYPE_OBJECT){ return INCOMPATIBLE; @@ -111,7 +111,8 @@ int InternalTypeChecker::checkObject(AnalyzedType* leftType, AnalyzedType* right AnalyzedClass* leftClass = leftType->getAnalyzedClass(); AnalyzedClass* rightClass = rightType->getAnalyzedClass(); - bool result = rightClass->hasBaseClass(leftClass); + bool result = downCastOnly ? rightClass->hasBaseClass(leftClass) + : leftClass->hasBaseClass(rightClass) || rightClass->hasBaseClass(leftClass); if(!result){ return INCOMPATIBLE; } diff --git a/src_smartcontract_vm/vm/type_check/InternalTypeChecker.h b/src_smartcontract_vm/vm/type_check/InternalTypeChecker.h index c09f825..b6b8764 100644 --- a/src_smartcontract_vm/vm/type_check/InternalTypeChecker.h +++ b/src_smartcontract_vm/vm/type_check/InternalTypeChecker.h @@ -19,7 +19,7 @@ class InternalTypeChecker { static constexpr int WARN_PRECISION{1}; static constexpr int INCOMPATIBLE{2}; - static int analyzeCompatibility(AnalyzedType* leftType, AnalyzedType* rightType); + static int analyzeCompatibility(AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly); private: @@ -27,7 +27,7 @@ class InternalTypeChecker { static int checkDomValue(AnalyzedType* leftType, AnalyzedType* rightType); static int checkDomObject(AnalyzedType* leftType, AnalyzedType* rightType); - static int checkObject(AnalyzedType* leftType, AnalyzedType* rightType); + static int checkObject(AnalyzedType* leftType, AnalyzedType* rightType, bool downCastOnly); static int checkBool(AnalyzedType* leftType, AnalyzedType* rightType); static int checkPrimitive(AnalyzedType* leftType, AnalyzedType* rightType); static int checkString(AnalyzedType* leftType, AnalyzedType* rightType); diff --git a/src_smartcontract_vm/vm/type_check/LeftType.cpp b/src_smartcontract_vm/vm/type_check/LeftType.cpp index 71871a4..e28cf9e 100644 --- a/src_smartcontract_vm/vm/type_check/LeftType.cpp +++ b/src_smartcontract_vm/vm/type_check/LeftType.cpp @@ -25,14 +25,14 @@ LeftType::~LeftType() { } -int LeftType::checkTypeCompatibility(AnalyzeContext* actx, RightType* rightType, bool compare) { +int LeftType::checkTypeCompatibility(AnalyzeContext* actx, RightType* rightType, bool compare, bool downCastOnly) { AnalyzedType* arightType = rightType->getAnalyzedType(); if(!compare && arightType->isNull() && (this->atype->isArray() || (!this->atype->isPrimitiveInteger() && !this->atype->isBool()))){ return InternalTypeChecker::OK; } - return InternalTypeChecker::analyzeCompatibility(this->atype, arightType); + return InternalTypeChecker::analyzeCompatibility(this->atype, arightType, downCastOnly); } } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/type_check/LeftType.h b/src_smartcontract_vm/vm/type_check/LeftType.h index 9a2f9d4..fccc3bb 100644 --- a/src_smartcontract_vm/vm/type_check/LeftType.h +++ b/src_smartcontract_vm/vm/type_check/LeftType.h @@ -20,7 +20,7 @@ class LeftType : public AbstractTypeCheckTarget { explicit LeftType(AbstractExpression* exp); virtual ~LeftType(); - int checkTypeCompatibility(AnalyzeContext* actx, RightType* rightType, bool compare); + int checkTypeCompatibility(AnalyzeContext* actx, RightType* rightType, bool compare, bool downCastOnly); }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/type_check/RightType.cpp b/src_smartcontract_vm/vm/type_check/RightType.cpp index 0610579..5bae23a 100644 --- a/src_smartcontract_vm/vm/type_check/RightType.cpp +++ b/src_smartcontract_vm/vm/type_check/RightType.cpp @@ -23,10 +23,10 @@ RightType::~RightType() { } -int RightType::checkTypeCompatibility(AnalyzeContext* actx, LeftType* leftType) { +int RightType::checkTypeCompatibility(AnalyzeContext* actx, LeftType* leftType, bool downCastOnly) { AnalyzedType* aleftType = leftType->getAnalyzedType(); - return InternalTypeChecker::analyzeCompatibility(this->atype, aleftType); + return InternalTypeChecker::analyzeCompatibility(this->atype, aleftType, downCastOnly); } } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/type_check/RightType.h b/src_smartcontract_vm/vm/type_check/RightType.h index c1bcb75..eb70744 100644 --- a/src_smartcontract_vm/vm/type_check/RightType.h +++ b/src_smartcontract_vm/vm/type_check/RightType.h @@ -19,7 +19,7 @@ class RightType : public AbstractTypeCheckTarget { explicit RightType(AbstractExpression* exp); virtual ~RightType(); - int checkTypeCompatibility(AnalyzeContext* actx, LeftType* leftType); + int checkTypeCompatibility(AnalyzeContext* actx, LeftType* leftType, bool downCastOnly); }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/vm/variable_access/ArrayReferenceAccess.cpp b/src_smartcontract_vm/vm/variable_access/ArrayReferenceAccess.cpp index c437a27..07ba0c2 100644 --- a/src_smartcontract_vm/vm/variable_access/ArrayReferenceAccess.cpp +++ b/src_smartcontract_vm/vm/variable_access/ArrayReferenceAccess.cpp @@ -54,7 +54,7 @@ void ArrayReferenceAccess::analyze(AnalyzeContext* actx, AbstractVariableInstrac dim = previousDim - dim; if(at.getType() == AnalyzedType::TYPE_DOM || at.getType() == AnalyzedType::TYPE_DOM_VALUE){ - analyzeDomArray(actx, lastIinst, element); + analyzeDomArray(actx, lastIinst, element); // identifier or TYPE_DOM_VALUE return; } diff --git a/src_smartcontract_vm/vm/variable_access/MemberFunctionCallAccess.cpp b/src_smartcontract_vm/vm/variable_access/MemberFunctionCallAccess.cpp index 89b856d..f485399 100644 --- a/src_smartcontract_vm/vm/variable_access/MemberFunctionCallAccess.cpp +++ b/src_smartcontract_vm/vm/variable_access/MemberFunctionCallAccess.cpp @@ -51,6 +51,8 @@ AbstractVmInstance* MemberFunctionCallAccess::interpret(VirtualMachine* vm, Abst } AbstractVmInstance* inst = lastInst; + + IAbstractVmInstanceSubstance* substance = inst->getInstance(); VmClassInstance* classInst = dynamic_cast(inst->getInstance()); return this->exp->interpret(vm, classInst); diff --git a/src_smartcontract_vm/vm/variable_access/MemberVariableAccess.cpp b/src_smartcontract_vm/vm/variable_access/MemberVariableAccess.cpp index 0793531..56c883c 100644 --- a/src_smartcontract_vm/vm/variable_access/MemberVariableAccess.cpp +++ b/src_smartcontract_vm/vm/variable_access/MemberVariableAccess.cpp @@ -164,7 +164,7 @@ AbstractVmInstance* MemberVariableAccess::interpretDomType(VirtualMachine* vm, A AnalyzedType at = inst->getRuntimeType(); if(at.getType() == AnalyzedType::TYPE_DOM_ARRAY){ - return interpretDomArrayType(vm, lastInst); + return interpretDomArrayType(vm, lastInst); // domArray.length } DomVariableInstance* dom = dynamic_cast(inst); diff --git a/src_test/smartcontract_db/toolkit/TestDbSchemaBase.cpp b/src_test/smartcontract_db/toolkit/TestDbSchemaBase.cpp index d98b7f1..2affa96 100644 --- a/src_test/smartcontract_db/toolkit/TestDbSchemaBase.cpp +++ b/src_test/smartcontract_db/toolkit/TestDbSchemaBase.cpp @@ -146,7 +146,7 @@ void TestDbSchemaBase::initSmartcontract() { this->vm->analyze(); setMain(L"test.fw", L"SmartContract", L"main"); - this->vm->createScInstance(); + this->vm->createScInstance(nullptr); } void TestDbSchemaBase::setMain(const wchar_t* pkg, const wchar_t* clazz, const wchar_t* method) noexcept { diff --git a/src_test/smartcontract_db/variable/test_dom_base.cpp b/src_test/smartcontract_db/variable/test_dom_base.cpp index 5c2422b..cb130fb 100644 --- a/src_test/smartcontract_db/variable/test_dom_base.cpp +++ b/src_test/smartcontract_db/variable/test_dom_base.cpp @@ -130,7 +130,7 @@ TEST(TestDomBaseGroup, case05){ } TEST(TestDomBaseGroup, case06){ - VirtualMachine* vm = new VirtualMachine(1024 * 10); __STP(vm); + VirtualMachine* vm = new VirtualMachine(1024 * 20); __STP(vm); GcManager* gc = vm->getGc(); { diff --git a/src_test/smartcontract_db/variable/test_vm_hash.cpp b/src_test/smartcontract_db/variable/test_vm_hash.cpp index b8f3f0b..42cbd20 100644 --- a/src_test/smartcontract_db/variable/test_vm_hash.cpp +++ b/src_test/smartcontract_db/variable/test_vm_hash.cpp @@ -77,7 +77,7 @@ TEST(TestVmHashGroup, put02){ } TEST(TestVmHashGroup, put03){ - VirtualMachine* vm = new VirtualMachine(1024 * 10); __STP(vm); + VirtualMachine* vm = new VirtualMachine(1024 * 1024); __STP(vm); UnicodeString strkey(L"key"); UnicodeString strkey2(L"key"); @@ -104,7 +104,7 @@ TEST(TestVmHashGroup, put03){ } TEST(TestVmHashGroup, keySet){ - VirtualMachine* vm = new VirtualMachine(1024 * 1024); __STP(vm); + VirtualMachine* vm = new VirtualMachine(1024 * 1024 * 2); __STP(vm); VMemHashmap* map = new(vm) VMemHashmap(vm); diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns index eb85a1e..0f6496f 100644 --- a/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/exec/src/sample/Sample01.alns @@ -1,8 +1,10 @@ package sample; import sample.ISampleDirect; +import lang.ModularProxyListner; +import modsample.export.IExportMethods; -class Sample01 implements ISampleDirect { +class Sample01 implements ISampleDirect, ModularProxyListner { public Sample01() { this.count = 3 * 2; stcount++; @@ -17,6 +19,21 @@ class Sample01 implements ISampleDirect { return this.count; } + public void moduleDetected(Object module, String ifname){ + // modsample.export.Module01ProxyIExportMethods + boolean bl = ifname.equals("modsample.export.Module01ProxyIExportMethods"); + if(bl){ + connector = (IExportMethods)module; + } + } + + public int callConnector(){ + connector.doubleup(); + return connector.getCount(); + } + private int count = 0; public static int stcount = 10; + + public IExportMethods connector; } diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns index ec4f07a..3d7ae7b 100644 --- a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IDirectAccess.alns @@ -2,5 +2,5 @@ package modsample.export; interface IDirectAccess { - + public void doubleup(); } diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns index 0982b39..74da868 100644 --- a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/IExportMethods.alns @@ -2,5 +2,6 @@ package modsample.export; interface IExportMethods { - + public void doubleup(); + public int getCount(); } diff --git a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns index 6b28532..c7d02b7 100644 --- a/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns +++ b/src_test/smartcontract_modular/instance/resources/case03/project01/modules/mod01/src/Module01.alns @@ -18,6 +18,10 @@ class Module01 implements IExportMethods, IDirectAccess { this.count = value; } + public int getCount() { + return this.count; + } + private int count = 0; private Result res; } diff --git a/src_test/smartcontract_modular/instance/test_inter_module_access.cpp b/src_test/smartcontract_modular/instance/test_inter_module_access.cpp index 62e603b..620dfbb 100644 --- a/src_test/smartcontract_modular/instance/test_inter_module_access.cpp +++ b/src_test/smartcontract_modular/instance/test_inter_module_access.cpp @@ -6,6 +6,33 @@ */ #include "test_utils/t_macros.h" +#include "../utils/ModularProjectUtils.h" + +#include "modular_project/ModularSmartcontractProject.h" +#include "modular_project/SmartcontractProjectId.h" + +#include "smartcontract_executor/ModularSmartcontractExecutor.h" + +#include "modular_project_registory/SmartcontractProjectData.h" + +#include "transaction/SmartcontractInstanceAddress.h" + +#include "smartcontract_cache/InstanceSpaceReleaser.h" + +#include "base/ArrayList.h" + +#include "ext_arguments/AbstractFunctionExtArguments.h" + +#include "smartcontract_executor/SmartcontractExecResult.h" + +#include "smartcontract_cache/InstanceSpace.h" + +#include "ext_binary/AbstractExtObject.h" + + +using namespace codablecash; +using namespace alinous; + TEST_GROUP(TestInterModuleAccessGroup) { TEST_SETUP() { env->setup(); @@ -16,6 +43,46 @@ TEST_GROUP(TestInterModuleAccessGroup) { }; TEST(TestInterModuleAccessGroup, case01){ + const File* projectFolder = this->env->getProjectRoot(); + ModularProjectUtils utils(L"src_test/smartcontract_modular/instance/resources/case03/project01/", projectFolder); + const File* baseDir = utils.getFolder(); + + ModularSmartcontractProject project(baseDir); + project.loadProject(); + + // Executor + File projectTestFolder = this->env->testCaseDir(); + _ST(File, baseTestDir, projectTestFolder.get(L"exec")) + + ModularSmartcontractExecutor executor(baseTestDir); + executor.createExecutor(); + { + executor.open(); + executor.registerModularSmartcontractProject(&project); + + SmartcontractProjectId* projectId = project.getProjectId(); __STP(projectId); + SmartcontractProjectData* data = executor.getProject(projectId); __STP(data); + CHECK(data != nullptr); + + SmartcontractInstanceAddress* address = SmartcontractInstanceAddress::createAddress(0); __STP(address); + executor.createInstance(address, projectId); + { + InstanceSpace* space = executor.loadFromCache(address); + InstanceSpaceReleaser __space(space); + CHECK(space != nullptr); + + ArrayList args; + args.setDeleteOnExit(); + + UnicodeString module(L"exec"); + UnicodeString methodName(L"callConnector"); + + SmartcontractExecResult* result = space->invokeMainObjectMethod(&module, &methodName, &args); __STP(result); + AbstractExtObject* obj = result->getReturnedValue(); + } + + executor.close(); + } } diff --git a/src_test/smartcontract_modular/instance/test_modular_instance.cpp b/src_test/smartcontract_modular/instance/test_modular_instance.cpp index d196e4f..26566e7 100644 --- a/src_test/smartcontract_modular/instance/test_modular_instance.cpp +++ b/src_test/smartcontract_modular/instance/test_modular_instance.cpp @@ -49,7 +49,16 @@ TEST(TestModularInstanceGroup, case01){ bool res = inst->hasCompileError(); CHECK(res == false); - res = inst->analyze(); + res = inst->preAnalyzeGoup(); + CHECK(res == false); + + res = inst->analyzeTypeRefGroup(); + CHECK(res == false); + + res = inst->analyzeMetadataGroup(); + CHECK(res == false); + + res = inst->analyzeGroup(); CHECK(res == false); inst->setMainInstance(); @@ -88,7 +97,10 @@ TEST(TestModularInstanceGroup, case02){ inst->createDatabase(); inst->loadDatabase(); - res = inst->analyze(); + res = inst->preAnalyzeGoup(); + res |= inst->analyzeTypeRefGroup(); + res |= inst->analyzeMetadataGroup(); + res |= inst->analyzeGroup(); CHECK(res == false); inst->setMainInstance(); diff --git a/src_test/smartcontract_vm/VmTestUtils.cpp b/src_test/smartcontract_vm/VmTestUtils.cpp index d26e627..f97a7fa 100644 --- a/src_test/smartcontract_vm/VmTestUtils.cpp +++ b/src_test/smartcontract_vm/VmTestUtils.cpp @@ -87,7 +87,7 @@ bool VmTestUtils::hasAnalyzeError(int errorType) { } bool VmTestUtils::createInstance() { - this->mainInst = vm->createScInstance(); + this->mainInst = vm->createScInstance(nullptr); ArrayList& exceptions = vm->getExceptions(); return !vm->hasError() && exceptions.isEmpty(); diff --git a/src_test/smartcontract_vm/base/test_ext_objects.cpp b/src_test/smartcontract_vm/base/test_ext_objects.cpp index a9d804a..917c1a7 100644 --- a/src_test/smartcontract_vm/base/test_ext_objects.cpp +++ b/src_test/smartcontract_vm/base/test_ext_objects.cpp @@ -31,13 +31,15 @@ TEST_GROUP(TestExtObjects) { }; TEST(TestExtObjects, constructObj){ - UnicodeString name("main"); - ExtClassObject obj(&name); + UnicodeString name(L"main"); + UnicodeString fqn(L"main.ClassA"); + ExtClassObject obj(&name, &fqn); } TEST(TestExtObjects, classobjadd){ UnicodeString name("main"); - ExtClassObject obj(&name); + UnicodeString fqn(L"main.ClassA"); + ExtClassObject obj(&name, &fqn); UnicodeString count("count"); ExtPrimitiveObject* intOnj = ExtPrimitiveObject::createIntObject(&count, 1); @@ -149,7 +151,8 @@ TEST(TestExtObjects, string01){ TEST(TestExtObjects, classObj01){ UnicodeString name(L"name"); - ExtClassObject obj(&name); + UnicodeString fqn(L"main.ClassA"); + ExtClassObject obj(&name, &fqn); UnicodeString exname(L"dummyEx"); ExtExceptionObject* exobj = obj.getExtExceptionObject(&exname); @@ -166,7 +169,7 @@ TEST(TestExtObjects, extExceptionCopy){ TEST(TestExtObjects, nullObj01){ UnicodeString name(L"name"); - ExtNullPtrObject obj(&name); + ExtNullPtrObject obj(&name, 0); ExtNullPtrObject* obj1 = dynamic_cast(obj.copy()); __STP(obj1); CHECK(obj1 != nullptr) diff --git a/src_test/smartcontract_vm/base/test_main_vm.cpp b/src_test/smartcontract_vm/base/test_main_vm.cpp index c7fcfd0..722728f 100644 --- a/src_test/smartcontract_vm/base/test_main_vm.cpp +++ b/src_test/smartcontract_vm/base/test_main_vm.cpp @@ -45,7 +45,7 @@ TEST(TestVMGroup, clearStack){ sc->setMainMethod(nullptr, &mainClass, &mainMethod); vm->analyze(); - vm->createScInstance(); + vm->createScInstance(nullptr); vm->newStack(); vm->clearStack(); @@ -76,7 +76,7 @@ TEST(TestVMGroup, createInstanceErrorException){ vm->analyze(); errmgr->activatePoint(L"VirtualMachine::interpret", L"VirtualMachine::interpret", 1); - vm->createScInstance(); + vm->createScInstance(nullptr); delete vm; } @@ -171,7 +171,7 @@ TEST(TestVMGroup, loadAndInitInstance){ vm->analyze(); - vm->createScInstance(); + vm->createScInstance(nullptr); vm->destroy(); } diff --git a/src_test/smartcontract_vm/exp/test_cast_exp.cpp b/src_test/smartcontract_vm/exp/test_cast_exp.cpp index 40601b0..f9add5c 100644 --- a/src_test/smartcontract_vm/exp/test_cast_exp.cpp +++ b/src_test/smartcontract_vm/exp/test_cast_exp.cpp @@ -41,7 +41,7 @@ TEST(TestCastExpGroup, case01){ CHECK(result) } -TEST(TestCastExpGroup, case02){ +TEST(TestCastExpGroup, case02_err){ const File* projectFolder = this->env->getProjectRoot(); VmTestUtils util(L"src_test/smartcontract_vm/exp/resources/cast/case02/", projectFolder); @@ -55,7 +55,7 @@ TEST(TestCastExpGroup, case02){ CHECK(result) ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); - CHECK(exobj == nullptr) + CHECK(exobj != nullptr) } TEST(TestCastExpGroup, case03){ @@ -164,6 +164,6 @@ TEST(TestCastExpGroup, case10){ CHECK(result) ExtExceptionObject* exobj = util.vm->getUncaughtException(); __STP(exobj); - CHECK(exobj) + CHECK(exobj == nullptr) } diff --git a/src_test/smartcontract_vm/instance/test_exception_inst.cpp b/src_test/smartcontract_vm/instance/test_exception_inst.cpp index 25972ba..37db30e 100644 --- a/src_test/smartcontract_vm/instance/test_exception_inst.cpp +++ b/src_test/smartcontract_vm/instance/test_exception_inst.cpp @@ -14,6 +14,7 @@ #include "base/UnicodeString.h" +#include "instance/instance_string/VmString.h" TEST_GROUP(TestExceptionInsttGroup) { TEST_SETUP(){} TEST_TEARDOWN(){} @@ -30,12 +31,11 @@ TEST(TestExceptionInsttGroup, meg01){ VmExceptionInstance* inst = new(vm) VmExceptionInstance(clazz, vm); __STP(inst); UnicodeString message(L"Hello"); - inst->setMessage(&message); + inst->setMessage(&message, vm); - const UnicodeString* str = inst->getMessage(); - CHECK(str->equals(&message)) + const VmString* vmstr = inst->getMessage(); + UnicodeString* str = new UnicodeString(vmstr->towString()); - str = inst->toString(); - CHECK(str != nullptr) + CHECK(str->equals(&message)) } } diff --git a/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base.alns b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base.alns new file mode 100644 index 0000000..d91fff4 --- /dev/null +++ b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base.alns @@ -0,0 +1,13 @@ + +package test.fw.base; + +import test.fw.base.BaseClass2; + +class BaseClass implements BaseClass2 { + + public void vfunc01(int arg){ + count = arg + 10; + } + + private int count; +} diff --git a/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base2.alns b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base2.alns new file mode 100644 index 0000000..e14be35 --- /dev/null +++ b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/base/base2.alns @@ -0,0 +1,7 @@ + +package test.fw.base; + +interface BaseClass2 { + public void vfunc01(int arg); + +} diff --git a/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/main.alns b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/main.alns new file mode 100644 index 0000000..4b1f951 --- /dev/null +++ b/src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/main.alns @@ -0,0 +1,19 @@ + + +package test.fw; + +import test.fw.base.BaseClass; +import test.fw.base.BaseClass2; + +class SmartContract { + public SmartContract() { + BaseClass2 baseIf = new BaseClass(); + baseIf.vfunc01(10); + } + + public int main(){ + + + } + +} diff --git a/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp b/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp index dd1fe44..d56cd7a 100644 --- a/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp +++ b/src_test/smartcontract_vm/method_invoke/test_call_maininst.cpp @@ -71,7 +71,7 @@ TEST(TestCallMainInstGroup, callMainMethod){ vm->loadSmartContract(sc); vm->analyze(); - VmClassInstance* mainInst = vm->createScInstance(); + VmClassInstance* mainInst = vm->createScInstance(nullptr); { vm->interpret(&mainMethod); diff --git a/src_test/smartcontract_vm/method_invoke/test_virtual_func_call.cpp b/src_test/smartcontract_vm/method_invoke/test_virtual_func_call.cpp index 3d00690..e7f019e 100644 --- a/src_test/smartcontract_vm/method_invoke/test_virtual_func_call.cpp +++ b/src_test/smartcontract_vm/method_invoke/test_virtual_func_call.cpp @@ -62,4 +62,16 @@ TEST(TestVFunctionCallGroup, test02){ CHECK(param = 20); } +TEST(TestVFunctionCallGroup, test03){ + const File* projectFolder = this->env->getProjectRoot(); + VmTestUtils util(L"src_test/smartcontract_vm/method_invoke/resources/vfunc/case03/", projectFolder); + + util.loadAllFiles(); + util.setMain(L"test.fw", L"SmartContract", L"main"); + + bool result = util.analyze(); + CHECK(result) + result = util.createInstance(); + CHECK(result) +} diff --git a/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp b/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp index b221076..a5b8263 100644 --- a/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp +++ b/src_test/smartcontract_vm/reserved_classes/test_string_class.cpp @@ -78,7 +78,7 @@ TEST(TestStringClassGroup, stringInst02){ } TEST(TestStringClassGroup, stringInstcmp01){ - VirtualMachine vm(1024); + VirtualMachine vm(1500); UnicodeString str(L"test"); VmStringInstance* strInst = new(&vm) VmStringInstance(&vm, &str); diff --git a/src_test/smartcontract_vm/variables/test_local_variavle.cpp b/src_test/smartcontract_vm/variables/test_local_variavle.cpp index 2991643..f9d379b 100644 --- a/src_test/smartcontract_vm/variables/test_local_variavle.cpp +++ b/src_test/smartcontract_vm/variables/test_local_variavle.cpp @@ -50,7 +50,7 @@ TEST(TestLocalVariablesGroup, intVariable){ vm->loadSmartContract(sc); vm->analyze(); - vm->createScInstance(); + vm->createScInstance(nullptr); vm->destroy(); } @@ -73,7 +73,7 @@ TEST(TestLocalVariablesGroup, intaccess){ vm->loadSmartContract(sc); vm->analyze(); - VmClassInstance* mainInst = vm->createScInstance(); + VmClassInstance* mainInst = vm->createScInstance(nullptr); { AnalyzeContext* actx = sc->getAnalyzeContext(); @@ -111,7 +111,7 @@ TEST(TestLocalVariablesGroup, intaccessWithMember){ vm->loadSmartContract(sc); vm->analyze(); - VmClassInstance* mainInst = vm->createScInstance(); + VmClassInstance* mainInst = vm->createScInstance(nullptr); { AnalyzeContext* actx = sc->getAnalyzeContext(); diff --git a/src_test/smartcontract_vm/variables/test_string_variables.cpp b/src_test/smartcontract_vm/variables/test_string_variables.cpp index d04a831..da70b70 100644 --- a/src_test/smartcontract_vm/variables/test_string_variables.cpp +++ b/src_test/smartcontract_vm/variables/test_string_variables.cpp @@ -49,7 +49,7 @@ TEST(TestStringVariablesGroup, stringMemberVariable){ vm->loadSmartContract(sc); vm->analyze(); - vm->createScInstance(); + vm->createScInstance(nullptr); vm->destroy(); } diff --git a/src_test/smartcontract_vm/variables/test_type_checker.cpp b/src_test/smartcontract_vm/variables/test_type_checker.cpp index f18519d..dec9040 100644 --- a/src_test/smartcontract_vm/variables/test_type_checker.cpp +++ b/src_test/smartcontract_vm/variables/test_type_checker.cpp @@ -40,7 +40,7 @@ TEST(TestTypeCheckGroup, intnl01){ AnalyzedType left(AnalyzedType::TYPE_INT); AnalyzedType right(AnalyzedType::TYPE_INT); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::OK == ret); } @@ -48,7 +48,7 @@ TEST(TestTypeCheckGroup, intnl02){ AnalyzedType left(AnalyzedType::TYPE_INT); AnalyzedType right; - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::INCOMPATIBLE == ret); } @@ -56,7 +56,7 @@ TEST(TestTypeCheckGroup, intnl03){ AnalyzedType left; AnalyzedType right; - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::NO_CHECK == ret); } @@ -64,7 +64,7 @@ TEST(TestTypeCheckGroup, intnl04){ AnalyzedType left(AnalyzedType::TYPE_BOOL); AnalyzedType right(AnalyzedType::TYPE_BOOL); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::OK == ret); } @@ -72,7 +72,7 @@ TEST(TestTypeCheckGroup, intnl05){ AnalyzedType left(AnalyzedType::TYPE_BOOL); AnalyzedType right(AnalyzedType::TYPE_INT); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::INCOMPATIBLE == ret); } @@ -80,7 +80,7 @@ TEST(TestTypeCheckGroup, intnl06){ AnalyzedType left(AnalyzedType::TYPE_STRING); AnalyzedType right(AnalyzedType::TYPE_STRING); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::OK == ret); } @@ -89,7 +89,7 @@ TEST(TestTypeCheckGroup, intnl07){ AnalyzedType left(AnalyzedType::TYPE_STRING); AnalyzedType right(AnalyzedType::TYPE_INT); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::INCOMPATIBLE == ret); } @@ -99,7 +99,7 @@ TEST(TestTypeCheckGroup, intnlDim){ left.setDim(2); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::INCOMPATIBLE == ret); } @@ -107,7 +107,7 @@ TEST(TestTypeCheckGroup, intnlObject){ AnalyzedType left(AnalyzedType::TYPE_OBJECT); AnalyzedType right(AnalyzedType::TYPE_INT); - int ret = InternalTypeChecker::analyzeCompatibility(&left, &right); + int ret = InternalTypeChecker::analyzeCompatibility(&left, &right, true); CHECK(InternalTypeChecker::INCOMPATIBLE == ret); } diff --git a/src_test/smartcontract_vm/variables/test_variables.cpp b/src_test/smartcontract_vm/variables/test_variables.cpp index bf6b72b..e16efb1 100644 --- a/src_test/smartcontract_vm/variables/test_variables.cpp +++ b/src_test/smartcontract_vm/variables/test_variables.cpp @@ -80,7 +80,7 @@ TEST(TestVmVariableGroup, primitives){ vm->loadSmartContract(sc); vm->analyze(); - vm->createScInstance(); + vm->createScInstance(nullptr); vm->destroy(); } From e9335897fde124c0df5079b32e038deeeaaa6e7d Mon Sep 17 00:00:00 2001 From: iizuka Date: Mon, 12 Jan 2026 15:36:31 +0800 Subject: [PATCH 11/11] Modular Smartcontract Engine --- .../ModularProxyMethodDeclare.cpp | 2 +- .../AbstractExecutableModuleInstance.cpp | 5 +- .../AbstractExecutableModuleInstance.h | 2 +- .../ext_binary/ExtArrayObject.cpp | 57 ++++++++++++++++++- .../ext_binary/ExtArrayObject.h | 8 ++- .../ext_binary/ExtClassObject.cpp | 12 ++-- .../ext_binary/ExtDomArrayObject.cpp | 18 ++++++ .../ext_binary/ExtDomObject.cpp | 18 ++++++ .../ext_binary/ExtExceptionObject.cpp | 32 +++++++++++ .../ext_binary/ExtPrimitiveObject.cpp | 27 +++++++++ .../instance/VmClassInstance.cpp | 7 ++- .../instance/VmClassInstance.h | 1 + .../instance/VmNullprtInstance.cpp | 5 +- .../instance_array/VmArrayInstance.cpp | 12 +++- .../instance_dom/DomRuntimeReference.cpp | 2 +- src_smartcontract_vm/vm/VirtualMachine.cpp | 32 +++++++++-- src_smartcontract_vm/vm/VirtualMachine.h | 2 +- .../resources/newobj/case03/base/base.alns | 8 +++ .../resources/newobj/case03/base/base2.alns | 16 ++++++ .../resources/newobj/case03/base/stinf.alns | 8 +++ .../resources/newobj/case03/main.alns | 22 +++++++ .../variables/test_allocation_if.cpp | 11 ++++ 22 files changed, 284 insertions(+), 23 deletions(-) create mode 100644 src_test/smartcontract_vm/variables/resources/newobj/case03/base/base.alns create mode 100644 src_test/smartcontract_vm/variables/resources/newobj/case03/base/base2.alns create mode 100644 src_test/smartcontract_vm/variables/resources/newobj/case03/base/stinf.alns create mode 100644 src_test/smartcontract_vm/variables/resources/newobj/case03/main.alns diff --git a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp index 69915d8..561b733 100644 --- a/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp +++ b/src_smartcontract_modular/inter_modular_access/ModularProxyMethodDeclare.cpp @@ -81,7 +81,7 @@ void ModularProxyMethodDeclare::doInterpret(FunctionArguments *args, VirtualMach AbstractExecutableModuleInstance* moduleInstance = dctx->getModuleInstance(); - AbstractExtObject* exceptionEx = moduleInstance->invokeMainObjectMethodProxy(this->name, args); __STP(exceptionEx); + AbstractExtObject* exceptionEx = moduleInstance->invokeMainObjectMethodProxy(vm, this->name, args); __STP(exceptionEx); if(exceptionEx != nullptr){ ExtExceptionObject* exExtObject = dynamic_cast(exceptionEx); diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp index 2ab25fc..ff78a23 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.cpp @@ -639,14 +639,13 @@ SmartcontractExecResult* AbstractExecutableModuleInstance::invokeMainObjectMetho } -AbstractExtObject* AbstractExecutableModuleInstance::invokeMainObjectMethodProxy(UnicodeString *methodName, FunctionArguments *args) { +AbstractExtObject* AbstractExecutableModuleInstance::invokeMainObjectMethodProxy(VirtualMachine* callerVm, UnicodeString *methodName, FunctionArguments *args) { AbstractExtObject* ret = nullptr; SmartContract* contract = this->vm->getSmartContract(); AnalyzeContext* actx = contract->getAnalyzeContext(); - MethodDeclare* method = this->vm->interpretMainObjectMethodProxy(methodName, args); - + MethodDeclare* method = this->vm->interpretMainObjectMethodProxy(callerVm, methodName, args); AnalyzedType* atype = method->getReturnedType(); ObjectReference* exObj = this->vm->getUncaughtExceptionProxy(); diff --git a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h index 1e3caf7..4534944 100644 --- a/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h +++ b/src_smartcontract_modular/smartcontract_instance/AbstractExecutableModuleInstance.h @@ -102,7 +102,7 @@ class AbstractExecutableModuleInstance { // invoke method SmartcontractExecResult* invokeMainObjectMethodProxy(UnicodeString *methodName, ArrayList* args); - AbstractExtObject* invokeMainObjectMethodProxy(UnicodeString *methodName, FunctionArguments* args); + AbstractExtObject* invokeMainObjectMethodProxy(VirtualMachine* callerVm, UnicodeString *methodName, FunctionArguments* args); const UnicodeString* getName() const noexcept { return this->name; diff --git a/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp b/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp index c8b03d7..9639b24 100644 --- a/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtArrayObject.cpp @@ -9,16 +9,37 @@ #include "instance/VmInstanceTypesConst.h" +#include "instance/instance_array/VmArrayInstance.h" + #include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "engine/sc_analyze/AnalyzedType.h" +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc_analyze/PackageSpace.h" + +#include "engine/sc/SmartContract.h" + +#include "bc/ExceptionThrower.h" + +#include "vm/exceptions.h" + + +using namespace codablecash; namespace alinous { -ExtArrayObject::ExtArrayObject(const UnicodeString* name, int length) : AbstractExtObject(name, VmInstanceTypesConst::INST_ARRAY) { +ExtArrayObject::ExtArrayObject(const UnicodeString* name, int length, uint8_t atype, int dim, const UnicodeString* fqn) : AbstractExtObject(name, VmInstanceTypesConst::INST_ARRAY) { this->length = length; + this->atype = atype; + this->dim = dim; + this->fqn = fqn != nullptr ? new UnicodeString(fqn) : nullptr; } ExtArrayObject::~ExtArrayObject() { this->array.deleteElements(); + delete this->fqn; } void ExtArrayObject::addInnerElement(AbstractExtObject* obj) noexcept { @@ -34,7 +55,7 @@ AbstractExtObject* ExtArrayObject::get(int i) const noexcept { } AbstractExtObject* ExtArrayObject::copy() const noexcept { - ExtArrayObject* newObj = new ExtArrayObject(getName(), this->length); + ExtArrayObject* newObj = new ExtArrayObject(getName(), this->length, this->atype, this->dim, this->fqn); int maxLoop = this->array.size(); for(int i = 0; i != maxLoop; ++i){ @@ -67,6 +88,38 @@ const UnicodeString* ExtArrayObject::toString() const noexcept { } AbstractVmInstance* ExtArrayObject::toVmInstance(VirtualMachine *vm) { + SmartContract* contract = vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + AnalyzedType* atype = new AnalyzedType(this->atype); __STP(atype); + atype->setDim(this->dim); + + if(this->fqn != nullptr){ + UnicodeString* packageName = TypeResolver::getPackageName(this->fqn); __STP(packageName); + PackageSpace* space = actx->getPackegeSpace(packageName); + ExceptionThrower::throwExceptionIfCondition(space == nullptr, L"The package was not found.", __FILE__, __LINE__); + + UnicodeString* className = TypeResolver::getClassName(this->fqn); __STP(className); + AnalyzedClass* aclass = space->getClass(className); + ExceptionThrower::throwExceptionIfCondition(aclass == nullptr, L"The class was not found.", __FILE__, __LINE__); + + atype->setAnalyzedClass(aclass); + } + + VmArrayInstance* inst = new(vm) VmArrayInstance(vm, this->length, *atype); __STP(inst); + + int maxLoop = this->array.size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractExtObject* exObject = this->array.get(i); + + AbstractVmInstance* vmValue = exObject->toVmInstance(vm); + IAbstractVmInstanceSubstance* substance = vmValue->getInstance(); + + AbstractReference* ref = substance->wrap(inst, vm); + inst->setReference(vm, i, ref); + } + + return __STP_MV(inst); // FIXME toVmInstance } diff --git a/src_smartcontract_vm/ext_binary/ExtArrayObject.h b/src_smartcontract_vm/ext_binary/ExtArrayObject.h index eb4af61..98b84df 100644 --- a/src_smartcontract_vm/ext_binary/ExtArrayObject.h +++ b/src_smartcontract_vm/ext_binary/ExtArrayObject.h @@ -14,10 +14,11 @@ namespace alinous { class AbstractExtObject; +class AnalyzedType; class ExtArrayObject : public AbstractExtObject { public: - ExtArrayObject(const UnicodeString* name, int length); + ExtArrayObject(const UnicodeString* name, int length, uint8_t atype, int dim, const UnicodeString* fqn); virtual ~ExtArrayObject(); void addInnerElement(AbstractExtObject* obj) noexcept; @@ -32,6 +33,11 @@ class ExtArrayObject : public AbstractExtObject { private: ArrayList array; int length; + + uint8_t atype; + int dim; + UnicodeString* fqn; + }; } /* namespace alinous */ diff --git a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp index 643b6c8..7f0d49c 100644 --- a/src_smartcontract_vm/ext_binary/ExtClassObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtClassObject.cpp @@ -34,6 +34,9 @@ #include "instance/IAbstractVmInstanceSubstance.h" +#include "instance/instance_gc/GcManager.h" + + using namespace codablecash; namespace alinous { @@ -151,6 +154,7 @@ const UnicodeString* ExtClassObject::toString() const noexcept { AbstractVmInstance* ExtClassObject::toVmInstance(VirtualMachine *vm) { SmartContract* contract = vm->getSmartContract(); AnalyzeContext* actx = contract->getAnalyzeContext(); + GcManager* gc = vm->getGc(); UnicodeString* packageName = TypeResolver::getPackageName(this->fqn); __STP(packageName); PackageSpace* space = actx->getPackegeSpace(packageName); @@ -166,14 +170,12 @@ AbstractVmInstance* ExtClassObject::toVmInstance(VirtualMachine *vm) { for(int i = 0; i != maxLoop; ++i){ AbstractExtObject* obj = this->list->get(i); - AbstractVmInstance* memberValue = obj->toVmInstance(vm); __STP(memberValue); - const UnicodeString* name = obj->getName(); - - IAbstractVmInstanceSubstance* substance = memberValue->getInstance(); __STP(substance); + AbstractVmInstance* memberValue = obj->toVmInstance(vm); + IAbstractVmInstanceSubstance* substance = memberValue->getInstance(); AbstractReference* ref = substance->wrap(inst, vm); - // FIXME toVmInstance + inst->addMember(gc, ref); } return __STP_MV(inst); diff --git a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp index 4305ec7..8ac44c5 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtDomArrayObject.cpp @@ -9,7 +9,12 @@ #include "instance/VmInstanceTypesConst.h" +#include "instance/instance_dom/DomArrayVariable.h" + #include "base/UnicodeString.h" +#include "base/StackRelease.h" + + namespace alinous { ExtDomArrayObject::ExtDomArrayObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_DOM_ARRAY) { @@ -66,6 +71,19 @@ const UnicodeString* ExtDomArrayObject::toString() const noexcept { } AbstractVmInstance* ExtDomArrayObject::toVmInstance(VirtualMachine *vm) { + DomArrayVariable* vmInstance = new(vm) DomArrayVariable(vm); __STP(vmInstance); + + int maxLoop = this->list->size(); + for(int i = 0; i != maxLoop; ++i){ + AbstractExtObject* obj = this->list->get(i); + + AbstractVmInstance* inst = obj->toVmInstance(vm); + IAbstractVmInstanceSubstance* substance = inst->getInstance(); + + vmInstance->add(vm, substance); + } + + return __STP_MV(vmInstance); // FIXME toVmInstance(VirtualMachine* vm); } diff --git a/src_smartcontract_vm/ext_binary/ExtDomObject.cpp b/src_smartcontract_vm/ext_binary/ExtDomObject.cpp index d49cd27..60892cb 100644 --- a/src_smartcontract_vm/ext_binary/ExtDomObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtDomObject.cpp @@ -10,9 +10,12 @@ #include "instance/VmInstanceTypesConst.h" +#include "instance/instance_dom/DomVariableInstance.h" + #include "base/UnicodeString.h" #include "base/StackRelease.h" + namespace alinous { ExtDomObject::ExtDomObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_DOM) { @@ -87,6 +90,21 @@ const UnicodeString* ExtDomObject::toString() const noexcept { } AbstractVmInstance* ExtDomObject::toVmInstance(VirtualMachine *vm) { + DomVariableInstance* vmInstance = new(vm) DomVariableInstance(vm); __STP(vmInstance); + + Iterator* it = this->properties->keySet()->iterator(); __STP(it); + while(it->hasNext()){ + const UnicodeString* key = it->next(); + AbstractExtObject* exobj = this->properties->get(key); + + AbstractVmInstance* inst = exobj->toVmInstance(vm); + IAbstractVmInstanceSubstance* substance = inst->getInstance(); + + VmStringInstance* vmString = new(vm) VmStringInstance(vm, key); __STP(vmString); + vmInstance->putProperty(vm, vmString, substance); + } + + return __STP_MV(vmInstance); // FIXME toVmInstance } diff --git a/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp b/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp index 8db2843..67d99a4 100644 --- a/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtExceptionObject.cpp @@ -9,9 +9,24 @@ #include "instance/VmInstanceTypesConst.h" +#include "instance/instance_exception_class/VmExceptionInstance.h" + #include "base/UnicodeString.h" +#include "base/StackRelease.h" + +#include "engine/sc/SmartContract.h" + +#include "engine/sc_analyze/AnalyzeContext.h" +#include "engine/sc_analyze/TypeResolver.h" +#include "engine/sc_analyze/PackageSpace.h" + +#include "vm/exceptions.h" + +#include "bc/ExceptionThrower.h" +using namespace codablecash; + namespace alinous { ExtExceptionObject::ExtExceptionObject(const UnicodeString* name) : AbstractExtObject(name, VmInstanceTypesConst::INST_EXCEPTION) { @@ -69,6 +84,23 @@ const UnicodeString* ExtExceptionObject::getMessage() const noexcept { } AbstractVmInstance* ExtExceptionObject::toVmInstance(VirtualMachine *vm) { + SmartContract* contract = vm->getSmartContract(); + AnalyzeContext* actx = contract->getAnalyzeContext(); + + UnicodeString* packageName = TypeResolver::getPackageName(this->className); __STP(packageName); + PackageSpace* space = actx->getPackegeSpace(packageName); + ExceptionThrower::throwExceptionIfCondition(space == nullptr, L"The package was not found.", __FILE__, __LINE__); + + UnicodeString* className = TypeResolver::getClassName(this->className); __STP(className); + AnalyzedClass* aclass = space->getClass(className); + ExceptionThrower::throwExceptionIfCondition(aclass == nullptr, L"The class was not found.", __FILE__, __LINE__); + + VmExceptionInstance* vmInstance = new(vm) VmExceptionInstance(aclass, vm); __STP(vmInstance); + if(this->message != nullptr){ + vmInstance->setMessage(this->message, vm); + } + + return __STP_MV(vmInstance); // FIXME toVmInstance } diff --git a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp index 5a44444..a979dcd 100644 --- a/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp +++ b/src_smartcontract_vm/ext_binary/ExtPrimitiveObject.cpp @@ -13,6 +13,7 @@ #include "base/UnicodeString.h" +#include "instance/instance_ref/PrimitiveReference.h" namespace alinous { ExtPrimitiveObject::ExtPrimitiveObject(const UnicodeString* name, uint8_t type) : AbstractExtObject(name, type) { @@ -134,6 +135,32 @@ const UnicodeString* ExtPrimitiveObject::toString() const noexcept { } AbstractVmInstance* ExtPrimitiveObject::toVmInstance(VirtualMachine *vm) { + PrimitiveReference* ref = nullptr; + + switch(this->type){ + case VmInstanceTypesConst::REF_BOOL: + ref = PrimitiveReference::createBoolReference(vm, (uint8_t)*((int32_t*)this->data)); + break; + case VmInstanceTypesConst::REF_BYTE: + ref = PrimitiveReference::createByteReference(vm, getByteValue()); + break; + case VmInstanceTypesConst::REF_CHAR: + ref = PrimitiveReference::createCharReference(vm, getCharValue()); + break; + case VmInstanceTypesConst::REF_SHORT: + ref = PrimitiveReference::createShortReference(vm, getShortValue()); + break; + case VmInstanceTypesConst::REF_INT: + ref = PrimitiveReference::createIntReference(vm, getIntValue()); + break; + case VmInstanceTypesConst::REF_LONG: + ref = PrimitiveReference::createLongReference(vm, getLongValue()); + break; + default: + break; + } + + return ref; // FIXME toVmInstance } diff --git a/src_smartcontract_vm/instance/VmClassInstance.cpp b/src_smartcontract_vm/instance/VmClassInstance.cpp index ccece8f..f892ab8 100644 --- a/src_smartcontract_vm/instance/VmClassInstance.cpp +++ b/src_smartcontract_vm/instance/VmClassInstance.cpp @@ -166,9 +166,8 @@ void VmClassInstance::init(VirtualMachine* vm) { AbstractReference* ref = RefereceFactory::createReferenceFromDefinition(this, dec, vm); ref->setOwner(this); - this->members.addElement(ref); - gc->registerObject(ref); + addMember(gc, ref); } for(int i = 0; i != maxLoop; ++i){ @@ -177,7 +176,11 @@ void VmClassInstance::init(VirtualMachine* vm) { dec->onAllocate(vm, ref); } +} +void VmClassInstance::addMember(GcManager* gc, AbstractReference *ref) { + this->members.addElement(ref); + gc->registerObject(ref); } const VMemList* VmClassInstance::getReferences() const noexcept { diff --git a/src_smartcontract_vm/instance/VmClassInstance.h b/src_smartcontract_vm/instance/VmClassInstance.h index 00799a6..ce00286 100644 --- a/src_smartcontract_vm/instance/VmClassInstance.h +++ b/src_smartcontract_vm/instance/VmClassInstance.h @@ -29,6 +29,7 @@ class VmClassInstance : public AbstractVmInstance, public IInstanceContainer { static VmClassInstance* createObject(AnalyzedClass* clazz, VirtualMachine* vm); void init(VirtualMachine* vm); + void addMember(GcManager* gc, AbstractReference* ref); virtual IAbstractVmInstanceSubstance* getInstance() noexcept; virtual AbstractReference* wrap(IAbstractVmInstanceSubstance* owner, VirtualMachine* vm); diff --git a/src_smartcontract_vm/instance/VmNullprtInstance.cpp b/src_smartcontract_vm/instance/VmNullprtInstance.cpp index d1e088e..d3a8ba2 100644 --- a/src_smartcontract_vm/instance/VmNullprtInstance.cpp +++ b/src_smartcontract_vm/instance/VmNullprtInstance.cpp @@ -45,7 +45,10 @@ AbstractReference* VmNullprtInstance::wrap(IAbstractVmInstanceSubstance *owner, else if(this->atype == AnalyzedType::TYPE_OBJECT_ARRAY){ ref = new(vm) ArrayReference(owner, vm, nullptr); } - else if(this->atype == AnalyzedType::TYPE_NONE){ + else if(this->atype == AnalyzedType::TYPE_DOM_VALUE || + this->atype == AnalyzedType::TYPE_DOM_ARRAY || + this->atype == AnalyzedType::TYPE_DOM_VALUE_PAIR || + this->atype == AnalyzedType::TYPE_DOM){ ref = new(vm) DomRuntimeReference(owner, vm); } diff --git a/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp b/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp index 3bae6e5..d00f833 100644 --- a/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp +++ b/src_smartcontract_vm/instance/instance_array/VmArrayInstance.cpp @@ -15,9 +15,11 @@ #include "ext_binary/ExtArrayObject.h" #include "engine/sc_analyze/AnalyzedType.h" +#include "engine/sc_analyze/AnalyzedClass.h" #include "base/UnicodeString.h" + namespace alinous { VmArrayInstance::VmArrayInstance(VirtualMachine* vm, int length, const AnalyzedType& atype) : AbstractVmInstance(VmInstanceTypesConst::INST_ARRAY, vm->publishInstanceSerial()) { @@ -69,7 +71,15 @@ const VMemList* VmArrayInstance::getReferences() const noexce } AbstractExtObject* VmArrayInstance::toClassExtObject(const UnicodeString* name, VTableRegistory* reg) { - ExtArrayObject* obj = new ExtArrayObject(name, this->length); + uint8_t atype = this->atype->getType(); + int dim = this->atype->getDim(); + AnalyzedClass* aclazz = this->atype->getAnalyzedClass(); + const UnicodeString* fqn = nullptr; + if(aclazz != nullptr){ + fqn = aclazz->getFullQualifiedName(); + } + + ExtArrayObject* obj = new ExtArrayObject(name, this->length, atype, dim, fqn); int maxLoop = this->array->size(); for(int i = 0; i != maxLoop; ++i){ diff --git a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp index d2ace40..240fc5b 100644 --- a/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp +++ b/src_smartcontract_vm/instance/instance_dom/DomRuntimeReference.cpp @@ -79,7 +79,7 @@ int DomRuntimeReference::valueCompare(const IAbstractVmInstanceSubstance* right) } AbstractExtObject* DomRuntimeReference::toClassExtObject(const UnicodeString* name, VTableRegistory* table) { - return this->reference == nullptr ? new ExtNullPtrObject(name, AnalyzedType::TYPE_NONE) : this->reference->toClassExtObject(name, table); + return this->reference == nullptr ? new ExtNullPtrObject(name, AnalyzedType::TYPE_DOM_VALUE) : this->reference->toClassExtObject(name, table); } const UnicodeString* DomRuntimeReference::toString() const noexcept { diff --git a/src_smartcontract_vm/vm/VirtualMachine.cpp b/src_smartcontract_vm/vm/VirtualMachine.cpp index c97e637..6f0eea5 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.cpp +++ b/src_smartcontract_vm/vm/VirtualMachine.cpp @@ -69,6 +69,7 @@ #include "base/StackRelease.h" #include "base/UnicodeString.h" +#include "instance/instance_gc/StackFloatingVariableHandler.h" namespace alinous { @@ -153,7 +154,15 @@ void VirtualMachine::interpret(const UnicodeString* method) { MethodDeclare* VirtualMachine::interpretMainObjectMethod(const UnicodeString *method, ArrayList *arguments) { FunctionArguments args; - return interpretMainObjectMethod(method, arguments, &args); + + MethodDeclare* methodDec = interpretMainObjectMethod(method, arguments, &args); + + // FIXME floating + StackFloatingVariableHandler floatHandler(this->gc); + AbstractVmInstance* vmInst = args.getReturnedValue(); + floatHandler.registerInstance(vmInst); + + return methodDec; } @@ -211,7 +220,7 @@ MethodDeclare* VirtualMachine::interpretMainObjectMethod(const UnicodeString* me } -MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(const UnicodeString *method, FunctionArguments *args) { +MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(VirtualMachine* callerVm, const UnicodeString *method, FunctionArguments *args) { VmClassInstance* _this = dynamic_cast(this->sc->getRootReference()->getInstance()); AnalyzedClass* aclass = _this->getAnalyzedClass(); @@ -256,13 +265,21 @@ MethodDeclare* VirtualMachine::interpretMainObjectMethodProxy(const UnicodeStrin methodDeclare->interpret(&localArguments, this); - // FIXME set return value local to arg + // set return value local to arg { AbstractVmInstance* returnedValue = localArguments.getReturnedValue(); if(returnedValue != nullptr){ + AnalyzeContext* actx = this->sc->getAnalyzeContext(); + VTableRegistory* vtableReg = actx->getVtableRegistory(); + IAbstractVmInstanceSubstance* sub = returnedValue->getInstance(); - } + UnicodeString ret(L"ret"); + AbstractExtObject* extObject = sub->instToClassExtObject(&ret, vtableReg); __STP(extObject); + + AbstractVmInstance* vmInst = extObject->toVmInstance(callerVm); + args->setReturnedValue(vmInst); + } } // uncaught exception @@ -291,6 +308,13 @@ void VirtualMachine::interpret(MethodDeclare* method, VmClassInstance* _this, Ar method->interpret(&args, this); + AbstractVmInstance* inst = args.getReturnedValue(); + + // FIXME floating + StackFloatingVariableHandler floatHandler(this->gc); + AbstractVmInstance* vmInst = args.getReturnedValue(); + floatHandler.registerInstance(vmInst); + // uncaught exception checkUncaughtException(); } diff --git a/src_smartcontract_vm/vm/VirtualMachine.h b/src_smartcontract_vm/vm/VirtualMachine.h index 0d600b3..7285a24 100644 --- a/src_smartcontract_vm/vm/VirtualMachine.h +++ b/src_smartcontract_vm/vm/VirtualMachine.h @@ -71,7 +71,7 @@ class VirtualMachine { MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments); MethodDeclare* interpretMainObjectMethod(const UnicodeString* method, ArrayList* arguments, FunctionArguments* args); - MethodDeclare* interpretMainObjectMethodProxy(const UnicodeString* method, FunctionArguments* args); + MethodDeclare* interpretMainObjectMethodProxy(VirtualMachine* callerVm, const UnicodeString* method, FunctionArguments* args); void interpret(const UnicodeString* method); void interpret(MethodDeclare* method, VmClassInstance* _this, ArrayList* arguments, ArrayList* exprogs); diff --git a/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base.alns b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base.alns new file mode 100644 index 0000000..cd76b4c --- /dev/null +++ b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base.alns @@ -0,0 +1,8 @@ + +package test.fw.base; + +import test.fw.base.BaseClass2; + +class BaseClass extends BaseClass2 { + +} diff --git a/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base2.alns b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base2.alns new file mode 100644 index 0000000..cf8ff43 --- /dev/null +++ b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/base2.alns @@ -0,0 +1,16 @@ + +package test.fw.base; + +class BaseClass2 implements StInf { + public static int b2s01 = 1; + + public BaseClass2() { + + } + + public int test() { + return this.intvalue; + } + + public int intvalue = 10; +} diff --git a/src_test/smartcontract_vm/variables/resources/newobj/case03/base/stinf.alns b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/stinf.alns new file mode 100644 index 0000000..38c25f2 --- /dev/null +++ b/src_test/smartcontract_vm/variables/resources/newobj/case03/base/stinf.alns @@ -0,0 +1,8 @@ + +package test.fw.base; + +interface StInf { + public static int TYPE_INT = 1; + + public int test(); +} diff --git a/src_test/smartcontract_vm/variables/resources/newobj/case03/main.alns b/src_test/smartcontract_vm/variables/resources/newobj/case03/main.alns new file mode 100644 index 0000000..a7f6f74 --- /dev/null +++ b/src_test/smartcontract_vm/variables/resources/newobj/case03/main.alns @@ -0,0 +1,22 @@ + + +package test.fw; + +import test.fw.base.BaseClass; +import test.fw.base.StInf; + +class SmartContract { + public SmartContract() { + obj = new BaseClass(); + count = obj.test(); + } + + public int main(){ + + } + + private BaseClass obj; + private int count = -1; + +} + diff --git a/src_test/smartcontract_vm/variables/test_allocation_if.cpp b/src_test/smartcontract_vm/variables/test_allocation_if.cpp index 9d230a9..ce69a81 100644 --- a/src_test/smartcontract_vm/variables/test_allocation_if.cpp +++ b/src_test/smartcontract_vm/variables/test_allocation_if.cpp @@ -41,6 +41,17 @@ TEST(TestAllocationIfGroup, case02){ util.loadAllFiles(); util.setMain(L"test.fw", L"SmartContract", L"main"); + bool result = util.analyze(); + CHECK(!result) +} + +TEST(TestAllocationIfGroup, case03){ + const File* projectFolder = this->env->getProjectRoot(); + VmTestUtils util(L"src_test/smartcontract_vm/variables/resources/newobj/case03/", projectFolder); + + util.loadAllFiles(); + util.setMain(L"test.fw", L"SmartContract", L"main"); + bool result = util.analyze(); CHECK(result)