nes-pascal

Milestone 0.5.12 — Funções: Auditoria de Completude e Qualidade

English Português (Brasil)

Este documento é um artefato de revisão independente da milestone 0.5.12 (Funções). Ele é distinto do relatório de implementação functions-0.5.12.md, que é o instantâneo da milestone feito pelo implementador. Esta auditoria registra verificação baseada em evidências, descobertas de cobertura e um backlog para endurecimento de acompanhamento.


1. Matriz de requisitos da milestone

O contrato é a seção Funções de roadmap/0.md (identificador 0.5.12). Todos os doze requisitos foram verificados contra evidências concretas do repositório, não nomes ou comentários.

# Requisito Status Evidência
1 Declarações de função Verificado Gramática function em parser.py (nome tipado, lista de parâmetros opcional, tipo de retorno opcional); declarações aceitas entre var e o bloco principal; test_parser_represents_typed_function_and_explicit_call, test_parser_rejects_malformed_function_declarations; declarações intercaladas com procedimentos.
2 Chamadas de função Verificado Nó de AST FunctionCall e ResolvedFunctionCall; toda chamada exige parênteses, incluindo chamadas sem parâmetros; test_forward_calls_resolve_in_callee_first_order; chamadas aninhadas em argumentos/aritmética/comparações/condições verificadas em fixtures de runtime e probes.
3 Valores de retorno byte Verificado Byte de suporte em RAM regular function_result_<name>; epílogo lda function_result_<name> + rts; test_return_storage_is_regular_ram_and_absent_without_functions; golden ABI; runtime no Mesen (resultados de aritmética aninhada $06/$31/$66/$F3).
4 Valores de retorno boolean Verificado Materialização canônica $00/$01; o acumulador carrega o resultado; o lda final deixa a flag Z válida para que o chamador faça branch direto de curto-circuito; test_boolean_function_is_valid_in_short_circuit_expression; verificação de curto-circuito por probe e no Mesen.
5 Parâmetros de função Verificado Parâmetros por valor byte/boolean usando a ABI estática de RAM regular de procedimento (símbolos parameter_<name>); validação de tipo via E4005; rejeição de tipos de parâmetro enum e color verificada por probe.
6 Validação do tipo de retorno Verificado Apenas retornos byte/boolean; E4026 para qualquer outro tipo (tests/fixtures/diagnostics/unsupported_function_return_type.nsp); literais de resultado errados rejeitados com E4004 (wrong_boolean_function_result.nsp, wrong_byte_function_result.nsp).
7 Chamadas de função dentro de expressões Verificado Chamadas resolvidas como expressões de valor em aritmética, comparações, índices de array, escritas de campo de record, condições de if/while/for, argumentos de nes.* e operandos de curto-circuito; verificado nas camadas de unidade, golden e runtime no Mesen.
8 Definir armazenamento do valor de retorno ou convenção de chamada Verificado ABI documentada em docs/language/functions.md e functions-0.5.12.md: byte de resultado estático em RAM regular por função, resultado retornado em A, A/X/Y/flags destruídos pelo chamador, endereços de retorno na pilha de hardware, sem frame de runtime; golden tests/golden/functions_abi.asm.
9 Preservar os temporários de expressão externos através de chamadas de função aninhadas Verificado callable_bases em TemporaryRequirements; o codegen pré-adquire o prefixo de base de cada função chamada para que os temporários do corpo da função chamada fiquem acima dos slots vivos do chamador; _generate_call_arguments arrenda resultados de argumentos anteriores através de argumentos posteriores que contêm chamadas; análise e codegen concordam; golden de pressão (Leaf na base 2, pico de 3 bytes vivos).
10 Suportar expressões de chamada de função aninhadas sobre o alocador de temporários com escopo Verificado Chamadas aninhadas reutilizam o pool com escopo da 0.5.11 sem aliasing; probe de 4 níveis (max_call_depth 4, 3 temporários vivos do chamador) verificado via Mesen; cadeias de chamada aninhadas com empilhamento de irmãos verificadas.
11 Definir a ordem de avaliação quando chamadas de função aparecem em expressões maiores Verificado Documentado e verificado: argumentos da esquerda para a direita; and/or em curto-circuito da esquerda para a direita (operandos pulados não executam); aritmética/comparação binária mantém primeiro o operando direito quando o lado direito exige avaliação (LeftCall() - RightCall() executa RightCall() primeiro). Coincide com as regras de redução pré-existentes; sem regressão.
12 Rejeitar recursão direta e indireta envolvendo funções Verificado E3014 para direta (recursive_function_call.nsp), indireta (recursive_function_call_indirect.nsp) e mista de procedimento/função (recursive_callable_mixed.nsp); test_direct_indirect_and_mixed_recursion_are_rejected; probe confirmou que um ciclo é rejeitado mesmo quando a função recursiva é inalcançável a partir do bloco principal.

Requisitos do roadmap não cobertos: nenhum. Todos os 12 requisitos estão implementados, documentados e exercitados por testes, fixtures, goldens ou benchmarks.


2. Cobertura semântica positiva

Casos normais / comuns (cobertos)

Condições de contorno (cobertas)

Interações (cobertas)

Casos apenas cobertos indiretamente


3. Matriz de cobertura de diagnósticos

Condição inválida Código esperado Teste / fixture existente Status
Nome de função desconhecido E3059 tests/fixtures/diagnostics/unknown_function.nsp + caso unitário Missing() Coberto
Contagem de argumentos errada E3060 tests/fixtures/diagnostics/function_argument_count.nsp + caso unitário One() Coberto
Função usada como declaração E3061 tests/fixtures/diagnostics/function_used_as_statement.nsp + caso unitário Coberto
Procedimento usado como expressão E3062 tests/fixtures/diagnostics/procedure_used_as_expression.nsp + caso unitário Value := Work() Coberto
Resultado lido antes de atribuído / não em todo caminho E3063 tests/fixtures/diagnostics/undefined_function_result.nsp + testes unitários de atribuição definitiva Coberto
Tipo de resultado errado / tipo de argumento E4004 wrong_byte_function_result.nsp, wrong_boolean_function_result.nsp (resultado); tipo de argumento apenas testado por unidade (Enabled($01)) Coberto (resultado); P3-1 (argumento)
Tipo de retorno não suportado E4026 tests/fixtures/diagnostics/unsupported_function_return_type.nsp Coberto
Tipo de parâmetro não suportado E4005 fixtures de parâmetro pré-existentes exercitadas para enum/color via probes; fixture específica de enum enum_procedure_parameter.nsp Coberto
Recursão direta / indireta / mista E3014 recursive_function_call.nsp, recursive_function_call_indirect.nsp, recursive_callable_mixed.nsp Coberto
Função registrada como callback de quadro E3018 verificado por probe apenas; a função é declarada mas relatada “Unknown callback procedure” (P3-3) P3-3
Função chamada sem parênteses E3005 verificado por probe; “Unknown identifier” (P3-4) P3-4
Chamada de declaração nua com contagem de argumentos errada E3061 antes de E3060 function_used_as_statement.nsp (contagem correta); probe de declaração com contagem errada relata E3061 (por design, P3-5) P3-5

Todos os seis diagnósticos novos específicos de função (E3059E3063, E4026) estão registrados no catálogo canônico (docs/DIAGNOSTICS.md, docs/reference/diagnostics/index.md, semantic.md/type-system.md e os contrapartes PT-BR mantidos), validados pelo teste de catálogo de diagnósticos e têm fixtures negativas focadas. As mensagens são específicas e acionáveis, com texto de sugestão.


4. Cobertura por camada de parser / semântica / backend

Camada Evidência Avaliação
Lexer / Parser Palavra-chave function, lista de parâmetros opcional, : type opcional, corpo begin/end; F(...) no nível de declaração parseado como chamada de procedimento para que E3061 dispare; test_parser_represents_typed_function_and_explicit_call, test_parser_rejects_malformed_function_declarations Coberto
Semântica Resolução de FunctionDeclaration/FunctionCall, ResolvedFunction, ResolvedFunctionCall, ResolvedFunctionResultAssignment; análise de resultado definitivo com regras de caminho cientes de curto-circuito; detecção de ciclos de recursão; namespace global compartilhado; regras de posicionamento de função/callback Coberto
AST FunctionDeclaration, FunctionCall, nós ResolvedFunction*; tipos dedicados; catálogo de nós resolvidos atualizado Coberto
Layout de memória Símbolos function_result_* em RAM regular em FUNCTION_RESULTS; custo zero sem funções (test_return_storage_is_regular_ram_and_absent_without_functions, identidade de benchmark); parâmetros reutilizam a ABI de RAM estática de procedimento Coberto
Backend codegen_analysis.py calcula callable_bases + max_call_depth; backend_ca65.py pré-adquire slots de base, arrenda resultados de argumentos através de argumentos que contêm chamadas, emite o epílogo lda function_result_X; rts; _zero_flag_is_valid permite branch Z direto para resultados booleanos; o comportamento de arrendamento de análise e codegen concorda (verificado por probe em 20+ cenários) Coberto
Suporte de runtime Nenhum código de runtime novo; pilha de hardware reservada integralmente para endereços de retorno de JSR/RTS; benchmarks inalterados Coberto

5. Auditoria do Assembly golden

tests/golden/functions_abi.asm registra o contrato da ABI de retorno: epílogo lda function_result_X / rts, jsr do chamador e preparação do resultado.

tests/golden/functions_temporary_pressure.asm é o golden crítico de segurança de temporários: o chamador mantém expression_temporary_0, function_Middle adquire expression_temporary_1 (base 1) e function_Leaf adquire expression_temporary_2 (base 2) — um pico verificado de três bytes simultaneamente vivos na profundidade de chamada de origem dois (quatro bytes de pilha de hardware). Este é exatamente o limite que a milestone não deve regredir.

Classificação: obrigatório — existe. A convenção de golden focado é seguida; nenhum golden de arquivo completo é justificado para Funções.


6. Validação de toolchain


7. Cobertura de runtime no Mesen

tests/mesen/verify_functions.lua executa tests/fixtures/runtime/functions.nsp e verifica memória de runtime concreta: segurança de parâmetros estáticos aninhados, argumentos da esquerda para a direita, aritmética complexa primeiro à direita, comparações, normalização Booleana, efeitos colaterais de curto-circuito, interação procedimento/função e wrap-around de 8 bits. Está conectada como test_functions_preserve_nested_static_parameters_and_short_circuits; todos os 29 MesenIntegrationTests passam localmente.

A bateria de probes independente adiciona verificação de runtime além da fixture enviada (cada endereço verificado de forma cruzada contra seu mapa de memória):

Esta é uma verificação comportamental de temporários seguros para chamadas, ordem de avaliação e segurança de parâmetros aninhados, não uma verificação de apenas-ROM-inicializa.


8. Cobertura de benchmark / recursos


9. Cobertura de documentação

Verificados: docs/language/functions.md, docs/pt-BR/language/functions.md, docs/runtime/cpu-memory.md, docs/pt-BR/runtime/cpu-memory.md, docs/reference/unsupported-features.md, docs/reference/diagnostics/{index,semantic,type-system}.md + PT-BR, docs/compiler/functions-0.5.12.md, docs/compiler/test-coverage-map.md + PT-BR, docs/index.md, docs/DIAGNOSTICS.md, docs/getting-started/*, roadmap 0.md + README.md, README e docs/reference/compiler-pipeline.md.


10. Mapa de cobertura de testes

docs/compiler/test-coverage-map.md (EN/PT-BR) adiciona o subsistema 31 “Funções” com Strong em todos os níveis aplicáveis (Semântica, Layout de Memória, Backend ASM, Golden ASM, Toolchain, Mesen Runtime, Corpus de Benchmark) e N/A para Lexer/Parser (a gramática é exercitada via testes unitários, mas o mapa de cobertura a marca como N/A conforme a convenção estabelecida). Esta classificação é defensável: testes unitários focados para todos os 12 requisitos, fixtures negativas para cada diagnóstico novo, um golden de ABI focado mais um golden de pressão de temporários, montagem/linkagem de toolchain do corpus de 21 benchmarks, um teste de runtime no Mesen e contabilidade exata de benchmarks existem para cada nível aplicável. Nenhuma correção do mapa é justificada.


11. Auditoria de regressão e interação


12. Lacunas de cobertura e descobertas

Severidade Descoberta
P0 Nenhuma encontrada. Nenhum defeito de correção ou semântica identificado no escopo implementado e documentado.
P1 Nenhuma. Todos os 12 requisitos documentados da milestone estão implementados e têm proteção de regressão focada.
P2-1 Sem guarda em tempo de compilação da profundidade máxima de chamada de origem vs. a pilha de hardware de 256 bytes Resolvido em fix/function-call-depth-stack-guard: um orçamento derivado reserva 10 bytes além dos dois bytes por endereço de retorno de JSR ativo (4 bytes para frames de JSR internos de runtime alcançáveis a partir de declarações de usuário, 6 bytes para folga de NMI), dando uma profundidade máxima suportada de chamáveis de (256 - 10) / 2 = 123. E5007 (HARDWARE_STACK_CALL_DEPTH_EXHAUSTED) rejeita cadeias acíclicas mais profundas em tempo de compilação; o limite de 124 cadeias é coberto por testes focados em tests/test_functions.py.
P3-1 Incompatibilidade de tipo de argumento de função (E4004) não tem fixture negativa dedicada; apenas uma asserção unitária no processo (Enabled($01)) e probes de CLI. Mesmo caminho de código do E4004 pré-existente; baixo valor incremental.
P3-2 docs/pt-BR/compiler/functions-0.5.12.md ausente; quebra o padrão de documento de design por milestone no PT-BR (todos os documentos de design de milestone anteriores são traduzidos). Toda a documentação voltada ao usuário da 0.5.12 está traduzida.
P3-3 Uma função registrada como callback de quadro (nes.on_update(SomeFunction)) é rejeitada com E3018 “Unknown callback procedure: SomeFunction” embora a função seja declarada; a rejeição está correta, mas a mensagem não explica que funções não podem ser callbacks.
P3-4 Uma função chamada sem parênteses (Value := CurrentScore;) relata E3005 “Unknown identifier: CurrentScore”; é preciso, mas não sugere o () exigido.
P3-5 Uma chamada de declaração nua com contagem de argumentos errada (F($01, $02);) relata E3061 (função usada como declaração) em vez de E3060 (contagem de argumentos). Por design — chamadas no nível de declaração parseiam como chamadas de procedimento; o erro primário aparece primeiro.

13. Resultados de validação local

14. Execução do GitHub Actions

Push de audit/0.5.12-validation. O pipeline de CI autoritativo (.github/workflows/ci.yml) rodou contra o branch enviado. A execução de validação final (após o commit de registro a5add38) é a execução do GitHub Actions 31772718704 (número de execução 56, evento push, head a5add38).

15. Gate de CI final

O job agregado ci-gate passou para o branch enviado, confirmando os jobs de toolchain do compilador e de runtime do Mesen e o gate geral remotamente. A evidência local (seção 13) concorda com o resultado remoto.


Recomendação

Todos os doze requisitos da milestone 0.5.12 são verificados contra evidências concretas (implementação, testes unitários, fixtures negativas, dois goldens focados, montagem/linkagem de toolchain, 29 execuções Mesen headless e contabilidade exata de benchmarks). A funcionalidade está distribuída corretamente entre parser, semântica, layout de memória e backend; análise e codegen concordam sobre a vivacidade de temporários, de modo que uma divergência de segurança de chamadas seria uma falha sonora em tempo de compilação em vez de corrupção silenciosa. A ordem de avaliação, a materialização Booleana, a redução de curto-circuito e todos os invariantes de tamanho/ciclos são preservados (identidade pré/pós de benchmark no corpus). Não restam descobertas P0, P1 ou P2: o único item de endurecimento P2 (guarda de profundidade máxima de chamada de origem, E5007) está resolvido em fix/function-call-depth-stack-guard com um orçamento derivado de 123 chamadas e cobertura focada de limites. Os itens P3 restantes são polimento de documentação e redação menor de diagnóstico, nenhum dos quais bloqueia os critérios de aceite da milestone.

PRONTA