PAXCOMP_SYS.pas
上传用户:julongnew
上传日期:2018-10-05
资源大小:388k
文件大小:108k
源码类别:

Windows编程

开发平台:

Delphi

  1. ////////////////////////////////////////////////////////////////////////////
  2. // PaxCompiler
  3. // Site: http://www.paxcompiler.com
  4. // Author: Alexander Baranovsky (paxscript@gmail.com)
  5. // ========================================================================
  6. // Copyright (c) Alexander Baranovsky, 2006-2008. All rights reserved.
  7. // Code Version: 2.4
  8. // ========================================================================
  9. // Unit: PAXCOMP_SYS.pas
  10. // ========================================================================
  11. ////////////////////////////////////////////////////////////////////////////
  12. {$I PaxCompiler.def}
  13. {$O-}
  14. {$Q-}
  15. {$R-}
  16. unit PAXCOMP_SYS;
  17. interface
  18. uses
  19. {$IFDEF LINUX}
  20. {$IFDEF FPC}
  21. {$ELSE}
  22.   QForms,
  23. {$ENDIF}
  24. {$ELSE}
  25. {$IFDEF WIN32}
  26.   Windows,
  27. {$ELSE}
  28. // Mac!
  29. {$ENDIF}
  30. {$ENDIF}
  31. {$IFDEF VARIANTS}
  32.   Variants,
  33. {$ENDIF}
  34.   TypInfo,
  35.   SysUtils,
  36.   Classes,
  37.   PAXCOMP_CONSTANTS;
  38. const
  39.   FirstCompiledScriptVersion = 102;
  40. var
  41.   FirstLocalId: Integer = 1000000;
  42.   StreamVersion: Integer = 117;
  43.   CompiledScriptVersion: Integer = 112;
  44. const
  45.   MaxPublishedProps = 50; // importer only
  46. {$IFNDEF UNIC}
  47.   varUString  = $0102; { Unicode string 258 } {not OLE compatible}
  48. {$ENDIF}
  49.   NaN         =  0.0 / 0.0;
  50.   Infinity    =  1.0 / 0.0;
  51.   NegInfinity = -1.0 / 0.0;
  52.   SecsPerHour   = 60 * 60;
  53.   SecsPerDay    = SecsPerHour * 24;
  54.   MSecsPerDay   = SecsPerDay * 1000;
  55.   MSecsPerHour  = SecsPerHour * 1000;
  56. {$IFDEF LINUX}
  57.   varClass = varError;
  58.   varPointer = $15;
  59. {$ELSE}
  60.   varClass = $0E;
  61.   varPointer = $15;
  62. {$ENDIF}
  63.   MaxHash = 199;
  64.   H_SelfPtr = 16;
  65.   H_ExceptionPtr = 20;
  66.   H_ByteCodePtr = 24;
  67.   H_Flag = 28;
  68.   FirstShiftValue = 85;
  69.   H_InitOnly = 4;
  70.   H_BodyOnly = 8;
  71.   kindNONE = 0;
  72.   kindVAR = 1;
  73.   kindCONST = 2;
  74.   kindSUB = 3;
  75.   kindPARAM = 4;
  76.   kindTYPE = 5;
  77.   kindTYPE_FIELD = 6;
  78.   kindLABEL = 7;
  79.   kindNAMESPACE = 8;
  80.   kindCONSTRUCTOR = 9;
  81.   kindDESTRUCTOR = 10;
  82.   kindPROP = 11;
  83.   kindEND_CLASS_HEADER = 12;
  84.   KindSubs = [KindSUB, KindCONSTRUCTOR, KindDESTRUCTOR];
  85.   UnsignedIntegerTypes = [typeBYTE, typeWORD, typeCARDINAL];
  86.   IntegerTypes = [typeBYTE, typeWORD, typeINTEGER, typeINT64,
  87.                   typeCARDINAL, typeSMALLINT, typeSHORTINT];
  88.   CharTypes = [typeANSICHAR, typeWIDECHAR];
  89.   BooleanTypes = [typeBOOLEAN, typeWORDBOOL, typeLONGBOOL, typeBYTEBOOL];
  90.   OrdinalTypes = IntegerTypes + CharTypes + BooleanTypes + [typeENUM];
  91.   RealTypes = [typeSINGLE, typeDOUBLE, typeEXTENDED];
  92.   StringTypes = [typeANSISTRING, typeSHORTSTRING, typeWIDESTRING, typeUNICSTRING];
  93.   NumberTypes = IntegerTypes + RealTypes + [typeCURRENCY];
  94.   VariantTypes = [typeVARIANT, typeOLEVARIANT];
  95.   DynamicTypes = [typeANSISTRING, typeWIDESTRING, typeUNICSTRING] + VariantTypes + [typeDYNARRAY, typeINTERFACE];
  96.   StandardTypes = OrdinalTypes + RealTypes + StringTypes + VariantTypes;
  97. var
  98.   OP_NOP,
  99.   OP_SEPARATOR,
  100.   OP_STMT,
  101.   OP_SET_CODE_LINE,
  102.   OP_BEGIN_NAMESPACE,
  103.   OP_END_NAMESPACE,
  104.   OP_BEGIN_TYPE,
  105.   OP_END_TYPE,
  106.   OP_BEGIN_CLASS_TYPE,
  107.   OP_END_CLASS_TYPE,
  108.   OP_BEGIN_CLASSREF_TYPE,
  109.   OP_END_CLASSREF_TYPE,
  110.   OP_BEGIN_INTERFACE_TYPE,
  111.   OP_END_INTERFACE_TYPE,
  112.   OP_BEGIN_RECORD_TYPE,
  113.   OP_END_RECORD_TYPE,
  114.   OP_BEGIN_ARRAY_TYPE,
  115.   OP_END_ARRAY_TYPE,
  116.   OP_BEGIN_DYNARRAY_TYPE,
  117.   OP_END_DYNARRAY_TYPE,
  118.   OP_BEGIN_SUBRANGE_TYPE,
  119.   OP_END_SUBRANGE_TYPE,
  120.   OP_BEGIN_ENUM_TYPE,
  121.   OP_END_ENUM_TYPE,
  122.   OP_BEGIN_SET_TYPE,
  123.   OP_END_SET_TYPE,
  124.   OP_BEGIN_POINTER_TYPE,
  125.   OP_END_POINTER_TYPE,
  126.   OP_BEGIN_PROC_TYPE,
  127.   OP_END_PROC_TYPE,
  128.   OP_BEGIN_SHORTSTRING_TYPE,
  129.   OP_END_SHORTSTRING_TYPE,
  130.   OP_BEGIN_ALIAS_TYPE,
  131.   OP_END_ALIAS_TYPE,
  132.   OP_BEGIN_CONST,
  133.   OP_END_CONST,
  134.   OP_BEGIN_VAR,
  135.   OP_END_VAR,
  136.   OP_GET_NEXTJSPROP, // js only
  137.   OP_CLEAR_REFERENCES, // js only
  138.   OP_BEGIN_MODULE,
  139.   OP_END_MODULE,
  140.   OP_END_INTERFACE_SECTION,
  141.   OP_END_IMPORT,
  142.   OP_BEGIN_INITIALIZATION,
  143.   OP_END_INITIALIZATION,
  144.   OP_BEGIN_FINALIZATION,
  145.   OP_END_FINALIZATION,
  146.   OP_EXTRA_BYTECODE,
  147.   OP_TRY_ON,
  148.   OP_TRY_OFF,
  149.   OP_FINALLY,
  150.   OP_EXCEPT,
  151.   OP_EXCEPT_ON,
  152.   OP_RAISE,
  153.   OP_COND_RAISE,
  154.   OP_BEGIN_EXCEPT_BLOCK,
  155.   OP_END_EXCEPT_BLOCK,
  156.   OP_OVERFLOW_CHECK,
  157.   OP_PAUSE,
  158.   OP_CHECK_PAUSE,
  159.   OP_CHECK_PAUSE_LIGHT,
  160.   OP_HALT,
  161.   OP_EMIT_OFF,
  162.   OP_EMIT_ON,
  163.   OP_BEGIN_USING,
  164.   OP_END_USING,
  165.   OP_BEGIN_BLOCK,
  166.   OP_END_BLOCK,
  167.   OP_EVAL,
  168.   OP_EVAL_INHERITED,
  169.   OP_EVAL_CONSTRUCTOR,
  170.   OP_UPDATE_INSTANCE,
  171.   OP_CLEAR_EDX,
  172.   OP_IMPLEMENTS,
  173.   OP_MYCLASS,
  174.   OP_MYBASE,
  175.   OP_LOAD_PROC,
  176.   OP_CHECK_OVERRIDE,
  177.   OP_EXIT,
  178.   OP_GO,
  179.   OP_GO_TRUE,
  180.   OP_GO_FALSE,
  181.   OP_GO_TRUE_BOOL,
  182.   OP_GO_FALSE_BOOL,
  183.   OP_GO_DL,
  184.   OP_CALL,
  185.   OP_BEGIN_CALL,
  186.   OP_CALL_DEFAULT_CONSTRUCTOR,
  187.   OP_CHECK_SUB_CALL,
  188.   OP_PUSH,
  189.   OP_PUSH_INSTANCE,
  190.   OP_PUSH_CLASSREF,
  191.   OP_PUSH_CONTEXT,
  192.   OP_POP_CONTEXT,
  193.   OP_FIND_CONTEXT,
  194.   OP_FIND_JS_FUNC,
  195.   OP_LABEL,
  196.   OP_SAVE_EDX,
  197.   OP_RESTORE_EDX,
  198.   OP_TYPE_CAST,
  199.   OP_BEGIN_SUB,
  200.   OP_DECLARE_LOCAL_VAR,
  201.   OP_DECLARE_TEMP_VAR,
  202.   OP_DESTROY_LOCAL_VAR,
  203.   OP_INIT_SUB,
  204.   OP_END_SUB,
  205.   OP_FIN_SUB,
  206.   OP_EPILOGUE_SUB,
  207.   OP_BEGIN_GLOBAL_BLOCK,
  208.   OP_EPILOGUE_GLOBAL_BLOCK,
  209.   OP_EPILOGUE_GLOBAL_BLOCK2,
  210.   OP_END_GLOBAL_BLOCK,
  211.   OP_ASSIGN_TYPE,
  212.   OP_DETERMINE_TYPE,
  213.   OP_ASSIGN_THE_SAME_TYPE,
  214.   OP_ASSIGN_TYPE_ALIAS,
  215.   OP_BEGIN_WITH,
  216.   OP_END_WITH,
  217.   OP_BEGIN_INIT_CONST,
  218.   OP_END_INIT_CONST,
  219.   OP_CREATE_POINTER_TYPE,
  220.   OP_CREATE_CLASSREF_TYPE,
  221.   OP_ADDRESS,
  222.   OP_TERMINAL,
  223.   OP_ADDRESS_PROG,
  224.   OP_ASSIGN_PROG,
  225.   OP_CREATE_DYNAMIC_ARRAY_TYPE,
  226.   OP_CREATE_SHORTSTRING_TYPE,
  227.   OP_SET_INCLUDE,
  228.   OP_SET_INCLUDE_INTERVAL,
  229.   OP_SET_EXCLUDE,
  230.   OP_LVALUE,
  231.   OP_ASSIGN,
  232.   OP_ASSIGN_CONST,
  233.   OP_ASSIGN_ENUM,
  234.   OP_CHECK_SUBRANGE_TYPE,
  235.   OP_INC,
  236.   OP_DEC,
  237.   OP_PRED,
  238.   OP_SUCC,
  239.   OP_ORD,
  240.   OP_CHR,
  241.   OP_STR,
  242.   OP_LOW,
  243.   OP_HIGH,
  244.   OP_SET_LENGTH,
  245.   OP_DYNARRAY_ASSIGN,
  246.   OP_DYNARRAY_CLR,
  247.   OP_DYNARRAY_HIGH,
  248.   OP_CREATE_EMPTY_DYNARRAY,
  249.   OP_SHORTSTRING_HIGH,
  250.   OP_PLUS,
  251.   OP_MINUS,
  252.   OP_MULT,
  253.   OP_DIV,
  254.   OP_IDIV,
  255.   OP_MOD,
  256.   OP_SHL,
  257.   OP_SHR,
  258.   OP_NEG,
  259.   OP_ABS,
  260.   OP_EQ,
  261.   OP_NE,
  262.   OP_LT,
  263.   OP_LE,
  264.   OP_GT,
  265.   OP_GE,
  266.   OP_CLASSNAME,
  267.   OP_GET_PROG,
  268.   OP_IS,
  269.   OP_AS,
  270.   OP_TYPEINFO,
  271.   OP_ADD_TYPEINFO,
  272.   OP_AND,
  273.   OP_OR,
  274.   OP_XOR,
  275.   OP_NOT,
  276.   OP_LEFT_SHIFT,
  277.   OP_RIGHT_SHIFT,
  278.   OP_RET,
  279.   OP_FIELD,
  280.   OP_ELEM,
  281.   OP_ITEM,
  282.   OP_RECORD_ITEM,
  283.   OP_PRINT,
  284.   OP_PRINT_EX,
  285.   OP_INIT_PANSICHAR_LITERAL,
  286.   OP_INIT_PWIDECHAR_LITERAL,
  287.   OP_SIZEOF,
  288.   OP_OLE_GET,
  289.   OP_OLE_SET,
  290.   OP_OLE_VALUE,
  291.   OP_OLE_PARAM,
  292.   OP_ONCREATE_OBJECT,
  293.   OP_ON_AFTER_OBJECT_CREATION,
  294.   OP_CREATE_OBJECT,
  295.   OP_DESTROY_OBJECT,
  296.   OP_GET_VMT_ADDRESS,
  297.   OP_ADD_ANCESTOR,
  298.   OP_ADD_INTERFACE,
  299.   OP_ADD_METHOD_INDEX,
  300.   OP_ASSIGNED,
  301.   OP_SAVE_REGS,
  302.   OP_RESTORE_REGS,
  303.   OP_ERR_ABSTRACT,
  304.   OP_UPDATE_DEFAULT_CONSTRUCTOR,
  305.   OP_FIND_CONSTRUCTOR,
  306.   OP_BEGIN_CRT_JS_FUNC_OBJECT,
  307.   OP_END_CRT_JS_FUNC_OBJECT,
  308.   OP_TO_JS_OBJECT,
  309.   OP_JS_TYPEOF,
  310.   OP_JS_VOID,
  311.   // for-in statement
  312.   OP_GET_ENUMERATOR,
  313.   OP_MOVE_NEXT,
  314.   OP_CURRENT,
  315.   OP_DUMMY
  316.   : Integer;
  317. // detailed operators
  318. var
  319.   OP_CURRENCY_FROM_INT64,
  320.   OP_CURRENCY_FROM_INT,
  321.   OP_CURRENCY_FROM_REAL,
  322.   OP_INT_TO_DOUBLE,
  323.   OP_INT64_TO_DOUBLE,
  324.   OP_INT_TO_SINGLE,
  325.   OP_INT64_TO_SINGLE,
  326.   OP_INT_TO_EXTENDED,
  327.   OP_INT64_TO_EXTENDED,
  328.   OP_INT_TO_INT64,
  329.   OP_BYTE_TO_INT64,
  330.   OP_WORD_TO_INT64,
  331.   OP_CARDINAL_TO_INT64,
  332.   OP_SMALLINT_TO_INT64,
  333.   OP_SHORTINT_TO_INT64,
  334.   OP_INT_FROM_INT64,
  335.   OP_BYTE_FROM_INT64,
  336.   OP_WORD_FROM_INT64,
  337.   OP_CARDINAL_FROM_INT64,
  338.   OP_SMALLINT_FROM_INT64,
  339.   OP_SHORTINT_FROM_INT64,
  340.   OP_MULT_INT64,
  341.   OP_IDIV_INT64,
  342.   OP_MOD_INT64,
  343.   OP_SHL_INT64,
  344.   OP_SHR_INT64,
  345.   OP_CURRENCY_TO_EXTENDED,
  346.   OP_CURRENCY_TO_SINGLE,
  347.   OP_DOUBLE_TO_SINGLE,
  348.   OP_DOUBLE_TO_EXTENDED,
  349.   OP_SINGLE_TO_DOUBLE,
  350.   OP_CURRENCY_TO_DOUBLE,
  351.   OP_SINGLE_TO_EXTENDED,
  352.   OP_EXTENDED_TO_DOUBLE,
  353.   OP_EXTENDED_TO_SINGLE,
  354.   OP_ASSIGN_BYTE_I,
  355.   OP_ASSIGN_BYTE_M,
  356.   OP_ASSIGN_WORD_I,
  357.   OP_ASSIGN_WORD_M,
  358.   OP_ASSIGN_CARDINAL_I,
  359.   OP_ASSIGN_CARDINAL_M,
  360.   OP_ASSIGN_SMALLINT_I,
  361.   OP_ASSIGN_SMALLINT_M,
  362.   OP_ASSIGN_SHORTINT_I,
  363.   OP_ASSIGN_SHORTINT_M,
  364.   OP_ASSIGN_INT_I,
  365.   OP_ASSIGN_INT_M,
  366.   OP_ASSIGN_DOUBLE,
  367.   OP_ASSIGN_CURRENCY,
  368.   OP_ASSIGN_EVENT,
  369.   OP_ASSIGN_SINGLE,
  370.   OP_ASSIGN_EXTENDED,
  371.   OP_ASSIGN_PANSICHAR,
  372.   OP_ASSIGN_PWIDECHAR,
  373.   OP_ASSIGN_INT64,
  374.   OP_ASSIGN_INTERFACE,
  375.   OP_CREATE_EVENT,
  376.   OP_ASSIGN_ANSISTRING,
  377.   OP_ASSIGN_SHORTSTRING,
  378.   OP_ASSIGN_WIDESTRING,
  379.   OP_ASSIGN_UNICSTRING,
  380.   OP_ASSIGN_VARIANT,
  381.   OP_ASSIGN_OLEVARIANT,
  382.   OP_ASSIGN_CLASS,
  383.   OP_ASSIGN_SHIFT,
  384.   OP_ASSIGN_TVarRec,
  385.   OP_ASSIGN_RECORD,
  386.   OP_ASSIGN_ARRAY,
  387.   OP_ANSISTRING_FROM_PANSICHAR,
  388.   OP_ANSISTRING_FROM_PWIDECHAR,
  389.   OP_ANSISTRING_FROM_ANSICHAR,
  390.   OP_ADD_ANSISTRING,
  391.   OP_ADD_SHORTSTRING,
  392.   OP_ADD_WIDESTRING,
  393.   OP_ADD_UNICSTRING,
  394.   OP_ADD_STRING,
  395.   OP_ANSISTRING_CLR,
  396.   OP_WIDESTRING_CLR,
  397.   OP_UNICSTRING_CLR,
  398.   OP_INTERFACE_CLR,
  399.   OP_CLASS_CLR, // js only
  400.   OP_EQ_STRUCT,
  401.   OP_NE_STRUCT,
  402.   OP_EQ_ANSISTRING,
  403.   OP_NE_ANSISTRING,
  404.   OP_GT_ANSISTRING,
  405.   OP_GE_ANSISTRING,
  406.   OP_LT_ANSISTRING,
  407.   OP_LE_ANSISTRING,
  408.   OP_GT_SHORTSTRING,
  409.   OP_GE_SHORTSTRING,
  410.   OP_LT_SHORTSTRING,
  411.   OP_LE_SHORTSTRING,
  412.   OP_GT_WIDESTRING,
  413.   OP_GE_WIDESTRING,
  414.   OP_LT_WIDESTRING,
  415.   OP_LE_WIDESTRING,
  416.   OP_GT_UNICSTRING,
  417.   OP_GE_UNICSTRING,
  418.   OP_LT_UNICSTRING,
  419.   OP_LE_UNICSTRING,
  420.   OP_EQ_SHORTSTRING,
  421.   OP_EQ_WIDESTRING,
  422.   OP_EQ_UNICSTRING,
  423.   OP_NE_SHORTSTRING,
  424.   OP_NE_WIDESTRING,
  425.   OP_NE_UNICSTRING,
  426.   OP_STRUCTURE_CLR,
  427.   OP_STRUCTURE_ADDREF,
  428.   OP_SHORTSTRING_FROM_PANSICHAR_LITERAL,
  429.   OP_SHORTSTRING_FROM_PWIDECHAR_LITERAL,
  430.   OP_SHORTSTRING_FROM_ANSICHAR,
  431.   OP_SHORTSTRING_FROM_WIDECHAR,
  432.   OP_SHORTSTRING_FROM_ANSISTRING,
  433.   OP_SHORTSTRING_FROM_WIDESTRING,
  434.   OP_UNICSTRING_FROM_WIDESTRING,
  435.   OP_SHORTSTRING_FROM_UNICSTRING,
  436.   OP_ANSISTRING_FROM_SHORTSTRING,
  437.   OP_WIDESTRING_FROM_PANSICHAR_LITERAL,
  438.   OP_WIDESTRING_FROM_PWIDECHAR_LITERAL,
  439.   OP_WIDESTRING_FROM_ANSICHAR,
  440.   OP_WIDESTRING_FROM_WIDECHAR,
  441.   OP_ANSISTRING_FROM_WIDECHAR,
  442.   OP_WIDESTRING_FROM_WIDECHAR_LITERAL,
  443.   OP_WIDESTRING_FROM_ANSISTRING,
  444.   OP_UNICSTRING_FROM_ANSISTRING,
  445.   OP_WIDESTRING_FROM_SHORTSTRING,
  446.   OP_WIDESTRING_FROM_UNICSTRING,
  447.   OP_UNICSTRING_FROM_SHORTSTRING,
  448.   OP_ANSISTRING_FROM_WIDESTRING,
  449.   OP_ANSISTRING_FROM_UNICSTRING,
  450.   OP_UNICSTRING_FROM_PANSICHAR_LITERAL,
  451.   OP_UNICSTRING_FROM_PWIDECHAR_LITERAL,
  452.   OP_UNICSTRING_FROM_ANSICHAR,
  453.   OP_UNICSTRING_FROM_WIDECHAR,
  454.   OP_UNICSTRING_FROM_WIDECHAR_LITERAL,
  455.   OP_VARIANT_FROM_CLASS, // JS only
  456.   OP_VARIANT_FROM_POINTER, // JS only
  457.   OP_CLASS_FROM_VARIANT, // JS only
  458.   OP_INTERFACE_FROM_CLASS,
  459.   OP_INTERFACE_CAST,
  460.   OP_VARIANT_FROM_PANSICHAR_LITERAL,
  461.   OP_VARIANT_FROM_PWIDECHAR_LITERAL,
  462.   OP_VARIANT_FROM_ANSISTRING,
  463.   OP_VARIANT_FROM_WIDESTRING,
  464.   OP_VARIANT_FROM_UNICSTRING,
  465.   OP_VARIANT_FROM_SHORTSTRING,
  466.   OP_VARIANT_FROM_ANSICHAR,
  467.   OP_VARIANT_FROM_WIDECHAR,
  468.   OP_VARIANT_FROM_WIDECHAR_LITERAL,
  469.   OP_VARIANT_FROM_INT,
  470.   OP_VARIANT_FROM_INT64,
  471.   OP_VARIANT_FROM_BYTE,
  472.   OP_VARIANT_FROM_BOOL,
  473.   OP_VARIANT_FROM_WORD,
  474.   OP_VARIANT_FROM_CARDINAL,
  475.   OP_VARIANT_FROM_SMALLINT,
  476.   OP_VARIANT_FROM_SHORTINT,
  477.   OP_VARIANT_FROM_DOUBLE,
  478.   OP_VARIANT_FROM_CURRENCY,
  479.   OP_VARIANT_FROM_SINGLE,
  480.   OP_VARIANT_FROM_EXTENDED,
  481.   OP_VARIANT_FROM_INTERFACE,
  482.   OP_OLEVARIANT_FROM_VARIANT,
  483.   OP_OLEVARIANT_FROM_PANSICHAR_LITERAL,
  484.   OP_OLEVARIANT_FROM_PWIDECHAR_LITERAL,
  485.   OP_OLEVARIANT_FROM_ANSISTRING,
  486.   OP_OLEVARIANT_FROM_WIDESTRING,
  487.   OP_OLEVARIANT_FROM_UNICSTRING,
  488.   OP_OLEVARIANT_FROM_SHORTSTRING,
  489.   OP_OLEVARIANT_FROM_ANSICHAR,
  490.   OP_OLEVARIANT_FROM_WIDECHAR,
  491.   OP_OLEVARIANT_FROM_WIDECHAR_LITERAL,
  492.   OP_OLEVARIANT_FROM_INT,
  493.   OP_OLEVARIANT_FROM_INT64,
  494.   OP_OLEVARIANT_FROM_BYTE,
  495.   OP_OLEVARIANT_FROM_BOOL,
  496.   OP_OLEVARIANT_FROM_WORD,
  497.   OP_OLEVARIANT_FROM_CARDINAL,
  498.   OP_OLEVARIANT_FROM_SMALLINT,
  499.   OP_OLEVARIANT_FROM_SHORTINT,
  500.   OP_OLEVARIANT_FROM_DOUBLE,
  501.   OP_OLEVARIANT_FROM_CURRENCY,
  502.   OP_OLEVARIANT_FROM_SINGLE,
  503.   OP_OLEVARIANT_FROM_EXTENDED,
  504.   OP_OLEVARIANT_FROM_INTERFACE,
  505.   OP_ANSISTRING_FROM_INT, // JS only
  506.   OP_ANSISTRING_FROM_DOUBLE, // JS only
  507.   OP_ANSISTRING_FROM_SINGLE, // JS only
  508.   OP_ANSISTRING_FROM_EXTENDED, // JS only
  509.   OP_ANSISTRING_FROM_BOOLEAN, // JS only
  510.   OP_UNICSTRING_FROM_INT, // JS only
  511.   OP_UNICSTRING_FROM_DOUBLE, // JS only
  512.   OP_UNICSTRING_FROM_SINGLE, // JS only
  513.   OP_UNICSTRING_FROM_EXTENDED, // JS only
  514.   OP_UNICSTRING_FROM_BOOLEAN, // JS only
  515.   OP_JS_FUNC_OBJ_FROM_VARIANT, // JS only
  516.   OP_ANSISTRING_FROM_VARIANT,
  517.   OP_WIDESTRING_FROM_VARIANT,
  518.   OP_UNICSTRING_FROM_VARIANT,
  519.   OP_SHORTSTRING_FROM_VARIANT,
  520.   OP_DOUBLE_FROM_VARIANT,
  521.   OP_CURRENCY_FROM_VARIANT,
  522.   OP_SINGLE_FROM_VARIANT,
  523.   OP_EXTENDED_FROM_VARIANT,
  524.   OP_INT64_FROM_VARIANT,
  525.   OP_INT_FROM_VARIANT,
  526.   OP_BYTE_FROM_VARIANT,
  527.   OP_WORD_FROM_VARIANT,
  528.   OP_CARDINAL_FROM_VARIANT,
  529.   OP_BOOL_FROM_VARIANT,
  530.   OP_BYTEBOOL_FROM_VARIANT,
  531.   OP_WORDBOOL_FROM_VARIANT,
  532.   OP_LONGBOOL_FROM_VARIANT,
  533.   OP_SMALLINT_FROM_VARIANT,
  534.   OP_SHORTINT_FROM_VARIANT,
  535.   OP_NOT_VARIANT,
  536.   OP_NEG_VARIANT,
  537.   OP_ADD_VARIANT,
  538.   OP_SUB_VARIANT,
  539.   OP_MULT_VARIANT,
  540.   OP_DIV_VARIANT,
  541.   OP_IDIV_VARIANT,
  542.   OP_MOD_VARIANT,
  543.   OP_SHL_VARIANT,
  544.   OP_SHR_VARIANT,
  545.   OP_AND_VARIANT,
  546.   OP_OR_VARIANT,
  547.   OP_XOR_VARIANT,
  548.   OP_LT_VARIANT,
  549.   OP_LE_VARIANT,
  550.   OP_GT_VARIANT,
  551.   OP_GE_VARIANT,
  552.   OP_EQ_VARIANT,
  553.   OP_NE_VARIANT,
  554.   OP_EQ_EVENT,
  555.   OP_NE_EVENT,
  556.   OP_VARIANT_CLR,
  557.   OP_VARARRAY_GET,
  558.   OP_VARARRAY_PUT,
  559.   OP_VARARRAY_IDX,
  560.   OP_ADD_INT_MI,
  561.   OP_ADD_INT_MM,
  562.   OP_SUB_INT_MI,
  563.   OP_SUB_INT_MM,
  564.   OP_IMUL_INT_MI,
  565.   OP_IMUL_INT_MM,
  566.   OP_IDIV_INT_MI,
  567.   OP_IDIV_INT_MM,
  568.   OP_IDIV_INT_IM,
  569.   OP_MOD_INT_MI,
  570.   OP_MOD_INT_MM,
  571.   OP_MOD_INT_IM,
  572.   OP_SHL_INT_MI,
  573.   OP_SHL_INT_MM,
  574.   OP_SHL_INT_IM,
  575.   OP_SHR_INT_MI,
  576.   OP_SHR_INT_MM,
  577.   OP_SHR_INT_IM,
  578.   OP_AND_INT_MI,
  579.   OP_AND_INT_MM,
  580.   OP_OR_INT_MI,
  581.   OP_OR_INT_MM,
  582.   OP_XOR_INT_MI,
  583.   OP_XOR_INT_MM,
  584.   OP_NEG_INT,
  585.   OP_NEG_INT64,
  586.   OP_ABS_INT,
  587.   OP_ABS_INT64,
  588.   OP_ABS_DOUBLE,
  589.   OP_ABS_SINGLE,
  590.   OP_ABS_EXTENDED,
  591.   OP_ABS_VARIANT,
  592.   OP_LT_INT_MI,
  593.   OP_LT_INT_MM,
  594.   OP_LE_INT_MI,
  595.   OP_LE_INT_MM,
  596.   OP_GT_INT_MI,
  597.   OP_GT_INT_MM,
  598.   OP_GE_INT_MI,
  599.   OP_GE_INT_MM,
  600.   OP_EQ_INT_MI,
  601.   OP_EQ_INT_MM,
  602.   OP_NE_INT_MI,
  603.   OP_NE_INT_MM,
  604.   OP_ADD_INT64,
  605.   OP_SUB_INT64,
  606.   OP_AND_INT64,
  607.   OP_OR_INT64,
  608.   OP_XOR_INT64,
  609.   OP_LT_INT64,
  610.   OP_LE_INT64,
  611.   OP_GT_INT64,
  612.   OP_GE_INT64,
  613.   OP_EQ_INT64,
  614.   OP_NE_INT64,
  615.   OP_ADD_CURRENCY,
  616.   OP_SUB_CURRENCY,
  617.   OP_MUL_CURRENCY,
  618.   OP_DIV_CURRENCY,
  619.   OP_LT_CURRENCY,
  620.   OP_LE_CURRENCY,
  621.   OP_GT_CURRENCY,
  622.   OP_GE_CURRENCY,
  623.   OP_EQ_CURRENCY,
  624.   OP_NE_CURRENCY,
  625.   OP_ADD_DOUBLE,
  626.   OP_SUB_DOUBLE,
  627.   OP_MUL_DOUBLE,
  628.   OP_DIV_DOUBLE,
  629.   OP_NEG_DOUBLE,
  630.   OP_NEG_CURRENCY,
  631.   OP_LT_DOUBLE,
  632.   OP_LE_DOUBLE,
  633.   OP_GT_DOUBLE,
  634.   OP_GE_DOUBLE,
  635.   OP_EQ_DOUBLE,
  636.   OP_NE_DOUBLE,
  637.   OP_ADD_SINGLE,
  638.   OP_SUB_SINGLE,
  639.   OP_MUL_SINGLE,
  640.   OP_DIV_SINGLE,
  641.   OP_NEG_SINGLE,
  642.   OP_LT_SINGLE,
  643.   OP_LE_SINGLE,
  644.   OP_GT_SINGLE,
  645.   OP_GE_SINGLE,
  646.   OP_EQ_SINGLE,
  647.   OP_NE_SINGLE,
  648.   OP_ADD_EXTENDED,
  649.   OP_SUB_EXTENDED,
  650.   OP_MUL_EXTENDED,
  651.   OP_DIV_EXTENDED,
  652.   OP_NEG_EXTENDED,
  653.   OP_LT_EXTENDED,
  654.   OP_LE_EXTENDED,
  655.   OP_GT_EXTENDED,
  656.   OP_GE_EXTENDED,
  657.   OP_EQ_EXTENDED,
  658.   OP_NE_EXTENDED,
  659.   OP_PUSH_EBP,
  660.   OP_POP,
  661.   OP_PUSH_ADDRESS,
  662.   OP_PUSH_STRUCTURE,
  663.   OP_PUSH_SET,
  664.   OP_PUSH_BYTE_IMM,
  665.   OP_PUSH_BYTE,
  666.   OP_PUSH_WORD_IMM,
  667.   OP_PUSH_WORD,
  668.   OP_PUSH_CARDINAL_IMM,
  669.   OP_PUSH_CARDINAL,
  670.   OP_PUSH_SMALLINT_IMM,
  671.   OP_PUSH_SMALLINT,
  672.   OP_PUSH_SHORTINT_IMM,
  673.   OP_PUSH_SHORTINT,
  674.   OP_PUSH_INT_IMM,
  675.   OP_PUSH_INT,
  676.   OP_PUSH_DOUBLE,
  677.   OP_PUSH_CURRENCY,
  678.   OP_PUSH_SINGLE,
  679.   OP_PUSH_EXTENDED,
  680.   OP_PUSH_ANSISTRING,
  681.   OP_PUSH_SHORTSTRING,
  682.   OP_PUSH_WIDESTRING,
  683.   OP_PUSH_UNICSTRING,
  684.   OP_PUSH_PANSICHAR_IMM,
  685.   OP_PUSH_PWIDECHAR_IMM,
  686.   OP_PUSH_INST,
  687.   OP_PUSH_CLSREF,
  688.   OP_PUSH_DYNARRAY,
  689.   OP_PUSH_INT64,
  690.   OP_PUSH_DATA,
  691.   OP_PUSH_EVENT,
  692.   OP_SET_ASSIGN,
  693.   OP_SET_UNION,
  694.   OP_SET_DIFFERENCE,
  695.   OP_SET_INTERSECTION,
  696.   OP_SET_SUBSET,
  697.   OP_SET_SUPERSET,
  698.   OP_SET_EQUALITY,
  699.   OP_SET_INEQUALITY,
  700.   OP_SET_MEMBERSHIP,
  701.   OP_GET_ANSISTR_PROP,
  702.   OP_SET_ANSISTR_PROP,
  703.   OP_GET_WIDESTR_PROP,
  704.   OP_SET_WIDESTR_PROP,
  705.   OP_GET_UNICSTR_PROP,
  706.   OP_SET_UNICSTR_PROP,
  707.   OP_GET_ORD_PROP,
  708.   OP_SET_ORD_PROP,
  709.   OP_GET_INTERFACE_PROP,
  710.   OP_SET_INTERFACE_PROP,
  711.   OP_GET_SET_PROP,
  712.   OP_SET_SET_PROP,
  713.   OP_GET_FLOAT_PROP,
  714.   OP_SET_FLOAT_PROP,
  715.   OP_GET_VARIANT_PROP,
  716.   OP_SET_VARIANT_PROP,
  717.   OP_GET_INT64_PROP,
  718.   OP_SET_INT64_PROP,
  719.   OP_GET_EVENT_PROP,
  720.   OP_SET_EVENT_PROP,
  721.   OP_SET_EVENT_PROP2,
  722.   OP_CREATE_METHOD
  723.   : Integer;
  724.   ASM_NOP,
  725.   ASM_WAIT,
  726.   ASM_CLC,
  727.   ASM_PUSHFD,
  728.   ASM_POPFD,
  729.   ASM_XCHG,
  730.   ASM_MOV,
  731.   ASM_LEA,
  732.   ASM_TEST,
  733.   ASM_ADD,
  734.   ASM_ADC,
  735.   ASM_SBB,
  736.   ASM_NEG,
  737.   ASM_SUB,
  738.   ASM_MUL,
  739.   ASM_IMUL,
  740.   ASM_DIV,
  741.   ASM_IDIV,
  742.   ASM_XOR,
  743.   ASM_AND,
  744.   ASM_OR,
  745.   ASM_SHL,
  746.   ASM_SHR,
  747.   ASM_CDQ,
  748.   ASM_CALL,
  749.   ASM_RET,
  750.   ASM_PUSH,
  751.   ASM_POP,
  752.   ASM_JMP,
  753.   ASM_JNO,
  754.   ASM_JNC,
  755.   ASM_JZ,
  756.   ASM_JNZ,
  757.   ASM_JBE,
  758.   ASM_JNLE,
  759.   ASM_FLD,
  760.   ASM_FILD,
  761.   ASM_FISTP,
  762.   ASM_FSTP,
  763.   ASM_FADD,
  764.   ASM_FSUB,
  765.   ASM_FMUL,
  766.   ASM_FDIV,
  767.   ASM_FCOMP,
  768.   ASM_FCOMPP,
  769.   ASM_FSTSV,
  770.   ASM_SAHF,
  771.   ASM_FCHS,
  772.   ASM_FABS,
  773.   ASM_SETL,
  774.   ASM_SETLE,
  775.   ASM_SETNLE,
  776.   ASM_SETNL,
  777.   ASM_SETB,
  778.   ASM_SETBE,
  779.   ASM_SETNBE,
  780.   ASM_SETNB,
  781.   ASM_SETZ,
  782.   ASM_SETNZ,
  783.   ASM_CMP,
  784.   ASM_REP_MOVSB,
  785.   ASM_REP_MOVSD
  786.   : Integer;
  787. type
  788.   TIsJSType = function (T: Integer): Boolean;
  789. function _IsJSType(T: Integer): Boolean;
  790. var
  791.   IsJSType: TIsJSType = {$IFDEF FPC}@{$ENDIF}_IsJSType;
  792. type
  793.   TSavePCUEvent = function (Sender: TObject; const UnitName: String): TStream
  794.     of object;
  795.   TLoadPCUEvent = function (Sender: TObject; const UnitName: String): TStream
  796.     of object;
  797.   TExceptionClass = class of Exception;
  798.   TCharSet = set of AnsiChar;
  799.   PPointer = ^Pointer;
  800.   TClassVisibility = (cvNone, cvPrivate, cvProtected, cvPublic, cvPublished);
  801.   
  802.   TBytes = array[0..1000000000] of Byte;
  803.   PBytes = ^TBytes;
  804.   TIntegers = array[0..100000] of Integer;
  805.   PIntegers = ^ TIntegers;
  806.   TPointers = array[0..100000] of Pointer;
  807.   PPointers = ^ TPointers;
  808.   TByteSet = set of Byte;
  809.   TTokenClass = (tcNone, tcSeparator, tcKeyword, tcIdentifier,
  810.                  tcBooleanConst, tcCharConst, tcPCharConst, tcIntegerConst,
  811.                  tcDoubleConst, tcNumCharConst, tcVariantConst,
  812.                  tcSpecial);
  813.   TTypedList = class
  814.   private
  815.     function GetCount: Integer;
  816.   public
  817.     L: TList;
  818.     constructor Create;
  819.     destructor Destroy; override;
  820.     procedure Clear; virtual;
  821.     procedure RemoveAt(I: Integer); virtual;
  822.     property Count: Integer read GetCount;
  823.   end;
  824.   TIntegerList = class
  825.   private
  826.     fItems: TList;
  827.     function GetItem(I: Integer): Integer;
  828.     procedure SetItem(I: Integer; value: Integer);
  829.     function GetCount: Integer;
  830.   public
  831.     constructor Create;
  832.     destructor Destroy; override;
  833.     procedure Clear;
  834.     function Add(value: Integer): Integer;
  835.     procedure Insert(I: Integer; value: Integer);
  836.     function IndexOf(value: Integer): Integer;
  837.     procedure RemoveAt(I: Integer);
  838.     procedure DeleteValue(value: Integer);
  839.     function Top: Integer;
  840.     procedure SaveToStream(S: TStream);
  841.     procedure LoadFromStream(S: TStream);
  842.     function SaveToPtr(P: Pointer): Integer;
  843.     function LoadFromPtr(P: Pointer): Integer;
  844.     function Clone: TIntegerList;
  845.     property Count: Integer read GetCount;
  846.     property Items[I: Integer]: Integer read GetItem write SetItem; default;
  847.     property Last: Integer read Top;
  848.   end;
  849.   TIntegerStack = class(TIntegerList)
  850.   public
  851.     procedure Push(value: Integer);
  852.     function Pop: Integer;
  853.     function Depth(value: Integer): Integer;
  854.   end;
  855.   TAssocIntegers = class
  856.   private
  857.     function GetCount: Integer;
  858.   public
  859.     Keys, Values: TIntegerList;
  860.     constructor Create;
  861.     destructor Destroy; override;
  862.     procedure Add(Key, Value: Integer);
  863.     procedure SaveToStream(S: TStream);
  864.     procedure LoadFromStream(S: TStream);
  865.     function SaveToPtr(P: Pointer): Integer;
  866.     function LoadFromPtr(P: Pointer): Integer;
  867.     property Count: Integer read GetCount;
  868.   end;
  869.   TStdTypeRec = class
  870.   public
  871.     Name: String;
  872.     TypeID: Integer;
  873.     Size: Integer;
  874.     NativeName: String;
  875.   end;
  876.   TStdTypeList = class
  877.   private
  878.     L: TList;
  879.     function GetRecord(I: Integer): TStdTypeRec;
  880.   public
  881.     constructor Create;
  882.     destructor Destroy; override;
  883.     function Add(const TypeName: String; Size: Integer): Integer;
  884.     function IndexOf(const S: String): Integer;
  885.     function Count: Integer;
  886.     function GetSize(TypeID: Integer): Integer;
  887.     property Records[I: Integer]: TStdTypeRec read GetRecord; default;
  888.   end;
  889.   THashArray = class
  890.   private
  891.     function GetMaxId: Integer;
  892.   public
  893.     A: array[0..MaxHash] of TIntegerList;
  894.     constructor Create;
  895.     destructor Destroy; override;
  896.     procedure AddName(const S: String; Id: Integer);
  897.     procedure DeleteName(const S: String; Id: Integer);
  898.     procedure Clear;
  899.     function Clone: THashArray;
  900.     function GetList(const S: String): TIntegerList;
  901.     property MaxId: Integer read GetMaxId;
  902.   end;
  903.   PaxCompilerException = class(Exception)
  904.   end;
  905.   PaxCancelException = class(EAbort)
  906.   end;
  907.   PaxExitException = class(EAbort);
  908.   TParamData = record
  909.     Flags: TParamFlags;
  910.     ParamName, TypeName: ShortString;
  911.   end;
  912.   PParamData = ^TParamData;
  913.   TGuidRec = class
  914.   public
  915.     GUID: TGUID;
  916.     Id: Integer;
  917.     Name: String;
  918.     GuidIndex: Integer;
  919.     procedure SaveToStream(S: TWriter);
  920.     procedure LoadFromStream(S: TReader);
  921.   end;
  922.   TGuidList = class
  923.   private
  924.     L: TList;
  925.     function GetRecord(I: Integer): TGuidRec;
  926.   public
  927.     constructor Create;
  928.     destructor Destroy; override;
  929.     function Count: Integer;
  930.     procedure Clear;
  931.     function Add(const GUID: TGUID; Id: Integer;
  932.                  const Name: String): TGuidRec;
  933.     function Clone: TGuidList;
  934.     function IndexOf(const GUID: TGUID): Integer;
  935.     function GetGuidByID(Id: Integer): TGUID;
  936.     function HasId(Id: Integer): Boolean;
  937.     procedure Delete(I: Integer);
  938.     procedure SaveToStream(S: TWriter);
  939.     procedure LoadFromStream(S: TReader);
  940.     property Records[I: Integer]: TGuidRec read GetRecord; default;
  941.   end;
  942. function StrEql(const S1, S2: String): Boolean;
  943. function ShiftPointer(P: Pointer; L: Integer): Pointer;
  944. function AlignLeft(const S: String; L: Integer): String;
  945. function ByteToHex(B: Byte): String;
  946. function IsShortInt(I: Integer): Boolean;
  947. function IsEmpty(const V: Variant): Boolean;
  948. function StrRefCountPtr(S: Pointer): Pointer;
  949. function StrRefCount(S: Pointer): Integer;
  950. function StrSizePtr(S: Pointer): Pointer;
  951. function StrSize(S: Pointer): Integer;
  952. function SaveStringListToStream(L: TStringList; P: TStream): Integer;
  953. function LoadStringListFromStream(L: TStringList; P: TStream): Integer;
  954. procedure SaveStringToStream(const S: String; P: TStream);
  955. function LoadStringFromStream(P: TStream): String;
  956. procedure SaveWideStringToStream(const S: WideString; P: TStream);
  957. function LoadWideStringFromStream(P: TStream): WideString;
  958. procedure SaveShortStringToStream(const S: ShortString; P: TStream);
  959. function LoadShortStringFromStream(P: TStream): ShortString;
  960. procedure SaveVariantToStream(const Value: Variant; S: TStream);
  961. function LoadVariantFromStream(S: TStream): Variant;
  962. procedure SaveIntegerToStream(Value: Integer; S: TStream);
  963. function LoadIntegerFromStream(S: TStream): Integer;
  964. function Int32ToByteSet(value: Integer): TByteSet;
  965. function ByteSetToInt32(value: TByteSet): Integer;
  966. function ByteSetToString(value: TByteSet; FinTypeId: Integer): String;
  967. function Norm(const S: String; L: Integer): String;
  968. function HashNumber(const S: String): Integer;
  969. function RemoveWhiteSpaces(const S: String): String;
  970. function PosCh(ch: Char; const S: String): Integer;
  971. function CountCh(ch: Char; const S: String): Integer;
  972. procedure ReplaceCh(var result: String; Source, Dest: Char);
  973. function RemoveCh(Ch: Char; const S: String): String;
  974. function RemoveChars(C: TCharSet; const S: String): String;
  975. function IsPositiveInt(S: PChar): Boolean;
  976. function GuidsAreEqual(const G1, G2: TGUID): Boolean;
  977. function ExtractName(const S: String): String;
  978. function ExtractFullName(const S: String): String;
  979. function ExtractClassName(const S: String): String;
  980. function ExtractOwner(const S: String): String;
  981. function ExtractFullOwner(const S: String): String;
  982. function ChCount(const S: String; Ch: Char): Integer;
  983. function CLSIDFromString(psz: PWideString; out clsid: TGUID): HResult; stdcall;
  984. var
  985.   Types: TStdTypeList;
  986.   Kinds: TStringList;
  987.   Operators: TStringList;
  988.   AsmOperators: TStringList;
  989.   DynDestrList: TIntegerList;
  990. function IsDynDestr(OP: Integer): Boolean;
  991. procedure ErrMessageBox(const S:  String);
  992. type
  993.   TVarPathRec = class
  994.   public
  995.     Id: Integer;
  996.     VarCount: Int64;
  997.   end;
  998.   TVarPath = class
  999.   private
  1000.     L: TList;
  1001.     function GetCount: Integer;
  1002.     function GetItem(I: Integer): TVarPathRec;
  1003.   public
  1004.     constructor Create;
  1005.     destructor Destroy; override;
  1006.     procedure Clear;
  1007.     function Add(Id: Integer; VarCount: Int64): TVarPathRec;
  1008.     function IndexOf(VarCount: Int64): Integer;
  1009.     function LastIndexOf(VarCount: Int64): Integer;
  1010.     property Count: Integer read GetCount;
  1011.     property Items[I: Integer]: TVarPathRec read GetItem; default;
  1012.   end;
  1013.   TVarPathList = class
  1014.   private
  1015.     L: TList;
  1016.     function GetCount: Integer;
  1017.     function GetPath(I: Integer): TVarPath;
  1018.   public
  1019.     constructor Create;
  1020.     destructor Destroy; override;
  1021.     procedure Clear;
  1022.     function AddPath: TVarPath;
  1023.     procedure Add(Id: Integer; VarCount: Int64);
  1024.     function GetLevel(VarCount: Int64): Integer;
  1025.     property Count: Integer read GetCount;
  1026.     property Pathes[I: Integer]: TVarPath read GetPath; default;
  1027.   end;
  1028.   TSomeTypeRec = class
  1029.   public
  1030.     Name: String;
  1031.     Id: Integer;
  1032.   end;
  1033.   TSomeTypeList = class
  1034.   private
  1035.     L: TList;
  1036.     function GetCount: Integer;
  1037.     function GetRecord(I: Integer): TSomeTypeRec;
  1038.   public
  1039.     constructor Create;
  1040.     destructor Destroy; override;
  1041.     procedure Clear;
  1042.     function Add(const Name: String; Id: Integer): TSomeTypeRec;
  1043.     procedure Delete(I: Integer);
  1044.     function Clone: TSomeTypeList;
  1045.     function IndexOf(const Name: String): Integer;
  1046.     property Count: Integer read GetCount;
  1047.     property Records[I: Integer]: TSomeTypeRec read GetRecord; default;
  1048.   end;
  1049.   TExternRecKind = (erNone, erLevel, erTypeId,
  1050.                     erOwnerId, erPatternId,
  1051.                     erAncestorId, erReadId, erWriteId,
  1052.                     ePropertyInBaseClassId,
  1053.                     erGUID);
  1054.   TCheckProc = function (const TypeName: String; Data: Pointer;
  1055.                          errKind: TExternRecKind): Boolean;
  1056.   TExternRec = class
  1057.   public
  1058.     Id: Integer;
  1059.     FullName: String;
  1060.     RecKind: TExternRecKind;
  1061.     procedure SaveToStream(S: TWriter);
  1062.     procedure LoadFromStream(S: TReader);
  1063.   end;
  1064.   TExternList = class
  1065.   private
  1066.     L: TList;
  1067.     function GetRecord(I: Integer): TExternRec;
  1068.     function GetCount: Integer;
  1069.   public
  1070.     constructor Create;
  1071.     destructor Destroy; override;
  1072.     procedure Clear;
  1073.     function Add(Id: Integer; const FullName: String;
  1074.                  RecKind: TExternRecKind): TExternRec;
  1075.     function Clone: TExternList;
  1076.     procedure SaveToStream(S: TWriter);
  1077.     procedure LoadFromStream(S: TReader);
  1078.     property Count: Integer read GetCount;
  1079.     property Records[I: Integer]: TExternRec read GetRecord; default;
  1080.   end;
  1081.   TFastStringList = class
  1082.   private
  1083.     L: TStringList;
  1084.     X: THashArray;
  1085.   public
  1086.     constructor Create;
  1087.     destructor Destroy; override;
  1088.     function Add(const S: String): Integer;
  1089.     function IndexOfEx(const S: String; Upcase: Boolean): Integer;
  1090.   end;
  1091.   TUndeclaredTypeRec = class
  1092.   public
  1093.     Id, ErrorIndex: Integer;
  1094.   end;
  1095.   TUndeclaredTypeList = class(TStringList)
  1096.     procedure Reset;
  1097.   end;
  1098. function GetImplementorOfInterface(const I: IUnknown): TObject;
  1099. function IsValidName(const S: String): Boolean;
  1100. type
  1101.   PClass = ^TClass;
  1102.   PSafeCallException = function  (Self: TObject; ExceptObject:
  1103.     TObject; ExceptAddr: Pointer): HResult;
  1104.   PAfterConstruction = procedure (Self: TObject);
  1105.   PBeforeDestruction = procedure (Self: TObject);
  1106.   PDispatch          = procedure (Self: TObject; var Message);
  1107.   PDefaultHandler    = procedure (Self: TObject; var Message);
  1108.   PNewInstance       = function  (Self: TClass) : TObject;
  1109.   PFreeInstance      = procedure (Self: TObject);
  1110.   PDestroy           = procedure (Self: TObject; OuterMost: ShortInt);
  1111.   PVmt = ^TVmt;
  1112. {$IFDEF UNIC}
  1113. { Virtual method table entries }
  1114. {
  1115.   vmtSelfPtr           = -88;
  1116.   vmtIntfTable         = -84;
  1117.   vmtAutoTable         = -80;
  1118.   vmtInitTable         = -76;
  1119.   vmtTypeInfo          = -72;
  1120.   vmtFieldTable        = -68;
  1121.   vmtMethodTable       = -64;
  1122.   vmtDynamicTable      = -60;
  1123.   vmtClassName         = -56;
  1124.   vmtInstanceSize      = -52;
  1125.   vmtParent            = -48;
  1126.   vmtEquals            = -44 deprecated 'Use VMTOFFSET in asm code';
  1127.   vmtGetHashCode       = -40 deprecated 'Use VMTOFFSET in asm code';
  1128.   vmtToString          = -36 deprecated 'Use VMTOFFSET in asm code';
  1129.   vmtSafeCallException = -32 deprecated 'Use VMTOFFSET in asm code';
  1130.   vmtAfterConstruction = -28 deprecated 'Use VMTOFFSET in asm code';
  1131.   vmtBeforeDestruction = -24 deprecated 'Use VMTOFFSET in asm code';
  1132.   vmtDispatch          = -20 deprecated 'Use VMTOFFSET in asm code';
  1133.   vmtDefaultHandler    = -16 deprecated 'Use VMTOFFSET in asm code';
  1134.   vmtNewInstance       = -12 deprecated 'Use VMTOFFSET in asm code';
  1135.   vmtFreeInstance      = -8 deprecated 'Use VMTOFFSET in asm code';
  1136.   vmtDestroy           = -4 deprecated 'Use VMTOFFSET in asm code';
  1137. }
  1138.   TVmt = packed record
  1139.     SelfPtr           : TClass;              // -88 pointer to virtual method table (or nil)
  1140.     IntfTable         : Pointer;             // -84 pointer to interface table (or nil)
  1141.     AutoTable         : Pointer;             // -80 pointer to Automation information table (or nil)
  1142.     InitTable         : Pointer;             // -76 pointer to instance initialization table (or nil)
  1143.     TypeInfo          : Pointer;             // -72 pointer to type information table (or nil)
  1144.     FieldTable        : Pointer;             // -58 pointer to field definition table (or nil)
  1145.     MethodTable       : Pointer;             // -64 pointer to method definition table (or nil)
  1146.     DynamicTable      : Pointer;             // -60 pointer to dynamic method table (or nil)
  1147.     ClassName         : PShortString;        // -56 pointer to short string containing class name
  1148.     InstanceSize      : Cardinal;            // -52 instance size in bytes
  1149.     Parent            : PClass;              // -48 pointer to a pointer to ancestor class (or nil)
  1150.     Equals            : Pointer;             // -44 deprecated 'Use VMTOFFSET in asm code';
  1151.     GetHashCode       : Pointer;             // -40
  1152.     ToString          : Pointer;             // -36
  1153.     SafeCallException : PSafeCallException;  // -32 pointer to entry point of SafecallException method (or nil)
  1154.     AfterConstruction : PAfterConstruction;  // -28 entry point of AfterConstruction method
  1155.     BeforeDestruction : PBeforeDestruction;  // -24 entry point of BeforeDestruction method
  1156.     Dispatch          : PDispatch;           // -20 entry point of Dispatch method
  1157.     DefaultHandler    : PDefaultHandler;     // -16 entry point of DefaultHandler method
  1158.     NewInstance       : PNewInstance;        // -12 entry point of NewInstance method
  1159.     FreeInstance      : PFreeInstance;       // -8 entry point of FreeInstance method
  1160.     Destroy           : PDestroy;            // -4 entry point of Destroy destructor
  1161.    {UserDefinedVirtuals: array[0..999] of procedure;}
  1162.   end;
  1163. {$ELSE}
  1164.   TVmt = packed record
  1165.     SelfPtr           : TClass;              // -76 pointer to virtual method table (or nil)
  1166.     IntfTable         : Pointer;             // -72 pointer to interface table (or nil)
  1167.     AutoTable         : Pointer;             // -68 pointer to Automation information table (or nil)
  1168.     InitTable         : Pointer;             // -64 pointer to instance initialization table (or nil)
  1169.     TypeInfo          : Pointer;             // -60 pointer to type information table (or nil)
  1170.     FieldTable        : Pointer;             // -56 pointer to field definition table (or nil)
  1171.     MethodTable       : Pointer;             // -52 pointer to method definition table (or nil)
  1172.     DynamicTable      : Pointer;             // -48 pointer to dynamic method table (or nil)
  1173.     ClassName         : PShortString;        // -44 pointer to short string containing class name
  1174.     InstanceSize      : Cardinal;            // -40 instance size in bytes
  1175.     Parent            : PClass;              // -36 pointer to a pointer to ancestor class (or nil)
  1176.     SafeCallException : PSafeCallException;  // -32 pointer to entry point of SafecallException method (or nil)
  1177.     AfterConstruction : PAfterConstruction;  // -28 entry point of AfterConstruction method
  1178.     BeforeDestruction : PBeforeDestruction;  // -24 entry point of BeforeDestruction method
  1179.     Dispatch          : PDispatch;           // -20 entry point of Dispatch method
  1180.     DefaultHandler    : PDefaultHandler;     // -16 entry point of DefaultHandler method
  1181.     NewInstance       : PNewInstance;        // -12 entry point of NewInstance method
  1182.     FreeInstance      : PFreeInstance;       // -8 entry point of FreeInstance method
  1183.     Destroy           : PDestroy;            // -4 entry point of Destroy destructor
  1184.    {UserDefinedVirtuals: array[0..999] of procedure;}
  1185.   end;
  1186. {$ENDIF}
  1187. function GetVmtFromClass(AClass: TClass): PVmt;
  1188. function GetVmtFromObject(Instance: TObject): PVmt;
  1189. function GetClassFromVMT(Vmt: PVmt): TClass;
  1190. function GetDestructorAddress(AClass: TClass): Pointer;
  1191. const
  1192.   MaxVirtuals = 999;
  1193.   strPaxSignature = 'This is a pax class';
  1194.   PaxSignatureLength = 19;
  1195. type
  1196.   PPointerArray = ^TPointerArray;
  1197.   TPointerArray = array[0..MaxVirtuals] of pointer;
  1198.   PPaxInfo = ^TPaxInfo;
  1199.   TPaxInfo = packed record
  1200.     PaxSignature: String[PaxSignatureLength];
  1201.     Prog: Pointer;
  1202.     ClassIndex: Integer;
  1203.   end;
  1204.   PPaxClassRec = ^TPaxClassRec;
  1205.   TPaxClassRec = packed record
  1206.     PaxInfo: TPaxInfo;
  1207.     VMT: TVMT;
  1208.     UserDefinedVirtuals: TPointerArray;
  1209.   end;
  1210. function GetPaxInfo(C: TClass): PPaxInfo;
  1211. function IsPaxObject(X: TObject): Boolean;
  1212. function IsPaxClass(C: TClass): Boolean;
  1213. function GetIntResultType(T1, T2: Integer): Integer;
  1214. {$IFDEF UNIC}
  1215. {$ELSE}
  1216. function CharInSet(C: AnsiChar; const CharSet: TCharSet): Boolean;
  1217. {$ENDIF}
  1218. type
  1219.   PVmtMethod = ^TVmtMethod;
  1220.   TVmtMethod = packed record
  1221.   {$ifdef WIN32}
  1222.     Size: Word;
  1223.   {$endif}
  1224.     Address: Pointer;
  1225.     Name: ShortString;
  1226.   end;
  1227.   PVmtMethodTable = ^TVmtMethodTable;
  1228.   TVmtMethodTable = packed record
  1229.     Count: Word;
  1230.     Methods: array[0..MaxListSize] of Byte;
  1231.     { Methods: array[1..Count] of TVmtMethod; }
  1232.   end;
  1233.   PFieldClassTable = ^TFieldClassTable;
  1234.   TFieldClassTable = packed record
  1235.     Count: Smallint;
  1236.     Classes: array [0..8191] of ^TPersistentClass;
  1237.   end;
  1238.   PVmtField = ^TVmtField;
  1239.   TVmtField = packed record
  1240.     Offset: Cardinal;    { Offset of field in the class data. }
  1241.     ClassIndex: Word;    { Index in the FieldClassTable. }
  1242.     Name: ShortString;
  1243.   end;
  1244.   PVmtFieldTable = ^TVmtFieldTable;
  1245.   TVmtFieldTable = packed record
  1246.     Count: Word;
  1247.     FieldClassTable: {$ifdef WIN32} PFieldClassTable {$else} Word {$endif};
  1248.     Fields: packed array[0..MaxListSize] of Byte;
  1249.     { Fields: packed array [1..Count] of TVmtField; }
  1250.   end;
  1251. function GetMethodSize(PMethod: PVmtMethod): Cardinal;
  1252. function GetFieldSize(PField: PVmtField): Cardinal;
  1253. function GetFieldTable(AClass: TClass): PVmtFieldTable;
  1254. function GetFieldClassTableSize(FieldClassTable: PFieldClassTable): Integer;
  1255. function CreateFieldClassTable(InitCount: SmallInt): PFieldClassTable;
  1256. procedure DestroyFieldClassTable(FieldClassTable: PFieldClassTable);
  1257. function StringToGUID(const S: string): TGUID;
  1258. function GUIDToString(const GUID: TGUID): string;
  1259. function LoadText(const FileName: String): String;
  1260. type
  1261.   TStreamRec = class
  1262.   public
  1263.     UnitName: String;
  1264.     Stream: TMemoryStream;
  1265.     constructor Create;
  1266.     destructor Destroy;override;
  1267.   end;
  1268.   TStreamList = class(TTypedList)
  1269.   private
  1270.     function GetRecord(I: Integer): TStreamRec;
  1271.   public
  1272.     function IndexOf(const UnitName: String): Integer;
  1273.     procedure AddFromFile(const FileName: String);
  1274.     property Records[I: Integer]: TStreamRec read GetRecord; default;
  1275.   end;
  1276. implementation
  1277. constructor TStreamRec.Create;
  1278. begin
  1279.   inherited;
  1280.   Stream := TMemoryStream.Create;
  1281. end;
  1282. destructor TStreamRec.Destroy;
  1283. begin
  1284.   inherited;
  1285.   Stream.Free;
  1286. end;
  1287. function TStreamList.GetRecord(I: Integer): TStreamRec;
  1288. begin
  1289.   result := TStreamRec(L[I]);
  1290. end;
  1291. function TStreamList.IndexOf(const UnitName: String): Integer;
  1292. var
  1293.   I: Integer;
  1294. begin
  1295.   result := -1;
  1296.   for I := 0 to Count - 1 do
  1297.     if StrEql(UnitName, Records[I].UnitName) then
  1298.     begin
  1299.       result := I;
  1300.       Exit;
  1301.     end;
  1302. end;
  1303. procedure TStreamList.AddFromFile(const FileName: String);
  1304. var
  1305.   UnitName: String;
  1306.   R: TStreamRec;
  1307. begin
  1308.   UnitName := ExtractOwner(FileName);
  1309.   if IndexOf(UnitName) <> -1 then
  1310.     Exit;
  1311.   R := TStreamRec.Create;
  1312.   R.UnitName := UnitName;
  1313.   R.Stream.LoadFromFile(FileName);
  1314.   L.Add(R);
  1315. end;
  1316. function StringToGUID(const S: string): TGUID;
  1317.   procedure InvalidGUID;
  1318.   begin
  1319.     raise Exception.Create(errSyntaxError);
  1320.   end;
  1321.   function HexChar(c: Char): Byte;
  1322.   begin
  1323.     case c of
  1324.       '0'..'9':  Result := Byte(c) - Byte('0');
  1325.       'a'..'f':  Result := (Byte(c) - Byte('a')) + 10;
  1326.       'A'..'F':  Result := (Byte(c) - Byte('A')) + 10;
  1327.     else
  1328.       InvalidGUID;
  1329.       Result := 0;
  1330.     end;
  1331.   end;
  1332.   function HexByte(p: PChar): Char;
  1333.   begin
  1334.     Result := Char((HexChar(p[0]) shl 4) + HexChar(p[1]));
  1335.   end;
  1336. var
  1337.   i: Integer;
  1338.   src, dest: PChar;
  1339. begin
  1340.   if ((Length(S) <> 38) or (s[1] <> '{')) then InvalidGUID;
  1341.   dest := @Result;
  1342.   src := PChar(s);
  1343.   Inc(src);
  1344.   for i := 0 to 3 do
  1345.     dest[i] := HexByte(src+(3-i)*2);
  1346.   Inc(src, 8);
  1347.   Inc(dest, 4);
  1348.   if src[0] <> '-' then InvalidGUID;
  1349.   Inc(src);
  1350.   for i := 0 to 1 do
  1351.   begin
  1352.     dest^ := HexByte(src+2);
  1353.     Inc(dest);
  1354.     dest^ := HexByte(src);
  1355.     Inc(dest);
  1356.     Inc(src, 4);
  1357.     if src[0] <> '-' then InvalidGUID;
  1358.     inc(src);
  1359.   end;
  1360.   dest^ := HexByte(src);
  1361.   Inc(dest);
  1362.   Inc(src, 2);
  1363.   dest^ := HexByte(src);
  1364.   Inc(dest);
  1365.   Inc(src, 2);
  1366.   if src[0] <> '-' then InvalidGUID;
  1367.   Inc(src);
  1368.   for i := 0 to 5 do
  1369.   begin
  1370.     dest^ := HexByte(src);
  1371.     Inc(dest);
  1372.     Inc(src, 2);
  1373.   end;
  1374. end;
  1375. function GUIDToString(const GUID: TGUID): string;
  1376. begin
  1377.   SetLength(Result, 38);
  1378.   StrLFmt(PChar(Result), 38,'{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}',   // do not localize
  1379.     [GUID.D1, GUID.D2, GUID.D3, GUID.D4[0], GUID.D4[1], GUID.D4[2], GUID.D4[3],
  1380.     GUID.D4[4], GUID.D4[5], GUID.D4[6], GUID.D4[7]]);
  1381. end;
  1382. function CreateFieldClassTable(InitCount: SmallInt): PFieldClassTable;
  1383. var
  1384.   SZ: Integer;
  1385. begin
  1386.   SZ := SizeOf(SmallInt) + InitCount * SizeOf(Pointer);
  1387.   result := AllocMem(SZ);
  1388.   result^.Count := InitCount;
  1389. end;
  1390. procedure DestroyFieldClassTable(FieldClassTable: PFieldClassTable);
  1391. var
  1392.   SZ: Integer;
  1393. begin
  1394.   SZ := GetFieldClassTableSize(FieldClassTable);
  1395.   FreeMem(FieldClassTable, SZ);
  1396. end;
  1397. function GetFieldClassTableSize(FieldClassTable: PFieldClassTable): Integer;
  1398. begin
  1399.   result := SizeOf(FieldClassTable^.Count) +
  1400.             FieldClassTable^.Count * SizeOf(Pointer);
  1401. end;
  1402. function GetFieldTable(AClass: TClass): PVmtFieldTable; assembler;
  1403. asm
  1404.   MOV EAX, [EAX].vmtFieldTable
  1405. end;
  1406. function GetMethodSize(PMethod: PVmtMethod): Cardinal;
  1407. begin
  1408. {$ifdef WIN32}
  1409.   Result := PMethod^.Size;
  1410. {$else}
  1411.   Result := SizeOf(Pointer) + Length(PMethod^.Name) + 1; 
  1412. {$endif}
  1413. end;
  1414. function GetFieldSize(PField: PVmtField): Cardinal;
  1415. begin
  1416.   Result := SizeOf(PField^.Offset) + SizeOf(PField^.ClassIndex) +
  1417.             Length(PField^.Name) + 1;
  1418. end;
  1419. function IsDynDestr(OP: Integer): Boolean;
  1420. begin
  1421.   result := DynDestrList.IndexOf(OP) <> -1;
  1422. end;
  1423. function GetPaxInfo(C: TClass): PPaxInfo;
  1424. var
  1425.   P: Pointer;
  1426. begin
  1427.   result := nil;
  1428.   if C = nil then
  1429.     Exit;
  1430.   P := GetVMTFromClass(C);
  1431.   P := ShiftPointer(P, - SizeOf(TPaxInfo));
  1432.   if Byte(P^) = PaxSignatureLength then
  1433.     if PShortString(P)^ = strPaxSignature then
  1434.       result := P;
  1435. end;
  1436. function IsPaxObject(X: TObject): Boolean;
  1437. begin
  1438.   if X = nil then
  1439.   begin
  1440.     result := false;
  1441.     Exit;
  1442.   end;
  1443.   result := IsPaxClass(X.ClassType);
  1444. end;
  1445. function IsPaxClass(C: TClass): Boolean;
  1446. begin
  1447.   if C = nil then
  1448.   begin
  1449.     result := false;
  1450.     Exit;
  1451.   end;
  1452.   result := GetPaxInfo(C) <> nil;
  1453. end;
  1454. function GetVmtFromClass(AClass: TClass): PVmt;
  1455. begin
  1456.   if AClass = nil then
  1457.   begin
  1458.     result := nil;
  1459.     Exit;
  1460.   end;
  1461.   Result := PVmt(AClass);
  1462.   Dec(Result);
  1463. end;
  1464. function GetDestructorAddress(AClass: TClass): Pointer;
  1465. begin
  1466.   result := ShiftPointer(AClass, -4);
  1467.   result := Pointer(result^);
  1468. end;
  1469. function GetVmtFromObject(Instance: TObject): PVmt;
  1470. begin
  1471.   Result := GetVmtFromClass(Instance.ClassType);
  1472. end;
  1473. function GetClassFromVMT(Vmt: PVmt): TClass;
  1474. begin
  1475.   if Vmt = nil then
  1476.   begin
  1477.     result := nil;
  1478.     Exit;
  1479.   end;
  1480.   Inc(Vmt);
  1481.   result := TClass(Vmt);
  1482. end;
  1483. function ChCount(const S: String; Ch: Char): Integer;
  1484. var
  1485.   I: Integer;
  1486. begin
  1487.   result := 0;
  1488.   for I:=1 to Length(S) do
  1489.     if S[I] = Ch then
  1490.       Inc(result);
  1491. end;
  1492. function GetIntResultType(T1, T2: Integer): Integer;
  1493. begin
  1494.   result := typeINTEGER;
  1495.   if not ((T1 in IntegerTypes) and (T2 in IntegerTypes)) then
  1496.     raise Exception.Create(errInternalError);
  1497.   if (T1 in UnsignedIntegerTypes) or (T2 in UnsignedIntegerTypes) then
  1498.     result := typeCARDINAL;
  1499.   if (T1 = typeINT64) or (T2 = typeINT64) then
  1500.     result := typeINT64;
  1501. end;
  1502. function GetImplementorOfInterface(const I: IUnknown): TObject;
  1503. { TODO -cDOC : Original code by Hallvard Vassbotn }
  1504. { TODO -cTesting : Check the implemetation for any further version of compiler }
  1505. const
  1506.   AddByte = $04244483; // opcode for ADD DWORD PTR [ESP+4], Shortint
  1507.   AddLong = $04244481; // opcode for ADD DWORD PTR [ESP+4], Longint
  1508. type
  1509.   PAdjustSelfThunk = ^TAdjustSelfThunk;
  1510.   TAdjustSelfThunk = packed record
  1511.     case AddInstruction: Longint of
  1512.       AddByte: (AdjustmentByte: ShortInt);
  1513.       AddLong: (AdjustmentLong: Longint);
  1514.   end;
  1515.   PInterfaceMT = ^TInterfaceMT;
  1516.   TInterfaceMT = packed record
  1517.     QueryInterfaceThunk: PAdjustSelfThunk;
  1518.   end;
  1519.   TInterfaceRef = ^PInterfaceMT;
  1520. var
  1521.   QueryInterfaceThunk: PAdjustSelfThunk;
  1522. begin
  1523.   try
  1524.     Result := Pointer(I);
  1525.     if Assigned(Result) then
  1526.     begin
  1527.       QueryInterfaceThunk := TInterfaceRef(I)^.QueryInterfaceThunk;
  1528.       case QueryInterfaceThunk.AddInstruction of
  1529.         AddByte:
  1530.           Inc(PChar(Result), QueryInterfaceThunk.AdjustmentByte);
  1531.         AddLong:
  1532.           Inc(PChar(Result), QueryInterfaceThunk.AdjustmentLong);
  1533.       else
  1534.         Result := nil;
  1535.       end;
  1536.     end;
  1537.   except
  1538.     Result := nil;
  1539.   end;
  1540. end;
  1541. function IsValidName(const S: String): Boolean;
  1542. var
  1543.   I: Integer;
  1544. begin
  1545.   if S = '' then
  1546.   begin
  1547.     result := false;
  1548.     Exit;
  1549.   end;
  1550.   result := true;
  1551.   for I := 1 to Length(S) do
  1552.     if not (AnsiChar(S[I]) in ['a'..'z','A'..'Z','_','0'..'9']) then
  1553.     begin
  1554.       result := false;
  1555.       Exit;
  1556.     end;
  1557. end;
  1558. // TTypedList ------------------------------------------------------------------
  1559. constructor TTypedList.Create;
  1560. begin
  1561.   inherited;
  1562.   L := TList.Create;
  1563. end;
  1564. destructor TTypedList.Destroy;
  1565. begin
  1566.   Clear;
  1567.   L.Free;
  1568.   inherited;
  1569. end;
  1570. function TTypedList.GetCount: Integer;
  1571. begin
  1572.   result := L.Count;
  1573. end;
  1574. procedure TTypedList.Clear;
  1575. var
  1576.   I: Integer;
  1577. begin
  1578.   for I:=0 to L.Count - 1 do
  1579.     TObject(L[I]).Free;
  1580.   L.Clear;
  1581. end;
  1582. procedure TTypedList.RemoveAt(I: Integer);
  1583. begin
  1584.   TObject(L[I]).Free;
  1585.   L.Delete(I);
  1586. end;
  1587. // TUndeclaredTypeList ---------------------------------------------------------
  1588. procedure TUndeclaredTypeList.Reset;
  1589. var
  1590.   I: Integer;
  1591. begin
  1592.   for I:= 0 to Count - 1 do
  1593.     Objects[I].Free;
  1594.   Clear;
  1595. end;
  1596. // TFastStringList -------------------------------------------------------------
  1597. constructor TFastStringList.Create;
  1598. begin
  1599.   inherited;
  1600.   L := TStringList.Create;
  1601.   X := THashArray.Create;
  1602. end;
  1603. destructor TFastStringList.Destroy;
  1604. begin
  1605.   L.Free;
  1606.   X.Free;
  1607.   inherited;
  1608. end;
  1609. function TFastStringList.Add(const S: String): Integer;
  1610. var
  1611.   H: Integer;
  1612. begin
  1613.   H := HashNumber(S);
  1614.   result := L.Add(S);
  1615.   X.A[H].Add(result);
  1616. end;
  1617. function TFastStringList.IndexOfEx(const S: String; Upcase: Boolean): Integer;
  1618. var
  1619.   I, J: Integer;
  1620.   List: TIntegerList;
  1621. begin
  1622.   result := -1;
  1623.   List := X.GetList(S);
  1624.   for I := 0 to List.Count - 1 do
  1625.   begin
  1626.     J := List[I];
  1627.     if Upcase then
  1628.     begin
  1629.       if StrEql(L[J], S) then
  1630.       begin
  1631.         result := J;
  1632.         Exit;
  1633.       end;
  1634.     end
  1635.     else
  1636.     begin
  1637.       if L[J] = S then
  1638.       begin
  1639.         result := J;
  1640.         Exit;
  1641.       end;
  1642.     end;
  1643.   end;
  1644. end;
  1645. // TExternRec ------------------------------------------------------------------
  1646. procedure TExternRec.SaveToStream(S: TWriter);
  1647. begin
  1648.   S.WriteInteger(id);
  1649.   S.WriteString(FullName);
  1650.   S.Write(RecKind, SizeOf(RecKind));
  1651. end;
  1652. procedure TExternRec.LoadFromStream(S: TReader);
  1653. begin
  1654.   Id := S.ReadInteger;
  1655.   FullName := S.ReadString;
  1656.   S.Read(RecKind, SizeOf(RecKind));
  1657. end;
  1658. // TExternList -----------------------------------------------------------------
  1659. constructor TExternList.Create;
  1660. begin
  1661.   inherited;
  1662.   L := TList.Create;
  1663. end;
  1664. destructor TExternList.Destroy;
  1665. begin
  1666.   Clear;
  1667.   L.Free;
  1668.   inherited;
  1669. end;
  1670. procedure TExternList.Clear;
  1671. var
  1672.   I: Integer;
  1673. begin
  1674.   for I:=0 to Count - 1 do
  1675.     Records[I].Free;
  1676.   L.Clear;
  1677. end;
  1678. function TExternList.Clone: TExternList;
  1679. var
  1680.   I: Integer;
  1681. begin
  1682.   result := TExternList.Create;
  1683.   for I:=0 to Count - 1 do
  1684.     with Records[I] do
  1685.     begin
  1686.       result.Add(Id, FullName, RecKind);
  1687.     end;
  1688. end;
  1689. function TExternList.GetRecord(I: Integer): TExternRec;
  1690. begin
  1691.   result := TExternRec(L[I]);
  1692. end;
  1693. function TExternList.GetCount: Integer;
  1694. begin
  1695.   result := L.Count;
  1696. end;
  1697. function TExternList.Add(Id: Integer; const FullName: String;
  1698.                          RecKind: TExternRecKind): TExternRec;
  1699. begin
  1700.   result := TExternRec.Create;
  1701.   result.Id := Id;
  1702.   result.FullName := FullName;
  1703.   result.RecKind := RecKind;
  1704.   L.Add(result);
  1705. end;
  1706. procedure TExternList.SaveToStream(S: TWriter);
  1707. var
  1708.   I: Integer;
  1709. begin
  1710.   S.WriteInteger(Count);
  1711.   for I := 0 to Count - 1 do
  1712.     Records[I].SaveToStream(S);
  1713. end;
  1714. procedure TExternList.LoadFromStream(S: TReader);
  1715. var
  1716.   I, K: Integer;
  1717.   R: TExternRec;
  1718. begin
  1719.   K := S.ReadInteger;
  1720.   for I := 0 to K - 1 do
  1721.   begin
  1722.     R := TExternRec.Create;
  1723.     R.LoadFromStream(S);
  1724.     L.Add(R);
  1725.   end;
  1726. end;
  1727. // TSomeTypeList ---------------------------------------------------------------
  1728. constructor TSomeTypeList.Create;
  1729. begin
  1730.   inherited;
  1731.   L := TList.Create;
  1732. end;
  1733. destructor TSomeTypeList.Destroy;
  1734. begin
  1735.   Clear;
  1736.   L.Free;
  1737.   inherited;
  1738. end;
  1739. function TSomeTypeList.GetCount: Integer;
  1740. begin
  1741.   result := L.Count;
  1742. end;
  1743. function TSomeTypeList.GetRecord(I: Integer): TSomeTypeRec;
  1744. begin
  1745.   result := TSomeTypeRec(L[I]);
  1746. end;
  1747. procedure TSomeTypeList.Clear;
  1748. var
  1749.   I: Integer;
  1750. begin
  1751.   for I:=0 to Count - 1 do
  1752.     Records[I].Free;
  1753.   L.Clear;
  1754. end;
  1755. function TSomeTypeList.Add(const Name: String; Id: Integer): TSomeTypeRec;
  1756. begin
  1757.   result := TSomeTypeRec.Create;
  1758.   result.Name := Name;
  1759.   result.Id := Id;
  1760.   L.Add(result);
  1761. end;
  1762. procedure TSomeTypeList.Delete(I: Integer);
  1763. begin
  1764.   Records[I].Free;
  1765.   L.Delete(I);
  1766. end;
  1767. function TSomeTypeList.Clone: TSomeTypeList;
  1768. var
  1769.   I: Integer;
  1770. begin
  1771.   result := TSomeTypeList.Create;
  1772.   for I := 0 to Count - 1 do
  1773.     result.Add(Records[I].Name, Records[I].Id);
  1774. end;
  1775. function TSomeTypeList.IndexOf(const Name: String): Integer;
  1776. var
  1777.   I: Integer;
  1778. begin
  1779.   result := -1;
  1780.   for I := 0 to Count - 1 do
  1781.     if StrEql(Records[I].Name, Name) then
  1782.     begin
  1783.       result := I;
  1784.       Exit;
  1785.     end;
  1786. end;
  1787. // TVarPath --------------------------------------------------------------------
  1788. constructor TVarPath.Create;
  1789. begin
  1790.   inherited;
  1791.   L := TList.Create;
  1792. end;
  1793. destructor TVarPath.Destroy;
  1794. begin
  1795.   Clear;
  1796.   L.Free;
  1797.   inherited;
  1798. end;
  1799. function TVarPath.GetCount: Integer;
  1800. begin
  1801.   result := L.Count;
  1802. end;
  1803. function TVarPath.GetItem(I: Integer): TVarPathRec;
  1804. begin
  1805.   result := TVarPathRec(L[I]);
  1806. end;
  1807. procedure TVarPath.Clear;
  1808. var
  1809.   I: Integer;
  1810. begin
  1811.   for I := 0 to Count - 1 do
  1812.     Items[I].Free;
  1813.   L.Clear;
  1814. end;
  1815. function TVarPath.Add(Id: Integer; VarCount: Int64): TVarPathRec;
  1816. begin
  1817.   result := TVarPathRec.Create;
  1818.   result.Id := Id;
  1819.   result.VarCount := VarCount;
  1820.   L.Add(result);
  1821. end;
  1822. function TVarPath.IndexOf(VarCount: Int64): Integer;
  1823. var
  1824.   I: Integer;
  1825. begin
  1826.   result := -1;
  1827.   for I := 0 to Count - 1 do
  1828.     if Items[I].VarCount = VarCount then
  1829.     begin
  1830.       result := I;
  1831.       Exit;
  1832.     end;
  1833. end;
  1834. function TVarPath.LastIndexOf(VarCount: Int64): Integer;
  1835. var
  1836.   I: Integer;
  1837. begin
  1838.   result := -1;
  1839.   for I := Count - 1 downto 0 do
  1840.     if Items[I].VarCount = VarCount then
  1841.     begin
  1842.       result := I;
  1843.       Exit;
  1844.     end;
  1845. end;
  1846. // TVarPathList ----------------------------------------------------------------
  1847. constructor TVarPathList.Create;
  1848. begin
  1849.   inherited;
  1850.   L := TList.Create;
  1851. end;
  1852. destructor TVarPathList.Destroy;
  1853. begin
  1854.   Clear;
  1855.   L.Free;
  1856.   inherited;
  1857. end;
  1858. procedure TVarPathList.Clear;
  1859. var
  1860.   I: Integer;
  1861. begin
  1862.   for I := 0 to Count - 1 do
  1863.     Pathes[I].Free;
  1864.   L.Clear;
  1865. end;
  1866. function TVarPathList.GetCount: Integer;
  1867. begin
  1868.   result := L.Count;
  1869. end;
  1870. function TVarPathList.GetPath(I: Integer): TVarPath;
  1871. begin
  1872.   result := TVarPath(L[I]);
  1873. end;
  1874. function TVarPathList.AddPath: TVarPath;
  1875. begin
  1876.   result := TVarPath.Create;
  1877.   L.Add(result);
  1878. end;
  1879. function TVarPathList.GetLevel(VarCount: Int64): Integer;
  1880. begin
  1881.   if VarCount < 100 then
  1882.     result := 1
  1883.   else if VarCount < 10000 then
  1884.     result := 2
  1885.   else if VarCount < 1000000 then
  1886.     result := 3
  1887.   else if VarCount < 100000000 then
  1888.     result := 4
  1889.   else if VarCount < 10000000000 then
  1890.     result := 5
  1891.   else if VarCount < 1000000000000 then
  1892.     result := 6
  1893.   else if VarCount < 100000000000000 then
  1894.     result := 7
  1895.   else
  1896.     raise PaxCompilerException.Create(errTooManyNestedCaseBlocks);
  1897. end;
  1898. procedure TVarPathList.Add(Id: Integer; VarCount: Int64);
  1899. var
  1900.   I, J, Idx: Integer;
  1901.   Path: TVarPath;
  1902.   Level: Integer;
  1903.   ParentVarCount: Integer;
  1904.   R: TVarPathRec;
  1905.   new_path: Boolean;
  1906. begin
  1907.   if Count = 0 then
  1908.   begin
  1909.     Path := AddPath;
  1910.     Path.Add(Id, VarCount);
  1911.     Exit;
  1912.   end;
  1913.   for I := 0 to Count - 1 do
  1914.   begin
  1915.     Path := Pathes[I];
  1916.     Idx := Path.IndexOf(VarCount);
  1917.     if Idx >= 0 then
  1918.     begin
  1919.       Path.Add(Id, VarCount);
  1920.       Exit;
  1921.     end;
  1922.   end;
  1923.   Level := GetLevel(VarCount);
  1924.   if Level = 1 then
  1925.   begin
  1926.     Path := AddPath;
  1927.     Path.Add(Id, VarCount);
  1928.     Exit;
  1929.   end;
  1930.  case Level of
  1931.    2:
  1932.    begin
  1933.      ParentVarCount := VarCount mod 100;
  1934.      new_path := VarCount div 100 > 1;
  1935.    end;
  1936.    3:
  1937.    begin
  1938.      ParentVarCount := VarCount mod 10000;
  1939.      new_path := VarCount div 10000 > 1;
  1940.    end;
  1941.    4:
  1942.    begin
  1943.      ParentVarCount := VarCount mod 1000000;
  1944.      new_path := VarCount div 1000000 > 1;
  1945.    end;
  1946.    5:
  1947.    begin
  1948.      ParentVarCount := VarCount mod 100000000;
  1949.      new_path := VarCount div 100000000 > 1;
  1950.    end;
  1951.    6:
  1952.    begin
  1953.      ParentVarCount := VarCount mod 10000000000;
  1954.      new_path := VarCount div 10000000000 > 1;
  1955.    end;
  1956.    7:
  1957.    begin
  1958.      ParentVarCount := VarCount mod 1000000000000;
  1959.      new_path := VarCount div 1000000000000 > 1;
  1960.    end
  1961.  else
  1962.    raise PaxCompilerException.Create(errTooManyNestedCaseBlocks);
  1963.  end;
  1964.   for I := Count - 1 downto 0 do
  1965.   begin
  1966.     Idx := Pathes[I].LastIndexOf(ParentVarCount);
  1967.     if Idx >= 0 then
  1968.     begin
  1969.       if new_path then
  1970.       begin
  1971.         Path := AddPath;
  1972.         for J := 0 to Idx do
  1973.         begin
  1974.           R := Pathes[I][J];
  1975.           Path.Add(R.Id, R.VarCount);
  1976.         end;
  1977.         Path.Add(Id, VarCount);
  1978.       end
  1979.       else
  1980.       begin
  1981.         Path := Pathes[I];
  1982.         Path.Add(Id, VarCount);
  1983.       end;
  1984.       Exit;
  1985.     end;
  1986.   end;
  1987.   Path := AddPath;
  1988.   Path.Add(Id, VarCount);
  1989. end;
  1990. //------------------------------------------------------------------------------
  1991. procedure ErrMessageBox(const S:  String);
  1992. begin
  1993. {$IFDEF CONSOLE}
  1994.   writeln(S);
  1995.   Exit;
  1996. {$ENDIF}
  1997. {$IFDEF LINUX}
  1998.   Application.MessageBox(PChar(S), 'paxCompiler', [smbOK]);
  1999. {$ELSE}
  2000.   MessageBox(GetActiveWindow(), PChar(S), PChar('paxCompiler'), MB_ICONEXCLAMATION or MB_OK);
  2001. {$ENDIF}
  2002. end;
  2003. procedure TGuidRec.SaveToStream(S: TWriter);
  2004. begin
  2005.   S.Write(Id, SizeOf(Id));
  2006.   S.Write(Guid, SizeOf(Guid));
  2007.   S.WriteString(Name);
  2008. end;
  2009. procedure TGuidRec.LoadFromStream(S: TReader);
  2010. begin
  2011.   S.Read(Id, SizeOf(Id));
  2012.   S.Read(Guid, SizeOf(Guid));
  2013.   Name := S.ReadString;
  2014. end;
  2015. constructor TGuidList.Create;
  2016. begin
  2017.   inherited;
  2018.   L := TList.Create;
  2019. end;
  2020. destructor TGuidList.Destroy;
  2021. begin
  2022.   Clear;
  2023.   L.Free;
  2024.   inherited;
  2025. end;
  2026. function TGuidList.Count: Integer;
  2027. begin
  2028.   result := L.Count;
  2029. end;
  2030. procedure TGuidList.Clear;
  2031. var
  2032.   I: Integer;
  2033. begin
  2034.   for I:=0 to Count - 1 do
  2035.     Records[I].Free;
  2036. end;
  2037. procedure TGuidList.Delete(I: Integer);
  2038. begin
  2039.   Records[I].Free;
  2040.   L.Delete(I);
  2041. end;
  2042. function TGuidList.Add(const GUID: TGUID; Id: Integer;
  2043.                        const Name: String): TGuidRec;
  2044. var
  2045.   I: Integer;
  2046. begin
  2047.   I := IndexOf(GUID);
  2048.   if I >= 0 then
  2049.   begin
  2050.     result := Records[I];
  2051.     Exit;
  2052.   end;
  2053.   result := TGuidRec.Create;
  2054.   L.Add(result);
  2055.   result.GUID := GUID;
  2056.   result.Name := Name;
  2057.   result.GuidIndex := L.Count - 1;
  2058.   result.Id := Id;
  2059. end;
  2060. function TGuidList.Clone: TGuidList;
  2061. var
  2062.   I: Integer;
  2063. begin
  2064.   result := TGuidList.Create;
  2065.   for I := 0 to Count - 1 do
  2066.     result.Add(Records[I].GUID, Records[I].Id, Records[I].Name);
  2067. end;
  2068. function TGuidList.IndexOf(const GUID: TGUID): Integer;
  2069. var
  2070.   I: Integer;
  2071. begin
  2072.   result := -1;
  2073.   for I := 0 to Count - 1 do
  2074.     if GuidsAreEqual(Records[I].GUID, GUID) then
  2075.     begin
  2076.       result := I;
  2077.       Exit;
  2078.     end;
  2079. end;
  2080. function TGuidList.GetGuidByID(Id: Integer): TGUID;
  2081. var
  2082.   I: Integer;
  2083. begin
  2084.   for I := 0 to Count - 1 do
  2085.     if Records[I].Id = Id then
  2086.     begin
  2087.       result := Records[I].GUID;
  2088.       Exit;
  2089.     end;
  2090.   result := IUnknown;
  2091. end;
  2092. function TGuidList.HasId(Id: Integer): Boolean;
  2093. var
  2094.   I: Integer;
  2095. begin
  2096.   for I := 0 to Count - 1 do
  2097.     if Records[I].Id = Id then
  2098.     begin
  2099.       result := true;
  2100.       Exit;
  2101.     end;
  2102.   result := false;
  2103. end;
  2104. procedure TGuidList.SaveToStream(S: TWriter);
  2105. var
  2106.   I, K: Integer;
  2107. begin
  2108.   K := Count;
  2109.   S.Write(K, SizeOf(K));
  2110.   for I := 0 to K - 1 do
  2111.     Records[I].SaveToStream(S);
  2112. end;
  2113. procedure TGuidList.LoadFromStream(S: TReader);
  2114. var
  2115.   I, K: Integer;
  2116.   R: TGuidRec;
  2117. begin
  2118.   Clear;
  2119.   S.Read(K, SizeOf(K));
  2120.   for I := 0 to K - 1 do
  2121.   begin
  2122.     R := TGuidRec.Create;
  2123.     R.LoadFromStream(S);
  2124.     Add(R.GUID, R.Id, R.Name);
  2125.     R.Free;
  2126.   end;
  2127. end;
  2128. function TGuidList.GetRecord(I: Integer): TGuidRec;
  2129. begin
  2130.   result := TGuidRec(L[I]);
  2131. end;
  2132. constructor THashArray.Create;
  2133. var
  2134.   I: Integer;
  2135. begin
  2136.   for I:=0 to MaxHash do
  2137.     A[I] := TIntegerList.Create;
  2138. end;
  2139. procedure THashArray.Clear;
  2140. var
  2141.   I: Integer;
  2142. begin
  2143.   for I:=0 to MaxHash do
  2144.     A[I].Clear;
  2145. end;
  2146. destructor THashArray.Destroy;
  2147. var
  2148.   I: Integer;
  2149. begin
  2150.   for I:=0 to MaxHash do
  2151.     A[I].Free;
  2152. end;
  2153. function THashArray.GetList(const S: String): TIntegerList;
  2154. var
  2155.   H: Integer;
  2156. begin
  2157.   H := HashNumber(S);
  2158.   result := A[H];
  2159. end;
  2160. function THashArray.GetMaxId: Integer;
  2161. var
  2162.   I, J: Integer;
  2163. begin
  2164.   result := 0;
  2165.   for I:=0 to MaxHash do
  2166.     for J := 0 to A[I].Count - 1 do
  2167.       if A[I][J] > result then
  2168.         result := A[I][J];
  2169. end;
  2170. function IsPositiveInt(S: PChar): Boolean;
  2171. var
  2172.   N: Byte;
  2173.   c: Char;
  2174. begin
  2175.   if S^ = #0 then
  2176.   begin
  2177.     result := false;
  2178.     Exit;
  2179.   end;
  2180.   result := true;
  2181.   repeat
  2182.     c := S^;
  2183.     if c = #0 then
  2184.       Exit;
  2185.     N := Ord(c);
  2186.     if N < Ord('0') then
  2187.     begin
  2188.       result := false;
  2189.       Exit;
  2190.     end;
  2191.     if N > Ord('9') then
  2192.     begin
  2193.       result := false;
  2194.       Exit;
  2195.     end;
  2196.     Inc(S);
  2197.   until false;
  2198. end;
  2199. function HashNumber(const S: String): Integer;
  2200. var
  2201.   I, J: Integer;
  2202. begin
  2203.   if S = '' then
  2204.   begin
  2205.     raise Exception.Create(errInternalError);
  2206.   end;
  2207.   I := 0;
  2208.   for J:=1 to Length(S) do
  2209.   begin
  2210.     I := I shl 1;
  2211.     I := I xor ord(UpCase(S[J]));
  2212.   end;
  2213.   if I < 0 then I := - I;
  2214.   result := I mod MaxHash;
  2215. end;
  2216. procedure THashArray.AddName(const S: String; Id: Integer);
  2217. var
  2218.   H: Integer;
  2219. begin
  2220.   if S = '' then
  2221.     Exit;
  2222.   H := HashNumber(S);
  2223.   with A[H] do
  2224.     Add(Id);
  2225. end;
  2226. procedure THashArray.DeleteName(const S: String; Id: Integer);
  2227. var
  2228.   H: Integer;
  2229. begin
  2230.   if S = '' then
  2231.     Exit;
  2232.   H := HashNumber(S);
  2233.   with A[H] do
  2234.     DeleteValue(Id);
  2235. end;
  2236. function THashArray.Clone: THashArray;
  2237. var
  2238.   I, J: Integer;
  2239. begin
  2240.   result := THashArray.Create;
  2241.   for I:=0 to MaxHash do
  2242.   begin
  2243.     for J:=0 to A[I].Count - 1 do
  2244.       result.A[I].Add(A[I][J]);
  2245.   end;
  2246. end;
  2247. {$IFDEF LINUX}
  2248. function CLSIDFromString;
  2249. begin
  2250. end;
  2251. {$ELSE}
  2252. function CLSIDFromString; external 'ole32.dll' name 'CLSIDFromString';
  2253. {$ENDIF}
  2254. function GuidsAreEqual(const G1, G2: TGUID): Boolean;
  2255. begin
  2256. {$IFDEF VARIANTS}
  2257.   result := SysUtils.IsEqualGUID(G1, G2);
  2258. {$ELSE}
  2259.   result := CompareMem(@G1, @G2, SizeOf(TGUID));
  2260. {$ENDIF}
  2261. end;
  2262. function Norm(const S: String; L: Integer): String;
  2263. begin
  2264.   result := Copy(S, 1, L);
  2265.   while Length(result) < L do
  2266.     result := ' ' + result;
  2267. end;
  2268. function Int32ToByteSet(value: Integer): TByteSet;
  2269. begin
  2270.   result := [];
  2271.   Move(value, result, 4);
  2272. end;
  2273. function ByteSetToInt32(value: TByteSet): Integer;
  2274. begin
  2275.   Move(value, result, 4);
  2276. end;
  2277. function ByteSetToString(value: TByteSet; FinTypeId: Integer): String;
  2278. var
  2279.   I, B1, B2: Integer;
  2280.   X: Boolean;
  2281. label
  2282.   L;
  2283. begin
  2284.   result := '[';
  2285.   X := true;
  2286.   B1 := -1;
  2287.   B2 := -1;
  2288.   for I:= 0 to 255 do
  2289.     if I in value then
  2290.     begin
  2291.       if X then
  2292.       begin
  2293.         B1 := I;
  2294.         B2 := I;
  2295.         X := false;
  2296.       end
  2297.       else
  2298.       begin
  2299.         B2 := I;
  2300.       end;
  2301.       if I = 255 then
  2302.         goto L;
  2303.     end
  2304.     else if B1 >= 0 then
  2305.     begin
  2306. L:
  2307.       if B2 - B1 = 0 then
  2308.         case FinTypeId of
  2309.           typeANSICHAR:
  2310.             result := result + '''' + Chr(B1) + '''';
  2311.           typeBOOLEAN:
  2312.             if B1 = 0 then
  2313.               result := result + 'false'
  2314.             else
  2315.               result := result + 'true'
  2316.           else
  2317.             result := result + IntToStr(B1);
  2318.         end
  2319.       else
  2320.         case FinTypeId of
  2321.           typeANSICHAR:
  2322.             result := result + '''' + Chr(B1) + '''' + '..' +
  2323.                                '''' + Chr(B2) + '''';
  2324.           typeBOOLEAN:
  2325.             result := result + 'false..true';
  2326.           else
  2327.             result := result + IntToStr(B1) + '..' + IntToStr(B2);
  2328.         end;
  2329.       B1 := -1;
  2330.       X := true;
  2331.       result := result + ',';
  2332.     end;
  2333.   if result[Length(result)] = ',' then
  2334.     result[Length(result)] := ']'
  2335.   else
  2336.     result := result + ']';
  2337. end;
  2338. {$IFDEF UNIC}
  2339. function SaveStringListToStream(L: TStringList; P: TStream): Integer;
  2340. var
  2341.   I, K: Integer;
  2342. begin
  2343.   K := L.Count;
  2344.   P.Write(K, 4);
  2345.   result := 4;
  2346.   for I:=0 to L.Count - 1 do
  2347.   begin
  2348.     SaveStringToStream(L[I], P);
  2349.     Inc(result, 4 + Length(L[I]) * SizeOf(Char));
  2350.   end;
  2351. end;
  2352. function LoadStringListFromStream(L: TStringList; P: TStream): Integer;
  2353. var
  2354.   I, K: Integer;
  2355.   S: String;
  2356. begin
  2357.   P.Read(K, 4);
  2358.   result := 4;
  2359.   for I:=0 to K - 1 do
  2360.   begin
  2361.     S := LoadStringFromStream(P);
  2362.     L.Add(S);
  2363.     Inc(result, 4 + Length(S) * SizeOf(Char));
  2364.   end;
  2365. end;
  2366. {$ELSE}
  2367. function SaveStringListToStream(L: TStringList; P: TStream): Integer;
  2368. var
  2369.   I, K: Integer;
  2370.   S: ShortString;
  2371. begin
  2372.   result := 0;
  2373.   K := L.Count;
  2374.   P.Write(K, 4);
  2375.   Inc(result, 4);
  2376.   for I:=0 to L.Count - 1 do
  2377.   begin
  2378.     S := L[I];
  2379.     K := Length(S);
  2380.     P.Write(K, 4);
  2381.     P.Write(S[1], Length(S));
  2382.     Inc(result, Length(S) + 4);
  2383.   end;
  2384. end;
  2385. function LoadStringListFromStream(L: TStringList; P: TStream): Integer;
  2386. var
  2387.   I, K, Count: Integer;
  2388.   S: ShortString;
  2389. begin
  2390.   result := 0;
  2391.   P.Read(Count, 4);
  2392.   Inc(result, 4);
  2393.   for I:=0 to Count - 1 do
  2394.   begin
  2395.     P.Read(K, 4);
  2396.     P.Read(S[1], K);
  2397.     S[0] := AnsiChar(Chr(K));
  2398.     L.Add(S);
  2399.     Inc(result, Length(S) + 4);
  2400.   end;
  2401. end;
  2402. {$ENDIF}
  2403. procedure SaveShortStringToStream(const S: ShortString; P: TStream);
  2404. begin
  2405.   P.Write(S[0], Length(S) + 1);
  2406. end;
  2407. function LoadShortStringFromStream(P: TStream): ShortString;
  2408. var
  2409.   L: Byte;
  2410. begin
  2411.   P.Read(L, SizeOf(Byte));
  2412.   P.Read(result[1], L);
  2413.   result[0] := AnsiChar(Chr(L));
  2414. end;
  2415. procedure SaveStringToStream(const S: String; P: TStream);
  2416. var
  2417.   K: Integer;
  2418. begin
  2419.   K := Length(S);
  2420.   P.Write(K, 4);
  2421.   if K > 0 then
  2422.     P.Write(Pointer(S)^, K * SizeOf(Char));
  2423. end;
  2424. function LoadStringFromStream(P: TStream): String;
  2425. var
  2426.   K: Integer;
  2427. begin
  2428.   P.Read(K, 4);
  2429.   SetLength(result, K);
  2430.   if K > 0 then
  2431.     P.Read(Pointer(result)^, K * SizeOf(Char));
  2432. end;
  2433. procedure SaveWideStringToStream(const S: WideString; P: TStream);
  2434. var
  2435.   K: Integer;
  2436. begin
  2437.   K := Length(S);
  2438.   P.Write(K, 4);
  2439.   if K > 0 then
  2440.     P.Write(Pointer(S)^, K * 2);
  2441. end;
  2442. function LoadWideStringFromStream(P: TStream): WideString;
  2443. var
  2444.   K: Integer;
  2445. begin
  2446.   P.Read(K, 4);
  2447.   SetLength(result, K);
  2448.   if K > 0 then
  2449.     P.Read(Pointer(result)^, K * 2);
  2450. end;
  2451. procedure SaveVariantToStream(const Value: Variant; S: TStream);
  2452. var
  2453.   VType: Integer;
  2454. begin
  2455.   VType := VarType(Value);
  2456.   SaveIntegerToStream(VType, S);
  2457.   case VType of
  2458.     varString:
  2459.       SaveStringToStream(Value, S);
  2460. {$IFDEF UNIC}
  2461.     varUString:
  2462.       SaveStringToStream(Value, S);
  2463. {$ENDIF}
  2464.     varOleStr:
  2465.       SaveWideStringToStream(Value, S);
  2466.     else
  2467.       S.Write(Value, SizeOf(Variant));
  2468.   end;
  2469. end;
  2470. function LoadVariantFromStream(S: TStream): Variant;
  2471. var
  2472.   VType: Integer;
  2473. begin
  2474.   VType := LoadIntegerFromStream(S);
  2475.   case VType of
  2476.     varString:
  2477.       result := LoadStringFromStream(S);
  2478. {$IFDEF UNIC}
  2479.     varUString:
  2480.       result := LoadStringFromStream(S);
  2481. {$ENDIF}
  2482.     varOleStr:
  2483.       result := LoadWideStringFromStream(S);
  2484.     else
  2485.       S.ReadBuffer(result, SizeOf(Variant));
  2486.   end;
  2487. end;
  2488. procedure SaveIntegerToStream(Value: Integer; S: TStream);
  2489. begin
  2490.   S.Write(Value, SizeOf(Integer));
  2491. end;
  2492. function LoadIntegerFromStream(S: TStream): Integer;
  2493. begin
  2494.   S.Read(result, SizeOf(Integer));
  2495. end;
  2496. function IsEmpty(const V: Variant): Boolean;
  2497. begin
  2498.   result := VarType(V) = varEmpty;
  2499. end;
  2500. //-- TIntegerList --------------------------------------------------------------
  2501. constructor TIntegerList.Create;
  2502. begin
  2503.   inherited;
  2504.   fItems := TList.Create;
  2505. end;
  2506. destructor TIntegerList.Destroy;
  2507. begin
  2508.   fItems.Free;
  2509.   inherited;
  2510. end;
  2511. function TIntegerList.Clone: TIntegerList;
  2512. var
  2513.   I: Integer;
  2514. begin
  2515.   result := TIntegerList.Create;
  2516.   for I:=0 to Count - 1 do
  2517.     result.Add(Items[I]);
  2518. end;
  2519. procedure TIntegerList.Clear;
  2520. begin
  2521.   fItems.Clear;
  2522. end;
  2523. function TIntegerList.GetCount: Integer;
  2524. begin
  2525.   result := fItems.Count;
  2526. end;
  2527. function TIntegerList.GetItem(I: Integer): Integer;
  2528. begin
  2529.   result := Integer(fItems[I]);
  2530. end;
  2531. procedure TIntegerList.SetItem(I: Integer; value: Integer);
  2532. begin
  2533.   fItems[I] := Pointer(value);
  2534. end;
  2535. function TIntegerList.Add(value: Integer): Integer;
  2536. begin
  2537.   result := fItems.Add(Pointer(value));
  2538. end;
  2539. procedure TIntegerList.Insert(I: Integer; value: Integer);
  2540. begin
  2541.   fItems.Insert(I, Pointer(value));
  2542. end;
  2543. procedure TIntegerList.RemoveAt(I: Integer);
  2544. begin
  2545.   fItems.Delete(I);
  2546. end;
  2547. procedure TIntegerList.DeleteValue(value: Integer);
  2548. var
  2549.   I: Integer;
  2550. begin
  2551.   I := IndexOf(value);
  2552.   if I >= 0 then
  2553.     fItems.Delete(I);
  2554. end;
  2555. function TIntegerList.IndexOf(value: Integer): Integer;
  2556. begin
  2557.   result := fItems.IndexOf(Pointer(value));
  2558. end;
  2559. function TIntegerList.Top: Integer;
  2560. begin
  2561.   if Count  = 0 then
  2562.     raise PaxCompilerException.Create(errInternalError);
  2563.   result := Items[Count - 1];
  2564. end;
  2565. procedure TIntegerList.SaveToStream(S: TStream);
  2566. var
  2567.   I: Integer;
  2568. begin
  2569.   SaveIntegerToStream(Count, S);
  2570.   for I:=0 to Count - 1 do
  2571.     SaveIntegerToStream(Integer(fItems[I]), S);
  2572. end;
  2573. procedure TIntegerList.LoadFromStream(S: TStream);
  2574. var
  2575.   I, K: Integer;
  2576. begin
  2577.   Clear;
  2578.   K := LoadIntegerFromStream(S);
  2579.   for I:=0 to K - 1 do
  2580.     Add(LoadIntegerFromStream(S));
  2581. end;
  2582. function TIntegerList.SaveToPtr(P: Pointer): Integer;
  2583. var
  2584.   I, K: Integer;
  2585. begin
  2586.   K := Count;
  2587.   Move(K, P^, 4);
  2588.   P := ShiftPointer(P, 4);
  2589.   for I:=0 to Count - 1 do
  2590.   begin
  2591.     K := Integer(fItems[I]);
  2592.     Move(K, P^, 4);
  2593.     P := ShiftPointer(P, 4);
  2594.   end;
  2595.   result := (Count * 4) + 4;
  2596. end;
  2597. function TIntegerList.LoadFromPtr(P: Pointer): Integer;
  2598. var
  2599.   I, K, Z: Integer;
  2600. begin
  2601.   Move(P^, K, 4);
  2602.   P := ShiftPointer(P, 4);
  2603.   for I:=0 to K - 1 do
  2604.   begin
  2605.     Move(P^, Z, 4);
  2606.     P := ShiftPointer(P, 4);
  2607.     Add(Z);
  2608.   end;
  2609.   result := (Count * 4) + 4;
  2610. end;
  2611. //-- TIntegerStack -------------------------------------------------------------
  2612. procedure TIntegerStack.Push(value: Integer);
  2613. begin
  2614.   Add(value);
  2615. end;
  2616. function TIntegerStack.Pop: Integer;
  2617. begin
  2618.   result := Items[Count - 1];
  2619.   fItems.Delete(Count - 1);
  2620. end;
  2621. function TIntegerStack.Depth(value: Integer): Integer;
  2622. var
  2623.   I: Integer;
  2624. begin
  2625.   result := -1;
  2626.   for I:=Count - 1 downto 0 do
  2627.   begin
  2628.     Inc(result);
  2629.     if Items[I] = value then
  2630.       Exit;
  2631.   end;
  2632.   raise Exception.Create(errInternalError);
  2633. end;
  2634. constructor TAssocIntegers.Create;
  2635. begin
  2636.   inherited;
  2637.   Keys := TIntegerList.Create;
  2638.   Values := TIntegerList.Create;
  2639. end;
  2640. destructor TAssocIntegers.Destroy;
  2641. begin
  2642.   Keys.Free;
  2643.   Values.Free;
  2644.   inherited;
  2645. end;
  2646. procedure TAssocIntegers.SaveToStream(S: TStream);
  2647. begin
  2648.   Keys.SaveToStream(S);
  2649.   Values.SaveToStream(S);
  2650. end;
  2651. procedure TAssocIntegers.LoadFromStream(S: TStream);
  2652. begin
  2653.   Keys.LoadFromStream(S);
  2654.   Values.LoadFromStream(S);
  2655. end;
  2656. function TAssocIntegers.SaveToPtr(P: Pointer): Integer;
  2657. begin
  2658.   result := Keys.SaveToPtr(P);
  2659.   P := ShiftPointer(P, result);
  2660.   Inc(result, Values.SaveToPtr(P));
  2661. end;
  2662. function TAssocIntegers.LoadFromPtr(P: Pointer): Integer;
  2663. begin
  2664.   result := Keys.LoadFromPtr(P);
  2665.   P := ShiftPointer(P, result);
  2666.   Inc(result, Values.LoadFromPtr(P));
  2667. end;
  2668. function TAssocIntegers.GetCount: Integer;
  2669. begin
  2670.   result := Keys.Count;
  2671. end;
  2672. procedure TAssocIntegers.Add(Key, Value: Integer);
  2673. begin
  2674.   Keys.Add(Key);
  2675.   Values.Add(Value);
  2676. end;
  2677. function StrEql(const S1, S2: String): Boolean;
  2678. begin
  2679.   result := CompareText(S1, S2) = 0;
  2680. end;
  2681. function ExtractName(const S: String): String;
  2682. var
  2683.   I, L: Integer;
  2684. begin
  2685.   L := Length(S);
  2686.   for I:= L downto 1 do
  2687. {$IFDEF UNIC}
  2688.     if CharInSet(S[I], ['.', '/', '']) then
  2689. {$ELSE}
  2690.     if S[I] in ['.', '/', ''] then
  2691. {$ENDIF}
  2692.     begin
  2693.       result := Copy(S, I + 1, L - I);
  2694.       Exit;
  2695.     end;
  2696.   result := S;
  2697. end;
  2698. function ExtractFullName(const S: String): String;
  2699. var
  2700.   I, L: Integer;
  2701. begin
  2702.   L := Length(S);
  2703.   for I:= 1 to L do
  2704.     if S[I] = '.' then
  2705.     begin
  2706.       result := Copy(S, I + 1, L - I);
  2707.       Exit;
  2708.     end;
  2709.   result := S;
  2710. end;
  2711. function ExtractFullOwner(const S: String): String;
  2712. var
  2713.   I, L: Integer;
  2714. begin
  2715.   L := Length(S);
  2716.   for I:= L downto 1 do
  2717.     if S[I] = '.' then
  2718.     begin
  2719.       result := Copy(S, 1, I - 1);
  2720.       Exit;
  2721.     end;
  2722.   result := '';
  2723. end;
  2724. function ExtractClassName(const S: String): String;
  2725. var
  2726.   I, L, K1, K2: Integer;
  2727. begin
  2728.   L := Length(S);
  2729.   result := '';
  2730.   K1 := 0;
  2731.   K2 := 0;
  2732.   for I:= L downto 1 do
  2733.     if S[I] = '.' then
  2734.       if K2 = 0 then
  2735.         K2 := I
  2736.       else
  2737.       begin
  2738.         K1 := I;
  2739.         result := Copy(S, K1 + 1, K2 - K1 - 1);
  2740.         Exit;
  2741.       end;
  2742.   result := Copy(S, K1 + 1, K2 - K1 - 1);
  2743. end;
  2744. function ExtractOwner(const S: String): String;
  2745. var
  2746.   P: Integer;
  2747. begin
  2748.   result := '';
  2749.   P := PosCh('.', S);
  2750.   if P > 0 then
  2751.     result := Copy(S, 1, P - 1);
  2752. end;
  2753. function ShiftPointer(P: Pointer; L: Integer): Pointer;
  2754. begin
  2755.  result := Pointer(Integer(P) + L);
  2756. end;
  2757. function AlignLeft(const S: String; L: Integer): String;
  2758. begin
  2759.   result := S;
  2760.   while Length(result) < L do
  2761.     result := result + ' ';
  2762. end;
  2763. function ByteToHex(B: Byte): String;
  2764. begin
  2765.   result := Format('%x', [B]);
  2766.   if Length(result) = 1 then
  2767.     result := '0' + result;
  2768. end;
  2769. constructor TStdTypeList.Create;
  2770. begin
  2771.   inherited;
  2772.   L := TList.Create;
  2773. end;
  2774. destructor TStdTypeList.Destroy;
  2775. var
  2776.   I: Integer;
  2777. begin
  2778.   for I:=0 to L.Count - 1 do
  2779.     Records[I].Free;
  2780.   L.Free;
  2781.   inherited;
  2782. end;
  2783. function TStdTypeList.IndexOf(const S: String): Integer;
  2784. var
  2785.   I: Integer;
  2786.   Q: String;
  2787. begin
  2788.   Q := UpperCase(S);
  2789.   for I:=0 to L.Count - 1 do
  2790.     if Records[I].Name = Q then
  2791.     begin
  2792.       result := I;
  2793.       Exit;
  2794.     end;
  2795.   result := -1;
  2796. end;
  2797. function TStdTypeList.GetRecord(I: Integer): TStdTypeRec;
  2798. begin
  2799.   if I = typePANSICHAR then
  2800.     I := typePOINTER
  2801.   else if I = typePVOID then
  2802.     I := typePOINTER;
  2803.   result := TStdTypeRec(L[I]);
  2804. end;
  2805. function TStdTypeList.Count: Integer;
  2806. begin
  2807.   result := L.Count;
  2808. end;
  2809. function TStdTypeList.Add(const TypeName: String; Size: Integer): Integer;
  2810. var
  2811.   R: TStdTypeRec;
  2812. begin
  2813.   R := TStdTypeRec.Create;
  2814.   R.TypeID := L.Count;
  2815.   L.Add(R);
  2816.   R.Size := Size;
  2817.   R.Name := UpperCase(TypeName);
  2818.   R.NativeName := TypeName;
  2819.   result := R.TypeID;
  2820. end;
  2821. function TStdTypeList.GetSize(TypeID: Integer): Integer;
  2822. begin
  2823.   result := Records[TypeID].Size;
  2824. end;
  2825. function IsShortInt(I: Integer): Boolean;
  2826. begin
  2827.   result := Abs(I) <= 127;
  2828. end;
  2829. function StrRefCountPtr(S: Pointer): Pointer;
  2830. begin
  2831.   if S <> nil then
  2832.     result := Pointer(Integer(Pointer(S)) - 8)
  2833.   else
  2834.     result := nil;
  2835. end;
  2836. function StrRefCount(S: Pointer): Integer;
  2837. begin
  2838.   result := Integer(StrRefCountPtr(S)^);
  2839. end;
  2840. function StrSizePtr(S: Pointer): Pointer;
  2841. begin
  2842.   if S <> nil then
  2843.     result := Pointer(Integer(Pointer(S)) - 4)
  2844.   else
  2845.     result := nil;
  2846. end;
  2847. function StrSize(S: Pointer): Integer;
  2848. begin
  2849.   result := Integer(StrSizePtr(S)^);
  2850. end;
  2851. function RemoveWhiteSpaces(const S: String): String;
  2852. var
  2853.   I: Integer;
  2854.   ch: Char;
  2855. begin
  2856.   result := '';
  2857.   for I:=1 to Length(S) do
  2858.   begin
  2859.     ch := S[I];
  2860.     if ch = ' ' then begin end
  2861.     else if ch = #9 then begin end
  2862.     else
  2863.       result := result + ch;
  2864.   end;
  2865. end;
  2866. function RemoveChars(C: TCharSet; const S: String): String;
  2867. var
  2868.   I: Integer;
  2869.   ch: Char;
  2870.   b: Boolean;
  2871. begin
  2872.   result := '';
  2873.   for I:=1 to Length(S) do
  2874.   begin
  2875.     ch := S[I];
  2876. {$IFDEF UNIC}
  2877.     b := CharInSet(ch, C);
  2878. {$ELSE}
  2879.     b := ch in C;
  2880. {$ENDIF}
  2881.     if b then
  2882.     begin
  2883.     end
  2884.     else
  2885.       result := result + ch;
  2886.   end;
  2887. end;
  2888. function PosCh(ch: Char; const S: String): Integer;
  2889. var
  2890.   I: Integer;
  2891. begin
  2892.   for I:=1 to Length(S) do
  2893.     if S[I] = ch then
  2894.     begin
  2895.       result := I;
  2896.       Exit;
  2897.     end;
  2898.   result := 0;
  2899. end;
  2900. function CountCh(ch: Char; const S: String): Integer;
  2901. var
  2902.   I: Integer;
  2903. begin
  2904.   result := 0;
  2905.   for I:=1 to Length(S) do
  2906.     if S[I] = ch then
  2907.       Inc(result);
  2908. end;
  2909. function RemoveCh(Ch: Char; const S: String): String;
  2910. var
  2911.   I: Integer;
  2912. begin
  2913.   result := '';
  2914.   for I:=1 to Length(S) do
  2915.     if S[I] <> Ch then
  2916.       result := result + S[I];
  2917. end;
  2918. procedure ReplaceCh(var result: String; Source, Dest: Char);
  2919. var
  2920.   I: Integer;
  2921. begin
  2922.   for I := 1 to Length(result) do
  2923.     if result[I] = Source then
  2924.       result[I] := Dest;
  2925. end;
  2926. {$IFDEF UNIC}
  2927. {$ELSE}
  2928. function CharInSet(C: AnsiChar; const CharSet: TCharSet): Boolean;
  2929. begin
  2930.   Result := C in CharSet;
  2931. end;
  2932. {$ENDIF}
  2933. function LoadText(const FileName: String): String;
  2934. var
  2935.   L: TStringList;
  2936. begin
  2937.   L := TStringList.Create;
  2938.   try
  2939.     L.LoadFromFile(FileName);
  2940.     result := L.Text;
  2941.   finally
  2942.     L.Free;
  2943.   end;
  2944. end;
  2945. function _IsJSType(T: Integer): Boolean;
  2946. begin
  2947.   result := false;
  2948. end;
  2949. initialization
  2950.   Types := TStdTypeList.Create;
  2951.   with Types do
  2952.   begin
  2953.     Add('', 0);
  2954.     Add('Void', SizeOf(Pointer));
  2955.     Add('Boolean', SizeOf(Boolean));
  2956.     Add('Byte', SizeOf(Byte));
  2957.     Add('Char', SizeOf(AnsiChar));
  2958.     Add('String', SizeOf(Pointer));
  2959.     Add('Word', SizeOf(Word));
  2960.     Add('Integer', SizeOf(Integer));
  2961.     Add('Double', SizeOf(Double));
  2962.     Add('Pointer', SizeOf(Pointer));
  2963.     Add('#RECORD', 0);
  2964.     Add('#ARRAY', 0);
  2965.     Add('#ALIAS', 0);
  2966.     Add('#ENUM', SizeOf(Byte));
  2967.     Add('#PROC', SizeOf(Pointer));
  2968.     Add('#SET', 32);
  2969.     Add('ShortString', 256);
  2970.     Add('Single', SizeOf(Single));
  2971.     Add('Extended', SizeOf(Extended));
  2972.     Add('#CLASS', SizeOf(Pointer));
  2973.     Add('#CLASSREF', SizeOf(Pointer));
  2974.     Add('WideChar', SizeOf(WideChar));
  2975.     Add('WideString', SizeOf(WideString));
  2976.     Add('Variant', SizeOf(Variant));
  2977.     Add('#DYNARRAY', SizeOf(Pointer));
  2978.     Add('Int64', SizeOf(Int64));
  2979.     Add('#INTERFACE', SizeOf(Pointer));
  2980.     Add('Cardinal', SizeOf(Cardinal));
  2981.     Add('#EVENT', SizeOf(TMethod));
  2982.     Add('Currency', SizeOf(Currency));
  2983.     Add('SmallInt', SizeOf(SmallInt));
  2984.     Add('ShortInt', SizeOf(ShortInt));
  2985.     Add('WordBool', SizeOf(WordBool));
  2986.     Add('LongBool', SizeOf(LongBool));
  2987.     Add('ByteBool', SizeOf(ByteBool));
  2988.     Add('OleVariant', SizeOf(OleVariant));
  2989. {$IFDEF UNIC}
  2990.     Add('UnicodeString', SizeOf(UnicString));
  2991. {$ENDIF}
  2992.   end;
  2993.   Kinds := TStringList.Create;
  2994.   with Kinds do
  2995.   begin
  2996.     Add('');
  2997.     Add('VAR');
  2998.     Add('CONST');
  2999.     Add('SUB');
  3000.     Add('PARAM');
  3001.     Add('TYPE');
  3002.     Add('T FIELD');
  3003.     Add('LABEL');
  3004.     Add('NAMESP');
  3005.     Add('CONSTR');
  3006.     Add('DESTR');
  3007.     Add('PROP');
  3008.     Add('END CH');
  3009.   end;
  3010.   Operators := TStringList.Create;
  3011.   with Operators do
  3012.   begin
  3013.     OP_NOP := - Add('NOP');
  3014.     OP_SEPARATOR := - Add('SEPARATOR');
  3015.     OP_STMT := - Add('STMT');
  3016.     OP_SET_CODE_LINE := - Add('SCL');
  3017.     OP_BEGIN_NAMESPACE := - Add('BEGIN NAMESPACE');
  3018.     OP_END_NAMESPACE := - Add('END NAMESPACE');
  3019.     OP_BEGIN_TYPE := - Add('BEGIN TYPE');
  3020.     OP_END_TYPE := - Add('END TYPE');
  3021.     OP_BEGIN_CLASS_TYPE := - Add('BEGIN CLASS TYPE');
  3022.     OP_END_CLASS_TYPE := - Add('END CLASS TYPE');
  3023.     OP_BEGIN_CLASSREF_TYPE := - Add('BEGIN CLASSREF TYPE');
  3024.     OP_END_CLASSREF_TYPE := - Add('END CLASSREF TYPE');
  3025.     OP_BEGIN_INTERFACE_TYPE := - Add('BEGIN INTERFACE TYPE');
  3026.     OP_END_INTERFACE_TYPE := - Add('END INTERFACE TYPE');
  3027.     OP_BEGIN_RECORD_TYPE := - Add('BEGIN RECORD TYPE');
  3028.     OP_END_RECORD_TYPE := - Add('END RECORD TYPE');
  3029.     OP_BEGIN_ARRAY_TYPE := - Add('BEGIN ARRAY TYPE');
  3030.     OP_END_ARRAY_TYPE := - Add('END ARRAY TYPE');
  3031.     OP_BEGIN_DYNARRAY_TYPE := - Add('BEGIN DYNARRAY TYPE');
  3032.     OP_END_DYNARRAY_TYPE := - Add('END DYNARRAY TYPE');
  3033.     OP_BEGIN_SUBRANGE_TYPE := - Add('BEGIN SUBRANGE TYPE');
  3034.     OP_END_SUBRANGE_TYPE := - Add('END SUBRANGE TYPE');
  3035.     OP_BEGIN_ENUM_TYPE := - Add('BEGIN ENUM TYPE');
  3036.     OP_END_ENUM_TYPE := - Add('END ENUM TYPE');
  3037.     OP_BEGIN_SET_TYPE := - Add('BEGIN SET TYPE');
  3038.     OP_END_SET_TYPE := - Add('END SET TYPE');
  3039.     OP_BEGIN_POINTER_TYPE := - Add('BEGIN POINTER TYPE');
  3040.     OP_END_POINTER_TYPE := - Add('END POINTER TYPE');
  3041.     OP_BEGIN_PROC_TYPE := - Add('BEGIN PROC TYPE');
  3042.     OP_END_PROC_TYPE := - Add('END PROC TYPE');
  3043.     OP_BEGIN_ALIAS_TYPE := - Add('BEGIN ALIAS TYPE');
  3044.     OP_END_ALIAS_TYPE := - Add('END ALIAS TYPE');
  3045.     OP_BEGIN_SHORTSTRING_TYPE := - Add('BEGIN SHORTSTRING TYPE');
  3046.     OP_END_SHORTSTRING_TYPE := - Add('END SHORTSTRING TYPE');
  3047.     OP_BEGIN_CONST := - Add('BEGIN CONST');
  3048.     OP_END_CONST := - Add('END CONST');
  3049.     OP_BEGIN_VAR := - Add('BEGIN VAR');
  3050.     OP_END_VAR := - Add('END VAR');
  3051.     OP_GET_NEXTJSPROP := - Add('GET NEXTJSPROP');
  3052.     OP_CLEAR_REFERENCES := - Add('CLEAR REFERENCES');
  3053.     OP_BEGIN_MODULE := - Add('BEGIN MODULE');
  3054.     OP_END_MODULE := - Add('END MODULE');
  3055.     OP_END_INTERFACE_SECTION := - Add('END INTERFACE SECTION');
  3056.     OP_END_IMPORT := - Add('END IMPORT');
  3057.     OP_BEGIN_INITIALIZATION := - Add('BEGIN INITIALIZATION');
  3058.     OP_END_INITIALIZATION := - Add('END INITIALIZATION');
  3059.     OP_BEGIN_FINALIZATION := - Add('BEGIN FINALIZATION');
  3060.     OP_END_FINALIZATION := - Add('END FINALIZATION');
  3061.     OP_EXTRA_BYTECODE := - Add('EXTRA BYTECODE');
  3062.     OP_TRY_ON := - Add('TRY ON');
  3063.     OP_TRY_OFF := - Add('TRY OFF');
  3064.     OP_FINALLY := - Add('FINALLY');
  3065.     OP_EXCEPT := - Add('EXCEPT');
  3066.     OP_EXCEPT_ON := - Add('EXCEPT ON');
  3067.     OP_RAISE := - Add('RAISE');
  3068.     OP_COND_RAISE := - Add('COND RAISE');
  3069.     OP_BEGIN_EXCEPT_BLOCK := - Add('BEGIN EXCEPT BLOCK');
  3070.     OP_END_EXCEPT_BLOCK := - Add('END EXCEPT BLOCK');
  3071.     OP_OVERFLOW_CHECK := - Add('OVERFLOW CHECK');
  3072.     OP_PAUSE := - Add('PAUSE');
  3073.     OP_CHECK_PAUSE := - Add('CHECK PAUSE');
  3074.     OP_CHECK_PAUSE_LIGHT := - Add('CHECK PAUSE LIGHT');
  3075.     OP_HALT := - Add('HALT');
  3076.     OP_EMIT_OFF := - Add('EMIT OFF');
  3077.     OP_EMIT_ON := - Add('EMIT ON');
  3078.     OP_BEGIN_USING := - Add('BEGIN USING');
  3079.     OP_END_USING := - Add('END USING');
  3080.     OP_BEGIN_BLOCK := - Add('BEGIN BLOCK');
  3081.     OP_END_BLOCK := - Add('END BLOCK');
  3082.     OP_EVAL := - Add('EVAL');
  3083.     OP_EVAL_INHERITED := - Add('EVAL INHERITED');
  3084.     OP_EVAL_CONSTRUCTOR := - Add('EVAL CONSTRUCTOR');
  3085.     OP_UPDATE_INSTANCE := - Add('UPDATE INSTANCE');
  3086.     OP_CLEAR_EDX := - Add('CLEAR EDX');
  3087.     OP_IMPLEMENTS := - Add('IMPLEMENTS');
  3088.     OP_MYCLASS := - Add('MYCLASS');
  3089.     OP_MYBASE := - Add('MYBASE');
  3090.     OP_LOAD_PROC := - Add('LOAD PROC');
  3091.     OP_CHECK_OVERRIDE := - Add('CHECK OVERRIDE');
  3092.     OP_EXIT := - Add('EXIT');
  3093.     OP_GO := - Add('GO');
  3094.     OP_GO_TRUE := - Add('GO TRUE');
  3095.     OP_GO_FALSE := - Add('GO FALSE');
  3096.     OP_GO_TRUE_BOOL := - Add('GO TRUE BOOL');
  3097.     OP_GO_FALSE_BOOL := - Add('GO FALSE BOOL');
  3098.     OP_GO_DL := - Add('GO DL');
  3099.     OP_BEGIN_CALL := - Add('BEGIN CALL');
  3100.     OP_CALL := - Add('CALL');
  3101.     OP_CALL_DEFAULT_CONSTRUCTOR := - Add('CALL DEFAULT CONSTRUCTOR');
  3102.     OP_CHECK_SUB_CALL := - Add('CHECK SUB CALL');
  3103.     OP_PUSH := - Add('PUSH');
  3104.     OP_PUSH_INSTANCE := - Add('PUSH INSTANCE');
  3105.     OP_PUSH_CLASSREF := - Add('PUSH CLASSREF');
  3106.     OP_PUSH_CONTEXT := - Add('PUSH CONTEXT');
  3107.     OP_POP_CONTEXT := - Add('POP CONTEXT');
  3108.     OP_FIND_CONTEXT := - Add('FIND CONTEXT');
  3109.     OP_FIND_JS_FUNC := - Add('FIND JS FUNC');
  3110.     OP_LABEL := - Add('LABEL');
  3111.     OP_TYPE_CAST := - Add('TYPE CAST');
  3112.     OP_BEGIN_SUB := - Add('BEGIN SUB');
  3113.     OP_DECLARE_LOCAL_VAR := - Add('DECLARE LOCAL VAR');
  3114.     OP_DECLARE_TEMP_VAR := - Add('DECLARE TEMP VAR');
  3115.     OP_DESTROY_LOCAL_VAR := - Add('DESTROY LOCAL VAR');
  3116.     OP_INIT_SUB := - Add('INIT SUB');
  3117.     OP_END_SUB := - Add('END SUB');
  3118.     OP_FIN_SUB := - Add('FIN SUB');
  3119.     OP_EPILOGUE_SUB := - Add('EPILOGUE SUB');
  3120.     OP_BEGIN_GLOBAL_BLOCK := - Add('BEGIN GLOBAL BLOCK');
  3121.     OP_EPILOGUE_GLOBAL_BLOCK := - Add('EPILOGUE_GLOBAL_BLOCK');
  3122.     OP_EPILOGUE_GLOBAL_BLOCK2 := - Add('EPILOGUE_GLOBAL_BLOCK2');
  3123.     OP_END_GLOBAL_BLOCK := - Add('END GLOBAL BLOCK');
  3124.     OP_ASSIGN_TYPE := - Add('ASSIGN TYPE');
  3125.     OP_DETERMINE_TYPE := - Add('DETERMINE TYPE');
  3126.     OP_ASSIGN_THE_SAME_TYPE := - Add('ASSIGN THE SAME TYPE');
  3127.     OP_ASSIGN_TYPE_ALIAS := - Add('ASSIGN TYPE ALIAS');
  3128.     OP_SAVE_EDX := - Add('SAVE EDX');
  3129.     OP_RESTORE_EDX := - Add('RESTORE EDX');
  3130.     OP_BEGIN_WITH := - Add('BEGIN WITH');
  3131.     OP_END_WITH := - Add('END WITH');
  3132.     OP_BEGIN_INIT_CONST := - Add('BEGIN INIT CONST');
  3133.     OP_END_INIT_CONST := - Add('END INIT CONST');
  3134.     OP_CREATE_POINTER_TYPE := - Add('CREATE POINTER TYPE');
  3135.     OP_CREATE_CLASSREF_TYPE := - Add('CREATE CLASSREF TYPE');
  3136.     OP_ADDRESS := - Add('ADDRESS');
  3137.     OP_TERMINAL := - Add('TERMINAL');
  3138.     OP_ADDRESS_PROG := - Add('ADDRESS PROG');
  3139.     OP_ASSIGN_PROG := - Add('ASSIGN PROG');
  3140.     OP_LVALUE := - Add('LVALUE');
  3141.     OP_ASSIGN := - Add(':=');
  3142.     OP_ASSIGN_CONST := - Add(':= (const)');
  3143.     OP_ASSIGN_ENUM := - Add(':= (enum)');
  3144.     OP_CHECK_SUBRANGE_TYPE := - Add('CHECK SUBRANGE TYPE');
  3145.     OP_CREATE_DYNAMIC_ARRAY_TYPE := - Add('CREATE DYNARRAY TYPE');
  3146.     OP_CREATE_SHORTSTRING_TYPE := - Add('CREATE SHORTSTRING TYPE');
  3147.     OP_INC := - Add('INC');
  3148.     OP_DEC := - Add('DEC');
  3149.     OP_PRED := - Add('PRED');
  3150.     OP_SUCC := - Add('SUCC');
  3151.     OP_ORD := - Add('ORD');
  3152.     OP_CHR := - Add('CHR');
  3153.     OP_STR := - Add('STR');
  3154.     OP_LOW := - Add('LOW');
  3155.     OP_HIGH := - Add('HIGH');
  3156.     OP_SET_LENGTH := - Add('SET LENGTH');
  3157.     OP_DYNARRAY_ASSIGN := - Add(':= (dynarray)');
  3158.     OP_DYNARRAY_CLR := - Add('CLR (dynarray)');
  3159.     OP_DYNARRAY_HIGH := - Add('HIGH (dynarray)');
  3160.     OP_CREATE_EMPTY_DYNARRAY := - Add('CRT EMPTY dynarray');
  3161.     OP_SHORTSTRING_HIGH := - Add('HIGH (shortstring)');
  3162.     OP_PLUS := - Add('+');
  3163.     OP_MINUS := - Add('-');
  3164.     OP_MULT := - Add('*');
  3165.     OP_DIV := - Add('/');
  3166.     OP_IDIV := - Add('DIV');
  3167.     OP_MOD := - Add('MOD');
  3168.     OP_SHL := - Add('SHL');
  3169.     OP_SHR := - Add('SHR');
  3170.     OP_AND := - Add('AND');
  3171.     OP_OR := - Add('OR');
  3172.     OP_XOR := - Add('XOR');
  3173.     OP_NOT := - Add('NOT');
  3174.     OP_NEG := - Add('NEG');
  3175.     OP_ABS := - Add('ABS');
  3176.     OP_EQ := - Add('=');
  3177.     OP_NE := - Add('<>');
  3178.     OP_GT := - Add('>');
  3179.     OP_GE := - Add('>=');
  3180.     OP_LT := - Add('<');
  3181.     OP_LE := - Add('<=');
  3182.     OP_CLASSNAME := - Add('CLASSNAME');
  3183.     OP_GET_PROG := - Add('GET_PROG');
  3184.     OP_IS := - Add('IS');
  3185.     OP_AS := - Add('AS');
  3186.     OP_TYPEINFO := - Add('TYPEINFO');
  3187.     OP_ADD_TYPEINFO := - Add('ADD_TYPEINFO');
  3188.     OP_RET := - Add('RET');
  3189.     OP_CURRENCY_FROM_INT64 := - Add('CURRENCY FROM INT64');
  3190.     OP_CURRENCY_FROM_INT := - Add('CURRENCY FROM INT');
  3191.     OP_CURRENCY_FROM_REAL := - Add('CURRENCY FROM REAL');
  3192.     OP_INT_TO_DOUBLE := - Add('INT TO DOUBLE');
  3193.     OP_INT64_TO_DOUBLE := - Add('INT64 TO DOUBLE');
  3194.     OP_INT_TO_SINGLE := - Add('INT TO SINGLE');
  3195.     OP_INT64_TO_SINGLE := - Add('INT64 TO SINGLE');
  3196.     OP_INT_TO_EXTENDED := - Add('INT TO EXTENDED');
  3197.     OP_INT64_TO_EXTENDED := - Add('INT64 TO EXTENDED');
  3198.     OP_INT_TO_INT64 := - Add('INT TO INT64');
  3199.     OP_BYTE_TO_INT64 := - Add('BYTE TO INT64');
  3200.     OP_WORD_TO_INT64 := - Add('WORD TO INT64');
  3201.     OP_CARDINAL_TO_INT64 := - Add('CARDINAL TO INT64');
  3202.     OP_SMALLINT_TO_INT64 := - Add('SMALLINT TO INT64');
  3203.     OP_SHORTINT_TO_INT64 := - Add('SHORTINT TO INT64');
  3204.     OP_INT_FROM_INT64 := - Add('INT FROM INT64');
  3205.     OP_BYTE_FROM_INT64 := - Add('BYTE FROM INT64');
  3206.     OP_WORD_FROM_INT64 := - Add('WORD FROM INT64');
  3207.     OP_CARDINAL_FROM_INT64 := - Add('CARDINAL FROM INT64');
  3208.     OP_SMALLINT_FROM_INT64 := - Add('SMALLINT FROM INT64');
  3209.     OP_SHORTINT_FROM_INT64 := - Add('SHORTINT FROM INT64');
  3210.     OP_CURRENCY_TO_EXTENDED := - Add('CURRENCY TO EXTENDED');
  3211.     OP_CURRENCY_TO_SINGLE := - Add('CURRENCY TO SINGLE');
  3212.     OP_DOUBLE_TO_SINGLE := - Add('DOUBLE TO SINGLE');
  3213.     OP_DOUBLE_TO_EXTENDED := - Add('DOUBLE TO EXTENDED');
  3214.     OP_SINGLE_TO_DOUBLE := - Add('SINGLE TO DOUBLE');
  3215.     OP_CURRENCY_TO_DOUBLE := - Add('CURRENCY TO DOUBLE');
  3216.     OP_SINGLE_TO_EXTENDED := - Add('SINGLE TO EXTENDED');
  3217.     OP_EXTENDED_TO_DOUBLE := - Add('EXTENDED TO DOUBLE');
  3218.     OP_EXTENDED_TO_SINGLE := - Add('EXTENDED TO SINGLE');
  3219.     OP_PUSH_EBP := -Add('push ebp');
  3220.     OP_POP := -Add('pop');
  3221.     OP_FIELD := - Add('FIELD');
  3222.     OP_ELEM := - Add('ELEM');
  3223.     OP_ITEM := - Add('ITEM');
  3224.     OP_RECORD_ITEM := - Add('RECORD ITEM');
  3225.     OP_PRINT := - Add('PRINT');
  3226.     OP_PRINT_EX := - Add('PRINT_EX');
  3227.     OP_SET_INCLUDE := - Add('SET INCLUDE');
  3228.     OP_SET_INCLUDE_INTERVAL := - Add('SET INCLUDE INTERVAL');
  3229.     OP_SET_EXCLUDE := - Add('SET EXCLUDE');
  3230.     OP_SET_MEMBERSHIP := -Add('SET MEMBERSHIP');
  3231.     OP_INIT_PANSICHAR_LITERAL := - Add('INIT PANSICHAR LITERAL');
  3232.     OP_INIT_PWIDECHAR_LITERAL := - Add('INIT PWIDECHAR LITERAL');
  3233.     OP_SIZEOF := - Add('SIZEOF');
  3234.     OP_OLE_GET := - Add('OLE_GET');
  3235.     OP_OLE_SET := - Add('OLE_SET');
  3236.     OP_OLE_VALUE := - Add('OLE_VALUE');
  3237.     OP_OLE_PARAM := - Add('OLE_PARAM');
  3238.     OP_ONCREATE_OBJECT := - Add('ON CREATE OBJECT');
  3239.     OP_ON_AFTER_OBJECT_CREATION := - Add('ON AFTER OBJECT CREATION');
  3240.     OP_CREATE_OBJECT := - Add('CREATE OBJECT');
  3241.     OP_DESTROY_OBJECT := - Add('DESTROY OBJECT');
  3242.     OP_GET_VMT_ADDRESS := - Add('GET VMT ADDRESS');
  3243.     OP_ADD_ANCESTOR := - Add('ADD ANCESTOR');
  3244.     OP_ADD_INTERFACE := - Add('ADD INTERFACE');
  3245.     OP_ADD_METHOD_INDEX := - Add('ADD METHOD INDEX');
  3246.     OP_ASSIGNED := - Add('ASSIGNED');
  3247.     OP_SET_SET_PROP := -Add('SET SET PROP');
  3248.     OP_SET_ORD_PROP := -Add('SET ORD PROP');
  3249.     OP_SET_INTERFACE_PROP := -Add('SET INTERFACE PROP');
  3250.     OP_SET_ANSISTR_PROP := -Add('SET ANSISTR PROP');
  3251.     OP_SET_WIDESTR_PROP := -Add('SET WIDESTR PROP');
  3252.     OP_SET_UNICSTR_PROP := -Add('SET UNICSTR PROP');
  3253.     OP_SET_FLOAT_PROP := -Add('SET FLOAT PROP');
  3254.     OP_SET_VARIANT_PROP := -Add('SET VARIANT PROP');
  3255.     OP_SET_INT64_PROP := -Add('SET INT64 PROP');
  3256.     OP_SET_EVENT_PROP := -Add('SET EVENT PROP');
  3257.     OP_SET_EVENT_PROP2 := -Add('SET EVENT PROP2');
  3258.     OP_VARARRAY_GET := -Add('VARARRAY GET');
  3259.     OP_VARARRAY_PUT := -Add('VARARRAY PUT');
  3260.     OP_VARARRAY_IDX := -Add('VARARRAY IDX');
  3261.     OP_SAVE_REGS := - Add('SAVE REGS');
  3262.     OP_RESTORE_REGS := - Add('RESTORE REGS');
  3263.     OP_ERR_ABSTRACT := - Add('ERR ABSTRACT');
  3264.     OP_UPDATE_DEFAULT_CONSTRUCTOR := - Add('UPDATE DEFAULT CONSTRUCTOR');
  3265.     OP_FIND_CONSTRUCTOR := - Add('FIND CONSTRUCTOR');
  3266.     OP_BEGIN_CRT_JS_FUNC_OBJECT := - Add('BEGIN_CRT_JS_FUNC_OBJECT');
  3267.     OP_END_CRT_JS_FUNC_OBJECT := - Add('END_CRT_JS_FUNC_OBJECT');
  3268.     OP_TO_JS_OBJECT := - Add('TO_JS_OBJECT');
  3269.     OP_JS_TYPEOF := - Add('JS_TYPEOF');
  3270.     OP_JS_VOID := - Add('JS_VOID');
  3271.     OP_ASSIGN_SHIFT := -Add('ASSIGN SHIFT');
  3272.     OP_ASSIGN_INT_M := -Add(':= (integer, m)');
  3273.     OP_CREATE_METHOD := -Add('CREATE METHOD');
  3274.     OP_GET_ENUMERATOR := -Add('GET ENUMERATOR');
  3275.     OP_MOVE_NEXT := -Add('MOVE NEXT');
  3276.     OP_CURRENT := -Add('CURRENT');
  3277. /////////////////// DETAILED OPERATORS /////////////////////////////////
  3278. //    OP_DUMMY := - Add('DUMMY');
  3279.     OP_ASSIGN_BYTE_I := -Add(':= (byte, i)');
  3280.     OP_ASSIGN_BYTE_M := -Add(':= (byte, m)');
  3281.     OP_ASSIGN_WORD_I := -Add(':= (word, i)');
  3282.     OP_ASSIGN_WORD_M := -Add(':= (word, m)');
  3283.     OP_ASSIGN_CARDINAL_I := -Add(':= (cardinal, i)');
  3284.     OP_ASSIGN_CARDINAL_M := -Add(':= (cardinal, m)');
  3285.     OP_ASSIGN_SMALLINT_I := -Add(':= (smallint, i)');
  3286.     OP_ASSIGN_SMALLINT_M := -Add(':= (smallint, m)');
  3287.     OP_ASSIGN_SHORTINT_I := -Add(':= (shortint, i)');
  3288.     OP_ASSIGN_SHORTINT_M := -Add(':= (shortint, m)');
  3289.     OP_ASSIGN_INT_I := -Add(':= (integer, i)');
  3290. //    OP_ASSIGN_INT_M := -Add(':= (integer, m)');
  3291.     OP_ASSIGN_DOUBLE := -Add(':= (double)');
  3292.     OP_ASSIGN_CURRENCY := -Add(':= (currency)');
  3293.     OP_ASSIGN_EVENT := -Add(':= (event)');
  3294.     OP_ASSIGN_SINGLE := -Add(':= (single)');
  3295.     OP_ASSIGN_EXTENDED := -Add(':= (extended)');
  3296.     OP_ASSIGN_PANSICHAR := -Add(':= (pansichar)');
  3297.     OP_ASSIGN_PWIDECHAR := -Add(':= (pwidechar)');
  3298.     OP_ASSIGN_INT64 := -Add(':= (int64)');
  3299.     OP_ASSIGN_INTERFACE := -Add(':= (interface)');
  3300.     OP_CREATE_EVENT := -Add('create event');
  3301.     OP_MULT_INT64 := -Add('* (int64)');
  3302.     OP_IDIV_INT64 := -Add('div (int64)');
  3303.     OP_MOD_INT64 := -Add('mod (int64)');
  3304.     OP_SHL_INT64 := -Add('shl (int64)');
  3305.     OP_SHR_INT64 := -Add('shr (int64)');
  3306.     OP_ANSISTRING_FROM_PANSICHAR := -Add('ANSISTRING FROM PANSICHAR');
  3307.     OP_ANSISTRING_FROM_PWIDECHAR := -Add('ANSISTRING FROM PWIDECHAR');
  3308.     OP_ANSISTRING_FROM_ANSICHAR := -Add('ANSISTRING FROM ANSICHAR');
  3309.     OP_ASSIGN_ANSISTRING := -Add(':= (ansistring)');
  3310.     OP_ASSIGN_SHORTSTRING := -Add(':= (shortstring)');
  3311.     OP_ASSIGN_WIDESTRING := -Add(':= (widestring)');
  3312.     OP_ASSIGN_UNICSTRING := -Add(':= (unicstring)');
  3313.     OP_ASSIGN_VARIANT := -Add(':= (variant)');
  3314.     OP_ASSIGN_OLEVARIANT := -Add(':= (olevariant)');
  3315.     OP_ASSIGN_CLASS := -Add(':= (class)');
  3316.     OP_ASSIGN_TVarRec := -Add(':= (TVarRec)');
  3317.     OP_ASSIGN_RECORD := -Add(':= (record)');
  3318.     OP_ASSIGN_ARRAY := -Add(':= (array)');
  3319.     OP_SHORTSTRING_FROM_PANSICHAR_LITERAL := -Add('SHORTSTRING FROM PANSICHAR LITERAL');
  3320.     OP_SHORTSTRING_FROM_PWIDECHAR_LITERAL := -Add('SHORTSTRING FROM PWIDECHAR LITERAL');
  3321.     OP_SHORTSTRING_FROM_ANSICHAR := -Add('SHORTSTRING FROM ANSICHAR');
  3322.     OP_SHORTSTRING_FROM_WIDECHAR := -Add('SHORTSTRING FROM WIDECHAR');
  3323.     OP_SHORTSTRING_FROM_ANSISTRING := -Add('SHORTSTRING FROM ANSISTRING');
  3324.     OP_SHORTSTRING_FROM_WIDESTRING := -Add('SHORTSTRING FROM WIDESTRING');
  3325.     OP_UNICSTRING_FROM_WIDESTRING := -Add('UNICSTRING FROM WIDESTRING');
  3326.     OP_SHORTSTRING_FROM_UNICSTRING := -Add('SHORTSTRING FROM UNICSTRING');
  3327.     OP_ANSISTRING_FROM_SHORTSTRING := -Add('ANSISTRING FROM SHORTSTRING');
  3328.     OP_WIDESTRING_FROM_PANSICHAR_LITERAL := -Add('WIDESTRING FROM PANSICHAR LITERAL');
  3329.     OP_WIDESTRING_FROM_PWIDECHAR_LITERAL := -Add('WIDESTRING FROM PWIDECHAR LITERAL');
  3330.     OP_WIDESTRING_FROM_ANSICHAR := -Add('WIDESTRING FROM ANSICHAR');
  3331.     OP_WIDESTRING_FROM_WIDECHAR := -Add('WIDESTRING FROM WIDECHAR');
  3332.     OP_ANSISTRING_FROM_WIDECHAR := -Add('ANSISTRING FROM WIDECHAR');
  3333.     OP_WIDESTRING_FROM_WIDECHAR_LITERAL := -Add('WIDESTRING FROM WIDECHAR LITERAL');
  3334.     OP_WIDESTRING_FROM_ANSISTRING := -Add('WIDESTRING FROM ANSISTRING');
  3335.     OP_UNICSTRING_FROM_ANSISTRING := -Add('UNICSTRING FROM ANSISTRING');
  3336.     OP_WIDESTRING_FROM_SHORTSTRING := -Add('WIDESTRING FROM SHORTSTRING');
  3337.     OP_WIDESTRING_FROM_UNICSTRING := -Add('WIDESTRING FROM UNICSTRING');
  3338.     OP_UNICSTRING_FROM_SHORTSTRING := -Add('UNICSTRING FROM SHORTSTRING');
  3339.     OP_ANSISTRING_FROM_WIDESTRING := -Add('ANSISTRING FROM WIDESTRING');
  3340.     OP_ANSISTRING_FROM_UNICSTRING := -Add('ANSISTRING FROM UNICSTRING');
  3341.     OP_UNICSTRING_FROM_PANSICHAR_LITERAL := -Add('UNICSTRING FROM PANSICHAR LITERAL');
  3342.     OP_UNICSTRING_FROM_PWIDECHAR_LITERAL := -Add('UNICSTRING FROM PWIDECHAR LITERAL');
  3343.     OP_UNICSTRING_FROM_ANSICHAR := -Add('UNICSTRING FROM ANSICHAR');
  3344.     OP_UNICSTRING_FROM_WIDECHAR := -Add('UNICSTRING FROM WIDECHAR');
  3345.     OP_UNICSTRING_FROM_WIDECHAR_LITERAL := -Add('UNICSTRING FROM WIDECHAR LITERAL');
  3346.     OP_VARIANT_FROM_CLASS := -Add('VARIANT FROM CLASS'); // JS only
  3347.     OP_VARIANT_FROM_POINTER := -Add('VARIANT FROM POINTER'); // JS only
  3348.     OP_CLASS_FROM_VARIANT := -Add('CLASS FROM VARIANT'); // JS only
  3349.     OP_INTERFACE_FROM_CLASS := -Add('INTERFACE FROM CLASS');
  3350.     OP_INTERFACE_CAST := -Add('INTERFACE CAST');
  3351.     OP_VARIANT_FROM_PANSICHAR_LITERAL := -Add('VARIANT FROM PANSICHAR LITERAL');
  3352.     OP_VARIANT_FROM_PWIDECHAR_LITERAL := -Add('VARIANT FROM PWIDECHAR LITERAL');
  3353.     OP_VARIANT_FROM_ANSISTRING := -Add('VARIANT FROM ANSISTRING');
  3354.     OP_VARIANT_FROM_WIDESTRING := -Add('VARIANT FROM WIDESTRING');
  3355.     OP_VARIANT_FROM_UNICSTRING := -Add('VARIANT FROM UNICSTRING');
  3356.     OP_VARIANT_FROM_SHORTSTRING := -Add('VARIANT FROM SHORTSTRING');
  3357.     OP_VARIANT_FROM_ANSICHAR := -Add('VARIANT FROM ANSICHAR');
  3358.     OP_VARIANT_FROM_WIDECHAR := -Add('VARIANT FROM WIDECHAR');
  3359.     OP_VARIANT_FROM_WIDECHAR_LITERAL := -Add('VARIANT FROM WIDECHAR LITERAL');
  3360.     OP_VARIANT_FROM_INT := -Add('VARIANT FROM INT');
  3361.     OP_VARIANT_FROM_INT64 := -Add('VARIANT FROM INT64');
  3362.     OP_VARIANT_FROM_BYTE := -Add('VARIANT FROM BYTE');
  3363.     OP_VARIANT_FROM_BOOL := -Add('VARIANT FROM BOOL');
  3364.     OP_VARIANT_FROM_WORD := -Add('VARIANT FROM WORD');
  3365.     OP_VARIANT_FROM_CARDINAL := -Add('VARIANT FROM CARDINAL');
  3366.     OP_VARIANT_FROM_SMALLINT := -Add('VARIANT FROM SMALLINT');
  3367.     OP_VARIANT_FROM_SHORTINT := -Add('VARIANT FROM SHORTINT');
  3368.     OP_VARIANT_FROM_DOUBLE := -Add('VARIANT FROM DOUBLE');
  3369.     OP_VARIANT_FROM_CURRENCY := -Add('VARIANT FROM CURRENCY');
  3370.     OP_VARIANT_FROM_SINGLE := -Add('VARIANT FROM SINGLE');
  3371.     OP_VARIANT_FROM_EXTENDED := -Add('VARIANT FROM EXTENDED');
  3372.     OP_VARIANT_FROM_INTERFACE := -Add('VARIANT FROM INTERFACE');
  3373.     OP_OLEVARIANT_FROM_VARIANT := -Add('OLEVARIANT FROM VARIANT');
  3374.     OP_OLEVARIANT_FROM_PANSICHAR_LITERAL := -Add('OLEVARIANT FROM PANSICHAR LITERAL');
  3375.     OP_OLEVARIANT_FROM_PWIDECHAR_LITERAL := -Add('OLEVARIANT FROM PWIDECHAR LITERAL');
  3376.     OP_OLEVARIANT_FROM_ANSISTRING := -Add('OLEVARIANT FROM ANSISTRING');
  3377.     OP_OLEVARIANT_FROM_WIDESTRING := -Add('OLEVARIANT FROM WIDESTRING');
  3378.     OP_OLEVARIANT_FROM_UNICSTRING := -Add('OLEVARIANT FROM UNICSTRING');
  3379.     OP_OLEVARIANT_FROM_SHORTSTRING := -Add('OLEVARIANT FROM SHORTSTRING');
  3380.     OP_OLEVARIANT_FROM_ANSICHAR := -Add('OLEVARIANT FROM ANSICHAR');
  3381.     OP_OLEVARIANT_FROM_WIDECHAR := -Add('OLEVARIANT FROM WIDECHAR');
  3382.     OP_OLEVARIANT_FROM_WIDECHAR_LITERAL := -Add('OLEVARIANT FROM WIDECHAR LITERAL');
  3383.     OP_OLEVARIANT_FROM_INT := -Add('OLEVARIANT FROM INT');
  3384.     OP_OLEVARIANT_FROM_INT64 := -Add('OLEVARIANT FROM INT64');
  3385.     OP_OLEVARIANT_FROM_BYTE := -Add('OLEVARIANT FROM BYTE');
  3386.     OP_OLEVARIANT_FROM_BOOL := -Add('OLEVARIANT FROM BOOL');
  3387.     OP_OLEVARIANT_FROM_WORD := -Add('OLEVARIANT FROM WORD');
  3388.     OP_OLEVARIANT_FROM_CARDINAL := -Add('OLEVARIANT FROM CARDINAL');
  3389.     OP_OLEVARIANT_FROM_SMALLINT := -Add('OLEVARIANT FROM SMALLINT');
  3390.     OP_OLEVARIANT_FROM_SHORTINT := -Add('OLEVARIANT FROM SHORTINT');
  3391.     OP_OLEVARIANT_FROM_DOUBLE := -Add('OLEVARIANT FROM DOUBLE');
  3392.     OP_OLEVARIANT_FROM_CURRENCY := -Add('OLEVARIANT FROM CURRENCY');
  3393.     OP_OLEVARIANT_FROM_SINGLE := -Add('OLEVARIANT FROM SINGLE');
  3394.     OP_OLEVARIANT_FROM_EXTENDED := -Add('OLEVARIANT FROM EXTENDED');
  3395.     OP_OLEVARIANT_FROM_INTERFACE := -Add('OLEVARIANT FROM INTERFACE');
  3396.     OP_ANSISTRING_FROM_INT := -Add('ANSISTRING FROM INT'); // JS only
  3397.     OP_ANSISTRING_FROM_DOUBLE := -Add('ANSISTRING FROM DOUBLE'); // JS only
  3398.     OP_ANSISTRING_FROM_SINGLE := -Add('ANSISTRING FROM SINGLE'); // JS only
  3399.     OP_ANSISTRING_FROM_EXTENDED := -Add('ANSISTRING FROM EXTENDED'); // JS only
  3400.     OP_ANSISTRING_FROM_BOOLEAN := -Add('ANSISTRING FROM BOOLEAN'); // JS only
  3401.     OP_UNICSTRING_FROM_INT := -Add('UNICSTRING FROM INT'); // JS only
  3402.     OP_UNICSTRING_FROM_DOUBLE := -Add('UNICSTRING FROM DOUBLE'); // JS only
  3403.     OP_UNICSTRING_FROM_SINGLE := -Add('UNICSTRING FROM SINGLE'); // JS only
  3404.     OP_UNICSTRING_FROM_EXTENDED := -Add('UNICSTRING FROM EXTENDED'); // JS only
  3405.     OP_UNICSTRING_FROM_BOOLEAN := -Add('UNICSTRING FROM BOOLEAN'); // JS only
  3406.     OP_JS_FUNC_OBJ_FROM_VARIANT := -Add('JS FUNC OBJ FROM VARIANT'); // JS only
  3407.     OP_ANSISTRING_FROM_VARIANT := -Add('ANSISTRING FROM VARIANT');
  3408.     OP_WIDESTRING_FROM_VARIANT := -Add('WIDESTRING FROM VARIANT');
  3409.     OP_UNICSTRING_FROM_VARIANT := -Add('UNICSTRING FROM VARIANT');
  3410.     OP_SHORTSTRING_FROM_VARIANT := -Add('SHORTSTRING FROM VARIANT');
  3411.     OP_DOUBLE_FROM_VARIANT := -Add('DOUBLE FROM VARIANT');
  3412.     OP_CURRENCY_FROM_VARIANT := -Add('CURRENCY FROM VARIANT');
  3413.     OP_SINGLE_FROM_VARIANT := -Add('SINGLE FROM VARIANT');
  3414.     OP_EXTENDED_FROM_VARIANT := -Add('EXTENDED FROM VARIANT');
  3415.     OP_INT64_FROM_VARIANT := -Add('INT64 FROM VARIANT');
  3416.     OP_INT_FROM_VARIANT := -Add('INT FROM VARIANT');
  3417.     OP_BYTE_FROM_VARIANT := -Add('BYTE FROM VARIANT');
  3418.     OP_WORD_FROM_VARIANT := -Add('WORD FROM VARIANT');
  3419.     OP_CARDINAL_FROM_VARIANT := -Add('CARDINAL FROM VARIANT');
  3420.     OP_BOOL_FROM_VARIANT := -Add('BOOL FROM VARIANT');
  3421.     OP_BYTEBOOL_FROM_VARIANT := -Add('BYTEBOOL FROM VARIANT');
  3422.     OP_WORDBOOL_FROM_VARIANT := -Add('WORDBOOL FROM VARIANT');
  3423.     OP_LONGBOOL_FROM_VARIANT := -Add('LONGBOOL FROM VARIANT');
  3424.     OP_SMALLINT_FROM_VARIANT := -Add('SMALLINT FROM VARIANT');
  3425.     OP_SHORTINT_FROM_VARIANT := -Add('SHORTINT FROM VARIANT');
  3426.     OP_NOT_VARIANT := -Add('not (variant)');
  3427.     OP_NEG_VARIANT := -Add('neg (variant)');
  3428.     OP_ADD_VARIANT := -Add('+ (variant)');
  3429.     OP_SUB_VARIANT := -Add('- (variant)');
  3430.     OP_MULT_VARIANT := -Add('* (variant)');
  3431.     OP_DIV_VARIANT := -Add('/ (variant)');
  3432.     OP_IDIV_VARIANT := -Add('div (variant)');
  3433.     OP_MOD_VARIANT := -Add('mod (variant)');
  3434.     OP_SHL_VARIANT := -Add('shl (variant)');
  3435.     OP_SHR_VARIANT := -Add('shr (variant)');
  3436.     OP_AND_VARIANT := -Add('and (variant)');
  3437.     OP_OR_VARIANT := -Add('or (variant)');
  3438.     OP_XOR_VARIANT := -Add('xor (variant)');
  3439.     OP_LT_VARIANT := -Add('< (variant)');
  3440.     OP_LE_VARIANT := -Add('<= (variant)');
  3441.     OP_GT_VARIANT := -Add('> (variant)');
  3442.     OP_GE_VARIANT := -Add('>= (variant)');
  3443.     OP_EQ_VARIANT := -Add('= (variant)');
  3444.     OP_NE_VARIANT := -Add('<> (variant)');
  3445.     OP_EQ_EVENT := -Add('= (event)');
  3446.     OP_NE_EVENT := -Add('<> (event)');
  3447.     OP_VARIANT_CLR := -Add('VARIANT CLR');
  3448.     OP_ADD_ANSISTRING := -Add('+ (ansistring)');
  3449.     OP_ADD_SHORTSTRING := -Add('+ (shortstring)');
  3450.     OP_ADD_WIDESTRING := -Add('+ (widestring)');
  3451.     OP_ADD_UNICSTRING := -Add('+ (unicstring)');
  3452.     OP_EQ_STRUCT := -Add('= (struct)');
  3453.     OP_NE_STRUCT := -Add('<> (struct)');
  3454.     OP_EQ_ANSISTRING := -Add('= (ansistring)');
  3455.     OP_EQ_SHORTSTRING := -Add('= (shortstring)');
  3456.     OP_EQ_WIDESTRING := -Add('= (widestring)');
  3457.     OP_EQ_UNICSTRING := -Add('= (unicstring)');
  3458.     OP_NE_ANSISTRING := -Add('<> (ansistring)');
  3459.     OP_NE_SHORTSTRING := -Add('<> (shortstring)');
  3460.     OP_NE_WIDESTRING := -Add('<> (widestring)');
  3461.     OP_NE_UNICSTRING := -Add('<> (unicstring)');
  3462.     OP_GT_ANSISTRING := -Add('> (ansistring)');
  3463.     OP_GE_ANSISTRING := -Add('>= (ansistring)');
  3464.     OP_LT_ANSISTRING := -Add('< (ansistring)');
  3465.     OP_LE_ANSISTRING := -Add('<= (ansistring)');
  3466.     OP_GT_SHORTSTRING := -Add('> (shortstring)');
  3467.     OP_GE_SHORTSTRING := -Add('>= (shortstring)');
  3468.     OP_LT_SHORTSTRING := -Add('< (shortstring)');
  3469.     OP_LE_SHORTSTRING := -Add('<= (shortstring)');
  3470.     OP_GT_WIDESTRING := -Add('> (widestring)');
  3471.     OP_GE_WIDESTRING := -Add('>= (widestring)');
  3472.     OP_LT_WIDESTRING := -Add('< (widestring)');
  3473.     OP_LE_WIDESTRING := -Add('<= (widestring)');
  3474.     OP_GT_UNICSTRING := -Add('> (unicstring)');
  3475.     OP_GE_UNICSTRING := -Add('>= (unicstring)');
  3476.     OP_LT_UNICSTRING := -Add('< (unicstring)');
  3477.     OP_LE_UNICSTRING := -Add('<= (unicstring)');
  3478.     OP_ANSISTRING_CLR := -Add('ANSISTRING CLR');
  3479.     OP_WIDESTRING_CLR := -Add('WIDESTRING CLR');
  3480.     OP_UNICSTRING_CLR := -Add('UNICSTRING CLR');
  3481.     OP_STRUCTURE_CLR := -Add('STRUCTURE CLR');
  3482.     OP_INTERFACE_CLR := -Add('INTERFACE CLR');
  3483.     OP_CLASS_CLR := -Add('CLASS CLR');
  3484.     OP_STRUCTURE_ADDREF := -Add('STRUCTURE ADDREF');
  3485.     OP_ADD_INT_MI := -Add('+ (integer, mi)');
  3486.     OP_ADD_INT_MM := -Add('+ (integer, mm)');
  3487.     OP_SUB_INT_MI := -Add('- (integer, mi)');
  3488.     OP_SUB_INT_MM := -Add('- (integer, mm)');
  3489.     OP_IMUL_INT_MI := -Add('imul (integer, mi)');
  3490.     OP_IMUL_INT_MM := -Add('imul (integer, mm)');
  3491.     OP_IDIV_INT_MI := -Add('idiv (integer, mi)');
  3492.     OP_IDIV_INT_MM := -Add('idiv (integer, mm)');
  3493.     OP_IDIV_INT_IM := -Add('idiv (integer, im)');
  3494.     OP_MOD_INT_MI := -Add('mod (integer, mi)');
  3495.     OP_MOD_INT_MM := -Add('mod (integer, mm)');
  3496.     OP_MOD_INT_IM := -Add('mod (integer, im)');
  3497.     OP_SHL_INT_MI := -Add('shl (integer, mi)');
  3498.     OP_SHL_INT_MM := -Add('shl (integer, mm)');
  3499.     OP_SHL_INT_IM := -Add('shl (integer, im)');
  3500.     OP_SHR_INT_MI := -Add('shr (integer, mi)');
  3501.     OP_SHR_INT_MM := -Add('shr (integer, mm)');
  3502.     OP_SHR_INT_IM := -Add('shr (integer, im)');
  3503.     OP_AND_INT_MI := -Add('and (integer, mi)');
  3504.     OP_AND_INT_MM := -Add('and (integer, mm)');
  3505.     OP_OR_INT_MI := -Add('or (integer, mi)');
  3506.     OP_OR_INT_MM := -Add('or (integer, mm)');
  3507.     OP_XOR_INT_MI := -Add('xor (integer, mi)');
  3508.     OP_XOR_INT_MM := -Add('xor (integer, mm)');
  3509.     OP_NEG_INT := -Add('NEG (integer)');
  3510.     OP_NEG_INT64 := -Add('NEG64 (integer)');
  3511.     OP_ABS_INT := -Add('ABS (integer)');
  3512.     OP_ABS_INT64 := -Add('ABS (int64)');
  3513.     OP_ABS_DOUBLE := -Add('ABS (double)');
  3514.     OP_ABS_SINGLE := -Add('ABS (single)');
  3515.     OP_ABS_EXTENDED := -Add('ABS (extended)');
  3516.     OP_ABS_VARIANT := -Add('ABS (variant)');
  3517.     OP_LT_INT_MI := -Add('< (integer, mi)');
  3518.     OP_LT_INT_MM := -Add('< (integer, mm)');
  3519.     OP_LE_INT_MI := -Add('<= (integer, mi)');
  3520.     OP_LE_INT_MM := -Add('<= (integer, mm)');
  3521.     OP_GT_INT_MI := -Add('> (integer, mi)');
  3522.     OP_GT_INT_MM := -Add('> (integer, mm)');
  3523.     OP_GE_INT_MI := -Add('>= (integer, mi)');
  3524.     OP_GE_INT_MM := -Add('>= (integer, mm)');
  3525.     OP_EQ_INT_MI := -Add('= (integer, mi)');
  3526.     OP_EQ_INT_MM := -Add('= (integer, mm)');
  3527.     OP_NE_INT_MI := -Add('<> (integer, mi)');
  3528.     OP_NE_INT_MM := -Add('<> (integer, mm)');
  3529.     OP_ADD_INT64 := -Add('+ (int64)');
  3530.     OP_SUB_INT64 := -Add('- (int64)');
  3531.     OP_AND_INT64 := -Add('AND (int64)');
  3532.     OP_OR_INT64 := -Add('OR (int64)');
  3533.     OP_XOR_INT64 := -Add('XOR (int64)');
  3534.     OP_LT_INT64 := -Add('< (int64)');
  3535.     OP_LE_INT64 := -Add('<= (int64)');
  3536.     OP_GT_INT64 := -Add('> (int64)');
  3537.     OP_GE_INT64 := -Add('>= (int64)');
  3538.     OP_EQ_INT64 := -Add('= (int64)');
  3539.     OP_NE_INT64 := -Add('<> (int64)');
  3540.     OP_ADD_CURRENCY := -Add('+ (currency)');
  3541.     OP_SUB_CURRENCY := -Add('- (currency)');
  3542.     OP_MUL_CURRENCY := -Add('* (currency)');
  3543.     OP_DIV_CURRENCY := -Add('/ (currency)');
  3544.     OP_LT_CURRENCY := -Add('< (currency)');
  3545.     OP_LE_CURRENCY := -Add('<= (currency)');
  3546.     OP_GT_CURRENCY := -Add('> (currency)');
  3547.     OP_GE_CURRENCY := -Add('>= (currency)');
  3548.     OP_EQ_CURRENCY := -Add('= (currency)');
  3549.     OP_NE_CURRENCY := -Add('<> (currency)');
  3550.     OP_ADD_DOUBLE := -Add('+ (double)');
  3551.     OP_SUB_DOUBLE := -Add('- (double)');
  3552.     OP_MUL_DOUBLE := -Add('* (double)');
  3553.     OP_DIV_DOUBLE := -Add('/ (double)');
  3554.     OP_NEG_DOUBLE := -Add('NEG (double)');
  3555.     OP_NEG_CURRENCY := -Add('NEG (currency)');
  3556.     OP_LT_DOUBLE := -Add('< (double)');
  3557.     OP_LE_DOUBLE := -Add('<= (double)');
  3558.     OP_GT_DOUBLE := -Add('> (double)');
  3559.     OP_GE_DOUBLE := -Add('>= (double)');
  3560.     OP_EQ_DOUBLE := -Add('= (double)');
  3561.     OP_NE_DOUBLE := -Add('<> (double)');
  3562.     OP_ADD_SINGLE := -Add('+ (single)');
  3563.     OP_SUB_SINGLE := -Add('- (single)');
  3564.     OP_MUL_SINGLE := -Add('* (single)');
  3565.     OP_DIV_SINGLE := -Add('/ (single)');
  3566.     OP_NEG_SINGLE := -Add('NEG (single)');
  3567.     OP_LT_SINGLE := -Add('< (single)');
  3568.     OP_LE_SINGLE := -Add('<= (single)');
  3569.     OP_GT_SINGLE := -Add('> (single)');
  3570.     OP_GE_SINGLE := -Add('>= (single)');
  3571.     OP_EQ_SINGLE := -Add('= (single)');
  3572.     OP_NE_SINGLE := -Add('<> (single)');
  3573.     OP_ADD_EXTENDED := -Add('+ (extended)');
  3574.     OP_SUB_EXTENDED := -Add('- (EXTENDED)');
  3575.     OP_MUL_EXTENDED := -Add('* (EXTENDED)');
  3576.     OP_DIV_EXTENDED := -Add('/ (EXTENDED)');
  3577.     OP_NEG_EXTENDED := -Add('NEG (EXTENDED)');
  3578.     OP_LT_EXTENDED := -Add('< (EXTENDED)');
  3579.     OP_LE_EXTENDED := -Add('<= (EXTENDED)');
  3580.     OP_GT_EXTENDED := -Add('> (EXTENDED)');
  3581.     OP_GE_EXTENDED := -Add('>= (EXTENDED)');
  3582.     OP_EQ_EXTENDED := -Add('= (EXTENDED)');
  3583.     OP_NE_EXTENDED := -Add('<> (EXTENDED)');
  3584.     OP_PUSH_ADDRESS := -Add('push address');
  3585.     OP_PUSH_STRUCTURE := -Add('push struct');
  3586.     OP_PUSH_SET := -Add('push set');
  3587.     OP_PUSH_BYTE_IMM := -Add('push (byte i)');
  3588.     OP_PUSH_BYTE := -Add('push (byte)');
  3589.     OP_PUSH_WORD_IMM := -Add('push (word i)');
  3590.     OP_PUSH_WORD := -Add('push (word)');
  3591.     OP_PUSH_CARDINAL_IMM := -Add('push (cardinal i)');
  3592.     OP_PUSH_CARDINAL := -Add('push (cardinal)');
  3593.     OP_PUSH_SMALLINT_IMM := -Add('push (smallint i)');
  3594.     OP_PUSH_SMALLINT := -Add('push (smallint)');
  3595.     OP_PUSH_SHORTINT_IMM := -Add('push (shortint i)');
  3596.     OP_PUSH_SHORTINT := -Add('push (shortint)');
  3597.     OP_PUSH_INT_IMM := -Add('push (int i)');
  3598.     OP_PUSH_INT := -Add('push (int)');
  3599.     OP_PUSH_DOUBLE := -Add('push (double)');
  3600.     OP_PUSH_CURRENCY := -Add('push (currency)');
  3601.     OP_PUSH_SINGLE := -Add('push (single)');
  3602.     OP_PUSH_EXTENDED := -Add('push (extended)');
  3603.     OP_PUSH_INT64 := -Add('push (int64)');
  3604.     OP_PUSH_DATA := -Add('push (data)');
  3605.     OP_PUSH_EVENT := -Add('push (event)');
  3606.     OP_PUSH_ANSISTRING := -Add('push (ansistring)');
  3607.     OP_PUSH_SHORTSTRING := -Add('push (shortstring)');
  3608.     OP_PUSH_WIDESTRING := -Add('push (widestring)');
  3609.     OP_PUSH_UNICSTRING := -Add('push (unicstring)');
  3610.     OP_PUSH_PANSICHAR_IMM := -Add('push (pansichar i)');
  3611.     OP_PUSH_PWIDECHAR_IMM := -Add('push (pwidechar i)');
  3612.     OP_PUSH_INST := -Add('push inst');
  3613.     OP_PUSH_CLSREF := -Add('push clsref');
  3614.     OP_PUSH_DYNARRAY := -Add('push dynarray');
  3615.     OP_SET_ASSIGN := -Add('SET ASSIGN');
  3616.     OP_SET_UNION := -Add('SET UNION');
  3617.     OP_SET_DIFFERENCE :=  -Add('SET DIFFERENCE');
  3618.     OP_SET_INTERSECTION := -Add('SET INTERSECTION');
  3619.     OP_SET_SUBSET := -Add('SET SUBSET');
  3620.     OP_SET_SUPERSET := -Add('SET SUPERSET');
  3621.     OP_SET_EQUALITY := -Add('SET EQUALITY');
  3622.     OP_SET_INEQUALITY := -Add('SET INEQUALITY');
  3623.     OP_GET_ANSISTR_PROP := -Add('GET ANSISTR PROP');
  3624.     OP_GET_WIDESTR_PROP := -Add('GET WIDESTR PROP');
  3625.     OP_GET_UNICSTR_PROP := -Add('GET UNICSTR PROP');
  3626.     OP_GET_ORD_PROP := -Add('GET ORD PROP');
  3627.     OP_GET_SET_PROP := -Add('GET SET PROP');
  3628.     OP_GET_INTERFACE_PROP := -Add('GET INTERFACE PROP');
  3629.     OP_GET_FLOAT_PROP := -Add('GET FLOAT PROP');
  3630.     OP_GET_VARIANT_PROP := -Add('GET VARIANT PROP');
  3631.     OP_GET_INT64_PROP := -Add('GET INT64 PROP');
  3632.     OP_GET_EVENT_PROP := -Add('GET EVENT PROP');
  3633. {$IFDEF UNIC}
  3634.     OP_ADD_STRING := OP_ADD_UNICSTRING;
  3635. {$ELSE}
  3636.     OP_ADD_STRING := OP_ADD_ANSISTRING;
  3637. {$ENDIF}
  3638.     OP_DUMMY := - Add('DUMMY');
  3639.     if IsDump then
  3640.       SaveToFile('operators.txt');
  3641.   end;
  3642.   AsmOperators := TStringList.Create;
  3643.   with AsmOperators do
  3644.   begin
  3645.     ASM_NOP := Add('NOP');
  3646.     ASM_WAIT := Add('WAIT');
  3647.     ASM_CLC := Add('CLC');
  3648.     ASM_PUSHFD := Add('PUSHFD');
  3649.     ASM_POPFD := Add('POPFD');
  3650.     
  3651.     ASM_XCHG := Add('XCHG');
  3652.     ASM_MOV := Add('MOV');
  3653.     ASM_LEA := Add('LEA');
  3654.     ASM_TEST := Add('TEST');
  3655.     ASM_ADD := Add('ADD');
  3656.     ASM_ADC := Add('ADC');
  3657.     ASM_SBB := Add('SBB');
  3658.     ASM_NEG := Add('NEG');
  3659.     ASM_SUB := Add('SUB');
  3660.     ASM_MUL := Add('MUL');
  3661.     ASM_IMUL := Add('IMUL');
  3662.     ASM_DIV := Add('DIV');
  3663.     ASM_IDIV := Add('IDIV');
  3664.     ASM_XOR := Add('XOR');
  3665.     ASM_AND := Add('AND');
  3666.     ASM_OR := Add('OR');
  3667.     ASM_SHL := Add('SHL');
  3668.     ASM_SHR := Add('SHR');
  3669.     ASM_CDQ := Add('CDQ');
  3670.     ASM_CALL := Add('CALL');
  3671.     ASM_RET := Add('RET');
  3672.     ASM_PUSH := Add('PUSH');
  3673.     ASM_POP := Add('POP');
  3674.     ASM_JMP := Add('JMP');
  3675.     ASM_JNO := Add('JNO');
  3676.     ASM_JNC := Add('JNC');
  3677.     ASM_JZ  := Add('JZ');
  3678.     ASM_JNZ := Add('JNZ');
  3679.     ASM_JBE := Add('JBE');
  3680.     ASM_JNLE:= Add('JNLE');
  3681.     ASM_FLD := Add('FLD');
  3682.     ASM_FILD := Add('FILD');
  3683.     ASM_FISTP := Add('FISTP');
  3684.     ASM_FSTP := Add('FSTP');
  3685.     ASM_FADD := Add('FADD');
  3686.     ASM_FSUB := Add('FSUB');
  3687.     ASM_FMUL := Add('FMUL');
  3688.     ASM_FDIV := Add('FDIV');
  3689.     ASM_FCOMP := Add('FCOMP');
  3690.     ASM_FCOMPP := Add('FCOMPP');
  3691.     ASM_FSTSV := Add('FSTSV');
  3692.     ASM_SAHF := Add('SAHF');
  3693.     ASM_FCHS := Add('FCHS');
  3694.     ASM_FABS := Add('FABS');
  3695.     ASM_SETL := Add('SETL'); // <
  3696.     ASM_SETLE := Add('SETLE'); // <=
  3697.     ASM_SETNLE := Add('SETNLE'); // >
  3698.     ASM_SETNL := Add('SETNL'); // >=
  3699.     ASM_SETB := Add('SETB'); // <
  3700.     ASM_SETBE := Add('SETBE'); // <=
  3701.     ASM_SETNBE := Add('SETNBE'); // >
  3702.     ASM_SETNB := Add('SETNB'); // >=
  3703.     ASM_SETZ := Add('SETZ'); // =
  3704.     ASM_SETNZ := Add('SETNZ'); // =
  3705.     ASM_CMP := Add('CMP');
  3706.     ASM_REP_MOVSB := Add('REP MOVSB');
  3707.     ASM_REP_MOVSD := Add('REP MOVSD');
  3708.     DynDestrList := TIntegerList.Create;
  3709.     with DynDestrList do
  3710.     begin
  3711.       Add(OP_VARIANT_CLR);
  3712.       Add(OP_ANSISTRING_CLR);
  3713.       Add(OP_WIDESTRING_CLR);
  3714.       Add(OP_UNICSTRING_CLR);
  3715.       Add(OP_INTERFACE_CLR);
  3716.       Add(OP_DYNARRAY_CLR);
  3717.       Add(OP_STRUCTURE_CLR);
  3718.     end;
  3719.   end;
  3720. finalization
  3721.   Types.Free;
  3722.   Kinds.Free;
  3723.   Operators.Free;
  3724.   AsmOperators.Free;
  3725.   DynDestrList.Free;
  3726. end.