//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once #include "ChakraCommon.h" #define BEGIN_INTERCEPTOR(scriptContext) \ BEGIN_LEAVE_SCRIPT(scriptContext) \ try { #define END_INTERCEPTOR(scriptContext) \ } \ catch (...) \ { \ Assert(false); \ } \ END_LEAVE_SCRIPT(scriptContext) \ \ if (scriptContext->HasRecordedException()) \ { \ scriptContext->RethrowRecordedException(NULL); \ } class JsrtExternalType sealed : public Js::DynamicType { public: JsrtExternalType(JsrtExternalType *type) : Js::DynamicType(type), jsFinalizeCallback(type->jsFinalizeCallback) {} JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback); //Js::PropertyId GetNameId() const { return ((Js::PropertyRecord *)typeDescription.className)->GetPropertyId(); } JsFinalizeCallback GetJsFinalizeCallback() const { return this->jsFinalizeCallback; } private: FieldNoBarrier(JsFinalizeCallback) jsFinalizeCallback; }; AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalType, &Js::Type::DumpObjectFunction); class JsrtExternalObject : public Js::DynamicObject { protected: DEFINE_VTABLE_CTOR(JsrtExternalObject, Js::DynamicObject); DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JsrtExternalObject); public: JsrtExternalObject(JsrtExternalType * type, void *data); static bool Is(Js::Var value); static JsrtExternalObject * FromVar(Js::Var value); static JsrtExternalObject * UnsafeFromVar(Js::Var value); static JsrtExternalObject * Create(void *data, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext); JsrtExternalType * GetExternalType() const { return (JsrtExternalType *)this->GetType(); } void Finalize(bool isShutdown) override; void Dispose(bool isShutdown) override; bool HasReadOnlyPropertiesInvisibleToTypeHandler() override { return true; } Js::DynamicType* DuplicateType() override; void * GetSlotData() const; void SetSlotData(void * data); private: Field(void *) slot; #if ENABLE_TTD public: virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override; virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; #endif }; AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalObject, &Js::RecyclableObject::DumpObjectFunction);