base_code.pas
来自「Delphi脚本控件」· PAS 代码 · 共 2,451 行 · 第 1/5 页
PAS
2,451 行
////////////////////////////////////////////////////////////////////////////
// PAXScript Interpreter
// Author: Alexander Baranovsky (ab@cable.netlux.org)
// ========================================================================
// Copyright (c) Alexander Baranovsky, 2003-2005. All rights reserved.
// Code Version: 3.0
// ========================================================================
// Unit: BASE_CODE.pas
// ========================================================================
////////////////////////////////////////////////////////////////////////////
{$I PaxScript.def}
{$O-}
unit BASE_CODE;
interface
uses
{$IFDEF VARIANTS}
Variants,
{$ENDIF}
SysUtils, Classes, Math, TypInfo,
BASE_CONSTS,
BASE_SYNC, BASE_CONV,
BASE_SYS, BASE_SYMBOL, BASE_CLASS, BASE_EXTERN, BASE_CALL;
const
MaxTryStack = 100;
type
TProc = procedure of object;
TPAXDebugInfo = class(TPAXStack)
procedure PopProc;
end;
TPAXTryStackRec = record
B1, B2: Integer;
end;
TPAXTryStack = class
public
A: array[1..MaxTryStack] of TPAXTryStackRec;
Card: Integer;
constructor Create;
procedure Clear;
procedure Push(N1, N2: Integer);
procedure Pop;
function Legal(N: Integer): boolean;
end;
TPAXBreakpoint = class
public
LineNumber: Integer;
Condition: String;
PassCount: Integer;
CurrPassCount: Integer;
constructor Create(LineNumber: Integer;
const Condition: String;
PassCount: Integer);
end;
TPAXBreakpointList = class(TPAXIndexedList)
private
function GetBreakpoint(I: Integer): TPAXBreakpoint;
public
procedure InitCurrPassCounts;
procedure AddBreakpoint(LineNumber: Integer;
const Condition: String;
PassCount: Integer);
function RemoveBreakpoint(LineNumber: Integer): Boolean;
property Breakpoints[I: Integer]: TPAXBreakpoint read GetBreakpoint; default;
end;
TPAXCodeRec = record
Op, Arg1, Arg2, Res, Vars: Integer;
PP_Res, PP_Arg1, PP_Arg2: Pointer;
_Entry, _SubID, SaveOP, AltArg1, LinePos: Integer;
IsExecutable: Boolean;
end;
TPAXCode = class
private
Base: Variant;
public
Scripter: Pointer;
SymbolTable: TPAXSymbolTable;
ClassList: TPAXClassList;
Stack: TPAXFastStack;
Prog: array of TPAXCodeRec;
Card: Integer;
ArrProc: array[- 350..BOUND_OPER] of TProc;
N, ErrorN: Integer;
SubRunCount: Integer;
UsingList: TPAXUsingList;
WithStack: TPAXWithStack;
LevelStack: TPAXFastStack;
TryStack: TPAXTryStack;
BreakPointList: TPAXBreakpointList;
DebugState: Boolean;
DebugInfo: TPAXDebugInfo;
StateStack: TPAXStack;
RefStack: TPAXFastStack;
SignFOP, fTerminated, DeclareON, SignRETURN, SignInitStage: Boolean;
ResultValue: Variant;
_ParamCount: Integer;
CurrRunMode: Integer;
_This: Variant;
InitializationList, FinalizationList: TPaxIds;
UpcaseOn: Boolean;
SignVBARRAYS: Boolean;
SignZERO_BASED_STRINGS: Boolean;
Undefined2: Variant;
SignHaltGlobal: Boolean;
AssignedUndeclaredList: TPAXIds;
IsAborted: Boolean;
VV: Variant;
constructor Create(AScripter: Pointer);
destructor Destroy; override;
function GetUpcase(I: Integer): Boolean;
procedure SetRef(ID: Integer; const V: Variant; ma: TPAXMemberAccess);
procedure SaveOP;
function CurrArg1ID: Integer;
function CurrArg2ID: Integer;
function CurrResID: Integer;
function CurrOP: Integer;
function IsExecutableSourceLine(const ModuleName: String; L: Integer): Boolean;
procedure SaveToStream(S: TStream; P1, P2: Integer);
procedure LoadFromStream(S: TStream;
DS: Integer = 0; DP: Integer = 0);
procedure CheckLength;
procedure Add(InitOp, InitArg1, InitArg2, InitRes: Integer; IsExecutable: Boolean = false);
procedure GenAt(P: Integer; InitOp, InitArg1, InitArg2, InitRes: Integer; IsExecutable: Boolean = false);
procedure SetFOP(FOP: Integer; Ex: Boolean = false);
procedure SaveState;
procedure RestoreState;
function FindCreateObjectStmt(TypeID: Integer): Integer;
function GetLanguageNamespaceID: Integer;
function GetModuleID(J: Integer): Integer;
function ModuleID: Integer;
function LineID: Integer;
function NextLineID: Integer;
function IsExecutableLine(I: Integer): Boolean;
function IsBreakpoint(L: Integer): Boolean;
procedure Dump(const FileName: String);
procedure Run(RunMode: Integer = _rmRun; DestLine: Integer = 0);
function EvalGetFunction(SubID, NParams: Integer): Integer;
procedure EvalSetProcedure(SubID, NParams: Integer; AValue: Variant);
procedure CallSub(SubID, ParamCount: Integer; PThis: PVariant; ResultID: Integer; MakeFOP: Boolean = false);
procedure CallHostSub(D: TPAXMethodDefinition; PThis, PResult: PVariant; ParamCount: Integer);
function PopVariant: Variant;
function PopAddress: Pointer;
function PopInteger: Integer;
procedure RaiseException;
procedure Optimization(StartPos, EndPos: Integer);
procedure LinkGoTo(StartPos, EndPos: Integer);
procedure RemoveNops;
procedure ReplaceID(ID1, ID2: Integer);
procedure InvokeOnChangedVariable;
function NextOp(var NewN: Integer): Integer;
function CurrMethodID: Integer;
procedure InitRunStage;
procedure ResetRunStage;
procedure ResetCompileStage;
procedure OperBinaryOperator;
procedure OperUnaryOperator;
procedure OperPrint;
procedure OperHalt;
procedure OperHaltGlobal;
procedure OperHaltOrNop;
procedure OperNop;
procedure OperSkip;
procedure OperPutProperty;
procedure OperCall;
procedure OperTypeCast;
procedure OperPush;
procedure OperRet;
procedure OperExit0;
procedure OperExit;
procedure OperReturn;
procedure OperSetLabel;
procedure OperGetParamCount;
procedure OperGetParam;
procedure OperGetPublishedProperty;
procedure OperPutPublishedProperty;
procedure OperRetOperator;
procedure OperExitOnError;
procedure OperDiscardError;
procedure OperFinally;
procedure OperCatch;
procedure OperTryOn;
procedure OperTryOff;
procedure OperThrow;
procedure OperCreateArray;
procedure OperDoNotDestroy;
procedure OperGetItem;
procedure OperPutItem;
procedure OperGetItemEx;
procedure OperPutItemEx;
procedure OperCreateShortString;
procedure OperGetField;
procedure OperGetStringElement;
procedure OperPutStringElement;
procedure OperCreateObject;
procedure OperDestroyHost;
procedure OperDestroyObject;
procedure OperDestroyLocalVar;
procedure OperDestroyIntf;
procedure OperRelease;
procedure OperCreateRef;
procedure OperUseNamespace;
procedure OperEndOfNamespace;
procedure OperBeginWith;
procedure OperEndWith;
procedure OperEvalWith;
procedure OperIn;
procedure OperInSet;
procedure OperInstanceOf;
procedure OperTypeOf;
procedure OperGetNextProp;
procedure OperSaveResult;
procedure OperGetAncestorName;
procedure OperGo;
procedure OperGoFalse;
procedure OperGoFalseEx;
procedure OperGoTrue;
procedure OperGoTrueEx;
procedure OperAssign;
procedure OperSetOwner;
procedure OperAssignResult;
procedure OperAssignAddress;
procedure OperGetTerminal;
procedure OperAnd;
procedure OperOr;
procedure OperXor;
procedure OperNot;
procedure OperLeftShift;
procedure OperLeftShift_Ex;
procedure OperRightShift;
procedure OperRightShift_Ex;
procedure OperUnsignedRightShift;
procedure OperUnsignedRightShift_Ex;
procedure OperPlus;
procedure OperPlus_Ex;
procedure OperMinus;
procedure OperMinus_Ex;
procedure OperUnaryPlus;
procedure OperUnaryMinus;
procedure OperUnaryMinusEx;
procedure OperMult;
procedure OperMult_Ex;
procedure OperDiv;
procedure OperDiv_Ex;
procedure OperIntDiv;
procedure OperMod;
procedure OperMod_Ex;
procedure OperPower;
procedure OperLT;
procedure OperLT_Ex;
procedure OperGT;
procedure OperGT_Ex;
procedure OperLE;
procedure OperLE_Ex;
procedure OperGE;
procedure OperGE_Ex;
procedure OperEQ;
procedure OperEQ_Ex;
procedure OperNE;
procedure OperNE_Ex;
procedure OperID;
procedure OperID_Ex;
procedure OperNI;
procedure OperNI_Ex;
procedure OperIS;
procedure OperAS;
procedure OperToInteger;
procedure OperToString;
procedure OperToBoolean;
procedure OperDefine;
procedure OperDeclareOn;
procedure OperDeclareOff;
procedure OperUpcaseOn;
procedure OperUpcaseOff;
procedure OperOptimizationOn;
procedure OperOptimizationOff;
procedure OperVBArraysOff;
procedure OperVBArraysOn;
procedure OperZeroBasedStringsOn;
procedure OperZeroBasedStringsOff;
procedure FindUnaryOperator(const Name: String; const V2: Variant);
procedure FindBinaryOperator(const Name: String; const V1, V2: Variant);
//------------------------------------------
procedure FOperGoFalse1;
procedure FOperGoFalse2;
procedure FOperGoTrue1;
procedure FOperGoTrue2;
procedure FOperAssign;
procedure FOperINC1;
procedure FOperINC2;
procedure FOperPlusInteger1;
procedure FOperPlusInteger2;
procedure FOperPlusDouble1;
procedure FOperPlusDouble2;
procedure FOperPlusString1;
procedure FOperPlusString2;
procedure FOperMinusInteger1;
procedure FOperMinusInteger2;
procedure FOperMinusDouble1;
procedure FOperMinusDouble2;
procedure FOperMultInteger1;
procedure FOperMultInteger2;
procedure FOperMultDouble1;
procedure FOperMultDouble2;
procedure FOperDivInteger1;
procedure FOperDivInteger2;
procedure FOperDivDouble1;
procedure FOperDivDouble2;
procedure FOperMod1;
procedure FOperMod2;
procedure FOperLTInteger1;
procedure FOperLTInteger2;
procedure FOperLTDouble1;
procedure FOperLTDouble2;
procedure FOperLEInteger1;
procedure FOperLEInteger2;
procedure FOperLEDouble1;
procedure FOperLEDouble2;
procedure FOperGTInteger1;
procedure FOperGTInteger2;
procedure FOperGTDouble1;
procedure FOperGTDouble2;
procedure FOperGEInteger1;
procedure FOperGEInteger2;
procedure FOperGEDouble1;
procedure FOperGEDouble2;
procedure FOperEQInteger1;
procedure FOperEQInteger2;
procedure FOperEQDouble1;
procedure FOperEQDouble2;
procedure FOperNEInteger1;
procedure FOperNEInteger2;
procedure FOperNEDouble1;
procedure FOperNEDouble2;
procedure FOperBitwiseAND1;
procedure FOperBitwiseAND2;
procedure FOperBitwiseOR1;
procedure FOperBitwiseOR2;
procedure FOperBitwiseXOR1;
procedure FOperBitwiseXOR2;
procedure FOperLogicalAND1;
procedure FOperLogicalAND2;
procedure FOperLogicalOR1;
procedure FOperLogicalOR2;
procedure FOperLogicalXOR1;
procedure FOperLogicalXOR2;
procedure FOperBitwiseNOT1;
procedure FOperBitwiseNOT2;
procedure FOperLogicalNOT1;
procedure FOperLogicalNOT2;
procedure FOperUnaryMinusInteger1;
procedure FOperUnaryMinusInteger2;
procedure FOperUnaryMinusDouble1;
procedure FOperUnaryMinusDouble2;
procedure FOperSHL1;
procedure FOperSHL2;
procedure FOperSHR1;
procedure FOperSHR2;
procedure FOperUSHR1;
procedure FOperUSHR2;
//======================================================================
procedure FOperPush;
procedure FOperPlus1;
procedure FOperPlus2;
procedure FOperMinus1;
procedure FOperMinus2;
procedure FOperMult1;
procedure FOperMult2;
procedure FOperDiv1;
procedure FOperDiv2;
procedure FOperGT1;
procedure FOperGT2;
procedure FOperGE1;
procedure FOperGE2;
procedure FOperLT1;
procedure FOperLT2;
procedure FOperLE1;
procedure FOperLE2;
procedure FOperEQ1;
procedure FOperEQ2;
procedure FOperNE1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?