#ifndef _PYC_CODE_H #define _PYC_CODE_H #include "pyc_sequence.h" #include "pyc_string.h" #include class PycData; class PycModule; struct PyarmorCoDescriptor { unsigned char flags; unsigned char short_nonce_index; unsigned char _; unsigned char decrypt_begin_index; unsigned int decrypt_length; unsigned int _enter_count; }; class PycCode : public PycObject { public: typedef std::vector> globals_t; enum CodeFlags { CO_OPTIMIZED = 0x1, // 1.3 -> CO_NEWLOCALS = 0x2, // 1.3 -> CO_VARARGS = 0x4, // 1.3 -> CO_VARKEYWORDS = 0x8, // 1.3 -> CO_NESTED = 0x10, // 2.1 -> CO_GENERATOR = 0x20, // 2.2 -> CO_NOFREE = 0x40, // 2.3 -> CO_COROUTINE = 0x80, // 3.5 -> CO_ITERABLE_COROUTINE = 0x100, // 3.5 -> CO_ASYNC_GENERATOR = 0x200, // 3.6 -> CO_GENERATOR_ALLOWED = 0x1000, // 2.3 only // The FUTURE flags are shifted left 4 bits starting from Python 3.8 // Older versions are automatically mapped to the new values in load() CO_FUTURE_DIVISION = 0x20000, // 2.3 - 2.7, 3.1 -> CO_FUTURE_ABSOLUTE_IMPORT = 0x40000, // 2.5 - 2.7, 3.1 -> CO_FUTURE_WITH_STATEMENT = 0x80000, // 2.5 - 2.7, 3.1 -> CO_FUTURE_PRINT_FUNCTION = 0x100000, // 2.6 - 2.7, 3.1 -> CO_FUTURE_UNICODE_LITERALS = 0x200000, // 2.6 - 2.7, 3.1 -> CO_FUTURE_BARRY_AS_BDFL = 0x400000, // 3.1 -> CO_FUTURE_GENERATOR_STOP = 0x800000, // 3.5 -> CO_FUTURE_ANNOTATIONS = 0x1000000, // 3.7 -> CO_NO_MONITORING_EVENTS = 0x2000000, // 3.13 -> CO_PYARMOR_OBFUSCATED = 0x20000000, // Pyarmor all }; PycCode(int type = TYPE_CODE) : PycObject(type), m_argCount(), m_posOnlyArgCount(), m_kwOnlyArgCount(), m_numLocals(), m_stackSize(), m_flags(), m_firstLine() { } void load(PycData* stream, PycModule* mod) override; void pyarmorDecryptCoCode(unsigned long consts_index, PycModule *mod); int argCount() const { return m_argCount; } int posOnlyArgCount() const { return m_posOnlyArgCount; } int kwOnlyArgCount() const { return m_kwOnlyArgCount; } int numLocals() const { return m_numLocals; } int stackSize() const { return m_stackSize; } int flags() const { return m_flags; } PycRef code() const { return m_code; } PycRef consts() const { return m_consts; } PycRef names() const { return m_names; } PycRef localNames() const { return m_localNames; } PycRef localKinds() const { return m_localKinds; } PycRef freeVars() const { return m_freeVars; } PycRef cellVars() const { return m_cellVars; } PycRef fileName() const { return m_fileName; } PycRef name() const { return m_name; } PycRef qualName() const { return m_qualName; } int firstLine() const { return m_firstLine; } PycRef lnTable() const { return m_lnTable; } PycRef exceptTable() const { return m_exceptTable; } PycRef getConst(int idx) const { return m_consts->get(idx); } PycRef getName(int idx) const { return m_names->get(idx).cast(); } PycRef getLocal(int idx) const { return m_localNames->get(idx).cast(); } PycRef getCellVar(PycModule* mod, int idx) const; const globals_t& getGlobals() const { return m_globalsUsed; } void markGlobal(PycRef varname) { m_globalsUsed.emplace_back(std::move(varname)); } private: int m_argCount, m_posOnlyArgCount, m_kwOnlyArgCount, m_numLocals; int m_stackSize, m_flags; PycRef m_code; PycRef m_consts; PycRef m_names; PycRef m_localNames; PycRef m_localKinds; PycRef m_freeVars; PycRef m_cellVars; PycRef m_fileName; PycRef m_name; PycRef m_qualName; int m_firstLine; PycRef m_lnTable; PycRef m_exceptTable; globals_t m_globalsUsed; /* Global vars used in this code */ }; #endif