2
0
Эх сурвалжийг харах

move chakracore only types behind ifdefs

Michael Holman 7 жил өмнө
parent
commit
282f7a25ac

+ 8 - 1
bin/ch/ChakraRtInterface.cpp

@@ -85,7 +85,6 @@ bool ChakraRTInterface::LoadChakraDll(ArgInfo* argInfo, HINSTANCE *outLibrary)
     m_jsApiHooks.pfJsrtDisposeRuntime = (JsAPIHooks::JsrtDisposeRuntimePtr)GetChakraCoreSymbol(library, "JsDisposeRuntime");
     m_jsApiHooks.pfJsrtCreateObject = (JsAPIHooks::JsrtCreateObjectPtr)GetChakraCoreSymbol(library, "JsCreateObject");
     m_jsApiHooks.pfJsrtCreateExternalObject = (JsAPIHooks::JsrtCreateExternalObjectPtr)GetChakraCoreSymbol(library, "JsCreateExternalObject");
-    m_jsApiHooks.pfJsrtCreateCustomExternalObject = (JsAPIHooks::JsrtCreateCustomExternalObjectPtr)GetChakraCoreSymbol(library, "JsCreateCustomExternalObject");
     m_jsApiHooks.pfJsrtGetArrayForEachFunction = (JsAPIHooks::JsrtGetArrayForEachFunctionPtr)GetChakraCoreSymbol(library, "JsGetArrayForEachFunction");;
     m_jsApiHooks.pfJsrtGetArrayKeysFunction = (JsAPIHooks::JsrtGetArrayKeysFunctionPtr)GetChakraCoreSymbol(library, "JsGetArrayKeysFunction");;
     m_jsApiHooks.pfJsrtGetArrayValuesFunction = (JsAPIHooks::JsrtGetArrayValuesFunctionPtr)GetChakraCoreSymbol(library, "JsGetArrayValuesFunction");;
@@ -190,7 +189,15 @@ bool ChakraRTInterface::LoadChakraDll(ArgInfo* argInfo, HINSTANCE *outLibrary)
     m_jsApiHooks.pfJsrtTTDMoveToTopLevelEvent = (JsAPIHooks::JsrtTTDMoveToTopLevelEventPtr)GetChakraCoreSymbol(library, "JsTTDMoveToTopLevelEvent");
     m_jsApiHooks.pfJsrtTTDReplayExecution = (JsAPIHooks::JsrtTTDReplayExecutionPtr)GetChakraCoreSymbol(library, "JsTTDReplayExecution");
     m_jsApiHooks.pfJsrtVarSerializer = (JsAPIHooks::JsrtVarSerializerPtr)GetChakraCoreSymbol(library, "JsVarSerializer");
+    m_jsApiHooks.pfJsrtVarSerializerSetTransferableVars = (JsAPIHooks::JsrtVarSerializerSetTransferableVarsPtr)GetChakraCoreSymbol(library, "JsVarSerializerSetTransferableVars");
+    m_jsApiHooks.pfJsrtVarSerializerWriteValue = (JsAPIHooks::JsrtVarSerializerWriteValuePtr)GetChakraCoreSymbol(library, "JsVarSerializerWriteValue");
+    m_jsApiHooks.pfJsrtVarSerializerReleaseData = (JsAPIHooks::JsrtVarSerializerReleaseDataPtr)GetChakraCoreSymbol(library, "JsVarSerializerReleaseData");
+    m_jsApiHooks.pfJsrtVarSerializerFree = (JsAPIHooks::JsrtVarSerializerFreePtr)GetChakraCoreSymbol(library, "JsVarSerializerFree");
     m_jsApiHooks.pfJsrtVarDeserializer = (JsAPIHooks::JsrtVarDeserializerPtr)GetChakraCoreSymbol(library, "JsVarDeserializer");
+    m_jsApiHooks.pfJsrtVarDeserializerSetTransferableVars = (JsAPIHooks::JsrtVarDeserializerSetTransferableVarsPtr)GetChakraCoreSymbol(library, "JsVarDeserializerSetTransferableVars");
+    m_jsApiHooks.pfJsrtVarDeserializerReadValue = (JsAPIHooks::JsrtVarDeserializerReadValuePtr)GetChakraCoreSymbol(library, "JsVarDeserializerReadValue");
+    m_jsApiHooks.pfJsrtVarDeserializerFree = (JsAPIHooks::JsrtVarDeserializerFreePtr)GetChakraCoreSymbol(library, "JsVarDeserializerFree");
+
     m_jsApiHooks.pfJsrtDetachArrayBuffer = (JsAPIHooks::JsrtDetachArrayBufferPtr)GetChakraCoreSymbol(library, "JsDetachArrayBuffer");
 
 #ifdef _WIN32

+ 0 - 3
bin/ch/ChakraRtInterface.h

@@ -16,7 +16,6 @@ struct JsAPIHooks
     typedef JsErrorCode (WINAPI *JsrtDisposeRuntimePtr)(JsRuntimeHandle runtime);
     typedef JsErrorCode (WINAPI *JsrtCreateObjectPtr)(JsValueRef *object);
     typedef JsErrorCode (WINAPI *JsrtCreateExternalObjectPtr)(void* data, JsFinalizeCallback callback, JsValueRef *object);
-    typedef JsErrorCode (WINAPI *JsrtCreateCustomExternalObjectPtr)(void* data, JsFinalizeCallback callback, JsGetterSetterInterceptor ** getterSetterInterceptor, JsValueRef *object);
     typedef JsErrorCode (WINAPI *JsrtGetArrayForEachFunctionPtr)(JsValueRef *result);
     typedef JsErrorCode (WINAPI *JsrtGetArrayKeysFunctionPtr)(JsValueRef *result);
     typedef JsErrorCode (WINAPI *JsrtGetArrayValuesFunctionPtr)(JsValueRef *result);
@@ -150,7 +149,6 @@ struct JsAPIHooks
     JsrtDisposeRuntimePtr pfJsrtDisposeRuntime;
     JsrtCreateObjectPtr pfJsrtCreateObject;
     JsrtCreateExternalObjectPtr pfJsrtCreateExternalObject;
-    JsrtCreateCustomExternalObjectPtr pfJsrtCreateCustomExternalObject;
     JsrtGetArrayForEachFunctionPtr pfJsrtGetArrayForEachFunction;
     JsrtGetArrayKeysFunctionPtr pfJsrtGetArrayKeysFunction;
     JsrtGetArrayValuesFunctionPtr pfJsrtGetArrayValuesFunction;
@@ -386,7 +384,6 @@ public:
     static JsErrorCode WINAPI JsDisposeRuntime(JsRuntimeHandle runtime) { return HOOK_JS_API(DisposeRuntime(runtime)); }
     static JsErrorCode WINAPI JsCreateObject(JsValueRef *object) { return HOOK_JS_API(CreateObject(object)); }
     static JsErrorCode WINAPI JsCreateExternalObject(void *data, JsFinalizeCallback callback, JsValueRef *object) { return HOOK_JS_API(CreateExternalObject(data, callback, object)); }
-    static JsErrorCode WINAPI JsCreateCustomExternalObject(void *data, JsFinalizeCallback callback, JsGetterSetterInterceptor ** getterSetterInterceptor, JsValueRef * object) { return HOOK_JS_API(CreateCustomExternalObject(data, callback, getterSetterInterceptor, object)); }
     static JsErrorCode WINAPI JsGetArrayForEachFunction(JsValueRef * result) { return HOOK_JS_API(GetArrayForEachFunction(result)); }
     static JsErrorCode WINAPI JsGetArrayKeysFunction(JsValueRef * result) { return HOOK_JS_API(GetArrayKeysFunction(result)); }
     static JsErrorCode WINAPI JsGetArrayValuesFunction(JsValueRef * result) { return HOOK_JS_API(GetArrayValuesFunction(result)); }

+ 0 - 8
lib/Jsrt/ChakraCommon.h

@@ -739,14 +739,6 @@ typedef unsigned short uint16_t;
     /// </param>
     typedef void (CHAKRA_CALLBACK *JsFinalizeCallback)(_In_opt_ void *data);
 
-    /// <summary>
-    ///     A trace callback.
-    /// </summary>
-    /// <param name="data">
-    ///     The external data that was passed in when creating the object being traced.
-    /// </param>
-    typedef void (CHAKRA_CALLBACK *JsTraceCallback)(_In_opt_ void *data);
-
     /// <summary>
     ///     A function callback.
     /// </summary>

+ 33 - 0
lib/Jsrt/ChakraCore.h

@@ -263,6 +263,14 @@ typedef bool (CHAKRA_CALLBACK *JsDOMWrapperTracingDoneCallback)(_In_opt_ void *d
 /// </summary>
 typedef void(CHAKRA_CALLBACK *JsDOMWrapperTracingEnterFinalPauseCallback)(_In_opt_ void *data);
 
+/// <summary>
+///     A trace callback.
+/// </summary>
+/// <param name="data">
+///     The external data that was passed in when creating the object being traced.
+/// </param>
+typedef void (CHAKRA_CALLBACK *JsTraceCallback)(_In_opt_ void *data);
+
 /// <summary>
 ///     Creates a new enhanced JavaScript function.
 /// </summary>
@@ -1053,6 +1061,29 @@ CHAKRA_API
         _In_ JsValueRef object2,
         _Out_ bool *result);
 
+/// <summary>
+///     Creates a new object (with prototype) that stores some external data.
+/// </summary>
+/// <remarks>
+///     Requires an active script context.
+/// </remarks>
+/// <param name="data">External data that the object will represent. May be null.</param>
+/// <param name="finalizeCallback">
+///     A callback for when the object is finalized. May be null.
+/// </param>
+/// <param name="prototype">Prototype object or nullptr.</param>
+/// <param name="object">The new object.</param>
+/// <returns>
+///     The code <c>JsNoError</c> if the operation succeeded, a failure code otherwise.
+/// </returns>
+CHAKRA_API
+    JsCreateExternalObjectWithPrototype(
+        _In_opt_ void *data,
+        _In_opt_ JsFinalizeCallback finalizeCallback,
+        _In_opt_ JsValueRef prototype,
+        _Out_ JsValueRef *object);
+
+/// <summary>
 ///     Creates a new object (with prototype) that stores some data.
 /// </summary>
 /// <remarks>
@@ -1078,6 +1109,7 @@ JsCreateTracedExternalObject(
     _In_opt_ JsValueRef prototype,
     _Out_ JsValueRef *object);
 
+/// <summary>
 ///     Creates a new object (with prototype) that stores some external data and also supports interceptors.
 /// </summary>
 /// <remarks>
@@ -1167,6 +1199,7 @@ JsIsConstructor(
     _In_ JsValueRef object,
     _Out_ bool *isConstructor);
 
+/// <summary>
 ///     Clones an object
 /// </summary>
 /// <param name="source">The original object.</param>

+ 31 - 160
lib/Jsrt/Core/JsrtCore.cpp

@@ -599,6 +599,37 @@ CHAKRA_API JsCreateCustomExternalObject(
     });
 }
 
+CHAKRA_API JsCreateTracedExternalObject(
+    _In_opt_ void *data,
+    _In_opt_ size_t inlineSlotSize,
+    _In_opt_ JsTraceCallback traceCallback,
+    _In_opt_ JsFinalizeCallback finalizeCallback,
+    _In_opt_ JsValueRef prototype,
+    _Out_ JsValueRef *object)
+{
+    return ContextAPINoScriptWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode {
+        PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTAllocateExternalObject, prototype);
+
+        PARAM_NOT_NULL(object);
+
+        Js::RecyclableObject * prototypeObject = nullptr;
+        if (prototype != JS_INVALID_REFERENCE)
+        {
+            VALIDATE_INCOMING_OBJECT_OR_NULL(prototype, scriptContext);
+            prototypeObject = Js::VarTo<Js::RecyclableObject>(prototype);
+        }
+        if (inlineSlotSize > UINT32_MAX)
+        {
+            return JsErrorInvalidArgument;
+        }
+        *object = JsrtExternalObject::Create(data, (uint)inlineSlotSize, traceCallback, finalizeCallback, prototypeObject, scriptContext, nullptr);
+
+        PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, object);
+
+        return JsNoError;
+    });
+}
+
 CHAKRA_API JsPrivateHasProperty(
     _In_ JsValueRef object,
     _In_ JsValueRef key,
@@ -830,99 +861,6 @@ CHAKRA_API JsCreateStringUtf16(
 }
 
 
-template <class CopyFunc>
-JsErrorCode WriteStringCopy(
-    JsValueRef value,
-    int start,
-    int length,
-    _Out_opt_ size_t* written,
-    const CopyFunc& copyFunc)
-{
-    if (written)
-    {
-        *written = 0;  // init to 0 for default
-    }
-
-    const char16* str = nullptr;
-    size_t strLength = 0;
-    JsErrorCode errorCode = JsStringToPointer(value, &str, &strLength);
-    if (errorCode != JsNoError)
-    {
-        return errorCode;
-    }
-
-    if (start < 0 || (size_t)start > strLength)
-    {
-        return JsErrorInvalidArgument;  // start out of range, no chars written
-    }
-
-    size_t count = min(static_cast<size_t>(length), strLength - start);
-    if (count == 0)
-    {
-        return JsNoError;  // no chars written
-    }
-
-    errorCode = copyFunc(str + start, count, written);
-    if (errorCode != JsNoError)
-    {
-        return errorCode;
-    }
-
-    if (written)
-    {
-        *written = count;
-    }
-
-    return JsNoError;
-}
-
-CHAKRA_API JsCopyStringUtf16(
-    _In_ JsValueRef value,
-    _In_ int start,
-    _In_ int length,
-    _Out_opt_ uint16_t* buffer,
-    _Out_opt_ size_t* written)
-{
-    PARAM_NOT_NULL(value);
-    VALIDATE_JSREF(value);
-
-    return WriteStringCopy(value, start, length, written,
-        [buffer](const char16* src, size_t count, size_t *needed)
-    {
-        if (buffer)
-        {
-            memmove(buffer, src, sizeof(char16) * count);
-        }
-        return JsNoError;
-    });
-}
-
-CHAKRA_API JsCopyString(
-    _In_ JsValueRef value,
-    _Out_opt_ char* buffer,
-    _In_ size_t bufferSize,
-    _Out_opt_ size_t* length)
-{
-    PARAM_NOT_NULL(value);
-    VALIDATE_JSREF(value);
-
-    const char16* str = nullptr;
-    size_t strLength = 0;
-    JsErrorCode errorCode = JsStringToPointer(value, &str, &strLength);
-    if (errorCode != JsNoError)
-    {
-        return errorCode;
-    }
-
-    utf8::WideToNarrow utf8Str(str, strLength, buffer, bufferSize);
-    if (length)
-    {
-        *length = utf8Str.Length();
-    }
-
-    return JsNoError;
-}
-
 CHAKRA_API JsCreatePropertyString(
     _In_z_ const char *name,
     _In_ size_t length,
@@ -943,50 +881,6 @@ CHAKRA_API JsCreatePropertyString(
     });
 }
 
-CHAKRA_API JsCopyPropertyId(
-    _In_ JsPropertyIdRef propertyId,
-    _Out_ char* buffer,
-    _In_ size_t bufferSize,
-    _Out_ size_t* length)
-{
-    PARAM_NOT_NULL(propertyId);
-
-    const char16* str = nullptr;
-    JsErrorCode errorCode = JsGetPropertyNameFromId(propertyId, &str);
-
-    if (errorCode != JsNoError)
-    {
-        return errorCode;
-    }
-
-    utf8::WideToNarrow utf8Str(str);
-    if (!buffer)
-    {
-        if (length)
-        {
-            *length = utf8Str.Length();
-        }
-    }
-    else
-    {
-        size_t count = min(bufferSize, utf8Str.Length());
-        // Try to copy whole characters if buffer size insufficient
-        auto maxFitChars = utf8::ByteIndexIntoCharacterIndex(
-            (LPCUTF8)(const char*)utf8Str, count,
-            utf8::DecodeOptions::doChunkedEncoding);
-        count = utf8::CharacterIndexToByteIndex(
-            (LPCUTF8)(const char*)utf8Str, utf8Str.Length(), maxFitChars);
-
-        memmove(buffer, utf8Str, sizeof(char) * count);
-        if (length)
-        {
-            *length = count;
-        }
-    }
-
-    return JsNoError;
-}
-
 CHAKRA_API JsCreatePromise(_Out_ JsValueRef *promise, _Out_ JsValueRef *resolve, _Out_ JsValueRef *reject)
 {
     return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode {
@@ -1219,29 +1113,6 @@ CHAKRA_API JsGetAndClearExceptionWithMetadata(_Out_ JsValueRef *metadata)
     });
 }
 
-CHAKRA_API JsCopyStringOneByte(
-    _In_ JsValueRef value,
-    _In_ int start,
-    _In_ int length,
-    _Out_opt_ char* buffer,
-    _Out_opt_ size_t* written)
-{
-    PARAM_NOT_NULL(value);
-    VALIDATE_JSREF(value);
-    return WriteStringCopy(value, start, length, written,
-        [buffer](const char16* src, size_t count, size_t *needed)
-    {
-        if (buffer)
-        {
-            for (size_t i = 0; i < count; i++)
-            {
-                buffer[i] = (char)src[i];
-            }
-        }
-        return JsNoError;
-    });
-}
-
 CHAKRA_API JsGetDataViewInfo(
     _In_ JsValueRef dataView,
     _Out_opt_ JsValueRef *arrayBuffer,

+ 179 - 13
lib/Jsrt/Jsrt.cpp

@@ -231,7 +231,7 @@ void CALLBACK CreateExternalObject_TTDCallback(Js::ScriptContext* ctx, Js::Var p
         prototypeObject = Js::VarTo<Js::RecyclableObject>(prototype);
     }
 
-    *object = JsrtExternalObject::Create(nullptr, 0, nullptr, nullptr, prototypeObject, ctx, nullptr);
+    *object = JsrtExternalObject::Create(nullptr, 0, nullptr, prototypeObject, ctx, nullptr);
 }
 
 void CALLBACK TTDDummyPromiseContinuationCallback(JsValueRef task, void *callbackState)
@@ -1331,10 +1331,7 @@ CHAKRA_API JsCreateObject(_Out_ JsValueRef *object)
     });
 }
 
-CHAKRA_API JsCreateTracedExternalObject(
-    _In_opt_ void *data,
-    _In_opt_ size_t inlineSlotSize,
-    _In_opt_ JsTraceCallback traceCallback,
+CHAKRA_API JsCreateExternalObjectWithPrototype(_In_opt_ void *data,
     _In_opt_ JsFinalizeCallback finalizeCallback,
     _In_opt_ JsValueRef prototype,
     _Out_ JsValueRef *object)
@@ -1347,14 +1344,11 @@ CHAKRA_API JsCreateTracedExternalObject(
         Js::RecyclableObject * prototypeObject = nullptr;
         if (prototype != JS_INVALID_REFERENCE)
         {
-            VALIDATE_INCOMING_OBJECT_OR_NULL(prototype, scriptContext);
+            VALIDATE_INCOMING_OBJECT(prototype, scriptContext);
             prototypeObject = Js::VarTo<Js::RecyclableObject>(prototype);
         }
-        if (inlineSlotSize > UINT32_MAX)
-        {
-            return JsErrorInvalidArgument;
-        }
-        *object = JsrtExternalObject::Create(data, (uint)inlineSlotSize, traceCallback, finalizeCallback, prototypeObject, scriptContext, nullptr);
+
+        *object = JsrtExternalObject::Create(data, 0, finalizeCallback, prototypeObject, scriptContext, nullptr);
 
         PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, object);
 
@@ -1364,7 +1358,7 @@ CHAKRA_API JsCreateTracedExternalObject(
 
 CHAKRA_API JsCreateExternalObject(_In_opt_ void *data, _In_opt_ JsFinalizeCallback finalizeCallback, _Out_ JsValueRef *object)
 {
-    return JsCreateTracedExternalObject(data, 0, nullptr, finalizeCallback, JS_INVALID_REFERENCE, object);
+    return JsCreateExternalObjectWithPrototype(data, finalizeCallback, JS_INVALID_REFERENCE, object);
 }
 
 CHAKRA_API JsConvertValueToObject(_In_ JsValueRef value, _Out_ JsValueRef *result)
@@ -1751,6 +1745,7 @@ CHAKRA_API JsHasProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId
     {
         return ContextAPIWrapper<JSRT_MAYBE_TRUE>(internalHasProperty);
     }
+#ifdef _CHAKRACOREBUILD
     else if (typeId == Js::TypeIds_Object)
     {
         // CEOs can also have traps so we would want the Enter/Leave semantics for those.
@@ -1760,6 +1755,7 @@ CHAKRA_API JsHasProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId
             return ContextAPIWrapper<JSRT_MAYBE_TRUE>(internalHasProperty);
         }
     }
+#endif
 
     return ContextAPINoScriptWrapper(internalHasProperty);
 }
@@ -2730,7 +2726,11 @@ CHAKRA_API JsHasExternalData(_In_ JsValueRef object, _Out_ bool *value)
         {
             object = Js::VarTo<Js::JavascriptProxy>(object);
         }
-        *value = (Js::VarIs<JsrtExternalObject>(object) || Js::VarIs<Js::CustomExternalWrapperObject>(object));
+        *value = (Js::VarIs<JsrtExternalObject>(object)
+#ifdef _CHAKRACOREBUILD
+            || Js::VarIs<Js::CustomExternalWrapperObject>(object)
+#endif
+            );
     }
     END_JSRT_NO_EXCEPTION
 }
@@ -2750,10 +2750,12 @@ CHAKRA_API JsGetExternalData(_In_ JsValueRef object, _Out_ void **data)
         {
             *data = Js::VarTo<JsrtExternalObject>(object)->GetSlotData();
         }
+#ifdef _CHAKRACOREBUILD
         else if (Js::VarIs<Js::CustomExternalWrapperObject>(object))
         {
             *data = Js::VarTo<Js::CustomExternalWrapperObject>(object)->GetSlotData();
         }
+#endif
         else
         {
             *data = nullptr;
@@ -2777,10 +2779,12 @@ CHAKRA_API JsSetExternalData(_In_ JsValueRef object, _In_opt_ void *data)
         {
             Js::VarTo<JsrtExternalObject>(object)->SetSlotData(data);
         }
+#ifdef _CHAKRACOREBUILD
         else if (Js::VarIs<Js::CustomExternalWrapperObject>(object))
         {
             Js::VarTo<Js::CustomExternalWrapperObject>(object)->SetSlotData(data);
         }
+#endif
         else
         {
             RETURN_NO_EXCEPTION(JsErrorInvalidArgument);
@@ -4851,6 +4855,100 @@ CHAKRA_API JsTTDDiagSetAutoTraceStatus(_In_ bool status)
 
 #ifdef _CHAKRACOREBUILD
 
+
+template <class CopyFunc>
+JsErrorCode WriteStringCopy(
+    JsValueRef value,
+    int start,
+    int length,
+    _Out_opt_ size_t* written,
+    const CopyFunc& copyFunc)
+{
+    if (written)
+    {
+        *written = 0;  // init to 0 for default
+    }
+
+    const char16* str = nullptr;
+    size_t strLength = 0;
+    JsErrorCode errorCode = JsStringToPointer(value, &str, &strLength);
+    if (errorCode != JsNoError)
+    {
+        return errorCode;
+    }
+
+    if (start < 0 || (size_t)start > strLength)
+    {
+        return JsErrorInvalidArgument;  // start out of range, no chars written
+    }
+
+    size_t count = min(static_cast<size_t>(length), strLength - start);
+    if (count == 0)
+    {
+        return JsNoError;  // no chars written
+    }
+
+    errorCode = copyFunc(str + start, count, written);
+    if (errorCode != JsNoError)
+    {
+        return errorCode;
+    }
+
+    if (written)
+    {
+        *written = count;
+    }
+
+    return JsNoError;
+}
+
+CHAKRA_API JsCopyStringUtf16(
+    _In_ JsValueRef value,
+    _In_ int start,
+    _In_ int length,
+    _Out_opt_ uint16_t* buffer,
+    _Out_opt_ size_t* written)
+{
+    PARAM_NOT_NULL(value);
+    VALIDATE_JSREF(value);
+
+    return WriteStringCopy(value, start, length, written,
+        [buffer](const char16* src, size_t count, size_t *needed)
+        {
+            if (buffer)
+            {
+                memmove(buffer, src, sizeof(char16) * count);
+            }
+            return JsNoError;
+        });
+}
+
+CHAKRA_API JsCopyString(
+    _In_ JsValueRef value,
+    _Out_opt_ char* buffer,
+    _In_ size_t bufferSize,
+    _Out_opt_ size_t* length)
+{
+    PARAM_NOT_NULL(value);
+    VALIDATE_JSREF(value);
+
+    const char16* str = nullptr;
+    size_t strLength = 0;
+    JsErrorCode errorCode = JsStringToPointer(value, &str, &strLength);
+    if (errorCode != JsNoError)
+    {
+        return errorCode;
+    }
+
+    utf8::WideToNarrow utf8Str(str, strLength, buffer, bufferSize);
+    if (length)
+    {
+        *length = utf8Str.Length();
+    }
+
+    return JsNoError;
+}
+
 _ALWAYSINLINE JsErrorCode CompileRun(
     JsValueRef scriptVal,
     JsSourceContext sourceContext,
@@ -4958,6 +5056,50 @@ CHAKRA_API JsCreatePropertyId(
     return JsGetPropertyIdFromNameInternal(wname, wname.Length(), propertyId);
 }
 
+CHAKRA_API JsCopyPropertyId(
+    _In_ JsPropertyIdRef propertyId,
+    _Out_ char* buffer,
+    _In_ size_t bufferSize,
+    _Out_ size_t* length)
+{
+    PARAM_NOT_NULL(propertyId);
+
+    const char16* str = nullptr;
+    JsErrorCode errorCode = JsGetPropertyNameFromId(propertyId, &str);
+
+    if (errorCode != JsNoError)
+    {
+        return errorCode;
+    }
+
+    utf8::WideToNarrow utf8Str(str);
+    if (!buffer)
+    {
+        if (length)
+        {
+            *length = utf8Str.Length();
+        }
+    }
+    else
+    {
+        size_t count = min(bufferSize, utf8Str.Length());
+        // Try to copy whole characters if buffer size insufficient
+        auto maxFitChars = utf8::ByteIndexIntoCharacterIndex(
+            (LPCUTF8)(const char*)utf8Str, count,
+            utf8::DecodeOptions::doChunkedEncoding);
+        count = utf8::CharacterIndexToByteIndex(
+            (LPCUTF8)(const char*)utf8Str, utf8Str.Length(), maxFitChars);
+
+        memmove(buffer, utf8Str, sizeof(char) * count);
+        if (length)
+        {
+            *length = count;
+        }
+    }
+
+    return JsNoError;
+}
+
 CHAKRA_API JsSerialize(
     _In_ JsValueRef scriptVal,
     _Out_ JsValueRef *bufferVal,
@@ -5075,6 +5217,30 @@ CHAKRA_API JsRunSerialized(
         buffer, arrayBuffer, sourceContext, url, 0, false, false, result, Js::Constants::InvalidSourceIndex);
 }
 
+
+CHAKRA_API JsCopyStringOneByte(
+    _In_ JsValueRef value,
+    _In_ int start,
+    _In_ int length,
+    _Out_opt_ char* buffer,
+    _Out_opt_ size_t* written)
+{
+    PARAM_NOT_NULL(value);
+    VALIDATE_JSREF(value);
+    return WriteStringCopy(value, start, length, written,
+        [buffer](const char16* src, size_t count, size_t *needed)
+    {
+        if (buffer)
+        {
+            for (size_t i = 0; i < count; i++)
+            {
+                buffer[i] = (char)src[i];
+            }
+        }
+        return JsNoError;
+    });
+}
+
 CHAKRA_API JsSerializeParserStateCore(
     _In_z_ const byte* script,
     _In_ size_t cb,

+ 1 - 0
lib/Jsrt/JsrtCommonExports.inc

@@ -112,6 +112,7 @@
     JsCopyStringOneByte
     JsCopyStringUtf16
     JsCreateCustomExternalObject
+    JsCreateExternalObjectWithPrototype
     JsCreatePromise
     JsCreateTracedExternalObject
     JsCreatePropertyId

+ 68 - 0
lib/Jsrt/JsrtExternalObject.cpp

@@ -7,6 +7,7 @@
 #include "JsrtExternalObject.h"
 #include "Types/PathTypeHandler.h"
 
+#ifdef _CHAKRACOREBUILD
 JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype)
     : Js::DynamicType(
         scriptContext,
@@ -21,6 +22,23 @@ JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsTraceCall
 {
     this->flags |= TypeFlagMask_JsrtExternal;
 }
+#endif
+JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype)
+    : Js::DynamicType(
+        scriptContext,
+        Js::TypeIds_Object,
+        prototype,
+        nullptr,
+        Js::PathTypeHandlerNoAttr::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, 0, 0, true, true),
+        true,
+        true)
+#ifdef _CHAKRACOREBUILD
+    , jsTraceCallback(nullptr)
+#endif
+    , jsFinalizeCallback(finalizeCallback)
+{
+    this->flags |= TypeFlagMask_JsrtExternal;
+}
 
 JsrtExternalObject::JsrtExternalObject(JsrtExternalType * type, void *data, uint inlineSlotSize) :
     Js::DynamicObject(type, true /* initSlots*/)
@@ -41,6 +59,7 @@ JsrtExternalObject::JsrtExternalObject(JsrtExternalType * type, void *data, uint
     }
 }
 
+#ifdef _CHAKRACOREBUILD
 /* static */
 JsrtExternalObject* JsrtExternalObject::Create(void *data, uint inlineSlotSize, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type)
 {
@@ -77,20 +96,69 @@ JsrtExternalObject* JsrtExternalObject::Create(void *data, uint inlineSlotSize,
 
     return externalObject;
 }
+#endif
+/* static */
+JsrtExternalObject* JsrtExternalObject::Create(void *data, uint inlineSlotSize, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type)
+{
+    if (prototype == nullptr)
+    {
+        prototype = scriptContext->GetLibrary()->GetObjectPrototype();
+    }
+    if (type == nullptr)
+    {
+#ifdef _CHAKRACOREBUILD
+        type = scriptContext->GetLibrary()->GetCachedJsrtExternalType(0, reinterpret_cast<uintptr_t>(finalizeCallback), reinterpret_cast<uintptr_t>(prototype));
+#else
+        type = scriptContext->GetLibrary()->GetCachedJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback), reinterpret_cast<uintptr_t>(prototype));
+#endif
+
+        if (type == nullptr)
+        {
+            type = RecyclerNew(scriptContext->GetRecycler(), JsrtExternalType, scriptContext, finalizeCallback, prototype);
+#ifdef _CHAKRACOREBUILD
+            scriptContext->GetLibrary()->CacheJsrtExternalType(0, reinterpret_cast<uintptr_t>(finalizeCallback), reinterpret_cast<uintptr_t>(prototype), type);
+#else
+            scriptContext->GetLibrary()->CacheJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback), reinterpret_cast<uintptr_t>(prototype), type);
+#endif
+        }
+    }
+
+    Assert(type->IsJsrtExternal());
+
+    JsrtExternalObject * externalObject;
+    if (finalizeCallback != nullptr)
+    {
+        externalObject = RecyclerNewFinalizedPlus(scriptContext->GetRecycler(), inlineSlotSize, JsrtExternalObject, static_cast<JsrtExternalType*>(type), data, inlineSlotSize);
+    }
+    else
+    {
+        externalObject = RecyclerNewPlus(scriptContext->GetRecycler(), inlineSlotSize, JsrtExternalObject, static_cast<JsrtExternalType*>(type), data, inlineSlotSize);
+    }
+
+    return externalObject;
+}
 
 void JsrtExternalObject::Mark(Recycler * recycler) 
 {
+#ifdef _CHAKRACOREBUILD
     recycler->SetNeedExternalWrapperTracing();
     JsTraceCallback traceCallback = this->GetExternalType()->GetJsTraceCallback();
     Assert(nullptr != traceCallback);
     JsrtCallbackState scope(nullptr);
     traceCallback(this->GetSlotData());
+#else
+    Assert(UNREACHED);
+#endif
 }
 
 void JsrtExternalObject::Finalize(bool isShutdown)
 {
     JsFinalizeCallback finalizeCallback = this->GetExternalType()->GetJsFinalizeCallback();
+#ifdef _CHAKRACOREBUILD
     Assert(this->GetExternalType()->GetJsTraceCallback() != nullptr || finalizeCallback != nullptr);
+#else
+    Assert(finalizeCallback != nullptr);
+#endif
     if (nullptr != finalizeCallback)
     {
         JsrtCallbackState scope(nullptr);

+ 17 - 2
lib/Jsrt/JsrtExternalObject.h

@@ -27,16 +27,28 @@
 class JsrtExternalType sealed : public Js::DynamicType
 {
 public:
-    JsrtExternalType(JsrtExternalType *type) : Js::DynamicType(type), jsTraceCallback(type->jsTraceCallback), jsFinalizeCallback(type->jsFinalizeCallback) {}
+    JsrtExternalType(JsrtExternalType *type) :
+        Js::DynamicType(type),
+#ifdef _CHAKRACOREBUILD
+        jsTraceCallback(type->jsTraceCallback),
+#endif
+        jsFinalizeCallback(type->jsFinalizeCallback) {}
+#ifdef _CHAKRACOREBUILD
     JsrtExternalType(Js::ScriptContext* scriptContext, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype);
+#endif
+    JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype);
 
     //Js::PropertyId GetNameId() const { return ((Js::PropertyRecord *)typeDescription.className)->GetPropertyId(); }
+#ifdef _CHAKRACOREBUILD
     JsTraceCallback GetJsTraceCallback() const { return this->jsTraceCallback; }
+#endif
     JsFinalizeCallback GetJsFinalizeCallback() const { return this->jsFinalizeCallback; }
 
 private:
-    FieldNoBarrier(JsTraceCallback const) jsTraceCallback;
     FieldNoBarrier(JsFinalizeCallback const) jsFinalizeCallback;
+#ifdef _CHAKRACOREBUILD
+    FieldNoBarrier(JsTraceCallback const) jsTraceCallback;
+#endif
 };
 AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalType, &Js::Type::DumpObjectFunction);
 
@@ -49,7 +61,10 @@ protected:
 public:
     JsrtExternalObject(JsrtExternalType * type, void *data, uint inlineSlotSize);
 
+#ifdef _CHAKRACOREBUILD
     static JsrtExternalObject * Create(void *data, uint inlineSlotSize, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type);
+#endif
+    static JsrtExternalObject * Create(void *data, uint inlineSlotSize, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type);
 
     JsrtExternalType * GetExternalType() const { return (JsrtExternalType *)this->GetType(); }
 

+ 12 - 0
lib/Runtime/Language/JavascriptOperators.cpp

@@ -1098,6 +1098,7 @@ CommonNumber:
         {
             return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext);
         }
+#ifdef _CHAKRACOREBUILD
         else
         {
             CustomExternalWrapperObject * wrapper = JavascriptOperators::TryFromVar<CustomExternalWrapperObject>(instance);
@@ -1106,6 +1107,7 @@ CommonNumber:
                 return wrapper->PropertyKeysTrap(CustomExternalWrapperObject::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext);
             }
         }
+#endif
 
         return JavascriptObject::CreateOwnStringPropertiesHelper(object, scriptContext);
     }
@@ -1121,6 +1123,7 @@ CommonNumber:
         {
             return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertySymbolKind, scriptContext);
         }
+#ifdef _CHAKRACOREBUILD
         else
         {
             CustomExternalWrapperObject * wrapper = JavascriptOperators::TryFromVar<CustomExternalWrapperObject>(instance);
@@ -1129,6 +1132,7 @@ CommonNumber:
                 return wrapper->PropertyKeysTrap(CustomExternalWrapperObject::KeysTrapKind::GetOwnPropertySymbolKind, scriptContext);
             }
         }
+#endif
 
         return JavascriptObject::CreateOwnSymbolPropertiesHelper(object, scriptContext);
     }
@@ -1143,6 +1147,7 @@ CommonNumber:
         {
             return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext);
         }
+#ifdef _CHAKRACOREBUILD
         else
         {
             CustomExternalWrapperObject * wrapper = JavascriptOperators::TryFromVar<CustomExternalWrapperObject>(instance);
@@ -1151,6 +1156,7 @@ CommonNumber:
                 return wrapper->PropertyKeysTrap(CustomExternalWrapperObject::KeysTrapKind::KeysKind, scriptContext);
             }
         }
+#endif
 
         return JavascriptObject::CreateOwnStringSymbolPropertiesHelper(object, scriptContext);
     }
@@ -1186,6 +1192,7 @@ CommonNumber:
             }
             return proxyResultToReturn;
         }
+#ifdef _CHAKRACOREBUILD
         else
         {
             CustomExternalWrapperObject * wrapper = JavascriptOperators::TryFromVar<CustomExternalWrapperObject>(object);
@@ -1221,6 +1228,7 @@ CommonNumber:
                 return wrapperResultToReturn;
             }
         }
+#endif
 
         return JavascriptObject::CreateOwnEnumerableStringPropertiesHelper(object, scriptContext);
     }
@@ -1232,6 +1240,7 @@ CommonNumber:
         {
             return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext);
         }
+#ifdef _CHAKRACOREBUILD
         else
         {
             CustomExternalWrapperObject * wrapper = JavascriptOperators::TryFromVar<CustomExternalWrapperObject>(object);
@@ -1240,6 +1249,7 @@ CommonNumber:
                 return wrapper->PropertyKeysTrap(CustomExternalWrapperObject::KeysTrapKind::EnumerableKeysKind, scriptContext);
             }
         }
+#endif
 
         return JavascriptObject::CreateOwnEnumerableStringSymbolPropertiesHelper(object, scriptContext);
     }
@@ -8808,6 +8818,7 @@ SetElementIHelper_INDEX_TYPE_IS_NUMBER:
         {
             return JavascriptProxy::DefineOwnPropertyDescriptor(obj, propId, descriptor, throwOnError, scriptContext);
         }
+#ifdef _CHAKRACOREBUILD
         else if (VarIs<CustomExternalWrapperObject>(obj))
         {
             // See if there is a trap for defineProperty.
@@ -8817,6 +8828,7 @@ SetElementIHelper_INDEX_TYPE_IS_NUMBER:
                 return TRUE;
             }
         }
+#endif
 
         PropertyDescriptor currentDescriptor;
         BOOL isCurrentDescriptorDefined = JavascriptOperators::GetOwnPropertyDescriptor(obj, propId, scriptContext, &currentDescriptor);

+ 2 - 0
lib/Runtime/Language/RuntimeLanguagePch.h

@@ -34,7 +34,9 @@
 
 #include "Types/TypePropertyCache.h"
 #include "Library/JavascriptVariantDate.h"
+#ifdef _CHAKRACOREBUILD
 #include "Library/CustomExternalWrapperObject.h"
+#endif
 #include "Library/JavascriptProxy.h"
 #include "Library/JavascriptSymbolObject.h"
 #include "Library/JavascriptGenerator.h"

+ 4 - 0
lib/Runtime/Library/CustomExternalWrapperObject.cpp

@@ -2,7 +2,10 @@
 // Copyright (C) Microsoft. All rights reserved.
 // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
 //-------------------------------------------------------------------------------------------------------
+
 #include "RuntimeLibraryPch.h"
+
+#ifdef _CHAKRACOREBUILD
 #include "Types/PathTypeHandler.h"
 
 using namespace Js;
@@ -1367,3 +1370,4 @@ void CustomExternalWrapperObject::ExtractSnapObjectDataInto(TTD::NSSnapObjects::
     TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<void*, TTD::NSSnapObjects::SnapObjectType::SnapExternalObject>(objData, nullptr);
 }
 #endif
+#endif // _CHAKRACOREBUILD

+ 21 - 2
lib/Runtime/Library/JavascriptLibrary.cpp

@@ -4469,7 +4469,12 @@ namespace Js
         return function;
     }
 
-    JsrtExternalType* JavascriptLibrary::GetCachedJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype)
+    JsrtExternalType* JavascriptLibrary::GetCachedJsrtExternalType(
+#ifdef _CHAKRACOREBUILD
+        uintptr_t traceCallback,
+#endif
+        uintptr_t finalizeCallback,
+        uintptr_t prototype)
     {
         RecyclerWeakReference<DynamicType>* dynamicTypeWeakRef = nullptr;
         DynamicType* dynamicType = nullptr;
@@ -4479,18 +4484,31 @@ namespace Js
             // Register for periodic cleanup
             scriptContext->RegisterWeakReferenceDictionary(jsrtExternalTypesCache);
         }
-        if (jsrtExternalTypesCache->TryGetValue(JsrtExternalCallbacks(traceCallback, finalizeCallback, prototype), &dynamicTypeWeakRef))
+        if (jsrtExternalTypesCache->TryGetValue(JsrtExternalCallbacks(
+#ifdef _CHAKRACOREBUILD
+            traceCallback,
+#endif
+            finalizeCallback,
+            prototype), &dynamicTypeWeakRef))
         {
             dynamicType = dynamicTypeWeakRef->Get();
         }
         return (JsrtExternalType*)dynamicType;
     }
 
+#ifdef _CHAKRACOREBUILD
     void JavascriptLibrary::CacheJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicTypeToCache)
     {
         jsrtExternalTypesCache->Item(JsrtExternalCallbacks(traceCallback, finalizeCallback, prototype), recycler->CreateWeakReferenceHandle<DynamicType>((DynamicType*)dynamicTypeToCache));
     }
+#else
+    void JavascriptLibrary::CacheJsrtExternalType(uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicTypeToCache)
+    {
+        jsrtExternalTypesCache->Item(JsrtExternalCallbacks(finalizeCallback, prototype), recycler->CreateWeakReferenceHandle<DynamicType>((DynamicType*)dynamicTypeToCache));
+    }
+#endif
 
+#ifdef _CHAKRACOREBUILD
     DynamicType* JavascriptLibrary::GetCachedCustomExternalWrapperType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype)
     {
         RecyclerWeakReference<DynamicType>* dynamicTypeWeakRef = nullptr;
@@ -4512,6 +4530,7 @@ namespace Js
     {
         customExternalWrapperTypesCache->Item(CustomExternalWrapperCallbacks(traceCallback, finalizeCallback, interceptors, prototype), recycler->CreateWeakReferenceHandle<DynamicType>(dynamicTypeToCache));
     }
+#endif
 
     void JavascriptLibrary::DefaultCreateFunction(ParseableFunctionInfo * functionInfo, int length, DynamicObject * prototype, PropertyId nameId)
     {

+ 22 - 2
lib/Runtime/Library/JavascriptLibrary.h

@@ -442,16 +442,30 @@ namespace Js
         Field(void *) nativeHostPromiseContinuationFunctionState;
 
         typedef SList<Js::FunctionProxy*, Recycler> FunctionReferenceList;
+#ifdef _CHAKRACOREBUILD
         struct JsrtExternalCallbacks
         {
             JsrtExternalCallbacks() : traceCallback(0), finalizeCallback(0), prototype(0) {}
             JsrtExternalCallbacks(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype) : traceCallback(traceCallback), finalizeCallback(finalizeCallback), prototype(prototype) {}
+
             uintptr_t traceCallback;
             uintptr_t finalizeCallback;
             uintptr_t prototype;
 
             operator hash_t() const { return (hash_t)(traceCallback ^ finalizeCallback ^ prototype); }
         };
+#else
+        struct JsrtExternalCallbacks
+        {
+            JsrtExternalCallbacks() : finalizeCallback(0), prototype(0) {}
+            JsrtExternalCallbacks(uintptr_t finalizeCallback, uintptr_t prototype) : finalizeCallback(finalizeCallback), prototype(prototype) {}
+
+            uintptr_t finalizeCallback;
+            uintptr_t prototype;
+
+            operator hash_t() const { return (hash_t)(finalizeCallback ^ prototype); }
+        };
+#endif
         typedef JsUtil::WeakReferenceDictionary<JsrtExternalCallbacks, DynamicType, DictionarySizePolicy<PowerOf2Policy, 1>> JsrtExternalTypesCache;
 
         Field(void *) bindRefChunkBegin;
@@ -916,10 +930,16 @@ namespace Js
         JavascriptExternalFunction* CreateIdMappedExternalFunction(MethodType entryPoint, DynamicType *pPrototypeType);
         JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, RecyclableObject * prototype);
         JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, InitializeMethod method, unsigned short deferredTypeSlots, bool hasAccessors);
-        JsrtExternalType* GetCachedJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype);
-        void CacheJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicType);
+#ifdef _CHAKRACOREBUILD
         DynamicType* GetCachedCustomExternalWrapperType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype);
         void CacheCustomExternalWrapperType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype, DynamicType* dynamicType);
+
+        JsrtExternalType* GetCachedJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype);
+        void CacheJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicType);
+#else
+        JsrtExternalType* GetCachedJsrtExternalType(uintptr_t finalizeCallback, uintptr_t prototype);
+        void CacheJsrtExternalType(uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicType);
+#endif
         static DynamicTypeHandler * GetDeferredPrototypeGeneratorFunctionTypeHandler(ScriptContext* scriptContext);
         static DynamicTypeHandler * GetDeferredPrototypeAsyncFunctionTypeHandler(ScriptContext* scriptContext);
         DynamicType * CreateDeferredPrototypeGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);

+ 2 - 0
lib/Runtime/Library/RuntimeLibraryPch.h

@@ -40,7 +40,9 @@
 #include "Library/JavascriptVariantDate.h"
 #include "Library/JavascriptPromise.h"
 #include "Library/JavascriptSymbolObject.h"
+#ifdef _CHAKRACOREBUILD
 #include "Library/CustomExternalWrapperObject.h"
+#endif
 #include "Library/JavascriptProxy.h"
 #include "Library/JavascriptReflect.h"
 #include "Library/JavascriptGenerator.h"

+ 4 - 0
lib/Runtime/Runtime.h

@@ -98,7 +98,9 @@ namespace Js
     class JavascriptBooleanObject;
     class JavascriptSymbol;
     class JavascriptSymbolObject;
+#ifdef _CHAKRACOREBUILD
     class CustomExternalWrapperObject;
+#endif
     class JavascriptProxy;
     class JavascriptReflect;
     class JavascriptEnumeratorIterator;
@@ -528,7 +530,9 @@ enum tagDEBUG_EVENT_INFO_TYPE
 #include "Types/ScriptFunctionType.h"
 #include "Library/ScriptFunction.h"
 
+#ifdef _CHAKRACOREBUILD
 #include "Library/CustomExternalWrapperObject.h"
+#endif
 #include "Library/JavascriptProxy.h"
 
 #if ENABLE_TTD

+ 10 - 4
lib/Runtime/Types/RecyclableObject.cpp

@@ -195,8 +195,11 @@ namespace Js
         {
             DynamicObject* obj = UnsafeVarTo<DynamicObject>(this);
             return obj->GetTypeHandler()->GetHasOnlyWritableDataProperties() &&
-                (!obj->HasObjectArray() || obj->GetObjectArrayOrFlagsAsArray()->HasOnlyWritableDataProperties()) &&
-                (!VarIs<CustomExternalWrapperObject>(obj) || UnsafeVarTo<CustomExternalWrapperObject>(obj)->IsInitialized());
+                (!obj->HasObjectArray() || obj->GetObjectArrayOrFlagsAsArray()->HasOnlyWritableDataProperties())
+#ifdef _CHAKRACOREBUILD
+                && (!VarIs<CustomExternalWrapperObject>(obj) || UnsafeVarTo<CustomExternalWrapperObject>(obj)->IsInitialized())
+#endif
+                ;
         }
 
         return true;
@@ -208,8 +211,11 @@ namespace Js
         {
             DynamicObject* obj = UnsafeVarTo<DynamicObject>(this);
             return obj->GetTypeHandler()->GetHasSpecialProperties() ||
-                (obj->HasObjectArray() && obj->GetObjectArrayOrFlagsAsArray()->HasAnySpecialProperties()) ||
-                (VarIs<CustomExternalWrapperObject>(obj) && !UnsafeVarTo<CustomExternalWrapperObject>(obj)->IsInitialized());
+                (obj->HasObjectArray() && obj->GetObjectArrayOrFlagsAsArray()->HasAnySpecialProperties())
+#ifdef _CHAKRACOREBUILD
+                || (VarIs<CustomExternalWrapperObject>(obj) && !UnsafeVarTo<CustomExternalWrapperObject>(obj)->IsInitialized())
+#endif
+                ;
         }
 
         return true;