Skip to main content

deep_clone_value

Function deep_clone_value 

Source
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 に (元オブジェクト, 複製先オブジェクト) を積みながら辿ることで、複製先の 入れ物を先に作ってから中身を埋める(=自己参照が現れた時点で既に登録済みにする)。