Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 33 additions & 25 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -741,36 +741,23 @@ src/ast/ast_dispatch.cpp
src/ast/ast_interop.cpp
src/ast/ast_tls.cpp
src/ast/ast_visitor.cpp
src/ast/ast_generate.cpp
src/ast/ast_simulate.cpp
src/ast/ast_typedecl.cpp
src/ast/ast_match.cpp
src/ast/ast_module.cpp
src/ast/ast_print.cpp
src/ast/ast_program.cpp
src/ast/ast_infer_type.cpp
src/ast/ast_infer_type_report.cpp
src/ast/ast_infer_type_function.cpp
src/ast/ast_infer_type_helper.cpp
src/ast/ast_infer_type_op.cpp
src/ast/ast_infer_type_make.cpp
src/ast/ast_lint.cpp
src/ast/ast_allocate_stack.cpp
src/ast/ast_derive_alias.cpp
src/ast/ast_const_folding.cpp
src/ast/ast_block_folding.cpp
src/ast/ast_gc_collect.cpp
src/ast/ast_gc_report.cpp
src/ast/ast_inscope_pod.cpp
src/ast/ast_escape_analysis.cpp
src/ast/ast_unused.cpp
src/ast/ast_annotations.cpp
src/ast/ast_export.cpp
src/ast/ast_parse.cpp
src/ast/ast_validate.cpp
src/ast/ast_debug_info_helper.cpp
src/ast/ast_handle.cpp
src/ast/dyn_modules.cpp
include/daScript/ast/compilation_errors.h
include/daScript/ast/ast_typedecl.h
include/daScript/ast/ast_typefactory.h
Expand Down Expand Up @@ -802,23 +789,15 @@ src/builtin/module_builtin_vector_ctor.cpp
src/builtin/module_builtin_array.cpp
src/builtin/module_builtin_math.cpp
src/builtin/module_builtin_string.cpp
src/builtin/module_builtin_ast_serialize.cpp
src/builtin/module_builtin_rtti.h
src/builtin/module_builtin_rtti.cpp
src/builtin/module_builtin_ast.cpp
src/builtin/module_builtin_ast_serialize.cpp
src/builtin/module_builtin_ast_flags.cpp
src/builtin/module_builtin_ast_annotations.cpp
src/builtin/module_builtin_ast_annotations_1.cpp
src/builtin/module_builtin_ast_annotations_2.cpp
src/builtin/module_builtin_ast_annotations_3.cpp
src/builtin/module_builtin_ast_adapters.cpp
src/builtin/module_builtin_ast.h
src/builtin/module_builtin_uriparser.h
src/builtin/module_builtin_uriparser.cpp
src/builtin/module_jit.cpp
src/builtin/module_builtin_fio.cpp
src/builtin/module_builtin_dasbind.cpp
src/builtin/module_builtin_network.cpp
src/builtin/module_builtin_debugger.cpp
src/builtin/module_builtin_jobque.cpp
src/builtin/module_file_access.cpp
Expand Down Expand Up @@ -1094,16 +1073,40 @@ MACRO(SETUP_LIBDASCRIPT library shared_lib full_setup sources exports_def)
ENDMACRO()

SET(LIBDASCRIPT_RUNTIME_SRC
${PARSER_GENERATED_SRC}
${PARSER_SRC} ${VECMATH_SRC} ${AST_SRC} ${SIMULATE_SRC} ${BUILTIN_SRC}
${VECMATH_SRC} ${AST_SRC} ${SIMULATE_SRC} ${BUILTIN_SRC}
${MISC_SRC} ${MAIN_SRC}
${DAGOR_NOISE_SRC} ${DAS_HASH_MAP_SRC} ${FAST_FLOAT_SRC} ${DASCRIPT_FMT_SRC}
${DAGOR_NOISE_SRC} ${DAS_HASH_MAP_SRC} ${FAST_FLOAT_SRC}
)

SET(LIBDASCRIPT_COMPILER_SRC
${SIMULATE_FUSION_SRC}
${PARSER_GENERATED_SRC}
${PARSER_SRC}
${DASCRIPT_FMT_SRC}
src/ast/ast_parse.cpp
src/ast/ast_optimize.cpp
src/ast/ast_const_folding.cpp
src/ast/ast_block_folding.cpp
src/ast/ast_unused.cpp
src/ast/ast_lint.cpp
src/ast/dyn_modules.cpp
src/misc/daScriptC.cpp
src/builtin/modules.cpp
src/ast/ast_infer_type.cpp
src/ast/ast_infer_type_report.cpp
src/ast/ast_infer_type_function.cpp
src/ast/ast_infer_type_helper.cpp
src/ast/ast_infer_type_op.cpp
src/ast/ast_infer_type_make.cpp
src/ast/ast_generate.cpp
src/builtin/module_builtin_ast.cpp
src/builtin/module_builtin_ast_flags.cpp
src/builtin/module_builtin_ast_annotations.cpp
src/builtin/module_builtin_ast_annotations_1.cpp
src/builtin/module_builtin_ast_annotations_2.cpp
src/builtin/module_builtin_ast_annotations_3.cpp
src/builtin/module_builtin_ast_adapters.cpp
src/builtin/module_builtin_network.cpp
)

# Eventually libDaScript_runtime will contain only minimal subset of sources
Expand Down Expand Up @@ -1134,6 +1137,11 @@ target_compile_definitions(libDaScriptDyn_runtime PUBLIC
# compiles empty in Release/Debug.
target_sources(libDaScript_runtime PRIVATE src/misc/alloc_tracker_overrides.cpp)
target_sources(libDaScriptDyn_runtime PRIVATE src/misc/alloc_tracker_overrides.cpp)
# The compiler lib is a separate binary (own CRT new/delete on Windows). Without
# its own copy of the override, parser/infer/ast allocations escape the tracker
# and read as cross-module orphan frees (false leaks in the RelWithDebInfo report).
target_sources(libDaScript PRIVATE src/misc/alloc_tracker_overrides.cpp)
target_sources(libDaScriptDyn PRIVATE src/misc/alloc_tracker_overrides.cpp)

target_link_libraries(libDaScript libDaScript_runtime)
target_link_libraries(libDaScriptDyn libDaScriptDyn_runtime)
Expand Down
23 changes: 9 additions & 14 deletions daslib/style_lint.das
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ module style_lint shared private
//! STYLE026 — nested 'unsafe { ... }' block; outer wrap already covers the scope — drop the inner
//! STYLE027 — var array<T> / table<K;V> with empty default-init followed by a for-loop that only push/insert into it; use a comprehension
//! STYLE028 — 'self->method(...)' inside a class method is optional — drop 'self->' and call 'method(...)' directly (compiler auto-promotes to the same invoke)
//! STYLE029 — non-public 'require X' used only for modules X re-exports (transitive-only) — require those directly and drop X (skipped when X provides macros or [init])
//! STYLE029 — non-public 'require X' used only for ONE module X re-exports — require it directly and drop X (skipped when ≥2 re-exports are used: aggregation facade; or when X provides macros or [init])
//! STYLE030 — non-public 'require X' that is entirely unused — no symbol from X (or anything it re-exports) is referenced; drop it (skipped when X provides any macro or an [init], or only re-exports builtins used through it, or X or its public re-export closure exports a function matching an unresolved call inside an uninstanced generic body). Suppress a deliberate keep with '// nolint:STYLE030'

require daslib/ast_boost
Expand Down Expand Up @@ -1683,26 +1683,21 @@ class StyleLintVisitor : AstVisitor {
var closure : table<string; bool>
st029_collect_public_deps(mod, closure)
var via : array<string>
var used_any = false
var used_count = 0
for (cm in keys(closure)) {
if (!key_exists(used_modules, cm)) continue
used_any = true
used_count++
if (closure?[cm] ?? false) via |> push(cm)
}
var line_at = at
if (!empty(via)) {
sort(via)
let mods = build_string() $(w) {
for (i in range(length(via))) {
if (i > 0) { w |> write(", ") }
w |> write(via[i])
}
}
style_warning("STYLE029: require {req_name} is used only for modules it re-exports ({mods}); require those directly and drop {req_name}", line_at)
// >=2 used re-exports = aggregation facade; single used builtin has
// no requirable replacement — both stay silent.
if (used_count == 1 && !empty(via)) {
let mods = via[0]
style_warning("STYLE029: require {req_name} is used only for the module it re-exports ({mods}); require it directly and drop {req_name}", line_at)
return
}
// Skip when only builtin-facade re-exports are used (legitimate).
return if (used_any)
return if (used_count > 0)
// Nothing direct, nothing transitive, no macro/[init] — genuinely unused.
style_warning("STYLE030: require {req_name} is unused — no symbol from it (or a module it re-exports) is referenced; drop it", line_at)
}
Expand Down
1 change: 1 addition & 0 deletions doc/reflections/das2rst.das
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ def document_module_rtti(_root : string) {
def document_module_ast(_root : string) {
var mod = [get_module("ast_core"), find_module("ast")]
var groups <- array<DocGroup>(
group_by_regex("Compilation and file access", mod, %regex~(compile|compile_file|make_file_access)$%%),
group_by_regex("Call generation", mod, %regex~(make_call)$%%),
group_by_regex("Visitor pattern", mod, %regex~visit.*%%),
group_by_regex("Expression generation", mod, %regex~(force_generated|get_expression_annotation|make_type_info_structure)%%),
Expand Down
35 changes: 18 additions & 17 deletions include/daScript/ast/ast.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ namespace das
typedef AnnotationDeclaration * AnnotationDeclarationPtr;

enum class LogicAnnotationOp { And, Or, Xor, Not };
AnnotationPtr newLogicAnnotation ( LogicAnnotationOp op );
AnnotationPtr newLogicAnnotation ( LogicAnnotationOp op,
DAS_API AnnotationPtr newLogicAnnotation ( LogicAnnotationOp op );
DAS_API AnnotationPtr newLogicAnnotation ( LogicAnnotationOp op,
const AnnotationDeclarationPtr & arg0, const AnnotationDeclarationPtr & arg1 );


Expand Down Expand Up @@ -640,7 +640,7 @@ namespace das
Expression(const LineInfo & a) : at(a) { gc_magic = GC_MAGIC_EXPRESSION; }
string describe() const;
virtual ~Expression() {}
friend StringWriter& operator<< (StringWriter& stream, const Expression & func);
friend DAS_API StringWriter& operator<< (StringWriter& stream, const Expression & func);
virtual ExpressionPtr visit(Visitor & /*vis*/ ) { DAS_ASSERT(0); return this; };
virtual ExpressionPtr clone( ExpressionPtr expr = nullptr ) const;
static ExpressionPtr autoDereference ( ExpressionPtr expr );
Expand Down Expand Up @@ -744,8 +744,6 @@ namespace das
return expr ? static_cast<ExprType*>(expr) : new ExprType();
}

bool isLocalOrGlobal ( ExpressionPtr expr );

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4324)
Expand Down Expand Up @@ -836,7 +834,7 @@ namespace das
public:
Function() { gc_magic = GC_MAGIC_FUNCTION; }
virtual ~Function() {}
friend StringWriter& operator<< (StringWriter& stream, const Function & func);
friend DAS_API StringWriter& operator<< (StringWriter& stream, const Function & func);
void getMangledName(TextWriter & ss) const;
string getMangledName() const;
uint64_t getMangledNameHash() const;
Expand Down Expand Up @@ -1019,10 +1017,10 @@ namespace das

};

uint64_t getFunctionHash ( Function * fun, SimNode * node, Context * context );
DAS_API uint64_t getFunctionHash ( Function * fun, SimNode * node, Context * context );

uint64_t getFunctionAotHash ( Function * fun );
string getAotHashComment ( const Function * fun );
DAS_API uint64_t getFunctionAotHash ( Function * fun );
DAS_API string getAotHashComment ( const Function * fun );
uint64_t getVariableListAotHash ( const vector<const Variable *> & globs, uint64_t initHash );

class DAS_API BuiltInFunction : public Function {
Expand Down Expand Up @@ -1123,7 +1121,7 @@ namespace das
verifyAll = 0xffffffff
};

bool isValidBuiltinName ( const string & name, bool canPunkt = false );
DAS_API bool isValidBuiltinName ( const string & name, bool canPunkt = false );

class DAS_API Module {
public:
Expand Down Expand Up @@ -1169,7 +1167,7 @@ namespace das
if ( objModule->visibleEverywhere ) return true;
return requireModule.find(objModule) != requireModule.end();
}
bool compileBuiltinModule ( const string & name, const unsigned char * const str, unsigned int str_len );//will replace last symbol to 0
friend DAS_CC_API bool compileBuiltinModule ( Module * module, const string & name, const unsigned char * const str, unsigned int str_len );
static Module * require ( const string & name );
static Module * requireEx ( const string & name, bool allowPromoted, const string & expectedFileName = string() );
static void Initialize();
Expand Down Expand Up @@ -1696,8 +1694,6 @@ namespace das
bool patchAnnotations();
void fixupAnnotations();
void normalizeOptionTypes ();
void inferTypes(TextWriter & logs, ModuleGroup & libGroup);
void inferTypesDirty(TextWriter & logs, bool verbose);
bool relocatePotentiallyUninitialized(TextWriter & logs);
void lint (TextWriter & logs, ModuleGroup & libGroup );
void inferLint(TextWriter & logs);
Expand All @@ -1711,7 +1707,6 @@ namespace das
void buildAccessFlags(TextWriter & logs);
bool verifyAndFoldContracts();
void validateAst();
void optimize(TextWriter & logs, ModuleGroup & libGroup);
bool inScopePodAnalysis(TextWriter & logs);
bool escapeAnalysis(TextWriter & logs); // pure analysis: sets Variable::does_not_escape
bool scopeFreeOptimization(TextWriter & logs); // consumes the analysis result: emits scope-exit frees
Expand Down Expand Up @@ -1823,15 +1818,21 @@ namespace das
DAS_API Func adapt ( const char * funcName, char * pClass, const StructInfo * info );

// this one works for single module only
DAS_API ProgramPtr parseDaScript ( const string & fileName, const string & moduleName, const FileAccessPtr & access,
DAS_CC_API ProgramPtr parseDaScript ( const string & fileName, const string & moduleName, const FileAccessPtr & access,
TextWriter & logs, ModuleGroup & libGroup, bool exportAll = false, bool isDep = false, CodeOfPolicies policies = CodeOfPolicies() );

// this one collectes dependencies and compiles with modules
DAS_API ProgramPtr compileDaScript ( const string & fileName, const FileAccessPtr & access,
DAS_CC_API ProgramPtr compileDaScript ( const string & fileName, const FileAccessPtr & access,
TextWriter & logs, ModuleGroup & libGroup, CodeOfPolicies policies = CodeOfPolicies() );
DAS_API ProgramPtr compileDaScriptSerialize ( const string & fileName, const FileAccessPtr & access,
DAS_CC_API ProgramPtr compileDaScriptSerialize ( const string & fileName, const FileAccessPtr & access,
TextWriter & logs, ModuleGroup & libGroup, CodeOfPolicies policies = CodeOfPolicies() );

// optimization pass (compiler lib); runs after type inference
void optimizeProgram ( Program * program, TextWriter & logs, ModuleGroup & libGroup );

// compile an embedded builtin module's source into `module` (compiler lib)
DAS_CC_API bool compileBuiltinModule ( Module * module, const string & name, const unsigned char * const str, unsigned int str_len );

// collect script prerequisits
DAS_API bool getPrerequisits ( const string & fileName,
const FileAccessPtr & access,
Expand Down
6 changes: 3 additions & 3 deletions include/daScript/ast/ast_expressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -786,8 +786,8 @@ namespace das
auto getValue() const { return ExprConstT::getValue(); };
};

int64_t getConstExprIntOrUInt ( ExpressionPtr expr );
pair<int64_t,bool> tryGetConstExprIntOrUInt ( ExpressionPtr expr );
DAS_API int64_t getConstExprIntOrUInt ( ExpressionPtr expr );
DAS_API pair<int64_t,bool> tryGetConstExprIntOrUInt ( ExpressionPtr expr );

struct DAS_API ExprConstUInt2 : ExprConstT<uint2,ExprConstUInt2> {
ExprConstUInt2(uint2 i = uint2())
Expand Down Expand Up @@ -1351,7 +1351,7 @@ namespace das
struct MakeFieldDecl;
typedef MakeFieldDecl * MakeFieldDeclPtr;

struct MakeFieldDecl : gc_node {
struct DAS_API MakeFieldDecl : gc_node {
LineInfo at;
string name;
ExpressionPtr value = nullptr;
Expand Down
Loading
Loading