base_event.pas

来自「Delphi脚本控件」· PAS 代码 · 共 704 行 · 第 1/2 页

PAS
704
字号
            SO := InstanceClassRec.CreateScriptObject;
            SO.Instance := TObject(j);
{
            SO := ClassRec.CreateScriptObject;
            SO.Instance := TObject(J);
}
          end;
        end
        else begin
          SO := TPAXScriptObject(TPAXBaseScripter(Scripter).ScriptObjectList.PaxObjects[Index]);
        end;

        Parameters[I].VType := vtObject;
        Parameters[I].VObject := SO;

        Types[I] := typeCLASS;
        Pointers[I] := @ SO.Instance;
      end
      else
      begin
        RTTITypeDefinition := DefinitionList.FindRTTITypeDefByName(S);
        if RTTITypeDefinition <> nil then
        begin
          pti := RTTITypeDefinition.pti;
          case pti^.Kind of
            tkEnumeration:
            begin
              Integers[I] := J;

              Adjust(J);
              ptd := GetTypeData(pti);
{$ifndef fp}
              if ptd^.BaseType^ = TypeInfo(Boolean) then
              begin
                Parameters[I].VType := vtBoolean;
                if J = 0 then
                  Parameters[I].VBoolean := false
                else
                  Parameters[I].VBoolean := true;

                Types[I] := typeBOOLEAN;
                Pointers[I] := @ Parameters[I].VBoolean;
              end
              else
{$endif}
              begin
//                Parameters[I].VType := vtAnsiString;
//                Parameters[I].VAnsiString := Pointer(AnsiString(GetEnumName(pti, J)));

                Parameters[I].VType := vtInteger;
                Parameters[I].VInteger := J;

                Types[I] := typeENUM;
                Pointers[I] := @ Integers[I];
              end;
            end;
            tkSet:
            begin
              Integers[I] := J;

              Adjust(J);
              Variants[I] := SetToVariantArray(J, pti);
              Parameters[I].VType := vtVariant;
              Parameters[I].VVariant := @Variants[I];

              Types[I] := typeSET;
              Pointers[I] := @ Integers[I];
            end;

            //--jgv 20061012
            tkChar:
            begin
              Adjust(J);
              Parameters[I].VType := vtInteger;
              Parameters[I].VType := vtChar;
              Parameters[I].VInteger := J;

              Types[I] := typeCHAR;
              Pointers[I] := @ Parameters[I].VInteger;
            end;

            else
            begin
              Parameters[I].VType := vtInteger;
              Parameters[I].VInteger := J;

              Types[I] := typeINTEGER;
              Pointers[I] := @ Parameters[I].VInteger;
            end;
          end;
        end
        else
        begin
          if StrEql(ParamTypes[I], 'String') then
          begin
            Parameters[I].VType := vtAnsiString;
            Parameters[I].VAnsiString := Pointer(J);

            Types[I] := typeSTRING;
            Pointers[I] := Parameters[I].VAnsiString;
          end
          else if StrEql(ParamTypes[I], 'WideString') then
          begin
            Parameters[I].VType := vtWideString;
            Parameters[I].VWideString := Pointer(J);

            Types[I] := typeWIDESTRING;
            Pointers[I] := Parameters[I].VWideString;
          end
          else if StrEql(ParamTypes[I], 'Boolean') then
          begin
            Parameters[I].VType := vtBoolean;
            Parameters[I].VBoolean := Boolean(Byte(J));

            Types[I] := typeBOOLEAN;
            Pointers[I] := @ Parameters[I].VBoolean;
          end
          else if StrEql(ParamTypes[I], 'Word') then
          begin
            Parameters[I].VType := vtInteger;
            Parameters[I].VInteger := J;

            Types[I] := typeWORD;
            Pointers[I] := @ Parameters[I].VInteger;
          end
          else if StrEql(ParamTypes[I], 'Char') then
          begin
            Adjust(J);
            Parameters[I].VType := vtInteger;
            Parameters[I].VInteger := J;

            Types[I] := typeCHAR;
            Pointers[I] := @ Parameters[I].VInteger;
          end
          else if StrEql(ParamTypes[I], 'Variant') then
          begin
            Parameters[I].VType := vtVariant;
            if ByRef then
              PVariant(Parameters[I].VVariant) := PVariant(Ptrs[I + 1])
            else
              PVariant(Parameters[I].VVariant) := PVariant(J);

            Types[I] := typeVARIANT;
            Pointers[I] := Parameters[I].VVariant;
          end
          else
          begin
            Parameters[I].VType := vtInteger;
            Parameters[I].VInteger := J;

            Types[I] := typeINTEGER;
            Pointers[I] := @ Parameters[I].VInteger;
          end;
        end;
      end;
    end;

    if OverrideHandlerMode = 1 then
      if HostHandler.Code <> nil then
        BASE_CALL.Call(HostHandler.Code,
                       nil,
                       HostHandler.Data,
                       false,
                       _ccRegister,
                       Pointers,
                       Types,
                       ExtraTypes,
                       ByRefs,
                       Sizes,
                       false);

    PThis := @ This;

    R := TPAXBaseScripter(Scripter).CallMethod(SubID, This, Parameters, true);

    with TPAXBaseScripter(Scripter) do
    begin
      for I:=1 to SymbolTable.Count[SubID] do
      begin
        ParamID := SymbolTable.GetParamID(SubID, I);
        TypeID := SymbolTable.PType[ParamID];
        if SymbolTable.ByRef[ParamID] = 1 then
        begin
          V := SymbolTable.VariantValue[ParamID];
          if TypeID = typeBOOLEAN then
            PBoolean(Ptrs[I])^ := V
          else if TypeID = typeINTEGER then
          begin
            PInteger(Ptrs[I])^ := V;
          end
          else if TypeID = typeWORD then
            PWord(Ptrs[I])^ := V
          else if TypeID = typeSHORTINT then
            PShortInt(Ptrs[I])^ := V
          else if TypeID = typeSMALLINT then
            PSmallInt(Ptrs[I])^ := V
          else if TypeID = typeBYTE then
            PByte(Ptrs[I])^ := V
          //-- jgv
          else if TypeID = typeCHAR then begin // jgv
            s := v;
            PByte(Ptrs[i])^ := Byte(char(s[1]));
          end
          else if TypeID = typeDOUBLE then
          begin
            PDouble(Ptrs[I])^ := V;
          end
          else if TypeID = typeEXTENDED then
            PExtended(Ptrs[I])^ := V
          else if TypeID = typeSTRING then
          begin
            PString(Ptrs[I])^ := V;
          end
          else if TypeID = typeWIDESTRING then
          begin
            PWideString(Ptrs[I])^ := V;
          end
          else if TypeID = typeVARIANT then
          begin
            PVariant(Ptrs[I])^ := V;
          end
          else if (TypeID < 0) then
          begin
             if isObject(V) then
             begin
               PInteger(Ptrs[I])^ := Integer(VariantToScriptObject(V).Instance);
               VariantToScriptObject(V).RefCount := -1;

               continue;
             end;

            // It's a structure - we're already directly modifying it.  Don't write anything, but we do need to
            // clean up after ourselves..
            ClassRec := ClassList.FindClass(TypeID);
            if ClassRec <> nil then
            begin
              if ClassRec.ck = ckEnum then
                PByte(Ptrs[I])^ := V;
            end;
          end
          else
          begin
            if isObject(V) then
            begin
              PInteger(Ptrs[I])^ := Integer(VariantToScriptObject(V).Instance);
            end
            else
              PByte(Ptrs[I])^ := V;
          end;
        end;
      end;
    end;

    if OverrideHandlerMode = 2 then
      if HostHandler.Code <> nil then
        BASE_CALL.Call(HostHandler.Code,
                       nil,
                       HostHandler.Data,
                       false,
                       _ccRegister,
                       Pointers,
                       Types,
                       ExtraTypes,
                       ByRefs,
                       Sizes,
                       false);

  finally
    for I:=0 to CreatedRecords.Count - 1 do
    begin
      SO := TPaxScriptObject(CreatedRecords[I]);
      TPAXBaseScripter(SO.Scripter).ScriptObjectList.RemoveObject(SO);
    end;
    // We need to clean up after ourselves!!!
    CreatedRecords.Free;
  end;

  if Assigned(TPAXBaseScripter(Scripter).OnHalt) then
  if TPAXBaseScripter(Scripter).Code.SignHaltGlobal then
  begin
    TPAXBaseScripter(Scripter).OnHalt(TPAXBaseScripter(Scripter).Owner);
  end;
end;

procedure TPAXEventHandler.HandleEvent;
const
  LocalFrameSize = 28;
asm
  mov dword ptr Self._EAX, eax
  mov dword ptr Self._EDX, edx
  mov dword ptr Self._ECX, ecx
  mov dword ptr Self._P, esp

  push ebp
  mov ebp, esp

  sub esp, LocalFrameSize

  mov [ebp-12], ecx
  mov [ebp- 8], edx
  mov [ebp- 4], eax

  push eax
  call Invoke
  pop eax

  mov ecx, Self.RetSize

  mov esp, ebp
  pop ebp

  cmp ecx, 0

  jnz @@Ret4
  ret

@@Ret4:
  cmp ecx, 4
  jnz @@Ret8
  ret 4

@@Ret8:
  cmp ecx, 8
  jnz @@Ret12
  ret 8

@@Ret12:
  cmp ecx, $0c
  jnz @@Ret16
  ret $0c

@@Ret16:
  cmp ecx, $10
  jnz @@Ret20
  ret $10

@@Ret20:
  cmp ecx, $14
  jnz @@Ret24
  ret $14

@@Ret24:
  cmp ecx, $18
  jnz @@Ret28
  ret $18

@@Ret28:
  ret $1C
end;

end.

⌨️ 快捷键说明

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