From b122fbda0e3aa643cac50f43926d6d8c5e63fc3d Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Thu, 13 Nov 2025 10:51:20 +0300 Subject: [PATCH 1/4] use helpers to access bound --- include/daScript/ast/ast.h | 26 +-- modules/dasAudio/src/dasAudio.cpp | 7 +- src/ast/ast_aot_cpp.cpp | 4 +- src/ast/ast_infer_type.cpp | 2 +- src/ast/ast_module.cpp | 57 +++---- src/ast/ast_parse.cpp | 58 +++---- src/ast/ast_simulate.cpp | 11 +- src/ast/ast_tls.cpp | 30 +++- src/builtin/module_builtin_ast.cpp | 12 +- src/builtin/module_builtin_ast_adapters.cpp | 158 +++++++++--------- .../module_builtin_ast_annotations.cpp | 2 +- src/builtin/module_builtin_ast_serialize.cpp | 3 +- src/builtin/module_builtin_jobque.cpp | 24 +-- src/builtin/module_builtin_rtti.cpp | 4 +- src/builtin/module_builtin_runtime.cpp | 54 +++--- src/simulate/debug_info.cpp | 2 +- src/simulate/simulate_fn_hash.cpp | 2 +- utils/daScript/main.cpp | 6 +- utils/dasFormatter/fmt.cpp | 6 +- 19 files changed, 250 insertions(+), 218 deletions(-) diff --git a/include/daScript/ast/ast.h b/include/daScript/ast/ast.h index fe6c1e016d..e4fa9674a3 100644 --- a/include/daScript/ast/ast.h +++ b/include/daScript/ast/ast.h @@ -1794,25 +1794,27 @@ namespace das AstSerializer * serializer_write = nullptr; inline static DAS_THREAD_LOCAL(DebugAgentInstance *) g_threadLocalDebugAgent; uint64_t dataWalkerStringLimit = 0; + + static daScriptEnvironment *getBound(); + static void setBound(daScriptEnvironment *bnd); + static daScriptEnvironment *exchangeBound(daScriptEnvironment *bnd); + + static daScriptEnvironment *getOwned(); + static void setOwned(daScriptEnvironment *bnd); + static daScriptEnvironment *exchangeOwned(daScriptEnvironment *bnd); + + static void ensure(); + + /*private:*/ inline static DAS_THREAD_LOCAL(daScriptEnvironment *) bound; inline static DAS_THREAD_LOCAL(daScriptEnvironment *) owned; - static void ensure(); }; struct daScriptEnvironmentGuard { das::daScriptEnvironment *initialBound; das::daScriptEnvironment *initialOwned; - daScriptEnvironmentGuard(das::daScriptEnvironment *bound = nullptr, das::daScriptEnvironment *owned = nullptr) { - initialBound = *das::daScriptEnvironment::bound; - initialOwned = *das::daScriptEnvironment::owned; - *das::daScriptEnvironment::bound = bound; - *das::daScriptEnvironment::owned = owned; - } - - ~daScriptEnvironmentGuard() { - *das::daScriptEnvironment::bound = initialBound; - *das::daScriptEnvironment::owned = initialOwned; - } + daScriptEnvironmentGuard(das::daScriptEnvironment *bound = nullptr, das::daScriptEnvironment *owned = nullptr); + ~daScriptEnvironmentGuard(); }; } diff --git a/modules/dasAudio/src/dasAudio.cpp b/modules/dasAudio/src/dasAudio.cpp index ee1f67b9b5..8de689acaf 100644 --- a/modules/dasAudio/src/dasAudio.cpp +++ b/modules/dasAudio/src/dasAudio.cpp @@ -219,8 +219,7 @@ void data_callback(ma_device*, void* pOutput, const void*, ma_uint32 frameCount) buffer.size = buffer.capacity = frameCount * g_channels; buffer.lock = 1; lock_guard guard(*g_mixer_context->contextMutex); - auto saved = *daScriptEnvironment::bound; - *daScriptEnvironment::bound = g_mixer_env; + auto saved = daScriptEnvironment::exchangeBound(g_mixer_env); g_mixer_context->restart(); g_mixer_context.get()->runWithCatch([&](){ das_invoke_function::invoke(g_mixer_context.get(),nullptr,g_mixer_function,buffer,g_channels,g_rate,fdt); @@ -229,7 +228,7 @@ void data_callback(ma_device*, void* pOutput, const void*, ma_uint32 frameCount) if ( const char* exp = g_mixer_context->getException() ) { g_mixer_context->to_err(&g_mixer_context->exceptionAt, exp); } - *daScriptEnvironment::bound = saved; + daScriptEnvironment::setBound(saved); } Context & dasAudio_mixerContext ( Context * context, LineInfoArg * at ) { @@ -258,7 +257,7 @@ bool dasAudio_init ( TFunc>,int32_t,int32_t,float> } g_mixer_context.reset(get_clone_context(&context,uint32_t(ContextCategory::audio_context))); g_mixer_function = mixer; - g_mixer_env = *daScriptEnvironment::bound; + g_mixer_env = daScriptEnvironment::getBound(); if ( ma_device_start(&g_device) != MA_SUCCESS ) { ma_device_uninit(&g_device); g_mixer_context.reset(); diff --git a/src/ast/ast_aot_cpp.cpp b/src/ast/ast_aot_cpp.cpp index 91fc91ad8e..097302754b 100644 --- a/src/ast/ast_aot_cpp.cpp +++ b/src/ast/ast_aot_cpp.cpp @@ -4218,7 +4218,7 @@ namespace das { return; } Context & context = *pctx; - (*daScriptEnvironment::bound)->g_Program = program; // setting it for the AOT macros + daScriptEnvironment::getBound()->g_Program = program; // setting it for the AOT macros // mark prologue PrologueMarker pmarker; @@ -4291,7 +4291,7 @@ namespace das { saveToFile(logger, outputFile + ".cpp", source_content); } - (*daScriptEnvironment::bound)->g_Program.reset(); + daScriptEnvironment::getBound()->g_Program.reset(); } void Program::aotCpp ( Context & context, TextWriter & logs, bool cross_platform ) { diff --git a/src/ast/ast_infer_type.cpp b/src/ast/ast_infer_type.cpp index 7279f8f5ab..2348a06f97 100644 --- a/src/ast/ast_infer_type.cpp +++ b/src/ast/ast_infer_type.cpp @@ -2272,7 +2272,7 @@ namespace das { if ( fromGeneric ) { ctor->fromGeneric = getOrCreateDummy(var->module); } - bool export_for_aot = !var->cppLayout && (*daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_isInAot); + bool export_for_aot = !var->cppLayout && (daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_isInAot); ctor->exports = alwaysExportInitializer || export_for_aot; extraFunctions.push_back(ctor); reportAstChanged(); diff --git a/src/ast/ast_module.cpp b/src/ast/ast_module.cpp index a1a2de5e01..565bc069eb 100644 --- a/src/ast/ast_module.cpp +++ b/src/ast/ast_module.cpp @@ -103,7 +103,8 @@ namespace das { } intptr_t ann = (intptr_t) (info->annotation_or_name); if ( ann & 1 ) { - DAS_VERIFYF(*daScriptEnvironment::bound && (*daScriptEnvironment::bound)->modules,"missing bound environment"); + auto bound = daScriptEnvironment::getBound(); + DAS_VERIFYF(bound && bound->modules,"missing bound environment"); // we add ~ at the beginning of the name for padding // if name is allocated by the compiler, it does not guarantee that it is aligned // we check if there is a ~ at the beginning of the name, and if it is - we skip it @@ -113,7 +114,7 @@ namespace das { string moduleName, annName; splitTypeName(cvtbuf, moduleName, annName); TypeAnnotation * resolve = nullptr; - for ( auto pm = (*daScriptEnvironment::bound)->modules; pm!=nullptr; pm=pm->next ) { + for ( auto pm = bound->modules; pm!=nullptr; pm=pm->next ) { if ( pm->name == moduleName ) { if ( auto annT = pm->findAnnotation(annName) ) { resolve = (TypeAnnotation *) annT.get(); @@ -121,7 +122,7 @@ namespace das { break; } } - if ( (*daScriptEnvironment::bound)->g_resolve_annotations ) { + if ( bound->g_resolve_annotations ) { info->annotation_or_name = resolve; } return resolve; @@ -140,16 +141,16 @@ namespace das { bool all = false; while ( !all ) { all = true; - for ( auto m = (*daScriptEnvironment::bound)->modules; m ; m = m->next ) { + for ( auto m = daScriptEnvironment::getBound()->modules; m ; m = m->next ) { all &= m->initDependencies(); } } } void Module::CollectFileInfo(das::vector &finfos) { - DAS_ASSERT(*daScriptEnvironment::owned!=nullptr); - DAS_ASSERT(*daScriptEnvironment::bound!=nullptr); - auto m = (*daScriptEnvironment::bound)->modules; + DAS_ASSERT(daScriptEnvironment::getOwned()!=nullptr); + DAS_ASSERT(daScriptEnvironment::getBound()!=nullptr); + auto m = daScriptEnvironment::getBound()->modules; while ( m ) { finfos.emplace_back(das::move(m->ownFileInfo)); m = m->next; @@ -157,13 +158,13 @@ namespace das { } void Module::Shutdown() { - DAS_ASSERT(*daScriptEnvironment::owned!=nullptr); - DAS_ASSERT(*daScriptEnvironment::bound!=nullptr); + DAS_ASSERT(daScriptEnvironment::getOwned()!=nullptr); + DAS_ASSERT(daScriptEnvironment::getBound()!=nullptr); g_envTotal --; if ( g_envTotal==0 ) { shutdownDebugAgent(); } - auto m = (*daScriptEnvironment::bound)->modules; + auto m = daScriptEnvironment::getBound()->modules; while ( m ) { auto pM = m; m = m->next; @@ -171,16 +172,16 @@ namespace das { } clearGlobalAotLibrary(); resetFusionEngine(); - *daScriptEnvironment::bound = nullptr; - if ( *daScriptEnvironment::owned ) { - delete *daScriptEnvironment::owned; - *daScriptEnvironment::owned = nullptr; + daScriptEnvironment::setBound(nullptr); + if ( daScriptEnvironment::getOwned() ) { + delete daScriptEnvironment::getOwned(); + daScriptEnvironment::setOwned(nullptr); } } void Module::Reset(bool debAg) { if ( debAg ) shutdownDebugAgent(); - auto m = (*daScriptEnvironment::bound)->modules; + auto m = daScriptEnvironment::getBound()->modules; while ( m ) { auto pM = m; m = m->next; @@ -189,14 +190,14 @@ namespace das { } void Module::foreach ( const callable & func ) { - for (auto m = (*daScriptEnvironment::bound)->modules; m != nullptr; m = m->next) { + for (auto m = daScriptEnvironment::getBound()->modules; m != nullptr; m = m->next) { if (!func(m)) break; } } Module * Module::require ( const string & name ) { - if ( !*daScriptEnvironment::bound ) return nullptr; - for ( auto m = (*daScriptEnvironment::bound)->modules; m != nullptr; m = m->next ) { + if ( !daScriptEnvironment::getBound() ) return nullptr; + for ( auto m = daScriptEnvironment::getBound()->modules; m != nullptr; m = m->next ) { if ( m->name == name ) { return m; } @@ -205,8 +206,8 @@ namespace das { } Module * Module::requireEx ( const string & name, bool allowPromoted ) { - if ( !*daScriptEnvironment::bound ) return nullptr; - for ( auto m = (*daScriptEnvironment::bound)->modules; m != nullptr; m = m->next ) { + if ( !daScriptEnvironment::getBound() ) return nullptr; + for ( auto m = daScriptEnvironment::getBound()->modules; m != nullptr; m = m->next ) { if ( allowPromoted || !m->promoted ) { if ( m->name == name ) { return m; @@ -227,7 +228,7 @@ namespace das { Type Module::findOption ( const string & name ) { Type optT = Type::none; - for ( auto m = (*daScriptEnvironment::bound)->modules; m != nullptr; m = m->next ) { + for ( auto m = daScriptEnvironment::getBound()->modules; m != nullptr; m = m->next ) { auto tt = m->getOptionType(name); if ( tt != Type::none ) { DAS_ASSERTF(optT==Type::none, "duplicate module option %s", name.c_str()); @@ -240,7 +241,7 @@ namespace das { Module::Module ( const string & n ) { setModuleName(n); if ( !name.empty() ) { - auto first = (*daScriptEnvironment::bound)->modules; + auto first = daScriptEnvironment::getBound()->modules; while (first != nullptr) { if (first->name == n) { @@ -248,8 +249,8 @@ namespace das { } first = first->next; } - next = (*daScriptEnvironment::bound)->modules; - (*daScriptEnvironment::bound)->modules = this; + next = daScriptEnvironment::getBound()->modules; + daScriptEnvironment::getBound()->modules = this; builtIn = true; } if ( n != "$" ) { @@ -263,8 +264,8 @@ namespace das { void Module::promoteToBuiltin(const FileAccessPtr & access) { DAS_ASSERTF(!builtIn, "failed to promote. already builtin"); - next = (*daScriptEnvironment::bound)->modules; - (*daScriptEnvironment::bound)->modules = this; + next = daScriptEnvironment::getBound()->modules; + daScriptEnvironment::getBound()->modules = this; builtIn = true; promoted = true; promotedAccess = access; @@ -272,8 +273,8 @@ namespace das { Module::~Module() { if ( builtIn ) { - Module ** p = &(*daScriptEnvironment::bound)->modules; - for ( auto m = (*daScriptEnvironment::bound)->modules; m != nullptr; p = &m->next, m = m->next ) { + Module ** p = &daScriptEnvironment::getBound()->modules; + for ( auto m = daScriptEnvironment::getBound()->modules; m != nullptr; p = &m->next, m = m->next ) { if ( m == this ) { *p = m->next; return; diff --git a/src/ast/ast_parse.cpp b/src/ast/ast_parse.cpp index 33fec2a1f5..641f3c3e57 100644 --- a/src/ast/ast_parse.cpp +++ b/src/ast/ast_parse.cpp @@ -453,8 +453,8 @@ namespace das { const string & fileName, ModuleGroup & libGroup, TextWriter & logs ) { - auto & serializer_read = (*daScriptEnvironment::bound)->serializer_read; - auto & serializer_write = (*daScriptEnvironment::bound)->serializer_write; + auto & serializer_read = daScriptEnvironment::getBound()->serializer_read; + auto & serializer_write = daScriptEnvironment::getBound()->serializer_write; if ( serializer_read == nullptr || serializer_read->seenNewModule ) { return false; @@ -583,10 +583,10 @@ namespace das { } int err; - (*daScriptEnvironment::bound)->g_Program = program; - (*daScriptEnvironment::bound)->g_compilerLog = &logs; - (*daScriptEnvironment::bound)->g_compilingFileName = fileName.c_str(); - (*daScriptEnvironment::bound)->g_compilingModuleName = moduleName.c_str(); + daScriptEnvironment::getBound()->g_Program = program; + daScriptEnvironment::getBound()->g_compilerLog = &logs; + daScriptEnvironment::getBound()->g_compilingFileName = fileName.c_str(); + daScriptEnvironment::getBound()->g_compilingModuleName = moduleName.c_str(); program->promoteToBuiltin = false; program->isCompiling = true; program->isDependency = isDep; @@ -602,7 +602,7 @@ namespace das { DasParserState parserState; parserState.g_Access = access; parserState.g_Program = program; - parserState.das_def_tab_size = (*daScriptEnvironment::bound)->das_def_tab_size; + parserState.das_def_tab_size = daScriptEnvironment::getBound()->das_def_tab_size; parserState.das_gen2_make_syntax = policies.gen2_make_syntax; yyscan_t scanner = nullptr; int64_t file_mtime = access->getFileMtime(fileName.c_str()); @@ -659,19 +659,19 @@ namespace das { } else { program->error(fileName + " not found", "","",LineInfo()); program->isCompiling = false; - (*daScriptEnvironment::bound)->g_Program.reset(); - (*daScriptEnvironment::bound)->g_compilerLog = nullptr; - (*daScriptEnvironment::bound)->g_compilingFileName = nullptr; - (*daScriptEnvironment::bound)->g_compilingModuleName = nullptr; + daScriptEnvironment::getBound()->g_Program.reset(); + daScriptEnvironment::getBound()->g_compilerLog = nullptr; + daScriptEnvironment::getBound()->g_compilingFileName = nullptr; + daScriptEnvironment::getBound()->g_compilingModuleName = nullptr; return program; } parserState = DasParserState(); *totParse += get_time_usec(time0); if ( err || program->failed() ) { - (*daScriptEnvironment::bound)->g_Program.reset(); - (*daScriptEnvironment::bound)->g_compilerLog = nullptr; - (*daScriptEnvironment::bound)->g_compilingFileName = nullptr; - (*daScriptEnvironment::bound)->g_compilingModuleName = nullptr; + daScriptEnvironment::getBound()->g_Program.reset(); + daScriptEnvironment::getBound()->g_compilerLog = nullptr; + daScriptEnvironment::getBound()->g_compilingFileName = nullptr; + daScriptEnvironment::getBound()->g_compilingModuleName = nullptr; sort(program->errors.begin(),program->errors.end()); program->isCompiling = false; return program; @@ -734,9 +734,9 @@ namespace das { logs << *program; } } - (*daScriptEnvironment::bound)->g_compilerLog = nullptr; - (*daScriptEnvironment::bound)->g_compilingFileName = nullptr; - (*daScriptEnvironment::bound)->g_compilingModuleName = nullptr; + daScriptEnvironment::getBound()->g_compilerLog = nullptr; + daScriptEnvironment::getBound()->g_compilingFileName = nullptr; + daScriptEnvironment::getBound()->g_compilingModuleName = nullptr; sort(program->errors.begin(), program->errors.end()); program->isCompiling = false; if ( !program->failed() ) { @@ -758,13 +758,13 @@ namespace das { *totM += get_time_usec(timeM); } } - (*daScriptEnvironment::bound)->g_Program.reset(); + daScriptEnvironment::getBound()->g_Program.reset(); if ( policies.macro_context_collect ) libGroup.collectMacroContexts(); if ( program->options.getBoolOption("log_compile_time",policies.log_compile_time) ) { auto dt = get_time_usec(time0) / 1000000.; logs << "compiler took " << dt << ", " << fileName << "\n"; } - auto & serializer_write = (*daScriptEnvironment::bound)->serializer_write; + auto & serializer_write = daScriptEnvironment::getBound()->serializer_write; if ( serializer_write != nullptr ) { serializer_write->parsedModules.push_back({fileName, file_mtime, program, program->thisModule.get()}); } @@ -852,7 +852,7 @@ namespace das { } void writebackModules ( ModuleGroup & libGroup ) { - auto & serializer_write = (*daScriptEnvironment::bound)->serializer_write; + auto & serializer_write = daScriptEnvironment::getBound()->serializer_write; for ( auto & parsedModule : serializer_write->parsedModules ) { auto & [fileName, fileMtime, program, thisModule] = parsedModule; // parsedModule is tuple *serializer_write << fileMtime; @@ -999,12 +999,12 @@ namespace das { } void disableSerializationOnDebugger ( vector & req ) { - if ( (*daScriptEnvironment::bound)->serializer_read == nullptr ) + if ( daScriptEnvironment::getBound()->serializer_read == nullptr ) return; for ( auto & mod : req ) { if ( mod.fileName.find("daslib/debug") != string::npos ) { - auto & serializer_read = (*daScriptEnvironment::bound)->serializer_read; - auto & serializer_write = (*daScriptEnvironment::bound)->serializer_read; + auto & serializer_read = daScriptEnvironment::getBound()->serializer_read; + auto & serializer_write = daScriptEnvironment::getBound()->serializer_read; serializer_read = serializer_write = nullptr; break; } @@ -1049,7 +1049,7 @@ namespace das { *totInfer = 0; *totOpt = 0; *totM = 0; - (*daScriptEnvironment::bound)->macroTimeTicks = 0; + daScriptEnvironment::getBound()->macroTimeTicks = 0; vector req; vector missing; vector circular, notAllowed; @@ -1118,12 +1118,12 @@ namespace das { } addNewModules(libGroup, program); } - auto & serializer_read = (*daScriptEnvironment::bound)->serializer_read; + auto & serializer_read = daScriptEnvironment::getBound()->serializer_read; if ( serializer_read && !policies.serialize_main_module ) serializer_read->seenNewModule = true; auto res = parseDaScript(fileName, modName, access, logs, libGroup, exportAll, false, policies); // wirteback all parsed modules from serializer_write - if ( (*daScriptEnvironment::bound)->serializer_write != nullptr - && (!(*daScriptEnvironment::bound)->serializer_read || (*daScriptEnvironment::bound)->serializer_read->failed) ) { + if ( daScriptEnvironment::getBound()->serializer_write != nullptr + && (!daScriptEnvironment::getBound()->serializer_read || daScriptEnvironment::getBound()->serializer_read->failed) ) { writebackModules(libGroup); } policies.threadlock_context |= res->options.getBoolOption("threadlock_context",false); @@ -1179,7 +1179,7 @@ namespace das { << "\tparse " << (*totParse / 1000000.) << "\n" << "\tinfer " << (*totInfer / 1000000.) << "\n" << "\toptimize " << (*totOpt / 1000000.) << "\n" - << "\tmacro " << (ref_time_delta_to_usec((*daScriptEnvironment::bound)->macroTimeTicks) / 1000000.) << "\n" + << "\tmacro " << (ref_time_delta_to_usec(daScriptEnvironment::getBound()->macroTimeTicks) / 1000000.) << "\n" << "\tmacro mods " << (*totM / 1000000.) << "\n" ; } diff --git a/src/ast/ast_simulate.cpp b/src/ast/ast_simulate.cpp index 51669433ac..ede8406b7b 100644 --- a/src/ast/ast_simulate.cpp +++ b/src/ast/ast_simulate.cpp @@ -3524,13 +3524,14 @@ namespace das context.debugger = getDebugger(); isSimulating = false; context.thisHelper = &helper; // note - we may need helper for the 'complete' - auto boundProgram = (*daScriptEnvironment::bound)->g_Program; - (*daScriptEnvironment::bound)->g_Program = this; // node - we are calling macros + auto bound_env = daScriptEnvironment::getBound(); + auto boundProgram = bound_env->g_Program; + bound_env->g_Program = this; // node - we are calling macros library.foreach_in_order([&](Module * pm) -> bool { for ( auto & sm : pm->simulateMacros ) { if ( !sm->preSimulate(this, &context) ) { error("simulate macro " + pm->name + "::" + sm->name + " failed to preSimulate", "", "", LineInfo()); - (*daScriptEnvironment::bound)->g_Program = boundProgram; + bound_env->g_Program = boundProgram; return false; } } @@ -3564,14 +3565,14 @@ namespace das for ( auto & sm : pm->simulateMacros ) { if ( !sm->simulate(this, &context) ) { error("simulate macro " + pm->name + "::" + sm->name + " failed to simulate", "", "", LineInfo()); - (*daScriptEnvironment::bound)->g_Program = boundProgram; + bound_env->g_Program = boundProgram; return false; } } return true; }, thisModule.get()); context.thisHelper = nullptr; - (*daScriptEnvironment::bound)->g_Program = boundProgram; + bound_env->g_Program = boundProgram; // dispatch about new inited context context.announceCreation(); if ( options.getBoolOption("log_debug_mem",false) ) { diff --git a/src/ast/ast_tls.cpp b/src/ast/ast_tls.cpp index 1334a24eb0..7904936387 100644 --- a/src/ast/ast_tls.cpp +++ b/src/ast/ast_tls.cpp @@ -4,6 +4,32 @@ namespace das { + +daScriptEnvironment *daScriptEnvironment::getBound() { return *(daScriptEnvironment::bound); } +daScriptEnvironment *daScriptEnvironment::getOwned() { return *(daScriptEnvironment::owned); } +void daScriptEnvironment::setBound(daScriptEnvironment *bnd) { *daScriptEnvironment::bound = bnd; } +void daScriptEnvironment::setOwned(daScriptEnvironment *own) { *daScriptEnvironment::owned = own; } +daScriptEnvironment *daScriptEnvironment::exchangeBound(daScriptEnvironment *bnd) { + auto prev = *daScriptEnvironment::bound; + *daScriptEnvironment::bound = bnd; + return prev; +} +daScriptEnvironment *daScriptEnvironment::exchangeOwned(daScriptEnvironment *own) { + auto prev = *daScriptEnvironment::owned; + *daScriptEnvironment::owned = own; + return prev; +} + +daScriptEnvironmentGuard::daScriptEnvironmentGuard(das::daScriptEnvironment *bound, das::daScriptEnvironment *owned) { + initialBound = das::daScriptEnvironment::exchangeBound(bound); + initialOwned = das::daScriptEnvironment::exchangeOwned(owned); +} + +daScriptEnvironmentGuard::~daScriptEnvironmentGuard() { + das::daScriptEnvironment::setBound(initialBound); + das::daScriptEnvironment::setOwned(initialOwned); +} + void daScriptEnvironment::ensure() { if ( !*daScriptEnvironment::bound ) { if ( !*daScriptEnvironment::owned ) { @@ -14,8 +40,8 @@ void daScriptEnvironment::ensure() { } uint64_t getCancelLimit() { - if ( !*daScriptEnvironment::bound ) return 0; - return (*daScriptEnvironment::bound)->dataWalkerStringLimit; + if ( !daScriptEnvironment::getBound() ) return 0; + return daScriptEnvironment::getBound()->dataWalkerStringLimit; } } \ No newline at end of file diff --git a/src/builtin/module_builtin_ast.cpp b/src/builtin/module_builtin_ast.cpp index 0f01ffb547..340eaf5e95 100644 --- a/src/builtin/module_builtin_ast.cpp +++ b/src/builtin/module_builtin_ast.cpp @@ -239,13 +239,13 @@ namespace das { } Module * compileModule ( Context * context, LineInfoArg * at ) { - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !program ) context->throw_error_at(at, "compileModule only available during compilation"); return program->thisModule.get(); } smart_ptr_raw compileProgram ( Context * context, LineInfoArg * at ) { - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !program ) context->throw_error_at(at, "compileProgram only available during compilation"); return program; } @@ -540,7 +540,7 @@ namespace das { ExpressionPtr makeCall ( const LineInfo & at, const char * name ) { name = name ? name : ""; - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; return program->makeCall(at, name); } @@ -664,15 +664,15 @@ namespace das { void das_comp_log ( const char * text, Context * context, LineInfoArg * at ) { if ( !text ) return; - if ( !*daScriptEnvironment::bound || !(*daScriptEnvironment::bound)->g_compilerLog ) { + if ( !daScriptEnvironment::getBound() || !(daScriptEnvironment::getBound()->g_compilerLog )) { context->throw_error_at(at, "compiler log is not set. its only available for the macros during compilation"); } - (*(*daScriptEnvironment::bound)->g_compilerLog) << text; + (*(daScriptEnvironment::getBound()->g_compilerLog) << text); } Annotation * get_expression_annotation ( Expression * expr, Context * context, LineInfoArg * at ) { if ( !expr ) return nullptr; - if ( !*daScriptEnvironment::bound ) context->throw_error_at(at, "expecting bound environment"); + if ( !daScriptEnvironment::getBound() ) context->throw_error_at(at, "expecting bound environment"); auto mod = Module::require("ast"); return mod->findAnnotation(expr->__rtti).get(); } diff --git a/src/builtin/module_builtin_ast_adapters.cpp b/src/builtin/module_builtin_ast_adapters.cpp index 68c55a12d2..af05415c23 100644 --- a/src/builtin/module_builtin_ast_adapters.cpp +++ b/src/builtin/module_builtin_ast_adapters.cpp @@ -1,3 +1,4 @@ +#include "daScript/ast/ast.h" #include "daScript/misc/platform.h" #include "module_builtin_rtti.h" @@ -17,17 +18,18 @@ namespace das { void runMacroFunction ( Context * context, const string & message, const callable & subexpr ) { auto timeM = ref_time_ticks(); + auto bound = daScriptEnvironment::getBound(); if ( !context->runWithCatch(subexpr) ) { - DAS_ASSERTF((*daScriptEnvironment::bound)->g_Program, "calling macros while not compiling a program"); - (*daScriptEnvironment::bound)->g_Program->error( + DAS_ASSERTF(bound->g_Program, "calling macros while not compiling a program"); + bound->g_Program->error( "macro caused exception during " + message, context->getException(), "", context->exceptionAt, CompilationError::exception_during_macro ); - (*daScriptEnvironment::bound)->g_Program->macroException = true; + bound->g_Program->macroException = true; } - (*daScriptEnvironment::bound)->macroTimeTicks += ref_time_ticks() - timeM; + bound->macroTimeTicks += ref_time_ticks() - timeM; } VisitorAdapter::VisitorAdapter(char *pClass, const StructInfo *info, Context *ctx) @@ -1714,8 +1716,8 @@ namespace das { if ( auto fnOpen = get_open(classPtr) ) { runMacroFunction(context, "open", [&]() { invoke_open(context,fnOpen,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), cppStyle,info); }); } @@ -1724,8 +1726,8 @@ namespace das { if ( auto fnAccept = get_accept(classPtr) ) { runMacroFunction(context, "accept", [&]() { invoke_accept(context,fnAccept,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), Ch,info); }); } @@ -1734,8 +1736,8 @@ namespace das { if ( auto fnClose = get_close(classPtr) ) { runMacroFunction(context, "close", [&]() { invoke_close(context,fnClose,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1744,8 +1746,8 @@ namespace das { if ( auto fnBeforeStructure = get_beforeStructure(classPtr) ) { runMacroFunction(context, "beforeStructure", [&]() { invoke_beforeStructure(context,fnBeforeStructure,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1754,8 +1756,8 @@ namespace das { if ( auto fnAfterStructure = get_afterStructure(classPtr) ) { runMacroFunction(context, "afterStructure", [&]() { invoke_afterStructure(context,fnAfterStructure,classPtr, - st, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + st, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1765,8 +1767,8 @@ namespace das { if ( auto fnBeforeFunction = get_beforeFunction(classPtr) ) { runMacroFunction(context, "beforeFunction", [&]() { invoke_beforeFunction(context,fnBeforeFunction,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1775,8 +1777,8 @@ namespace das { if ( auto fnAfterFunction = get_afterFunction(classPtr) ) { runMacroFunction(context, "afterFunction", [&]() { invoke_afterFunction(context,fnAfterFunction,classPtr, - fn, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + fn, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1785,8 +1787,8 @@ namespace das { if ( auto fnBeforeStructureFields = get_beforeStructureFields(classPtr) ) { runMacroFunction(context, "beforeStructureFields", [&]() { invoke_beforeStructureFields(context,fnBeforeStructureFields,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1795,8 +1797,8 @@ namespace das { if ( auto fnAfterStructureField = get_afterStructureField(classPtr) ) { runMacroFunction(context, "afterStructureField", [&]() { invoke_afterStructureField(context,fnAfterStructureField,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1805,8 +1807,8 @@ namespace das { if ( auto fnAfterStructureFields = get_afterStructureFields(classPtr) ) { runMacroFunction(context, "afterStructureFields", [&]() { invoke_afterStructureFields(context,fnAfterStructureFields,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1815,8 +1817,8 @@ namespace das { if ( auto fnGlobalVariables = get_beforeGlobalVariables(classPtr) ) { runMacroFunction(context, "beforeGlobalVariables", [&]() { invoke_beforeGlobalVariables(context,fnGlobalVariables,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1825,8 +1827,8 @@ namespace das { if ( auto fnGlobalVariable = get_afterGlobalVariable(classPtr) ) { runMacroFunction(context, "afterGlobalVariable", [&]() { invoke_afterGlobalVariable(context,fnGlobalVariable,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1835,8 +1837,8 @@ namespace das { if ( auto fnGlobalVariables = get_afterGlobalVariables(classPtr) ) { runMacroFunction(context, "afterGlobalVariables", [&]() { invoke_afterGlobalVariables(context,fnGlobalVariables,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1845,8 +1847,8 @@ namespace das { if ( auto fnTuple = get_beforeTuple(classPtr) ) { runMacroFunction(context, "beforeTuple", [&]() { invoke_beforeTuple(context,fnTuple,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1855,8 +1857,8 @@ namespace das { if ( auto fnTuple = get_beforeTupleEntries(classPtr) ) { runMacroFunction(context, "beforeTupleEntries", [&]() { invoke_beforeTupleEntries(context,fnTuple,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1865,8 +1867,8 @@ namespace das { if ( auto fnTuple = get_afterTupleEntry(classPtr) ) { runMacroFunction(context, "afterTupleEntry", [&]() { invoke_afterTupleEntry(context,fnTuple,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1875,8 +1877,8 @@ namespace das { if ( auto fnTuple = get_afterTupleEntries(classPtr) ) { runMacroFunction(context, "afterTupleEntries", [&]() { invoke_afterTupleEntries(context,fnTuple,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1885,8 +1887,8 @@ namespace das { if ( auto fnTuple = get_afterTuple(classPtr) ) { runMacroFunction(context, "afterTuple", [&]() { invoke_afterTuple(context,fnTuple,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1895,8 +1897,8 @@ namespace das { if ( auto fnVariant = get_beforeVariant(classPtr) ) { runMacroFunction(context, "beforeVariant", [&]() { invoke_beforeVariant(context,fnVariant,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1905,8 +1907,8 @@ namespace das { if ( auto fnVariant = get_beforeVariantEntries(classPtr) ) { runMacroFunction(context, "beforeVariantEntries", [&]() { invoke_beforeVariantEntries(context,fnVariant,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1915,8 +1917,8 @@ namespace das { if ( auto fnVariant = get_afterVariantEntry(classPtr) ) { runMacroFunction(context, "afterVariantEntry", [&]() { invoke_afterVariantEntry(context,fnVariant,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1925,8 +1927,8 @@ namespace das { if ( auto fnVariant = get_afterVariantEntries(classPtr) ) { runMacroFunction(context, "afterVariantEntries", [&]() { invoke_afterVariantEntries(context,fnVariant,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1935,8 +1937,8 @@ namespace das { if ( auto fnVariant = get_afterVariant(classPtr) ) { runMacroFunction(context, "afterVariant", [&]() { invoke_afterVariant(context,fnVariant,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1945,8 +1947,8 @@ namespace das { if ( auto fnBitfield = get_beforeBitfield(classPtr) ) { runMacroFunction(context, "beforeBitfield", [&]() { invoke_beforeBitfield(context,fnBitfield,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1955,8 +1957,8 @@ namespace das { if ( auto fnBitfield = get_beforeBitfieldEntries(classPtr) ) { runMacroFunction(context, "beforeBitfieldEntries", [&]() { invoke_beforeBitfieldEntries(context,fnBitfield,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1965,8 +1967,8 @@ namespace das { if ( auto fnBitfield = get_afterBitfieldEntry(classPtr) ) { runMacroFunction(context, "afterBitfieldEntry", [&]() { invoke_afterBitfieldEntry(context,fnBitfield,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1975,8 +1977,8 @@ namespace das { if ( auto fnBitfield = get_afterBitfieldEntries(classPtr) ) { runMacroFunction(context, "afterBitfieldEntries", [&]() { invoke_afterBitfieldEntries(context,fnBitfield,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1985,8 +1987,8 @@ namespace das { if ( auto fnBitfield = get_afterBitfield(classPtr) ) { runMacroFunction(context, "afterBitfield", [&]() { invoke_afterBitfield(context,fnBitfield,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -1995,8 +1997,8 @@ namespace das { if ( auto fnEnum = get_beforeEnumeration(classPtr) ) { runMacroFunction(context, "beforeEnumeration", [&]() { invoke_beforeEnumeration(context,fnEnum,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2005,8 +2007,8 @@ namespace das { if ( auto fnEnum = get_beforeEnumerationEntries(classPtr) ) { runMacroFunction(context, "beforeEnumerationEntries", [&]() { invoke_beforeEnumerationEntries(context,fnEnum,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2015,8 +2017,8 @@ namespace das { if ( auto fnEnum = get_afterEnumerationEntry(classPtr) ) { runMacroFunction(context, "afterEnumerationEntry", [&]() { invoke_afterEnumerationEntry(context,fnEnum,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2025,8 +2027,8 @@ namespace das { if ( auto fnEnum = get_afterEnumerationEntries(classPtr) ) { runMacroFunction(context, "afterEnumerationEntries", [&]() { invoke_afterEnumerationEntries(context,fnEnum,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2035,8 +2037,8 @@ namespace das { if ( auto fnEnum = get_afterEnumeration(classPtr) ) { runMacroFunction(context, "afterEnumeration", [&]() { invoke_afterEnumeration(context,fnEnum,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2045,8 +2047,8 @@ namespace das { if ( auto fnAlias = get_beforeAlias(classPtr) ) { runMacroFunction(context, "beforeAlias", [&]() { invoke_beforeAlias(context,fnAlias,classPtr, - (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2055,8 +2057,8 @@ namespace das { if ( auto fnAlias = get_afterAlias(classPtr) ) { runMacroFunction(context, "afterAlias", [&]() { invoke_afterAlias(context,fnAlias,classPtr, - (char *) name, (*daScriptEnvironment::bound)->g_Program, - (*daScriptEnvironment::bound)->g_Program->thisModule.get(), + (char *) name, daScriptEnvironment::getBound()->g_Program, + daScriptEnvironment::getBound()->g_Program->thisModule.get(), info); }); } @@ -2202,7 +2204,7 @@ namespace das { newM->module = module; return ecm; }) ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { // If it happened during compilation => fail. // Otherwise we just adding same macro at runtime (e.g. due to aot). context->throw_error_at(at, "can't add call macro %s to module %s", newM->name.c_str(), module->name.c_str()); @@ -2402,7 +2404,7 @@ namespace das { ann->annotation->name.c_str(), func->name.c_str()); } auto fAnn = (FunctionAnnotation*)ann->annotation.get(); - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !fAnn->apply(func, *program->thisModuleGroup, ann->arguments, err) ) { context->throw_error_at(at, "annotation %s failed to apply to function %s", ann->annotation->name.c_str(), func->name.c_str()); @@ -2417,7 +2419,7 @@ namespace das { ann->annotation->name.c_str(), blk->at.describe().c_str()); } auto fAnn = (FunctionAnnotation*)ann->annotation.get(); - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !fAnn->apply(blk.ptr, *program->thisModuleGroup, ann->arguments, err) ) { context->throw_error_at(at, "annotation %s failed to apply to block %s", ann->annotation->name.c_str(), blk->at.describe().c_str()); @@ -2432,7 +2434,7 @@ namespace das { ann->annotation->name.c_str(), st->name.c_str()); } auto stAnn = (StructureAnnotation*)ann->annotation.get(); - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !stAnn->touch(st, *program->thisModuleGroup, ann->arguments, err) ) { context->throw_error_at(at, "annotation %s failed to apply to struct %s", ann->annotation->name.c_str(), st->name.c_str()); diff --git a/src/builtin/module_builtin_ast_annotations.cpp b/src/builtin/module_builtin_ast_annotations.cpp index 23b63cc653..b53ea516d1 100644 --- a/src/builtin/module_builtin_ast_annotations.cpp +++ b/src/builtin/module_builtin_ast_annotations.cpp @@ -236,7 +236,7 @@ namespace das { } virtual SimNode * simluate ( Context * context, const ExpressionPtr & expr, string & error ) override { - if ( !context->thisProgram->isCompilingMacros && !context->thisProgram->folding && !(*daScriptEnvironment::bound)->g_isInAot ) { + if ( !context->thisProgram->isCompilingMacros && !context->thisProgram->folding && !daScriptEnvironment::getBound()->g_isInAot ) { if ( !context->thisProgram->options.getBoolOption("rtti",context->thisProgram->policies.rtti) ) { error = "ast_typedecl requires `options rtti` or rtti to be enabled in policies"; return nullptr; diff --git a/src/builtin/module_builtin_ast_serialize.cpp b/src/builtin/module_builtin_ast_serialize.cpp index c96908f0c1..5767c9db73 100644 --- a/src/builtin/module_builtin_ast_serialize.cpp +++ b/src/builtin/module_builtin_ast_serialize.cpp @@ -7,6 +7,7 @@ #include "daScript/ast/ast.h" #include #include +#include namespace das { @@ -1787,7 +1788,7 @@ namespace das { return true; },"*"); // always finalize annotations - (*daScriptEnvironment::bound)->g_Program = program; + daScriptEnvironment::getBound()->g_Program = program; program->finalizeAnnotations(); if ( is_macro_module ) { diff --git a/src/builtin/module_builtin_jobque.cpp b/src/builtin/module_builtin_jobque.cpp index 8e0d2743a3..8ac2f116e6 100644 --- a/src/builtin/module_builtin_jobque.cpp +++ b/src/builtin/module_builtin_jobque.cpp @@ -234,8 +234,8 @@ namespace das { return TypeDecl::gcFlag_heap | TypeDecl::gcFlag_stringHeap; } virtual void walk(DataWalker & walker, void * data) override { - bool gResolve = (*daScriptEnvironment::bound)->g_resolve_annotations; - (*daScriptEnvironment::bound)->g_resolve_annotations = false; + bool gResolve = daScriptEnvironment::getBound()->g_resolve_annotations; + daScriptEnvironment::getBound()->g_resolve_annotations = false; BasicStructureAnnotation::walk(walker, data); Channel * ch = (Channel *) data; if ( !ch->isValid() ) { @@ -245,7 +245,7 @@ namespace das { walker.walk((char *)&data, ti); }); } - (*daScriptEnvironment::bound)->g_resolve_annotations = gResolve; + daScriptEnvironment::getBound()->g_resolve_annotations = gResolve; } }; @@ -304,8 +304,8 @@ namespace das { return TypeDecl::gcFlag_heap | TypeDecl::gcFlag_stringHeap; } virtual void walk(DataWalker & walker, void * data) override { - bool gResolve = (*daScriptEnvironment::bound)->g_resolve_annotations; - (*daScriptEnvironment::bound)->g_resolve_annotations = false; + bool gResolve = daScriptEnvironment::getBound()->g_resolve_annotations; + daScriptEnvironment::getBound()->g_resolve_annotations = false; BasicStructureAnnotation::walk(walker, data); LockBox * ch = (LockBox *) data; if ( !ch->isValid() ) { @@ -315,7 +315,7 @@ namespace das { walker.walk((char *)&data, ti); }); } - (*daScriptEnvironment::bound)->g_resolve_annotations = gResolve; + daScriptEnvironment::getBound()->g_resolve_annotations = gResolve; } }; @@ -355,9 +355,9 @@ namespace das { ptr += 16; das_invoke_function::invoke(forkContext.get(), lineinfo, fn, ptr, lambda.capture); das_delete::clear(context, lambda); - auto bound = *daScriptEnvironment::bound; + auto bound = daScriptEnvironment::getBound(); g_jobQue->push([=]() mutable { - *daScriptEnvironment::bound = bound; + daScriptEnvironment::setBound(bound); Lambda flambda(ptr); das_invoke_lambda::invoke(forkContext.get(), lineinfo, flambda); das_delete::clear(forkContext.get(), flambda); @@ -382,9 +382,9 @@ namespace das { das_invoke_function::invoke(forkContext.get(), lineinfo, fn, ptr, lambda.capture); das_delete::clear(context, lambda); g_jobQueTotalThreads ++; - auto bound = *daScriptEnvironment::bound; + auto bound = daScriptEnvironment::getBound(); thread([=]() mutable { - *daScriptEnvironment::bound = bound; + daScriptEnvironment::setBound(bound); Lambda flambda(ptr); das_invoke_lambda::invoke(forkContext.get(), lineinfo, flambda); das_delete::clear(forkContext.get(), flambda); @@ -413,9 +413,9 @@ namespace das { debugger_started.store(true); shared_ptr forkContext; forkContext.reset(get_clone_context(context, uint32_t(ContextCategory::thread_clone))); - auto bound = *daScriptEnvironment::bound; + auto bound = daScriptEnvironment::getBound(); thread([=]() mutable { - *daScriptEnvironment::bound = bound; + daScriptEnvironment::setBound(bound); das_invoke::invoke(forkContext.get(), lineinfo, lambda); forkContext.reset(); stop_debugger(); diff --git a/src/builtin/module_builtin_rtti.cpp b/src/builtin/module_builtin_rtti.cpp index 6737adb8e5..afde817c9f 100644 --- a/src/builtin/module_builtin_rtti.cpp +++ b/src/builtin/module_builtin_rtti.cpp @@ -1158,9 +1158,9 @@ namespace das { cast>::from(program), cast::from(&istr) }; - (*daScriptEnvironment::bound)->g_Program = program; + daScriptEnvironment::getBound()->g_Program = program; context->invoke(block, args, nullptr, at); - (*daScriptEnvironment::bound)->g_Program.reset(); + daScriptEnvironment::getBound()->g_Program.reset(); } } else { context->throw_error_at(at, "rtti_compile internal error, something went wrong"); diff --git a/src/builtin/module_builtin_runtime.cpp b/src/builtin/module_builtin_runtime.cpp index da665b27ed..14343f6b91 100644 --- a/src/builtin/module_builtin_runtime.cpp +++ b/src/builtin/module_builtin_runtime.cpp @@ -63,7 +63,7 @@ namespace das MacroFunctionAnnotation() : MarkFunctionAnnotation("_macro") { } virtual bool apply(const FunctionPtr & func, ModuleGroup &, const AnnotationArgumentList &, string &) override { func->macroInit = true; - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; program->needMacroModule = true; return true; }; @@ -109,10 +109,10 @@ namespace das }; virtual bool verifyCall ( ExprCallFunc * call, const AnnotationArgumentList & args, const AnnotationArgumentList & /*progArgs */, string & /*err*/ ) override { - DAS_ASSERT((*daScriptEnvironment::bound)->g_compilerLog); - (*(*daScriptEnvironment::bound)->g_compilerLog) << call->at.describe() << ": *warning* function " << call->func->name << " is deprecated\n"; + DAS_ASSERT(daScriptEnvironment::getBound()->g_compilerLog); + (*daScriptEnvironment::getBound()->g_compilerLog) << call->at.describe() << ": *warning* function " << call->func->name << " is deprecated\n"; if ( auto arg = args.find("message",Type::tString) ) { - (*(*daScriptEnvironment::bound)->g_compilerLog) << "\t" << arg->sValue << "\n"; + (*daScriptEnvironment::getBound()->g_compilerLog) << "\t" << arg->sValue << "\n"; } return true; } @@ -121,7 +121,7 @@ namespace das struct TypeFunctionFunctionAnnotation : MarkFunctionAnnotation { TypeFunctionFunctionAnnotation() : MarkFunctionAnnotation("type_function") { } virtual bool apply(const FunctionPtr & func, ModuleGroup &, const AnnotationArgumentList &, string & error) override { - if ( !(*daScriptEnvironment::bound)->g_Program->thisModule->addTypeFunction(func->name, true) ) { + if ( !daScriptEnvironment::getBound()->g_Program->thisModule->addTypeFunction(func->name, true) ) { error = "can't add type function. type function " + func->name + " already exists?"; return false; } @@ -1251,24 +1251,24 @@ namespace das }; bool is_compiling ( ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - return (*daScriptEnvironment::bound)->g_Program->isCompiling || (*daScriptEnvironment::bound)->g_Program->isSimulating; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + return daScriptEnvironment::getBound()->g_Program->isCompiling || daScriptEnvironment::getBound()->g_Program->isSimulating; } return false; } bool is_compiling_macros ( ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - return (*daScriptEnvironment::bound)->g_Program->isCompilingMacros; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + return daScriptEnvironment::getBound()->g_Program->isCompilingMacros; } return false; } bool is_compiling_macros_in_module ( char * name ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - if ( !(*daScriptEnvironment::bound)->g_Program->isCompilingMacros ) return false; - if ( (*daScriptEnvironment::bound)->g_Program->thisModule->name != to_rts(name) ) return false; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + if ( !daScriptEnvironment::getBound()->g_Program->isCompilingMacros ) return false; + if ( daScriptEnvironment::getBound()->g_Program->thisModule->name != to_rts(name) ) return false; if ( isInDebugAgentCreation() ) return false; return true; } @@ -1276,8 +1276,8 @@ namespace das } bool is_reporting_compilation_errors ( ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - return (*daScriptEnvironment::bound)->g_Program->reportingInferErrors; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + return daScriptEnvironment::getBound()->g_Program->reportingInferErrors; } return false; } @@ -1481,9 +1481,9 @@ namespace das } void toCompilerLog ( const char * text, Context * context, LineInfoArg * at ) { - if ( (*daScriptEnvironment::bound)->g_compilerLog ) { + if ( daScriptEnvironment::getBound()->g_compilerLog ) { if ( text ) { - (*(*daScriptEnvironment::bound)->g_compilerLog) << text; + (*daScriptEnvironment::getBound()->g_compilerLog) << text; } } else { context->throw_error_at(at, "can only write to compiler log during compilation"); @@ -1491,38 +1491,38 @@ namespace das } bool is_in_aot ( ) { - return *daScriptEnvironment::bound ? (*daScriptEnvironment::bound)->g_isInAot : false; + return daScriptEnvironment::getBound() ? daScriptEnvironment::getBound()->g_isInAot : false; } void set_aot ( ) { - assert(*daScriptEnvironment::bound); - (*daScriptEnvironment::bound)->g_isInAot = true; + assert(daScriptEnvironment::getBound()); + daScriptEnvironment::getBound()->g_isInAot = true; } void reset_aot ( ) { - assert(*daScriptEnvironment::bound); - (*daScriptEnvironment::bound)->g_isInAot = false; + assert(daScriptEnvironment::getBound()); + daScriptEnvironment::getBound()->g_isInAot = false; } bool is_in_completion ( ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - return (*daScriptEnvironment::bound)->g_Program->policies.completion; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + return daScriptEnvironment::getBound()->g_Program->policies.completion; } return false; } bool is_folding ( ) { - if ( *daScriptEnvironment::bound && (*daScriptEnvironment::bound)->g_Program ) { - return (*daScriptEnvironment::bound)->g_Program->folding; + if ( daScriptEnvironment::getBound() && daScriptEnvironment::getBound()->g_Program ) { + return daScriptEnvironment::getBound()->g_Program->folding; } return false; } const char * compiling_file_name ( ) { - return *daScriptEnvironment::bound ? (*daScriptEnvironment::bound)->g_compilingFileName : nullptr; + return daScriptEnvironment::getBound() ? daScriptEnvironment::getBound()->g_compilingFileName : nullptr; } const char * compiling_module_name ( ) { - return *daScriptEnvironment::bound ? (*daScriptEnvironment::bound)->g_compilingModuleName : nullptr; + return daScriptEnvironment::getBound() ? daScriptEnvironment::getBound()->g_compilingModuleName : nullptr; } // remove define to enable emscripten version diff --git a/src/simulate/debug_info.cpp b/src/simulate/debug_info.cpp index ae849dc2f9..602e248871 100644 --- a/src/simulate/debug_info.cpp +++ b/src/simulate/debug_info.cpp @@ -85,7 +85,7 @@ namespace das } void TypeInfo::resolveAnnotation() const { - if ( (*daScriptEnvironment::bound)->modules ) Module::resolveAnnotation(this); + if ( daScriptEnvironment::getBound()->modules ) Module::resolveAnnotation(this); } diff --git a/src/simulate/simulate_fn_hash.cpp b/src/simulate/simulate_fn_hash.cpp index 21e3369c5d..e7d88a363b 100644 --- a/src/simulate/simulate_fn_hash.cpp +++ b/src/simulate/simulate_fn_hash.cpp @@ -195,7 +195,7 @@ namespace das { }; void collectDependencies ( FunctionPtr fun, const TBlock,TArray> & block, Context * context, LineInfoArg * line ) { - auto program = (*daScriptEnvironment::bound)->g_Program; + auto program = daScriptEnvironment::getBound()->g_Program; if ( !program ) context->throw_error_at(line, "Can't collect dependencies outside of compilation."); program->markExecutableSymbolUse(); DependencyCollector collector; diff --git a/utils/daScript/main.cpp b/utils/daScript/main.cpp index 106473fbb4..e0552df2c6 100644 --- a/utils/daScript/main.cpp +++ b/utils/daScript/main.cpp @@ -105,9 +105,9 @@ bool compile ( const string & fn, const string & cppFn, bool dryRun, bool cross_ NamespaceGuard das_guard(tw, "das"); { NamespaceGuard anon_guard(tw, program->thisNamespace); // anonymous - (*daScriptEnvironment::bound)->g_Program = program; // setting it for the AOT macros + daScriptEnvironment::getBound()->g_Program = program; // setting it for the AOT macros program->aotCpp(*pctx, tw, cross_platform); - (*daScriptEnvironment::bound)->g_Program.reset(); + daScriptEnvironment::getBound()->g_Program.reset(); // list STUFF program->registerAotCpp(tw, *pctx, false); tw << "\n"; @@ -263,7 +263,7 @@ int das_aot_main ( int argc, char * argv[] ) { require_project_specific_modules(); #include "modules/external_need.inc" Module::Initialize(); - (*daScriptEnvironment::bound)->g_isInAot = true; + daScriptEnvironment::getBound()->g_isInAot = true; bool compiled = false; if ( standaloneContext ) { StandaloneContextCfg cfg = {standaloneContextName, standaloneClassName ? standaloneClassName : "StandaloneContext"}; diff --git a/utils/dasFormatter/fmt.cpp b/utils/dasFormatter/fmt.cpp index 6dc6f1c0bc..654b735f58 100644 --- a/utils/dasFormatter/fmt.cpp +++ b/utils/dasFormatter/fmt.cpp @@ -188,8 +188,8 @@ Result transform_syntax(const string &filename, const string content, format::Fo // All initialization and parsing took from daslang source yyscan_t scanner = nullptr; ProgramPtr program = make_smart(); - (*daScriptEnvironment::bound)->g_Program = program; - (*daScriptEnvironment::bound)->g_compilerLog = &tout; + daScriptEnvironment::getBound()->g_Program = program; + daScriptEnvironment::getBound()->g_compilerLog = &tout; program->promoteToBuiltin = false; program->isCompiling = true; program->isDependency = false; @@ -207,7 +207,7 @@ Result transform_syntax(const string &filename, const string content, format::Fo parserState.g_Access = access; parserState.g_FileAccessStack.push_back(access->getFileInfo(filename)); parserState.g_Program = program; - parserState.das_def_tab_size = (*daScriptEnvironment::bound)->das_def_tab_size; + parserState.das_def_tab_size = daScriptEnvironment::getBound()->das_def_tab_size; parserState.das_gen2_make_syntax = false; libGroup.foreach([&](Module *mod) { if (mod->commentReader) { From f1d606548df46c8359903f29fe4eab659b94f434 Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Thu, 13 Nov 2025 16:08:13 +0300 Subject: [PATCH 2/4] ADD_MODULE_LIB now creates library as well --- CMakeLists.txt | 15 +++++++++++++++ include/daScript/simulate/heap.h | 4 ++-- modules/dasAudio/CMakeLists.txt | 5 ++--- modules/dasClangBind/CMakeLists.txt | 3 +-- modules/dasPUGIXML/CMakeLists.txt | 3 +-- modules/dasSQLITE/CMakeLists.txt | 3 +-- modules/dasStbImage/CMakeLists.txt | 5 ++--- modules/dasStbTrueType/CMakeLists.txt | 3 +-- modules/dasStdDlg/CMakeLists.txt | 11 +++++------ 9 files changed, 30 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a960cf16fa..37da0180c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,12 +287,27 @@ SET(DAS_MODULES_NEED_INC ${NEED_MODULES_PATH}/external_need.inc) FILE(WRITE ${DAS_MODULES_RESOLVE_INC}.temp "") FILE(WRITE ${DAS_MODULES_NEED_INC}.temp "") +add_compile_definitions(PRIVATE DAS_MOD_API=) + +MACRO(ADD_DAS_LIBRARY lib) + ADD_LIBRARY(${lib} ${ARGN}) + # SET_TARGET_PROPERTIES(${lib} PROPERTIES POSITION_INDEPENDENT_CODE ON) + # TARGET_COMPILE_OPTIONS(${lib} PRIVATE -fvisibility=hidden) +ENDMACRO() + SET(DAS_MODULES_LIBS) SET(DAS_ALL_EXAMPLES) FILE(GLOB _modules RELATIVE "${PROJECT_SOURCE_DIR}/modules" "modules/*") FOREACH(_module ${_modules}) MACRO(ADD_MODULE_LIB lib) MESSAGE("REGISTER DAS MODULE ${lib}") + + # temporary `if`, unless all modules not use new API + if(${ARGC} GREATER 1) + ADD_DAS_LIBRARY(${lib} ${ARGN}) + TARGET_LINK_LIBRARIES(${lib} PUBLIC libDaScript) + endif() + LIST(APPEND DAS_MODULES_LIBS ${lib}) ENDMACRO() diff --git a/include/daScript/simulate/heap.h b/include/daScript/simulate/heap.h index 1383e3afcd..fcea798d4c 100644 --- a/include/daScript/simulate/heap.h +++ b/include/daScript/simulate/heap.h @@ -289,8 +289,8 @@ namespace das { virtual void sweep() override { DAS_ASSERT(0 && "not supported"); } virtual bool isOwnPtr ( char * ptr, uint32_t ) override; virtual bool isValidPtr ( char *, uint32_t ) override { return true; } - virtual void setInitialSize ( uint32_t size ); - virtual int32_t getInitialSize() const; + virtual void setInitialSize ( uint32_t size ) override; + virtual int32_t getInitialSize() const override; virtual void setGrowFunction ( CustomGrowFunction && fun ) override; protected: LinearChunkAllocator model; diff --git a/modules/dasAudio/CMakeLists.txt b/modules/dasAudio/CMakeLists.txt index 440515fea2..ceeff9dcf3 100644 --- a/modules/dasAudio/CMakeLists.txt +++ b/modules/dasAudio/CMakeLists.txt @@ -29,11 +29,10 @@ IF ((NOT DAS_AUDIO_INCLUDED) AND ((NOT ${DAS_AUDIO_DISABLED}) OR (NOT DEFINED DA ) ENDIF() - ADD_MODULE_LIB(libDasModuleAudio) ADD_MODULE_CPP(Audio) # ADD_MODULE_NATIVE(AUDIO_boost) - ADD_LIBRARY(libDasModuleAudio ${DAS_AUDIO_MODULE_SRC} ${DAS_AUDIO_MODULE_PLATFORM_SRC} ${MIT_HRTF_SRC}) - TARGET_LINK_LIBRARIES(libDasModuleAudio ${AUDIO_LIBRARIES}) + ADD_MODULE_LIB(libDasModuleAudio ${DAS_AUDIO_MODULE_SRC} ${DAS_AUDIO_MODULE_PLATFORM_SRC} ${MIT_HRTF_SRC}) + TARGET_LINK_LIBRARIES(libDasModuleAudio PUBLIC ${AUDIO_LIBRARIES}) # ADD_DEPENDENCIES(libDasModuleAudio) TARGET_INCLUDE_DIRECTORIES(libDasModuleAudio PUBLIC ${AUDIO_INCLUDE_DIR} ${MIT_HRTF_INCLUDE_DIR}) diff --git a/modules/dasClangBind/CMakeLists.txt b/modules/dasClangBind/CMakeLists.txt index 3e3d71bb00..a2d4235f99 100644 --- a/modules/dasClangBind/CMakeLists.txt +++ b/modules/dasClangBind/CMakeLists.txt @@ -53,10 +53,9 @@ IF ((NOT DAS_CLANG_BIND_INCLUDED) AND (${Clang_FOUND}) AND ((NOT ${DAS_CLANG_BIN ${DAS_CLANG_BIND_DIR}/src/dasClangBind.func_17.cpp ) - ADD_MODULE_LIB(libDasModuleClangBind) ADD_MODULE_CPP(dasClangBind) # ADD_MODULE_NATIVE(CLANG_BIND_boost) - ADD_LIBRARY(libDasModuleClangBind ${DAS_CLANG_BIND_MODULE_SRC} ${DAS_CLANG_BIND_MODULE_PLATFORM_SRC}) + ADD_MODULE_LIB(libDasModuleClangBind ${DAS_CLANG_BIND_MODULE_SRC} ${DAS_CLANG_BIND_MODULE_PLATFORM_SRC}) IF(APPLE) TARGET_LINK_LIBRARIES(libDasModuleClangBind ${CLANG_BIND_LIBRARIES} ${LIBCLANG_LIB}/libclang.dylib) ELSEIF(UNIX) diff --git a/modules/dasPUGIXML/CMakeLists.txt b/modules/dasPUGIXML/CMakeLists.txt index 640efd00cf..f9a050ba50 100644 --- a/modules/dasPUGIXML/CMakeLists.txt +++ b/modules/dasPUGIXML/CMakeLists.txt @@ -21,10 +21,9 @@ IF ((NOT DAS_PUGIXML_INCLUDED) AND ((NOT ${DAS_PUGIXML_DISABLED}) OR (NOT DEFINE ${DAS_PUGIXML_DIR}/pugixml/pugiconfig.hpp ) - ADD_MODULE_LIB(libDasModulePUGIXML) ADD_MODULE_CPP(PUGIXML) # ADD_MODULE_NATIVE(PUGIXML_boost) - ADD_LIBRARY(libDasModulePUGIXML ${DAS_PUGIXML_MODULE_SRC} ${PUGIXML_SRC}) + ADD_MODULE_LIB(libDasModulePUGIXML ${DAS_PUGIXML_MODULE_SRC} ${PUGIXML_SRC}) TARGET_LINK_LIBRARIES(libDasModulePUGIXML ${PUGIXML_LIBRARIES}) # ADD_DEPENDENCIES(libDasModulePUGIXML) TARGET_INCLUDE_DIRECTORIES(libDasModulePUGIXML PUBLIC ${PUGIXML_INCLUDE_DIR}) diff --git a/modules/dasSQLITE/CMakeLists.txt b/modules/dasSQLITE/CMakeLists.txt index 6fe0867dc5..406cb9e87d 100644 --- a/modules/dasSQLITE/CMakeLists.txt +++ b/modules/dasSQLITE/CMakeLists.txt @@ -63,10 +63,9 @@ IF ((NOT DAS_SQLITE_INCLUDED) AND ((NOT ${DAS_SQLITE_DISABLED}) OR (NOT DEFINED ADD_DEFINITIONS(-DSQLITE_ENABLE_STMT_SCANSTATUS=1) ADD_DEFINITIONS(-DSQLITE_ENABLE_SNAPSHOT=1) - ADD_MODULE_LIB(libDasModuleSQLITE) ADD_MODULE_CPP(dasSQLITE) # ADD_MODULE_NATIVE(SQLITE_boost) - ADD_LIBRARY(libDasModuleSQLITE ${DAS_SQLITE_MODULE_SRC} ${DAS_SQLITE_SRC}) + ADD_MODULE_LIB(libDasModuleSQLITE ${DAS_SQLITE_MODULE_SRC} ${DAS_SQLITE_SRC}) TARGET_INCLUDE_DIRECTORIES(libDasModuleSQLITE PUBLIC ${SQLITE_INCLUDE_DIR}) SETUP_CPP11(libDasModuleSQLITE) diff --git a/modules/dasStbImage/CMakeLists.txt b/modules/dasStbImage/CMakeLists.txt index 73618656eb..b9de5d9311 100644 --- a/modules/dasStbImage/CMakeLists.txt +++ b/modules/dasStbImage/CMakeLists.txt @@ -13,11 +13,10 @@ IF ((NOT DAS_STBIMAGE_INCLUDED) AND (NOT ${DAS_STBIMAGE_DISABLED})) ${DAS_STBIMAGE_DIR}/src/dasStbImage.cpp ) - ADD_MODULE_LIB(libDasModuleStbImage) ADD_MODULE_CPP(StbImage) # ADD_MODULE_NATIVE(STBIMAGE_boost) - ADD_LIBRARY(libDasModuleStbImage ${DAS_STBIMAGE_MODULE_SRC} ${DAS_STBIMAGE_MODULE_PLATFORM_SRC}) - TARGET_LINK_LIBRARIES(libDasModuleStbImage ${STBIMAGE_LIBRARIES}) + ADD_MODULE_LIB(libDasModuleStbImage ${DAS_STBIMAGE_MODULE_SRC} ${DAS_STBIMAGE_MODULE_PLATFORM_SRC}) + TARGET_LINK_LIBRARIES(libDasModuleStbImage PUBLIC ${STBIMAGE_LIBRARIES}) # ADD_DEPENDENCIES(libDasModuleStbImage) TARGET_INCLUDE_DIRECTORIES(libDasModuleStbImage PUBLIC ${STBIMAGE_INCLUDE_DIR}) diff --git a/modules/dasStbTrueType/CMakeLists.txt b/modules/dasStbTrueType/CMakeLists.txt index 3c8aabb14b..70d26ff38c 100644 --- a/modules/dasStbTrueType/CMakeLists.txt +++ b/modules/dasStbTrueType/CMakeLists.txt @@ -13,10 +13,9 @@ IF ((NOT DAS_STBTRUETYPE_INCLUDED) AND ((NOT ${DAS_STBTRUETYPE_DISABLED}) OR (NO ${DAS_STBTRUETYPE_DIR}/src/dasStbTrueType.cpp ) - ADD_MODULE_LIB(libDasModuleStbTrueType) ADD_MODULE_CPP(StbTrueType) # ADD_MODULE_NATIVE(stbimage_boost) - ADD_LIBRARY(libDasModuleStbTrueType ${DAS_STBTRUETYPE_MODULE_SRC} ${DAS_STBTRUETYPE_MODULE_PLATFORM_SRC}) + ADD_MODULE_LIB(libDasModuleStbTrueType ${DAS_STBTRUETYPE_MODULE_SRC} ${DAS_STBTRUETYPE_MODULE_PLATFORM_SRC}) TARGET_LINK_LIBRARIES(libDasModuleStbTrueType ${STBTRUETYPE_LIBRARIES}) # ADD_DEPENDENCIES(libDasModuleStbTrueType) TARGET_INCLUDE_DIRECTORIES(libDasModuleStbTrueType PUBLIC ${STBTRUETYPE_INCLUDE_DIR}) diff --git a/modules/dasStdDlg/CMakeLists.txt b/modules/dasStdDlg/CMakeLists.txt index 725e0aac9c..72dc958d5e 100644 --- a/modules/dasStdDlg/CMakeLists.txt +++ b/modules/dasStdDlg/CMakeLists.txt @@ -36,16 +36,15 @@ IF ((NOT DAS_STDDLG_INCLUDED) AND ((NOT ${DAS_STDDLG_DISABLED}) OR (NOT DEFINED ) ENDIF() - ADD_MODULE_LIB(libDasModuleStdDlg) ADD_MODULE_CPP(StdDlg) # ADD_MODULE_NATIVE(STDDLG_boost) - ADD_LIBRARY(libDasModuleStdDlg ${DAS_STDDLG_MODULE_SRC} ${DAS_STDDLG_MODULE_PLATFORM_SRC}) - TARGET_LINK_LIBRARIES(libDasModuleStdDlg ${STDDLG_LIBRARIES}) + ADD_MODULE_LIB(libDasModuleStdDlg ${DAS_STDDLG_MODULE_SRC} ${DAS_STDDLG_MODULE_PLATFORM_SRC}) + TARGET_LINK_LIBRARIES(libDasModuleStdDlg PUBLIC ${STDDLG_LIBRARIES}) # ADD_DEPENDENCIES(libDasModuleStdDlg) TARGET_INCLUDE_DIRECTORIES(libDasModuleStdDlg PUBLIC ${STDDLG_INCLUDE_DIR}) IF(WIN32) - TARGET_LINK_LIBRARIES(libDasModuleStdDlg ShLwApi) + TARGET_LINK_LIBRARIES(libDasModuleStdDlg PUBLIC ShLwApi) ENDIF() IF(LINUX_GTK) @@ -54,11 +53,11 @@ IF ((NOT DAS_STDDLG_INCLUDED) AND ((NOT ${DAS_STDDLG_DISABLED}) OR (NOT DEFINED include_directories(${GTK3_INCLUDE_DIRS}) link_directories(${GTK3_LIBRARY_DIRS}) add_definitions(${GTK3_CFLAGS_OTHER}) - TARGET_LINK_LIBRARIES(libDasModuleStdDlg ${GTK3_LIBRARIES}) + TARGET_LINK_LIBRARIES(libDasModuleStdDlg PUBLIC ${GTK3_LIBRARIES}) ENDIF() IF(APPLE) - TARGET_LINK_LIBRARIES(libDasModuleStdDlg + TARGET_LINK_LIBRARIES(libDasModuleStdDlg PUBLIC "-framework AppKit" ) ENDIF() From ce5a0506610cbb91af454c97beef26d123048ca5 Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Thu, 13 Nov 2025 16:15:02 +0300 Subject: [PATCH 3/4] Add compile-time JIT argument checking flag. We need it to not waste memory due to huge templates instantiation. --- include/daScript/ast/ast_interop.h | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/include/daScript/ast/ast_interop.h b/include/daScript/ast/ast_interop.h index 0cea6728c4..9542d13311 100644 --- a/include/daScript/ast/ast_interop.h +++ b/include/daScript/ast/ast_interop.h @@ -182,6 +182,8 @@ namespace das virtual void * getBuiltinAddress() const override { return (void *) &usingFunc; } }; +#define VERIFY_JIT_ARGUMENTS 0 +#if VERIFY_JIT_ARGUMENTS template struct VerifyFn; @@ -195,8 +197,6 @@ namespace das template static void verifySingleArgumentType(size_t /*idx*/, FunctionPtr /*fn_info*/) { - // todo: enable once everything else is merged - /* auto & type = fn_info->arguments[idx]->type; if (type->isVectorType()) { using CleanType = remove_cv_t>; @@ -222,9 +222,9 @@ namespace das "Reference type mismatch %s in function %s. It makes jit work incorrectly. " "You must be manually changed ref, but not implemented JitConstRefByValue for this type.", debug_type_name(), fn_info->name.c_str()); - */ } }; +#endif void addExternFunc(Module& mod, const FunctionPtr & fx, bool isCmres, SideEffects seFlags); @@ -248,7 +248,9 @@ namespace das fnX->setSideEffects(sideEffects); fnX->propertyFunction = true; DAS_ASSERTF(!fnX->result->isSmartPointer(), "property function can't return smart pointer %s::%s", mod.name.c_str(), name); +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif mod.addFunction(fnX,true); // yes, this one can fail. same C++ bound property can be in multiple classes before or after refactor return fnX; } @@ -278,7 +280,9 @@ namespace das fnX->setSideEffects(sideEffects); fnX->propertyFunction = true; DAS_ASSERTF(!fnX->result->isSmartPointer(), "property function can't return smart pointer %s::%s", mod.name.c_str(), name); +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif mod.addFunction(fnX,true); // yes, this one can fail. same C++ bound property can be in multiple classes before or after refactor return fnX; } @@ -299,7 +303,9 @@ namespace das #endif tempFn(fnX.get()); +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif addExternFunc(mod, fnX, SimNodeType::IS_CMRES, seFlags); return fnX; } @@ -330,7 +336,9 @@ namespace das fnX->name.c_str(), fnX->name.c_str()); } } +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif return fnX; } @@ -349,7 +357,9 @@ namespace das auto fnX = make_smart>(name, lib, cppName); #endif tempFn(fnX.get()); +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif addExternFunc(mod, fnX, SimNodeType::IS_CMRES, seFlags); return fnX; } @@ -371,7 +381,9 @@ namespace das #endif tempFn(fnX.get()); fnX->result->temporary = true; +#if VERIFY_JIT_ARGUMENTS VerifyFn::verify(fnX); +#endif addExternFunc(mod, fnX, SimNodeType::IS_CMRES, seFlags); return fnX; } @@ -440,5 +452,9 @@ namespace das addExtern(mod, lib, "&=", SideEffects::modifyArgument, ("das_operator_enum_AND_EQU<" + cppName + ">::invoke").c_str()); } + +#ifdef VERIFY_JIT_ARGUMENTS +#undef VERIFY_JIT_ARGUMENTS +#endif } From 64c9ea9da5b674e9fd89968d7c9baedb7de1454c Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Thu, 13 Nov 2025 18:35:42 +0300 Subject: [PATCH 4/4] add empty break to silence warning --- src/ast/ast_print.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ast/ast_print.cpp b/src/ast/ast_print.cpp index 6a2c6eb285..65340a8766 100644 --- a/src/ast/ast_print.cpp +++ b/src/ast/ast_print.cpp @@ -836,6 +836,7 @@ namespace das { case Type::tBitfield8: ss << "8"; break; case Type::tBitfield16: ss << "16"; break; case Type::tBitfield64: ss << "64"; break; + default: break; } ss << "(0x" << HEX << c->getValue() << DEC << ")"; }