| 720 | } |
| 721 | |
| 722 | Value jsValueToValue(IJavaScriptContext& jsContext, |
| 723 | const JSValue& jsValue, |
| 724 | const ReferenceInfoBuilder& referenceInfoBuilder, |
| 725 | JSExceptionTracker& exceptionTracker) { |
| 726 | Valdi::JavaScriptRef<JSValue> ref; |
| 727 | |
| 728 | if (!checkRefNotCircular(jsValue, exceptionTracker.getCircularRefChecker(), ref)) { |
| 729 | static auto kCircular = STRING_LITERAL("<circular>"); |
| 730 | return Valdi::Value(kCircular); |
| 731 | } |
| 732 | |
| 733 | switch (jsContext.getValueType(jsValue)) { |
| 734 | case Valdi::ValueType::Null: |
| 735 | return Valdi::Value(); |
| 736 | case Valdi::ValueType::Undefined: |
| 737 | return Valdi::Value::undefined(); |
| 738 | case Valdi::ValueType::InternedString: |
| 739 | case Valdi::ValueType::StaticString: |
| 740 | // We always use the interned string API when going from an untyped JSValue to a Value |
| 741 | return Value(jsContext.valueToString(jsValue, exceptionTracker)); |
| 742 | case Valdi::ValueType::Int: |
| 743 | return Value(jsContext.valueToInt(jsValue, exceptionTracker)); |
| 744 | case Valdi::ValueType::Double: |
| 745 | return Value(jsContext.valueToDouble(jsValue, exceptionTracker)); |
| 746 | case Valdi::ValueType::Long: |
| 747 | return Value(jsContext.valueToLong(jsValue, exceptionTracker).toInt64()); |
| 748 | case Valdi::ValueType::Bool: |
| 749 | return Value(jsContext.valueToBool(jsValue, exceptionTracker)); |
| 750 | case Valdi::ValueType::Map: |
| 751 | return jsObjectToValue(jsContext, jsValue, referenceInfoBuilder, exceptionTracker); |
| 752 | case Valdi::ValueType::Array: |
| 753 | return jsArrayToValue(jsContext, jsValue, referenceInfoBuilder, exceptionTracker); |
| 754 | case Valdi::ValueType::TypedArray: |
| 755 | return jsTypedArrayToValue(jsContext, jsValue, referenceInfoBuilder, exceptionTracker); |
| 756 | case Valdi::ValueType::Function: |
| 757 | return Value(jsFunctionToFunction( |
| 758 | jsContext, jsValue, referenceInfoBuilder, exceptionTracker, defaultJSValueFunctionFactory())); |
| 759 | case Valdi::ValueType::TypedObject: |
| 760 | std::abort(); |
| 761 | case Valdi::ValueType::ProxyTypedObject: |
| 762 | std::abort(); |
| 763 | case Valdi::ValueType::ValdiObject: |
| 764 | return jsWrappedObjectToValue(jsContext, jsValue, exceptionTracker); |
| 765 | case Valdi::ValueType::Error: |
| 766 | return jsErrorToValue(jsContext, jsValue, exceptionTracker); |
| 767 | } |
| 768 | } |
| 769 | |
| 770 | std::string formatJsModule(const std::string_view& jsModule) { |
| 771 | std::string_view modulePrefix = "(function(require, module, exports) { "; |