Limite do código de um método é de 65535 bytes? [RESOLVIDO]
10 respostas
ctdaa
Olá.
Estou criando um parser com a ferramenta javaCC, que por sua vez gera várias classes java. Em uma destas classes geradas estou recebendo o seguinte erro:
Pesquisei o problema e a recomendação diz que este é um limite do java e que eu devo rever a gramática que estou implementando para otimizá-la.
Tudo bem, vou fazer isto. Mas este limite é fixo ou existe forma de configurar algum parametro de compilação ou algo assim?
Se seu método é maior que isso talvez seja uma boa hora de refatorar.
ctdaa
Existe alguma ferramenta, utilitário, plugin, etc… que possa fazer um refactor, clean-up ou algo parecido com o fonte ou com o código java compilado?
A intensão é somente reduzir o tamanho do código, já que a manutenção dos fontes não será feita diretamente no java (e sim pelo javaCC).
J
juliocbq
eu não sabia que existia esse limite. Mas um método com mais 65000 bytes também é exorbitante.
ctdaa
Como disse no início do tópico a classe é gerada automaticamente, por isso não posso dar manutenção direta no fonte. Quando eu compilar novamente a definição do javaCC ele vai regerar as classes e consequentemente perderá as alterações. Se houver uma ferramenta de refactor automatico, aplico novamente toda vez que forem regeradas.
E
entanglement
Perguntinha. Digamos que seu método esteja gerando uma grande quantidade de bytecodes porque ele contém uma grande quantidade de constantes string. Seria possível acumular essas strings e lê-las de um resource, em vez de estarem no arquivo .class?
ctdaa
Boa idéia. Já havia pensado nisto. Mas examinei o fonte e não tem nenhuma string… quem projetou o compilador javaCC já deve ter pensado neste tipo de otimização…
Vou colocar parte do fonte para ilustrar:
Os números que aparecem apontam para o código definido em uma classe de constantes.
Ali deve ter dicas para solucionar o teu caso. O problema é que parece estar fora do ar.
ctdaa
Para registrar uma solução mais inteligente:
Como o problema era com a quantidade de palavras reservadas existentes na gramática, implementei uma segmentação separando alguns statements em um parser independente. No parser principal aciono o parser segundário quando o token específico for encontrado…
Alterei a definição do token () para capturar a linha completa do statement ( e não apenas a palavra DEFINE ):
<DEFAULT>TOKEN:{<ALTER:"ALTER">|<BACKUP:("BACKUP"|"BUP")>|<BLDINDEX:("BLDINDEX"|"BIX")>|<CANCEL:"CANCEL">|<REPRO:"REPRO">//* Statements implementados em parser externo:|<DEFINE:("DEFINE"|"DEF")(~[])(~["\n","\r"])*>
A chamada ao parser secundário (IdcamsDefine) dentro do parser principal (Idcams) ficou assim: