pub(crate) fn deep_clone_value(
it: &mut Interp,
v: &Value,
seen: &mut Vec<(ObjRef, ObjRef)>,
) -> Result<Value, Value>Expand description
structuredClone は仕様上、循環参照(var a={}; a.self=a;)や同一オブジェクトへの
複数参照(構造の共有)を正しく扱う必要がある。以前はそのための「複製済みオブジェクトの
記録」を一切持たず単純な再帰だけだったため、循環参照ではスタックオーバーフロー
(この no_std カーネル環境ではクラッシュ/ハングになり得る)に陥っていた。
seen に (元オブジェクト, 複製先オブジェクト) を積みながら辿ることで、複製先の
入れ物を先に作ってから中身を埋める(=自己参照が現れた時点で既に登録済みにする)。