diff --git a/app/src/examples/ShareablesExample.tsx b/app/src/examples/ShareablesExample.tsx
index ee094ea439f0..0e9a0b7297e3 100644
--- a/app/src/examples/ShareablesExample.tsx
+++ b/app/src/examples/ShareablesExample.tsx
@@ -13,6 +13,7 @@ export default function ShareablesExample() {
+
);
}
@@ -159,6 +160,22 @@ function DataViewDemo() {
return ;
}
+function ErrorDemo() {
+ const handlePress = () => {
+ const e = new Error('error message');
+ console.log(_WORKLET ? 'UI' : 'RN', e instanceof Error);
+ console.log(_WORKLET ? 'UI' : 'RN', String(e));
+ console.log(_WORKLET ? 'UI' : 'RN', e.stack?.length);
+ runOnUI(() => {
+ console.log(_WORKLET ? 'UI' : 'RN', e instanceof Error);
+ console.log(_WORKLET ? 'UI' : 'RN', String(e));
+ console.log(_WORKLET ? 'UI' : 'RN', e.stack?.length);
+ })();
+ };
+
+ return ;
+}
+
const styles = StyleSheet.create({
container: {
flex: 1,
diff --git a/src/reanimated2/shareables.ts b/src/reanimated2/shareables.ts
index 1f7d3eab5641..51139cec674b 100644
--- a/src/reanimated2/shareables.ts
+++ b/src/reanimated2/shareables.ts
@@ -202,6 +202,20 @@ Offending code was: \`${getWorkletCode(value)}\``);
});
shareableMappingCache.set(value, handle);
return handle as ShareableRef;
+ } else if (value instanceof Error) {
+ const { name, message, stack } = value;
+ const handle = makeShareableCloneRecursive({
+ __init: () => {
+ 'worklet';
+ const error = new Error();
+ error.name = name;
+ error.message = message;
+ error.stack = stack;
+ return error;
+ },
+ });
+ shareableMappingCache.set(value, handle);
+ return handle as ShareableRef;
} else if (value instanceof ArrayBuffer) {
toAdapt = value;
} else if (ArrayBuffer.isView(value)) {