#pragma once #include "Reflection/reflection.h" #include "Script/ThreadRef.h" #include "Script/LuaSourceContainer.h" #include "Util/ProtectedString.h" #include "V8Tree/Instance.h" #include #include namespace RBX { extern const char* const sModuleScript; class ModuleScript : public DescribedCreatable { public: static const Reflection::PropDescriptor prop_Source; enum ScriptSetupState { NotRunYet = 0, Running = 1, CompletedError = 2, CompletedSuccess = 3 }; class PerVMState { public: PerVMState(); virtual ~PerVMState(); int getResultRegistryIndex() const; // Destroy the current result index and replace it with index. void reassignResultRegistryIndex(int newIndex); void setRunning(boost::intrusive_ptr node); void setCompletedError(); void setCompletedSuccess(lua_State* globalStateContainingResult, int resultRegistryIndex); ScriptSetupState getCurrentState() const; void addYieldedImporter(Lua::WeakThreadRef L); void getAndClearYieldedImporters(std::vector* out); void cleanupAndResetState(); void resetState(); private: ScriptSetupState scriptLoadingState; boost::intrusive_ptr node; lua_State* globalStateContainingResult; int resultRegistryIndex; std::vector yieldedImporters; void releaseReferenceIfCompletedSuccessfully(); void releaseScriptNodeIfPresent(); }; ModuleScript(); // Instance bool askSetParent(const Instance* instance) const override { return true; } ProtectedString getSource() const; void setSource(const ProtectedString& newText); std::string requestHash() const; PerVMState& vmState(lua_State* vm); // Try to get rid of this method once new play button is launched. static void cleanupAndResetState(const weak_ptr module); // Reset the state of the module script without destroying its result index. void resetState(); void setReloadRequested(bool reload) { reloadRequested = reload; } bool getReloadRequested() const { return reloadRequested; } void fireSourceChanged() override; rbx::signal starting; protected: void onScriptIdChanged() override; private: ProtectedString source; bool reloadRequested; typedef boost::unordered_map VMStateMap; VMStateMap stateMap; }; } // namespace