Ich habe einen Fehler Marshaling einer Datenstruktur (Fehler abstrakten Typ (Benutzerdefiniert)). Es gibt einen bekannten abstrakten Typ, nämlich Big_int. Wie auch immer, Marshals gut. In der Anwendung gibt es keinen benutzerdefinierten C-Code. Neben Nums wird auch die Unix-Bibliothek verwendet (allerdings glaube ich nicht, dass es aktive Objekte dieses Typs gibt). Wir sind Marshal'ing mit Closures.
Zwei (nur) Third-Party-Bibliotheken werden verwendet: OCS-Schema (Scheme-Interpreter, reines Ocaml) und Dypgen (erweiterbarer GLR-Parser, auch reines Ocaml). Das Problem ist mit einer neuen Funktion von Dyspen, einen dynamisch erweiterten Parser zu speichern.
Die Ocaml-Fehlermeldung ist fast nutzlos (sie identifiziert nicht den abstrakten Typ mit dem benutzerdefinierten Tag als Täter).
Wir haben Lexbuf als den Täter vermutet, weil er einen Verschluss über einen Ocaml-Kanal enthält und nicht Marshal's sein kann, aber es scheint, dass dies nicht das Problem ist. Also meine Frage ist:
Welche Standard-Bibliothekskomponenten können nicht Marshall'd sein?
Schwache Arrays können nicht gemarshallt werden. Ich bin mit OCS Scheme nicht vertraut, aber ich würde erwarten, dass ein Interpreter für eine müllsammelte Sprache, die in OCaml geschrieben wurde, schwache Zeiger verwendet (sie lassen Sie auf die Speicherverwaltung von OCaml zurückgreifen).
In OCamls Verteidigung glaube ich nicht, dass der Custom-Methodenblock den Namen des Typs enthält (im Nachhinein scheint das eine gute Sache zu sein).
BEARBEITEN: Ja:
%Vor%EDIT2: Wie von ygrek gezeigt, gibt es im benutzerdefinierten Methodenblock Platz für einen Namen. Ich sollte auch klarstellen, dass schwache Arrays keine benutzerdefinierten Werte sind, da meine Antwort dies zu implizieren scheint. Schwache Arrays haben das Abstract-Tag und sind mit dem ersten Datenwort verkettet, so dass der Garbage Collector sie in speziellen Schwachzeiger-bezogenen Phasen des Collection-Zyklus durchlaufen kann.
Tags und Links marshalling ocaml