Jump to content

Stefan Glienke

Members
  • Content Count

    242
  • Joined

  • Last visited

  • Days Won

    18

Everything posted by Stefan Glienke

  1. Stefan Glienke

    Make attention to Embarcadero

    The guys at HGGC and TA Associates ultimately are making the decisions...
  2. Stefan Glienke

    JSON string value

    If you have documentation you cannot just yolo refactor code every release and break something...
  3. I am not going to argue with you why mutable(!) global state is bad because a ton of respected people in the software development community have already proven that. As I said a singleton can be the easy solution - that does not make it a good one. Putting any code into an otherwise no or hard testable software component is only a crutch - there are ways to design software to be testable by default which does not only make it easily testable but also more robust and maintainable. Just read "Clean Code" and/or watch "Clean code talks" on Youtube. Also fwiw there is a difference between Singleton as in the GoF Singleton (ensuring that there is only one instance and preventing everyone from ever instantiating a second instance of that) and "singletoness" (establishing the contract of only having one instance but not preventing anyone from instantiating one on its own and inject it somewhere). Even in DI driven architectures there are singletons, but it is controlled via the DI system that there is only one instance being created and passed around. That decouples any consumer from the actual implementation of that singleton and makes it easily testable/mockable (see "seam")
  4. A singleton is never a good solution - it might be the easy one in the middle of a DI unfriendly architecture but that's it. Singletons do not only couple pieces together that don't have to but they also allow all kinds of crazy and hard to find errors - as every global state does.
  5. If you think that it's related to .NET then call dcc yourself and see if that works - as I said already the error comes from the dcc. So it can only be that msbuild is passing down different values than before causing it to behave differently. To rule that out, eliminate the suspected factor from the equation, troubleshooting 101
  6. I think I once saw there was an issue with non ascii characters in the path causing trouble.
  7. Googling for this error and drf yields this: Source
  8. I don't see an msbuild error - the error is from the delphi commandline compiler (dcc) and you see the error it raised: F2039 I guess drf is your custom file extension for the project being compiled? Make sure the file is not write protected or accessed by any other program if already existing.
  9. Stefan Glienke

    Detecting Memory Leaks

    What memory leak? That assert is telling you that CRYPTO_set_mem_functions returned 0
  10. Stefan Glienke

    Undocumented "Interface flag" for IInvokable?

    If with "you" you mean @Der schöne Günther then yes.
  11. Stefan Glienke

    Undocumented "Interface flag" for IInvokable?

    The compiler is responsible for writing typeInfo into the binary.
  12. Stefan Glienke

    Undocumented "Interface flag" for IInvokable?

    It seems indeed as if the TIntfFlag enum was never extended since Delphi6 (I think that was when interface RTTI was introduced) - I can confirm that at least since XE an interface type with $M+ gets a fourth flag (lets call it ifHasMethodInfo) set. If the type is an anonymous method type (see https://stackoverflow.com/q/49950534/587106) then there is a 7th enum value in the set. The situations where bit 5 and 6 are set are unknown to me. You might want to file an issue in QP about this. @Remy Lebeau Your diagnosis is still wrong - if the debugger shows then that means it has the 4th bit set. I can confirm my findings with this code: uses SysUtils, Rtti; type TIntfFlagEx = (ifHasGuid, ifDispInterface, ifDispatch, ifMethodInfo, ifUnknown, ifUnknown2, ifAnonymousMethod); TIntfFlagsEx = set of TIntfFlagEx; {$M+} IFoo = interface ['{35CFB4E2-4A13-48E9-8026-C1558001F4B7}'] procedure Main; end; {$M-} {$M+} IBar = interface(TProc) ['{AB2FEC1A-339F-4E58-B3DB-EC7B734F461B}'] end; {$M-} {$M+} TMyProc = reference to procedure; {$M-} procedure PrintIntf(typeInfo: Pointer); var context: TRttiContext; rttiInterface: TRttiInterfaceType; flags: TIntfFlagsEx; begin rttiInterface := context.GetType(typeInfo) as TRttiInterfaceType; flags := TIntfFlagsEx(rttiInterface.IntfFlags); Writeln(rttiInterface.Name, ' ', TValue.From(flags).ToString); end; begin PrintIntf(TypeInfo(IInterface)); PrintIntf(TypeInfo(IInvokable)); PrintIntf(TypeInfo(IFoo)); PrintIntf(TypeInfo(TProc)); PrintIntf(TypeInfo(TFunc<Integer>)); PrintIntf(TypeInfo(TMyProc)); PrintIntf(TypeInfo(IBar)); Readln; end. prints this: IInterface [ifHasGuid] IInvokable [ifMethodInfo] IFoo [ifHasGuid,ifMethodInfo] TProc [ifAnonymousMethod] TFunc<System.Integer> [ifAnonymousMethod] TMyProc [ifMethodInfo,ifAnonymousMethod] IBar [ifHasGuid,ifMethodInfo,ifAnonymousMethod]
  13. Stefan Glienke

    The Android 64bit deadline warnings have started

    The block will happen less than two months from now - read for yourself: https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html
  14. Stefan Glienke

    A YAML Library for Delphi

    Ah, I see now, they are all hidden in that innocently looking TestParse and TestEmit methods - was expecting to see them more fine grained :) I have some suggestions for some possible low level optimizations (for example eliminating some unnecessary code from function prologues and epilogues caused by usually not raised exceptions but the fact the exception creation code is directly coded into the methods (and in fact is repeated multiple times) - will file a PR.
  15. Stefan Glienke

    A YAML Library for Delphi

    Does it pass https://github.com/yaml/yaml-test-suite ?
  16. Stefan Glienke

    GetMemory vs. GetMem

    function _GetMem(Size: NativeInt): Pointer; begin if Size <= 0 then Exit(nil); Result := MemoryManager.GetMem(Size); if Result = nil then Error(reOutOfMemory); end; function GetMemory(Size: NativeInt): Pointer; cdecl; begin Result := MemoryManager.GetMem(Size); end; Do you see the difference? Also GetMem is an intrinsic that maps to System._GetMem
  17. Stefan Glienke

    MSBuild and genearating MapFile

    DCC_MapFile=3 See BDS\bin\CodeGear.Delphi.Targets starting at around line 400
  18. Stefan Glienke

    Show public/published distinction in code-completion popup?

    Writing entire words in uppercase (even more so if colored red) is considered shouting on the internet
  19. Stefan Glienke

    Show public/published distinction in code-completion popup?

    That was my point - no need to shout.
  20. Stefan Glienke

    Show public/published distinction in code-completion popup?

    What should it show? scnr 😉
  21. uses Spring.VirtualClass; procedure NotifyFree(const Self: TObject); var freeInstance: TFreeInstance; begin freeInstance := GetClassData(Self.ClassParent).FreeInstance; Writeln('Object of class ', Self.ClassName, ' destroyed'); freeInstance(Self); end; var vc: TVirtualClasses; o: TObject; begin vc := TVirtualClasses.Create; try o := TObject.Create; try vc.Proxify(o); GetClassData(o.ClassType).FreeInstance := NotifyFree; finally o.Free; end; finally vc.Free; end; end.
  22. Stefan Glienke

    What's the state of JCL/JVCL?

    I know the repositories get maintenance and update for new Delphi releases but I wonder if there is actually a release planned. Last JCL release is 2.7 from september 2015 which probably does not support any Delphi version after that - last JVCL release is 3.49 also from september 2015. Since then we are in limbo state working with some master state - this is kinda far from optimal.
  23. Stefan Glienke

    Bug: anonymous methods in procedure list

    Anonymous methods normally don't appear in the procedure list (which I don't mind - so even if you decide to list them in the future, please make that optional). However when you have a function/procedure does not have any arguments and you don't write () they appear in the list: procedure Main; var f: TFunc<Integer>; p: TProc; f2: TFunc<Integer,Integer>; p2: TProc<Integer>; begin f := function: Integer begin end; // appears as empty entry in procedure list f := function(): Integer begin end; // does not appear p := procedure begin end; // appears as "begin end" in procedure list p := procedure() begin end; // does not appear p2 := procedure(x: Integer) begin end; // does not appear f2 := function(x: Integer): Integer begin end; // does not appear end;
  24. Stefan Glienke

    Bug: anonymous methods in procedure list

    What does QP have to do with a GExperts bug?
  25. Stefan Glienke

    10.3.1 has been released

    Yes - all major versions can coexist
×