harsher compile error
This commit is contained in:
@@ -191,6 +191,7 @@ function extract_module_summaries(compiled) {
|
|||||||
if (_summary_resolver == null) return null
|
if (_summary_resolver == null) return null
|
||||||
var instrs = null
|
var instrs = null
|
||||||
var summaries = []
|
var summaries = []
|
||||||
|
var unresolved = []
|
||||||
var i = 0
|
var i = 0
|
||||||
var j = 0
|
var j = 0
|
||||||
var n = 0
|
var n = 0
|
||||||
@@ -205,6 +206,7 @@ function extract_module_summaries(compiled) {
|
|||||||
var path = null
|
var path = null
|
||||||
var result_slot = 0
|
var result_slot = 0
|
||||||
var summary = null
|
var summary = null
|
||||||
|
var inv_n = 0
|
||||||
|
|
||||||
if (compiled.main == null) return null
|
if (compiled.main == null) return null
|
||||||
instrs = compiled.main.instructions
|
instrs = compiled.main.instructions
|
||||||
@@ -254,6 +256,9 @@ function extract_module_summaries(compiled) {
|
|||||||
summary = _summary_resolver(path)
|
summary = _summary_resolver(path)
|
||||||
if (summary != null) {
|
if (summary != null) {
|
||||||
summaries[] = {slot: result_slot, summary: summary}
|
summaries[] = {slot: result_slot, summary: summary}
|
||||||
|
} else {
|
||||||
|
inv_n = length(instr)
|
||||||
|
unresolved[] = {path: path, line: instr[inv_n - 2], col: instr[inv_n - 1]}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,7 +266,9 @@ function extract_module_summaries(compiled) {
|
|||||||
i = i + 1
|
i = i + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length(summaries) > 0) return summaries
|
if (length(summaries) > 0 || length(unresolved) > 0) {
|
||||||
|
return {summaries: summaries, unresolved: unresolved}
|
||||||
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,6 +276,8 @@ function extract_module_summaries(compiled) {
|
|||||||
function run_ast_fn(name, ast, env) {
|
function run_ast_fn(name, ast, env) {
|
||||||
var compiled = mcode_mod(ast)
|
var compiled = mcode_mod(ast)
|
||||||
var ms = null
|
var ms = null
|
||||||
|
var _ui = 0
|
||||||
|
var _ur = null
|
||||||
var optimized = null
|
var optimized = null
|
||||||
var _di = 0
|
var _di = 0
|
||||||
var _diag = null
|
var _diag = null
|
||||||
@@ -286,9 +295,23 @@ function run_ast_fn(name, ast, env) {
|
|||||||
compiled._warn = true
|
compiled._warn = true
|
||||||
ms = extract_module_summaries(compiled)
|
ms = extract_module_summaries(compiled)
|
||||||
if (ms != null) {
|
if (ms != null) {
|
||||||
compiled._module_summaries = ms
|
if (length(ms.summaries) > 0) {
|
||||||
|
compiled._module_summaries = ms.summaries
|
||||||
|
}
|
||||||
|
if (length(ms.unresolved) > 0) {
|
||||||
|
compiled._unresolved_imports = ms.unresolved
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (compiled._unresolved_imports != null) {
|
||||||
|
_ui = 0
|
||||||
|
while (_ui < length(compiled._unresolved_imports)) {
|
||||||
|
_ur = compiled._unresolved_imports[_ui]
|
||||||
|
print(`${name}:${text(_ur.line)}:${text(_ur.col)}: error: cannot resolve module '${_ur.path}'\n`)
|
||||||
|
_ui = _ui + 1
|
||||||
|
}
|
||||||
|
disrupt
|
||||||
|
}
|
||||||
optimized = streamline_mod(compiled)
|
optimized = streamline_mod(compiled)
|
||||||
if (optimized._verify) {
|
if (optimized._verify) {
|
||||||
delete optimized._verify
|
delete optimized._verify
|
||||||
@@ -321,7 +344,46 @@ function run_ast_noopt_fn(name, ast, env) {
|
|||||||
// Compile AST to blob without loading (for caching)
|
// Compile AST to blob without loading (for caching)
|
||||||
function compile_to_blob(name, ast) {
|
function compile_to_blob(name, ast) {
|
||||||
var compiled = mcode_mod(ast)
|
var compiled = mcode_mod(ast)
|
||||||
var optimized = streamline_mod(compiled)
|
var ms = null
|
||||||
|
var _ui = 0
|
||||||
|
var _ur = null
|
||||||
|
var optimized = null
|
||||||
|
var _di = 0
|
||||||
|
var _diag = null
|
||||||
|
var _has_errors = false
|
||||||
|
if (!_no_warn) {
|
||||||
|
compiled._warn = true
|
||||||
|
ms = extract_module_summaries(compiled)
|
||||||
|
if (ms != null) {
|
||||||
|
if (length(ms.summaries) > 0) {
|
||||||
|
compiled._module_summaries = ms.summaries
|
||||||
|
}
|
||||||
|
if (length(ms.unresolved) > 0) {
|
||||||
|
compiled._unresolved_imports = ms.unresolved
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (compiled._unresolved_imports != null) {
|
||||||
|
_ui = 0
|
||||||
|
while (_ui < length(compiled._unresolved_imports)) {
|
||||||
|
_ur = compiled._unresolved_imports[_ui]
|
||||||
|
print(`${name}:${text(_ur.line)}:${text(_ur.col)}: error: cannot resolve module '${_ur.path}'\n`)
|
||||||
|
_ui = _ui + 1
|
||||||
|
}
|
||||||
|
disrupt
|
||||||
|
}
|
||||||
|
optimized = streamline_mod(compiled)
|
||||||
|
if (optimized._diagnostics != null && length(optimized._diagnostics) > 0) {
|
||||||
|
_di = 0
|
||||||
|
_has_errors = false
|
||||||
|
while (_di < length(optimized._diagnostics)) {
|
||||||
|
_diag = optimized._diagnostics[_di]
|
||||||
|
print(`${_diag.file}:${text(_diag.line)}:${text(_diag.col)}: ${_diag.severity}: ${_diag.message}\n`)
|
||||||
|
if (_diag.severity == "error") _has_errors = true
|
||||||
|
_di = _di + 1
|
||||||
|
}
|
||||||
|
if (_has_errors) disrupt
|
||||||
|
}
|
||||||
return mach_compile_mcode_bin(name, json.encode(optimized))
|
return mach_compile_mcode_bin(name, json.encode(optimized))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1864,6 +1864,7 @@ var streamline = function(ir, log) {
|
|||||||
var cs = null
|
var cs = null
|
||||||
var argc = null
|
var argc = null
|
||||||
var known_arity = null
|
var known_arity = null
|
||||||
|
var load_field_null = false
|
||||||
|
|
||||||
// Build module_slots map from ir._module_summaries
|
// Build module_slots map from ir._module_summaries
|
||||||
if (ir._module_summaries != null) {
|
if (ir._module_summaries != null) {
|
||||||
@@ -2007,12 +2008,15 @@ var streamline = function(ir, log) {
|
|||||||
|
|
||||||
// --- Warning checks (likely bug) ---
|
// --- Warning checks (likely bug) ---
|
||||||
|
|
||||||
|
load_field_null = false
|
||||||
if (op == "load_field") {
|
if (op == "load_field") {
|
||||||
obj_type = cur_types[instr[2]]
|
obj_type = cur_types[instr[2]]
|
||||||
if (obj_type == T_ARRAY) {
|
if (obj_type == T_ARRAY) {
|
||||||
emit("warning", line, col, "named property access on array — always returns null")
|
emit("warning", line, col, "named property access on array — always returns null")
|
||||||
|
load_field_null = true
|
||||||
} else if (obj_type == T_TEXT) {
|
} else if (obj_type == T_TEXT) {
|
||||||
emit("warning", line, col, "named property access on text — always returns null")
|
emit("warning", line, col, "named property access on text — always returns null")
|
||||||
|
load_field_null = true
|
||||||
}
|
}
|
||||||
// Cross-module: check if obj is a module with known exports
|
// Cross-module: check if obj is a module with known exports
|
||||||
ms = module_slots[text(instr[2])]
|
ms = module_slots[text(instr[2])]
|
||||||
@@ -2044,6 +2048,11 @@ var streamline = function(ir, log) {
|
|||||||
// Update types for this instruction
|
// Update types for this instruction
|
||||||
track_types(cur_types, instr)
|
track_types(cur_types, instr)
|
||||||
|
|
||||||
|
// Override: load_field on array/text always returns null
|
||||||
|
if (load_field_null) {
|
||||||
|
cur_types[instr[1]] = T_NULL
|
||||||
|
}
|
||||||
|
|
||||||
i = i + 1
|
i = i + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user