⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ef.h

📁 易语言IDE源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
           如果不能满足此要求,请使用第4条中的文本值格式。
    6、逻辑型属性值可以为“真”或“假”,如果某个属性在属性表中只有名称而没有提供值,则认为是逻辑型属性,其值为真。
*/
/*
    m_dwNameHashValue为m_szName的hash值
    m_dwReserved1必须保持为0
*/
#define _EF_DEFINE_GENERAL_INFO     \
            EFDWord m_dwState;      \
            EFChar *m_szName, *m_szHelpString, *m_szExtendedPropertyList;  \
            EFDWord m_dwNameHashValue;  \
            EFDWord m_dwReserved1;

#define _EF_DEFINE_BASE_TYPE_INFO    \
            _EF_DEFINE_GENERAL_INFO  \
            EFLibInfo* m_pLibInfo;   \
            EFTypeType m_enType;     \
            EFDouble m_dbVersion;    \
            EFInt m_nCategoryIndex;

//////////////////////////////////////////////////////////////////////////
// 基本的m_dwState值

#define EF_S_HIDDEN     (1 << 31)  //   说明具有此标记的类型或成员由于某种原因希望被隐藏起来而不让用户知晓,因此
                                   // 探测器类程序应该将其跳过而不列出。
                                   //   此标记不影响正常使用,仅用作辅助说明。
#define EF_IS_STATE_VISIBLE(state)      (((state) & EF_S_HIDDEN) == 0)

/*
成员的输出属性:
    私有:只能在本类中使用。
    扩展:不可在外部被使用,但可以在本类或继承类中使用。
    公开:可在外部被使用
    如果EF_S_PROTECTED和EF_S_PUBLIC都没有被设置,则为私有。
类型的输出属性:
    私有:只能在本类库中使用。
    公开:可以在本类库外使用。
*/
#define EF_S_PROTECTED  (1 << 30)  // 指定当前成员输出属性为扩展
#define EF_S_PUBLIC     (1 << 29)  // 指定当前成员输出属性为公开

#define EF_IS_STATE_PRIVATE(state)      (((state) & (EF_S_PUBLIC|EF_S_PROTECTED)) == 0)

//////////////////////////////////////////////////////////////////////////

// 三种扩展类型:类,接口,枚举
typedef enum
{
    EF_TT_NULL        = 0,
    EF_TT_CLASS       = 1,
    EF_TT_INTERFACE   = 2,
    EF_TT_ENUM        = 3
}
EFTypeType;

typedef struct _tagEFTypeInfo
{
    _EF_DEFINE_BASE_TYPE_INFO
}
EFTypeInfo;

typedef struct _tagEFGeneralInfo
{
    _EF_DEFINE_GENERAL_INFO
}
EFGeneralInfo;


// 用作快速数据类型操作。
typedef struct _tagEFDataTypeInfo
{
    EF_DatatypeType m_enDataType;  // 记录数据类型类别
	EFChar* m_szDataType;          // 记录数据类型名称
    EFDWord m_dwDataTypeHash;      // 记录数据类型名称的hash值。
    EFTypeInfo* m_pTypeInfo;       // 如果是非基本数据类型,则在此记录其具体类型信息(EFClassInfo/EFInterfaceInfo/EFEnumInfo),否则为NULL。
}
EFDataTypeInfo;

//////////////////////////////////////////////////////////////////////////

typedef struct _tagEFLocalVarDebugInfo
{
	EFInt m_nLineIndex;    // 该变量在源代码文件中定义时的行索引位置(从0开始)。
    EFChar* m_szDataType;  // 数据类型
    EFChar* m_szName;      // 变量名称
    EFInt m_nDataOffset;   //   变量数据在堆栈中的偏移。如果大于等于零,表明为静态局部变量,
                          // 此时为该变量的替代类变量在EFClassInfo的m_pFieldTable表中的索引。
}
EFLocalVarDebugInfo;

typedef struct _tagEFCodeBlockDebugInfo
{
    EFInt m_nCodeOffset;  // 代码块首地址相对于m_func的偏移量。
    EFInt m_nCodeSize;    // 代码块的尺寸。

    EFInt m_nLocalVarCount;  // 本代码块中局部变量的数目。
    EFLocalVarDebugInfo* m_pLocalVarInf;  // 按照在程序中的定义顺序排序

    // 本代码块中内嵌方法的名称表,中间用'\0'分隔,最后用'\0'结束。如果没有内嵌方法,本成员为NULL。
	EFChar* m_szzInnerMethodsName;
}
EFCodeBlockDebugInfo;

typedef struct _tagEFStatementLineDebugInfo
{
	EFInt m_nLineIndex;        // 语句行在源代码文件中的行索引位置(从0开始)。
    EFInt m_nCodeOffset;	   // 语句行代码数据相对于m_func的偏移量。
	EFInt m_nCallFuncCount;    // 本行所调用的其他方法数目。
	EFInt* m_pnCallCodeOffset; // 记录每个调用到某方法的call指令相对于m_func的偏移量。
    // 记录除了顺序的下一行外,本语句行执行后还可能跳到的代码地址相对于m_func的偏移量,为-1时无效。
    EFInt m_nGotoCodeOffset1, m_nGotoCodeOffset2;
}
EFStatementLineDebugInfo;

// 记录方法调试信息
typedef struct _tagDebugMethodInf
{
    EFChar* m_szSourceFileName;  // 本方法所处源代码文件名称
    EFInt m_nLineIndex;  // 本方法定义头在源代码文件中的行索引位置(从0开始)。
    EFInt m_nCodeSize;   // m_func所指向代码的尺寸。

    EFInt m_nStatementLineCount;
    EFStatementLineDebugInfo* m_pStatementLineInf;  // 按照EFStatementLineDebugInfo.m_nLineIndex排序

    EFInt m_nCodeBlockInfCount;
    EFCodeBlockDebugInfo* m_pCodeBlockInf;  // 按照EFCodeBlockDebugInfo.m_nCodeOffset排序
}
EFMethodDebugInfo;

//////////////////////////////////////////////////////////////////////////

typedef union _tagEFImmValue
{
    EFInt m_int;
    EFDouble m_double;
    EFBool m_bool;
    EFText m_text;
    EFBinary m_bin;
    EFArray m_array;  // 不能为对象数组和接口数组
}
EFImmValue;

typedef union _tagEFValue
{
    EFInt m_int;
    EFDouble m_double;
    EFBool m_bool;
    EFText m_text;
    EFBinary m_bin;
    EFObject* m_pObject;
    EFInterface* m_pInterface;
    EFArray m_array;
}
EFValue;

//////////////////////////////////////////////////////////////////////////

typedef struct _tagEFArgInfo
{
    #define EF_S_ARG_NULLABLE     (1 << 0)       //   如果本参数的数据类型为类或接口,设置本标志位表示可以接收
                                                 // 空的接口或类对象,否则空对象将不能被传递到方法实现代码。
    #define EF_S_ARG_HAS_DEFAULT_VALUE (1 << 1)  // 标记本参数是否具有默认值
    /*
        标记从本参数处到最后一个参数止是否为可扩展参数组,整个参数表中最多只能有一个参数具有此标志。
        举例,如果有方法: method1 (整数 arg1, 整数 arg2<可扩展>, 文本 arg3)。其中,arg2具有EF_S_ARG_EXTENDABLE
      标志,则调用方可以以类似 method1 (1,  2, "abc",  3, "bcd") 的方式对此方法进行参数扩展调用。
        注意,参数只能成组扩展,譬如上面的例子就不能写成 method1 (1,  2, "abc",  3) 。
        在用C++代码实现此方法时,该方法的实现函数应该类似如下书写:
          void method1 (EFObject* pThis, EFInt arg1, EFInt arg2, EFText arg3, EFInt nExtendedArgGroupCount, ...)
        其中,nExtendedArgGroupCount记录具体扩展提供的参数组数目,譬如在上面的例子中,nExtendedArgGroupCount为1。
        如果具有扩展参数的方法同时具有多返回值,则多返回值接收表应放在nExtendedArgGroupCount的前面,C++实现函数类似如下书写:
          void method1 (EFObject* pThis, EFInt arg1, EFInt arg2, EFText arg3, void* pReturnData, EFInt nExtendedArgGroupCount, ...)
    */
    #define EF_S_ARG_EXTENDABLE      (1 << 2)

    _EF_DEFINE_GENERAL_INFO

    EFChar* m_szDataType;
    EFDWord m_dwDataTypeHashValue;  // m_szDataType的hash值。

    //   如果EF_S_ARG_HAS_DEFAULT_VALUE被置位,则本成员用作记录对应的参数默认值。
    // 注意如果参数数据类型为类或接口,则本成员没有作用,其默认值固定为“空”。
    EFImmValue m_vDefault;
}
EFArgInfo;

// 所有事件处理方法的原型
// 返回真表示需要继续传递此事件, 返回假表示中止传递此事件。
// pEventObject指向一个基类为“系统.事件”的对象。
typedef EFBool (*EF_PFN_EVENT_FUNC) (EFObject* pThis, EFObject* pEventObject);  // 非静态的事件处理方法
typedef EFBool (*EF_PFN_STATIC_EVENT_FUNC) (EFObject* pEventObject);  // 静态的事件处理方法

/*   定义多返回值的方法:此时m_szDataType可以按照类似以下方法书写: "int, TextFile",
   同时方法在编译时将在最后一个参数后面自动加入一个指向结构的指针(不需要手工定义),
   该结构中的成员为所有返回值的顺序排列,返回前把所需要返回的数据填入到该结构中即可。 
     譬如方法:“整数,文本 method1 ()”的C++实现函数应类似如下书写:
        void method1 (EFObject* pThis, void* pReturnData)
*/
typedef struct _tagEFMethodInfo
{
    #define EF_S_M_PROPERTY                (1 << 0)  //   指示本方法是否为属性读写方法。如果定义了此标志,本方法的原型必须类似
                                                     //“返回值数据类型 属性名 ()”-属性读 或“属性名 (参数数据类型 参数名)”-属性写。
    #define EF_S_M_STATIC                  (1 << 1)  // 是否为静态方法。
    #define EF_S_M_EVENT_HANDLER           (1 << 2)  // 是否为事件处理方法,如果具有此标志,则方法的原型必须为EF_PFN_EVENT_FUNC。
    #define EF_S_M_INIT                    (1 << 3)  // 是否为构造方法。如果此标志被设置,上面标志应该都不能被设置。
                                                     // 注意:类的构造方法中必须要调用其基础类的构造方法,以保证基础类对象能够被
                                                     // 构造,有两种调用需求情况:
                                                     // 1、调用基础类的默认构造方法,可以使用公用函数MCallBaseClassDefaultConstructor。
                                                     // 2、调用基础类的指定构造方法,需要自行编码直接调用。
    #define EF_S_M_ENUMERATER              (1 << 4)  // 指示本方法为遍历器类中的遍历方法,具体请参见技术白皮书。
    #define EF_S_M_CONVERTER               (1 << 5)  //   指示本方法是否为数据类型转换器方法,如果定义了此标志,本方法的原型必须
                                                     // 类似“转换到数据类型 方法名 ()” 或“ 初始化 (转换入数据类型 参数名)”。
                                                     // 注意:1、转入方法必须同时是类的初始化方法。
                                                     //       2、只支持对基本数据类型或数组数据类型的转换。
                                                     //       3、转换方法必须公开。
    _EF_DEFINE_GENERAL_INFO

    // 方法友好名,用于实现语意化编程。其中以<1>表示第一个参数,<2>表示第二个参数,如此类推。
    // 允许使用除半角字符“'<”之外的所有字符。
	EFChar* m_szFriendlyName; 
    EFDWord m_dwFriendlyNameHashValue;  // m_szFriendlyName的hash值。

    EFChar* m_szReturnDataType;  // 注意此处可能指向组合数据类型,即类似: "int, TextFile"
    EFDWord m_dwReturnDataTypeHashValue;  // m_szReturnDataType的hash值。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -