2011-01-30 12 views
8

Errore nel marshalling di una struttura dati (tipo di errore astratto (personalizzato)). Esiste un tipo astratto noto in uso, ovvero Big_int. Comunque quel Marshal va bene. Non c'è codice C personalizzato nell'applicazione. Oltre a Nums, viene utilizzata anche la libreria Unix (tuttavia non credo ci siano oggetti attivi di quel tipo). Stiamo facendo il maresciallo con le chiusure.Quali tipi di libreria standard OCaml non possono essere sottoposti a marshalling?

Sono in uso due (solo) librerie di terze parti: Schema OCS (interprete di schema, puro Ocaml) e Dypgen (parser GLR estendibile, anche puro Ocaml). Il problema è con una nuova funzionalità di Dypgen, che salva un parser esteso in modo dinamico.

Il messaggio di errore Ocaml è quasi inutile (non identifica il tipo astratto con tag personalizzato è il colpevole).

Abbiamo sospettato Lexbuf come colpevole perché contiene una chiusura su un canale Ocaml e non può essere Maresciallo, ma sembra che questo non sia il problema. Quindi la mia domanda è:

Quali componenti di libreria standard non possono essere utilizzati da Marshall?

risposta

7

Gli array deboli non possono essere sottoposti a marshalling. Non ho familiarità con OCS Scheme, ma mi aspetterei che un interprete per un linguaggio raccolto in spazzatura scritto in OCaml utilizzi i puntatori deboli (che ti lasciano a piggyback nella gestione della memoria di OCaml).

Nella difesa di OCaml, non penso che il blocco del metodo personalizzato contenga il nome del tipo (retrospettivamente, sembra una buona cosa avere).

EDIT: Sì:

$ grep Weak ~/Downloads/ocs-1.0.3/src/*.ml 
/Users/pascal/Downloads/ocs-1.0.3/src/ocs_sym.ml:module SymTable = Weak.Make (HashSymbol) 

EDIT2: Come sottolineato da ygrek, c'è spazio per un nome nel blocco metodo personalizzato. Dovrei anche chiarire che gli array deboli non sono valori personalizzati, poiché la mia risposta sembrava implicare ciò. Gli array deboli hanno il tag Abstract e sono concatenati usando la prima parola di dati in modo che il garbage collector possa attraversarli in speciali fasi correlate al puntatore debole del ciclo di raccolta.

+2

I valori personalizzati possono avere il puntatore del nome in custom_ops (utilizzato come tag di marshalling). – ygrek

+0

Hm, quindi cosa succede se provi a Maresciallo un array debole? Sto decisamente ricevendo (personalizzato) nella diagnostica. – Yttrill

+1

@Yttrill "Marshal.to_string (Weak.create 3) [] ;;". Risultato: "Eccezione: Invalid_argument" output_value: valore astratto (Abstract) " –

Problemi correlati