Como entender esses parágrafos no EMCA 335 sobre `.locals init`?
Do ECMA 335 I.12.4.1 Chamadas de método
A matriz de variáveis locais sempre tem nulo para os tipos de objeto e para os campos nos tipos de valor que contêm objetos. Além disso, se.locals init
é definido, então a matriz de variáveis locais é inicializada para 0 para tipos inteiros e 0.0 para tipos de ponto flutuante. Os tipos de valor não são inicializados pela CLI, mas o código verificado fornecerá uma chamada para um inicializador como parte do código do ponto de entrada do método.
assim
"Inicializado como 0 para tipos integrais e 0.0 para tipos de ponto flutuante" significa "zera os tipos de valor"?
Isso significa: independentemente de.locals init
, A CLI deve sempre garantir que os tipos de objetos sejam definidos como nulos na entrada do método? Então, por que diferenciar os tipos de objeto e os tipos de valor aqui: os tipos de valor de saída zero não são semelhantes ao tipo de objeto de saída zero?
Como entender que "tipos de valor não são inicializados pelo CLI"?
O que isso significa: "código verificado fornecerá uma chamada para um inicializador como parte do código do ponto de entrada do método"? Não é parte de verificação do CLI?
Do ECMA 335 III.1.8.1.1 Algoritmo de verificação
Métodos verificáveis devem ter.locals init
conjunto. Se não estiver definido, o CLI pode lançar umVerificationException
onde a montagem não foi concedidaSecurityPermission.SkipVerification
. A CLI pode, opcionalmente, optar por executar uma análise de atribuição definida (para determinar qual local é gravado antes da leitura) para permitir que um compilador de código nativo de CIL minimize seu impacto no desempenho para esse requisito.
E se.locals init
está definido, a especificação requer que a CLI deve zerar a matriz de variáveis locais na entrada do método. Isso significa que o código da máquina de zerar precisa ser executado na entrada. Então, como seria a "análise de atribuição definida" ajuda, dado que o zeramento possivelmente desnecessário já foi feito?
Desculpas se não me fiz claro. Vou tentar o meu melhor para melhorar minhas perguntas com base em comentários.