O que e o RPO realmente?
O RPO (Repositorio de Objetos) explicado: estrutura interna, por que e um arquivo unico, como objetos sao linkados em runtime.
RPO sigla de "Repositorio de Objetos". E o equivalente Protheus de uma DLL ou JAR — arquivo binario que contem o codigo compilado de tudo (Protheus padrao, customizacoes, libs). AppServer carrega 1 ou mais RPOs no startup e linka tudo numa unica imagem em memoria.
Diferenca de arquitetura
| Mundo | Equivalente |
|---|---|
| Java | JAR + classpath |
| .NET | DLL + assembly |
| Python | .pyc + sys.path |
| Protheus | .RPO + RpoCustom/RpoPatches |
Como objetos sao resolvidos
Quando voce chama U_MinhaFunc(), o AppServer:
- Procura no RpoPatches (patches recentes) primeiro
- Depois no RpoCustom (customizacao)
- Por fim no tttp.rpo (padrao)
- Primeira ocorrencia ganha — patches sobrescrevem padrao
Por isso voce pode sobrescrever rotina padrao da TOTVS: compilando uma rotina com mesmo nome (ex: MA410VLD) no seu RPO custom, ela passa a ser usada no lugar da padrao. Util pra customizar comportamento sem editar fonte TOTVS.
Estrutura interna
RPO contem:
- Bytecode AdvPL/TLPP compilado (instrucoes da maquina virtual)
- Tabela de simbolos (mapeamento nome -> bytecode offset)
- Includes resolvidos (a TOTVS apaga as
#includeao compilar) - Versao da LIB (compatibilidade do framework)
"Token RPO" — por que Function nua e rejeitada
A partir de 2020, AppServer pode validar RPO contra assinatura digital (Token RPO). Isso bloqueia codigo nao homologado em ambiente que ativou o recurso. Particularidade: Function nua (sem User nem Static) e tratada como tentativa de sobrescrever rotina padrao — RPO Token rejeita. Use sempre User Function em customizacao.
Detalhe: a skill /advpl-find-issues tem regra function-not-user pra detectar isso.
Comandos uteis
- RpoVer() — retorna versao do RPO carregado
- RpoLanguage() — idioma compilado
- RpoLastUpdate() — data do ultimo update
- UpdRPOData() — recarrega metadados (apos hot patch)