tests.rtti.invoke.pas 108 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035
  1. unit tests.rtti.invoke;
  2. {$ifdef fpc}
  3. {$mode objfpc}{$H+}
  4. {$endif}
  5. {.$define debug}
  6. interface
  7. uses
  8. {$IFDEF FPC}
  9. fpcunit,testregistry,
  10. {$ELSE FPC}
  11. TestFramework,
  12. {$ENDIF FPC}
  13. types,
  14. sysutils, typinfo, Rtti,
  15. tests.rtti.attrtypes2,
  16. tests.rtti.invoketypes,
  17. Tests.Rtti.Util;
  18. type
  19. TProcArgs = record
  20. aInputArgs,
  21. aOutputArgs: TValueArray;
  22. aResult: TValue;
  23. end;
  24. { TTestInvokeBase }
  25. TTestInvokeBase = class(TTestCase)
  26. private type
  27. TInvokeFlag = (
  28. ifStatic,
  29. ifConstructor
  30. );
  31. TInvokeFlags = set of TInvokeFlag;
  32. private
  33. function DoInvoke(aCodeAddress: CodePointer; aArgs: TValueArray; aCallConv: TCallConv; aResultType: PTypeInfo; aFlags: TInvokeFlags; out aValid: Boolean): TValue;
  34. procedure DoStaticInvokeTestVariant(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; aResult: String);
  35. procedure DoStaticInvokeTestOrdinalCompare(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; aResult: Int64);
  36. procedure DoStaticInvokeTestAnsiStringCompare(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; constref aResult: AnsiString);
  37. procedure DoStaticInvokeTestUnicodeStringCompare(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; constref aResult: UnicodeString);
  38. procedure DoIntfInvoke(aIndex: SizeInt; aInputArgs, aOutputArgs: TValueArray; aResult: TValue);
  39. procedure DoMethodInvoke(aInst: TObject; aMethod: TMethod; aTypeInfo: PTypeInfo; aIndex: SizeInt; aInputArgs, aOutputArgs: TValueArray; aResult: TValue);
  40. procedure DoProcVarInvoke(aInst: TObject; aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs, aOutputArgs: TValueArray; aResult: TValue);overload;
  41. procedure DoProcVarInvoke(aInst: TObject; aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; aData : TProcArgs);overload;
  42. procedure DoProcInvoke(aInst: TObject; aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; aData : TProcArgs); overload;
  43. procedure DoProcInvoke(aInst: TObject; aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; aInputArgs, aOutputArgs: TValueArray; aResult: TValue);overload;
  44. procedure DoUntypedInvoke(aInst: TObject; aProc: CodePointer; aMethod: TMethod; aTypeInfo: PTypeInfo; aData : TProcArgs); overload;
  45. procedure DoUntypedInvoke(aInst: TObject; aProc: CodePointer; aMethod: TMethod; aTypeInfo: PTypeInfo; aInputArgs, aOutputArgs: TValueArray; aResult: TValue); overload;
  46. function GetRecValue(aTypeInfo : PTypeInfo; aSize : integer; aReverse: Boolean): TValue;
  47. end;
  48. { TTestInvoke }
  49. TTestInvoke = class(TTestInvokeBase)
  50. private
  51. published
  52. procedure TestShortString;
  53. procedure TestAnsiString;
  54. procedure TestWideString;
  55. procedure TestUnicodeString;
  56. procedure TestVariant;
  57. procedure TestLongInt;
  58. procedure TestInt64;
  59. procedure TestIntfVariant;
  60. procedure TestTObject;
  61. procedure TestCasts;
  62. procedure TestClassConstructor;
  63. procedure TestInheritedClassConstructor;
  64. procedure TestClassProperty;
  65. procedure TestIndexedProperty;
  66. end;
  67. { TTestInvokeIntfMethods }
  68. TTestInvokeIntfMethods = class(TTestInvokeBase)
  69. Published
  70. Procedure Test1;
  71. Procedure Test2;
  72. Procedure Test3;
  73. Procedure Test4;
  74. Procedure Test5;
  75. Procedure Test6;
  76. Procedure Test7;
  77. Procedure Test8;
  78. Procedure Test9;
  79. Procedure Test10;
  80. Procedure Test11;
  81. Procedure Test12;
  82. Procedure Test13;
  83. Procedure Test14;
  84. Procedure Test15;
  85. Procedure Test16;
  86. Procedure Test17;
  87. Procedure Test18;
  88. Procedure Test19;
  89. Procedure Test20;
  90. Procedure Test21;
  91. Procedure Test22;
  92. end;
  93. { TTestInvokeIntfMethodsRecs }
  94. TTestInvokeIntfMethodsRecs = class(TTestInvokeBase)
  95. Published
  96. Procedure Test1;
  97. Procedure Test2;
  98. Procedure Test3;
  99. Procedure Test4;
  100. Procedure Test5;
  101. Procedure Test6;
  102. Procedure Test7;
  103. Procedure Test8;
  104. Procedure Test9;
  105. Procedure Test10;
  106. end;
  107. { TTestInvokeMethodVars }
  108. TTestInvokeMethodTests = class(TTestInvokeBase)
  109. protected
  110. cls: TTestInterfaceClass;
  111. procedure DoProcVarInvoke(aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs, aOutputArgs: TValueArray; aResult: TValue); overload;
  112. procedure DoProcInvoke(aProc: CodePointer; aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs, aOutputArgs: TValueArray; aResult: TValue); overload;
  113. procedure DoUntypedInvoke(aProc: CodePointer; aMethod: TMethod; aTypeInfo: PTypeInfo; const aInputArgs, aOutputArgs: TValueArray); overload;
  114. Public
  115. Procedure SetUp; override;
  116. Procedure TearDown; override;
  117. end;
  118. TTestInvokeMethodVars = class(TTestInvokeMethodTests)
  119. Published
  120. Procedure Test1;
  121. Procedure Test2;
  122. Procedure Test3;
  123. Procedure Test4;
  124. Procedure Test5;
  125. Procedure Test6;
  126. Procedure Test7;
  127. Procedure Test8;
  128. Procedure Test9;
  129. Procedure Test10;
  130. Procedure Test11;
  131. Procedure Test12;
  132. Procedure Test13;
  133. Procedure Test14;
  134. Procedure Test15;
  135. Procedure Test16;
  136. Procedure Test17;
  137. Procedure Test18;
  138. Procedure Test19;
  139. Procedure Test20;
  140. Procedure Test21;
  141. Procedure Test22;
  142. end;
  143. { TTestInvokeMethodVarsRecs }
  144. TTestInvokeMethodVarsRecs = class(TTestInvokeMethodTests)
  145. Published
  146. Procedure Test1;
  147. Procedure Test2;
  148. Procedure Test3;
  149. Procedure Test4;
  150. Procedure Test5;
  151. Procedure Test6;
  152. Procedure Test7;
  153. Procedure Test8;
  154. Procedure Test9;
  155. Procedure Test10;
  156. end;
  157. { TTestInvokeProcVars }
  158. TTestInvokeProcVars = class(TTestInvokeMethodTests)
  159. Published
  160. Procedure Test1;
  161. Procedure Test2;
  162. Procedure Test3;
  163. Procedure Test4;
  164. Procedure Test5;
  165. Procedure Test6;
  166. Procedure Test7;
  167. Procedure Test8;
  168. Procedure Test9;
  169. Procedure Test10;
  170. Procedure Test11;
  171. Procedure Test12;
  172. Procedure Test13;
  173. Procedure Test14;
  174. Procedure Test15;
  175. Procedure Test16;
  176. Procedure Test17;
  177. Procedure Test18;
  178. Procedure Test19;
  179. Procedure Test20;
  180. Procedure Test21;
  181. Procedure Test22;
  182. end;
  183. { TTestInvokeProcVarRecs }
  184. TTestInvokeProcVarRecs = class(TTestInvokeMethodTests)
  185. Published
  186. Procedure Test1;
  187. Procedure Test2;
  188. Procedure Test3;
  189. Procedure Test4;
  190. Procedure Test5;
  191. Procedure Test6;
  192. Procedure Test7;
  193. Procedure Test8;
  194. Procedure Test9;
  195. Procedure Test10;
  196. end;
  197. { TTestInvokeTestProc }
  198. TTestInvokeTestProc = Class(TTestInvokeMethodTests)
  199. Published
  200. Procedure Test1;
  201. Procedure Test2;
  202. Procedure Test3;
  203. Procedure Test4;
  204. Procedure Test5;
  205. Procedure Test6;
  206. Procedure Test7;
  207. Procedure Test8;
  208. {$ifdef NEEDS_POINTER_HELPER}
  209. Procedure Test9;
  210. Procedure Test10;
  211. Procedure Test11;
  212. Procedure Test12;
  213. Procedure Test13;
  214. Procedure Test14;
  215. Procedure Test15;
  216. Procedure Test16;
  217. Procedure Test17;
  218. {$ENDIF}
  219. Procedure Test18;
  220. Procedure Test19;
  221. Procedure Test20;
  222. Procedure Test21;
  223. Procedure Test22;
  224. end;
  225. { TTestInvokeTestProcRecs }
  226. TTestInvokeTestProcRecs = Class(TTestInvokeMethodTests)
  227. Published
  228. Procedure Test1;
  229. Procedure Test2;
  230. Procedure Test3;
  231. Procedure Test4;
  232. Procedure Test5;
  233. Procedure Test6;
  234. Procedure Test7;
  235. Procedure Test8;
  236. Procedure Test9;
  237. Procedure Test10;
  238. end;
  239. { TTestInvokeUntyped }
  240. TTestInvokeUntyped = Class(TTestInvokeMethodTests)
  241. Published
  242. Procedure Test1;
  243. Procedure Test2;
  244. Procedure Test3;
  245. Procedure Test4;
  246. Procedure Test5;
  247. Procedure Test6;
  248. Procedure Test7;
  249. Procedure Test8;
  250. Procedure Test9;
  251. end;
  252. { TTestInvokeInstanceMethods }
  253. TTestInvokeInstanceMethods = Class(TTestInvokeBase)
  254. private
  255. Fctx: TRttiContext;
  256. function CreateClass(C: TClass): TObject;
  257. Protected
  258. procedure SetUp; override;
  259. procedure TearDown; override;
  260. Published
  261. Procedure TestInvokeConstructor;
  262. end;
  263. { TTestRecordMethodInvoke }
  264. TTestRecordMethodInvoke = class(TTestInvokeBase)
  265. private
  266. Fctx: TRttiContext;
  267. recType : TRttitype;
  268. testRec, testRec2: TTestAttr2Record;
  269. tv_rec : TValue;
  270. Protected
  271. procedure SetUp; override;
  272. procedure TearDown; override;
  273. Published
  274. Procedure TestCreate;
  275. procedure TestCreate2;
  276. procedure TestCreate3;
  277. procedure TestCreate4;
  278. procedure TestOffset1;
  279. procedure TestOffset2;
  280. procedure TestStaticFunc;
  281. end;
  282. implementation
  283. { ----------------------------------------------------------------------
  284. Auxiliary methods to test
  285. ----------------------------------------------------------------------}
  286. procedure ProcTest1;
  287. begin
  288. TTestInterfaceClass.ProcVarInst.Test1;
  289. end;
  290. function ProcTest2: SizeInt;
  291. begin
  292. Result := TTestInterfaceClass.ProcVarInst.Test2;
  293. end;
  294. function ProcTest3(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: SizeInt): SizeInt;
  295. begin
  296. Result := TTestInterfaceClass.ProcVarInst.Test3(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  297. end;
  298. procedure ProcTest4(aArg1: AnsiString; aArg2: UnicodeString; aArg3: WideString; aArg4: ShortString);
  299. begin
  300. TTestInterfaceClass.ProcVarInst.Test4(aArg1, aArg2, aArg3, aArg4);
  301. end;
  302. function ProcTest5: AnsiString;
  303. begin
  304. Result := TTestInterfaceClass.ProcVarInst.Test5;
  305. end;
  306. function ProcTest6: UnicodeString;
  307. begin
  308. Result := TTestInterfaceClass.ProcVarInst.Test6;
  309. end;
  310. function ProcTest7: WideString;
  311. begin
  312. Result := TTestInterfaceClass.ProcVarInst.Test7;
  313. end;
  314. function ProcTest8: ShortString;
  315. begin
  316. Result := TTestInterfaceClass.ProcVarInst.Test8;
  317. end;
  318. procedure ProcTest9(aArg1: SizeInt; var aArg2: SizeInt; out aArg3: SizeInt; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: SizeInt);
  319. begin
  320. TTestInterfaceClass.ProcVarInst.Test9(aArg1, aArg2, aArg3, aArg4);
  321. end;
  322. procedure ProcTest10(aArg1: AnsiString; var aArg2: AnsiString; out aArg3: AnsiString; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: AnsiString);
  323. begin
  324. TTestInterfaceClass.ProcVarInst.Test10(aArg1, aArg2, aArg3, aArg4);
  325. end;
  326. procedure ProcTest11(aArg1: ShortString; var aArg2: ShortString; out aArg3: ShortString; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: ShortString);
  327. begin
  328. TTestInterfaceClass.ProcVarInst.Test11(aArg1, aArg2, aArg3, aArg4);
  329. end;
  330. procedure ProcTest12(aArg1: array of SizeInt; var aArg2: array of SizeInt; out aArg3: array of SizeInt; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: array of SizeInt);
  331. begin
  332. TTestInterfaceClass.ProcVarInst.Test12(aArg1, aArg2, aArg3, aArg4);
  333. end;
  334. function ProcTest13(aArg1: Single; var aArg2: Single; out aArg3: Single; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: Single): Single;
  335. begin
  336. Result := TTestInterfaceClass.ProcVarInst.Test13(aArg1, aArg2, aArg3, aArg4);
  337. end;
  338. function ProcTest14(aArg1: Double; var aArg2: Double; out aArg3: Double; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: Double): Double;
  339. begin
  340. Result := TTestInterfaceClass.ProcVarInst.Test14(aArg1, aArg2, aArg3, aArg4);
  341. end;
  342. function ProcTest15(aArg1: Extended; var aArg2: Extended; out aArg3: Extended; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: Extended): Extended;
  343. begin
  344. Result := TTestInterfaceClass.ProcVarInst.Test15(aArg1, aArg2, aArg3, aArg4);
  345. end;
  346. function ProcTest16(aArg1: Comp; var aArg2: Comp; out aArg3: Comp; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: Comp): Comp;
  347. begin
  348. Result := TTestInterfaceClass.ProcVarInst.Test16(aArg1, aArg2, aArg3, aArg4);
  349. end;
  350. function ProcTest17(aArg1: Currency; var aArg2: Currency; out aArg3: Currency; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4: Currency): Currency;
  351. begin
  352. Result := TTestInterfaceClass.ProcVarInst.Test17(aArg1, aArg2, aArg3, aArg4);
  353. end;
  354. function ProcTest18(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: Single): Single;
  355. begin
  356. Result := TTestInterfaceClass.ProcVarInst.Test18(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  357. end;
  358. function ProcTest19(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: Double): Double;
  359. begin
  360. Result := TTestInterfaceClass.ProcVarInst.Test19(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  361. end;
  362. function ProcTest20(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: Extended): Extended;
  363. begin
  364. Result := TTestInterfaceClass.ProcVarInst.Test20(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  365. end;
  366. function ProcTest21(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: Comp): Comp;
  367. begin
  368. Result := TTestInterfaceClass.ProcVarInst.Test21(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  369. end;
  370. function ProcTest22(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10: Currency): Currency;
  371. begin
  372. Result := TTestInterfaceClass.ProcVarInst.Test22(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6, aArg7, aArg8, aArg9, aArg10);
  373. end;
  374. function ProcTestRecSize1(aArg1: TTestRecord1): TTestRecord1;
  375. begin
  376. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize1(aArg1);
  377. end;
  378. function ProcTestRecSize2(aArg1: TTestRecord2): TTestRecord2;
  379. begin
  380. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize2(aArg1);
  381. end;
  382. function ProcTestRecSize3(aArg1: TTestRecord3): TTestRecord3;
  383. begin
  384. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize3(aArg1);
  385. end;
  386. function ProcTestRecSize4(aArg1: TTestRecord4): TTestRecord4;
  387. begin
  388. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize4(aArg1);
  389. end;
  390. function ProcTestRecSize5(aArg1: TTestRecord5): TTestRecord5;
  391. begin
  392. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize5(aArg1);
  393. end;
  394. function ProcTestRecSize6(aArg1: TTestRecord6): TTestRecord6;
  395. begin
  396. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize6(aArg1);
  397. end;
  398. function ProcTestRecSize7(aArg1: TTestRecord7): TTestRecord7;
  399. begin
  400. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize7(aArg1);
  401. end;
  402. function ProcTestRecSize8(aArg1: TTestRecord8): TTestRecord8;
  403. begin
  404. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize8(aArg1);
  405. end;
  406. function ProcTestRecSize9(aArg1: TTestRecord9): TTestRecord9;
  407. begin
  408. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize9(aArg1);
  409. end;
  410. function ProcTestRecSize10(aArg1: TTestRecord10): TTestRecord10;
  411. begin
  412. Result := TTestInterfaceClass.ProcVarRecInst.TestRecSize10(aArg1);
  413. end;
  414. procedure ProcTestUntyped(var aArg1; out aArg2; const aArg3; {$ifdef fpc}constref{$else}const [ref]{$endif} aArg4);
  415. begin
  416. TTestInterfaceClass.ProcVarInst.TestUntyped(aArg1, aArg2, aArg3, aArg4);
  417. end;
  418. // Shortstring parameters
  419. function TestShortStringRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: ShortString): ShortString; register;
  420. begin
  421. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  422. end;
  423. function TestShortStringCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: ShortString): ShortString; cdecl;
  424. begin
  425. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  426. end;
  427. function TestShortStringStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: ShortString): ShortString; stdcall;
  428. begin
  429. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  430. end;
  431. function TestShortStringPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: ShortString): ShortString; pascal;
  432. begin
  433. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  434. end;
  435. // Ansistring parameters
  436. function TestAnsiStringRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: AnsiString): AnsiString; register;
  437. begin
  438. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  439. end;
  440. function TestAnsiStringCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: AnsiString): AnsiString; cdecl;
  441. begin
  442. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  443. end;
  444. function TestAnsiStringStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: AnsiString): AnsiString; stdcall;
  445. begin
  446. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  447. end;
  448. function TestAnsiStringPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: AnsiString): AnsiString; pascal;
  449. begin
  450. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  451. end;
  452. // Widestring parameters
  453. function TestWideStringRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: WideString): WideString; register;
  454. begin
  455. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  456. end;
  457. function TestWideStringCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: WideString): WideString; cdecl;
  458. begin
  459. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  460. end;
  461. function TestWideStringStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: WideString): WideString; stdcall;
  462. begin
  463. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  464. end;
  465. function TestWideStringPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: WideString): WideString; pascal;
  466. begin
  467. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  468. end;
  469. // Unicode parameters
  470. function TestUnicodeStringRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: UnicodeString): UnicodeString; register;
  471. begin
  472. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  473. end;
  474. function TestUnicodeStringCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: UnicodeString): UnicodeString; cdecl;
  475. begin
  476. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  477. end;
  478. function TestUnicodeStringStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: UnicodeString): UnicodeString; stdcall;
  479. begin
  480. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  481. end;
  482. function TestUnicodeStringPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: UnicodeString): UnicodeString; pascal;
  483. begin
  484. Result := aArg1 + aArg2 + aArg3 + aArg4 + aArg5 + aArg6;
  485. end;
  486. // Longint parameters
  487. function TestLongIntRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: LongInt): LongInt; register;
  488. begin
  489. Result := aArg1 + aArg2 * 10 + aArg3 * 100 + aArg4 * 1000 + aArg5 * 10000 + aArg6 * 100000;
  490. end;
  491. function TestLongIntCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: LongInt): LongInt; cdecl;
  492. begin
  493. Result := aArg1 + aArg2 * 10 + aArg3 * 100 + aArg4 * 1000 + aArg5 * 10000 + aArg6 * 100000;
  494. end;
  495. function TestLongIntStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: LongInt): LongInt; stdcall;
  496. begin
  497. Result := aArg1 + aArg2 * 10 + aArg3 * 100 + aArg4 * 1000 + aArg5 * 10000 + aArg6 * 100000;
  498. end;
  499. function TestLongIntPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: LongInt): LongInt; pascal;
  500. begin
  501. Result := aArg1 + aArg2 * 10 + aArg3 * 100 + aArg4 * 1000 + aArg5 * 10000 + aArg6 * 100000;
  502. end;
  503. // class parameters
  504. type
  505. TTestClass = class
  506. fString: String;
  507. fValue: LongInt;
  508. end;
  509. function TestTTestClassRegister(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: TTestClass): TTestClass; register;
  510. begin
  511. Result := TTestClass.Create;
  512. Result.fString := aArg1.fString + aArg2.fString + aArg3.fString + aArg4.fString + aArg5.fString + aArg6.fString;
  513. Result.fValue := aArg1.fValue + aArg2.fValue * 10 + aArg3.fValue * 100 + aArg4.fValue * 1000 + aArg5.fValue * 10000 + aArg6.fValue * 100000;
  514. end;
  515. function TestTTestClassCdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: TTestClass): TTestClass; cdecl;
  516. begin
  517. Result := TTestClass.Create;
  518. Result.fString := aArg1.fString + aArg2.fString + aArg3.fString + aArg4.fString + aArg5.fString + aArg6.fString;
  519. Result.fValue := aArg1.fValue + aArg2.fValue * 10 + aArg3.fValue * 100 + aArg4.fValue * 1000 + aArg5.fValue * 10000 + aArg6.fValue * 100000;
  520. end;
  521. function TestTTestClassStdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: TTestClass): TTestClass; stdcall;
  522. begin
  523. Result := TTestClass.Create;
  524. Result.fString := aArg1.fString + aArg2.fString + aArg3.fString + aArg4.fString + aArg5.fString + aArg6.fString;
  525. Result.fValue := aArg1.fValue + aArg2.fValue * 10 + aArg3.fValue * 100 + aArg4.fValue * 1000 + aArg5.fValue * 10000 + aArg6.fValue * 100000;
  526. end;
  527. function TestTTestClassPascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: TTestClass): TTestClass; pascal;
  528. begin
  529. Result := TTestClass.Create;
  530. Result.fString := aArg1.fString + aArg2.fString + aArg3.fString + aArg4.fString + aArg5.fString + aArg6.fString;
  531. Result.fValue := aArg1.fValue + aArg2.fValue * 10 + aArg3.fValue * 100 + aArg4.fValue * 1000 + aArg5.fValue * 10000 + aArg6.fValue * 100000;
  532. end;
  533. // Variant parameters
  534. function TestVariantRegister(aArg1 : variant): string; register;
  535. begin
  536. Result:=aArg1;
  537. end;
  538. function TestVariantCdecl(aArg1 : variant): string; cdecl;
  539. begin
  540. Result:=aArg1;
  541. end;
  542. function TestVariantPascal(aArg1 : variant): string; pascal;
  543. begin
  544. Result:=aArg1;
  545. end;
  546. // Int64 parameters
  547. function TestInt64Register(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: Int64): Int64; register;
  548. begin
  549. Result := aArg1 + aArg2 * 100 + aArg3 * 10000 + aArg4 * 1000000 + aArg5 * 100000000 + aArg6 * 10000000000;
  550. end;
  551. function TestInt64Cdecl(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: Int64): Int64; cdecl;
  552. begin
  553. Result := aArg1 + aArg2 * 100 + aArg3 * 10000 + aArg4 * 1000000 + aArg5 * 100000000 + aArg6 * 10000000000;
  554. end;
  555. function TestInt64StdCall(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: Int64): Int64; stdcall;
  556. begin
  557. Result := aArg1 + aArg2 * 100 + aArg3 * 10000 + aArg4 * 1000000 + aArg5 * 100000000 + aArg6 * 10000000000;
  558. end;
  559. function TestInt64Pascal(aArg1, aArg2, aArg3, aArg4, aArg5, aArg6: Int64): Int64; pascal;
  560. begin
  561. Result := aArg1 + aArg2 * 100 + aArg3 * 10000 + aArg4 * 1000000 + aArg5 * 100000000 + aArg6 * 10000000000;
  562. end;
  563. { ----------------------------------------------------------------------
  564. TTestInvokeBase
  565. ----------------------------------------------------------------------}
  566. function TTestInvokeBase.DoInvoke(aCodeAddress: CodePointer; aArgs: TValueArray;
  567. aCallConv: TCallConv; aResultType: PTypeInfo; aFlags: TInvokeFlags; out aValid: Boolean): TValue;
  568. begin
  569. try
  570. Result := Rtti.Invoke(aCodeAddress, aArgs, aCallConv, aResultType, ifStatic in aFlags, ifConstructor in aFlags);
  571. aValid := True;
  572. except
  573. on e: ENotImplemented do begin
  574. Status('Ignoring unimplemented functionality of test');
  575. aValid := False;
  576. end else
  577. raise;
  578. end;
  579. end;
  580. procedure TTestInvokeBase.DoStaticInvokeTestOrdinalCompare(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; aResult: Int64);
  581. var
  582. resval: TValue;
  583. valid: Boolean;
  584. begin
  585. resval := DoInvoke(aAddress, aValues, aCallConv, aReturnType, [ifStatic], valid);
  586. if valid and Assigned(aReturnType) and (resval.AsOrdinal <> aResult) then begin
  587. Fail('Result of test "%s" is unexpected; expected: %s, got: %s', [aTestName, IntToStr(aResult), IntToStr(resval.AsOrdinal)]);
  588. end;
  589. end;
  590. procedure TTestInvokeBase.DoStaticInvokeTestVariant(const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv; aValues: TValueArray; aReturnType: PTypeInfo; aResult: String);
  591. var
  592. resval: TValue;
  593. valid: Boolean;
  594. begin
  595. resval := DoInvoke(aAddress, aValues, aCallConv, aReturnType, [ifStatic], valid);
  596. if valid and (resval.AsAnsiString <> aResult) then begin
  597. Fail('Result of test "%s" is unexpected; expected: %s, got: %s', [aTestName, aResult, String(resval.AsAnsiString)]);
  598. end;
  599. end;
  600. procedure TTestInvokeBase.DoStaticInvokeTestAnsiStringCompare(
  601. const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv;
  602. aValues: TValueArray; aReturnType: PTypeInfo; constref aResult: AnsiString);
  603. var
  604. resval: TValue;
  605. valid: Boolean;
  606. begin
  607. resval := DoInvoke(aAddress, aValues, aCallConv, aReturnType, [ifStatic], valid);
  608. if valid and Assigned(aReturnType) and (resval.AsAnsiString <> aResult) then begin
  609. Fail('Result of test "%s" is unexpected; expected: "%s", got: "%s"', [aTestName, aResult, resval.AsString]);
  610. end;
  611. end;
  612. procedure TTestInvokeBase.DoStaticInvokeTestUnicodeStringCompare(
  613. const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv;
  614. aValues: TValueArray; aReturnType: PTypeInfo; constref aResult: UnicodeString
  615. );
  616. var
  617. resval: TValue;
  618. valid: Boolean;
  619. begin
  620. resval := DoInvoke(aAddress, aValues, aCallConv, aReturnType, [ifStatic], valid);
  621. if valid and Assigned(aReturnType) and (resval.AsUnicodeString <> aResult) then begin
  622. Fail('Result of test "%s" is unexpected; expected: "%s", got: "%s"', [aTestName, aResult, resval.AsString]);
  623. end;
  624. end;
  625. procedure TTestInvokeBase.DoIntfInvoke(aIndex: SizeInt; aInputArgs,
  626. aOutputArgs: TValueArray; aResult: TValue);
  627. var
  628. cls: TTestInterfaceClass;
  629. intf: ITestInterface;
  630. name: String;
  631. context: TRttiContext;
  632. t: TRttiType;
  633. inst, res: TValue;
  634. method: TRttiMethod;
  635. i: SizeInt;
  636. input: array of TValue;
  637. begin
  638. input:=Nil;
  639. cls := TTestInterfaceClass.Create;
  640. intf := cls;
  641. TValue.Make(@intf, TypeInfo(intf), inst);
  642. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then
  643. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker)
  644. else
  645. name := 'Test' + IntToStr(aIndex);
  646. context := TRttiContext.Create;
  647. try
  648. t := context.GetType(TypeInfo(ITestInterface));
  649. method := t.GetMethod(name);
  650. Check(Assigned(method), 'Method not found: ' + name);
  651. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  652. IValueData of managed types) }
  653. SetLength(input, Length(aInputArgs));
  654. for i := 0 to High(input) do
  655. input[i] := CopyValue(aInputArgs[i]);
  656. try
  657. res := method.Invoke(inst, aInputArgs);
  658. except
  659. DumpExceptionBacktrace(output);
  660. raise;
  661. end;
  662. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  663. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  664. Check(EqualValues(aResult, res), 'Expected result value differs from returned for ' + name);
  665. CheckEquals(Length(aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  666. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  667. CheckEquals(Length(aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  668. for i := 0 to High(aInputArgs) do begin
  669. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  670. end;
  671. for i := 0 to High(aOutputArgs) do begin
  672. Check(EqualValues(aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  673. Check(EqualValues(aOutputArgs[i], aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  674. end;
  675. finally
  676. context.Free;
  677. end;
  678. end;
  679. procedure TTestInvokeBase.DoMethodInvoke(aInst: TObject; aMethod: TMethod;
  680. aTypeInfo: PTypeInfo; aIndex: SizeInt; aInputArgs, aOutputArgs: TValueArray; aResult: TValue);
  681. var
  682. cls: TTestInterfaceClass;
  683. name: String;
  684. context: TRttiContext;
  685. t: TRttiType;
  686. callable, res: TValue;
  687. method: TRttiMethodType;
  688. i: SizeInt;
  689. input: array of TValue;
  690. begin
  691. input:=Nil;
  692. cls := aInst as TTestInterfaceClass;
  693. cls.Reset;
  694. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then
  695. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker)
  696. else
  697. name := 'Test' + IntToStr(aIndex);
  698. TValue.Make(@aMethod, aTypeInfo, callable);
  699. context := TRttiContext.Create;
  700. try
  701. t := context.GetType(aTypeInfo);
  702. Check(t is TRttiMethodType, 'Not a method variable: ' + aTypeInfo^.Name);
  703. method := t as TRttiMethodType;
  704. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  705. IValueData of managed types) }
  706. SetLength(input, Length(aInputArgs));
  707. for i := 0 to High(input) do
  708. input[i] := CopyValue(aInputArgs[i]);
  709. res := method.Invoke(callable, aInputArgs);
  710. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  711. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  712. Check(EqualValues(aResult, res), 'Expected result value differs from returned for ' + name);
  713. CheckEquals(Length(aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  714. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  715. CheckEquals(Length(aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  716. for i := 0 to High(aInputArgs) do begin
  717. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  718. end;
  719. for i := 0 to High(aOutputArgs) do begin
  720. Check(EqualValues(aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  721. Check(EqualValues(aOutputArgs[i], aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  722. end;
  723. finally
  724. context.Free;
  725. end;
  726. end;
  727. procedure TTestInvokeBase.DoProcVarInvoke(aInst: TObject; aProc: CodePointer;
  728. aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs, aOutputArgs: TValueArray; aResult: TValue);
  729. var
  730. cls: TTestInterfaceClass;
  731. name: String;
  732. context: TRttiContext;
  733. t: TRttiType;
  734. callable, res: TValue;
  735. proc: TRttiProcedureType;
  736. i: SizeInt;
  737. input: array of TValue;
  738. begin
  739. input:=Nil;
  740. cls := aInst as TTestInterfaceClass;
  741. cls.Reset;
  742. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then begin
  743. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker);
  744. TTestInterfaceClass.ProcVarRecInst := cls;
  745. end else begin
  746. name := 'Test' + IntToStr(aIndex);
  747. TTestInterfaceClass.ProcVarInst := cls;
  748. end;
  749. TValue.Make(@aProc, aTypeInfo, callable);
  750. context := TRttiContext.Create;
  751. try
  752. t := context.GetType(aTypeInfo);
  753. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  754. proc := t as TRttiProcedureType;
  755. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  756. IValueData of managed types) }
  757. SetLength(input, Length(aInputArgs));
  758. for i := 0 to High(input) do
  759. input[i] := CopyValue(aInputArgs[i]);
  760. res := proc.Invoke(callable, aInputArgs);
  761. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  762. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  763. Check(EqualValues(aResult, res), 'Expected result value differs from returned for ' + name);
  764. CheckEquals(Length(aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  765. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  766. CheckEquals(Length(aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  767. for i := 0 to High(aInputArgs) do begin
  768. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  769. end;
  770. for i := 0 to High(aOutputArgs) do begin
  771. Check(EqualValues(aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  772. Check(EqualValues(aOutputArgs[i], aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  773. end;
  774. finally
  775. context.Free;
  776. end;
  777. end;
  778. procedure TTestInvokeBase.DoProcVarInvoke(aInst: TObject; aProc: CodePointer;
  779. aTypeInfo: PTypeInfo; aIndex: SizeInt; aData: TProcArgs);
  780. var
  781. cls: TTestInterfaceClass;
  782. name: String;
  783. context: TRttiContext;
  784. t: TRttiType;
  785. callable, res: TValue;
  786. proc: TRttiProcedureType;
  787. i: SizeInt;
  788. input: array of TValue;
  789. begin
  790. input:=Nil;
  791. cls := aInst as TTestInterfaceClass;
  792. cls.Reset;
  793. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then begin
  794. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker);
  795. TTestInterfaceClass.ProcVarRecInst := cls;
  796. end else begin
  797. name := 'Test' + IntToStr(aIndex);
  798. TTestInterfaceClass.ProcVarInst := cls;
  799. end;
  800. TValue.Make(@aProc, aTypeInfo, callable);
  801. context := TRttiContext.Create;
  802. try
  803. t := context.GetType(aTypeInfo);
  804. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  805. proc := t as TRttiProcedureType;
  806. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  807. IValueData of managed types) }
  808. SetLength(input, Length(aData.aInputArgs));
  809. for i := 0 to High(input) do
  810. input[i] := CopyValue(aData.aInputArgs[i]);
  811. res := proc.Invoke(callable, aData.aInputArgs);
  812. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  813. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  814. Check(EqualValues(aData.aResult, res), 'Expected result value differs from returned for ' + name);
  815. CheckEquals(Length(aData.aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  816. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  817. CheckEquals(Length(aData.aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  818. for i := 0 to High(aData.aInputArgs) do begin
  819. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  820. end;
  821. for i := 0 to High(aData.aOutputArgs) do begin
  822. Check(EqualValues(aData.aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  823. Check(EqualValues(aData.aOutputArgs[i], aData.aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  824. end;
  825. finally
  826. context.Free;
  827. end;
  828. end;
  829. procedure TTestInvokeBase.DoProcInvoke(aInst: TObject; aProc: CodePointer;
  830. aTypeInfo: PTypeInfo; aIndex: SizeInt; aInputArgs, aOutputArgs: TValueArray;
  831. aResult: TValue);
  832. var
  833. cls: TTestInterfaceClass;
  834. name: String;
  835. context: TRttiContext;
  836. t: TRttiType;
  837. callable, res: TValue;
  838. proc: TRttiProcedureType;
  839. i: SizeInt;
  840. input: array of TValue;
  841. restype: PTypeInfo;
  842. begin
  843. input:=Nil;
  844. cls := aInst as TTestInterfaceClass;
  845. cls.Reset;
  846. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then begin
  847. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker);
  848. TTestInterfaceClass.ProcVarRecInst := cls;
  849. end else begin
  850. name := 'Test' + IntToStr(aIndex);
  851. TTestInterfaceClass.ProcVarInst := cls;
  852. end;
  853. TValue.Make(@aProc, aTypeInfo, callable);
  854. context := TRttiContext.Create;
  855. try
  856. t := context.GetType(aTypeInfo);
  857. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  858. proc := t as TRttiProcedureType;
  859. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  860. IValueData of managed types) }
  861. SetLength(input, Length(aInputArgs));
  862. for i := 0 to High(input) do
  863. input[i] := CopyValue(aInputArgs[i]);
  864. if Assigned(proc.ReturnType) then
  865. restype := PTypeInfo(proc.ReturnType.Handle)
  866. else
  867. restype := Nil;
  868. res := Rtti.Invoke(aProc, aInputArgs, proc.CallingConvention, restype, True, False);
  869. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  870. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  871. Check(EqualValues(aResult, res), 'Expected result value differs from returned for ' + name);
  872. CheckEquals(Length(aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  873. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  874. CheckEquals(Length(aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  875. for i := 0 to High(aInputArgs) do begin
  876. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  877. end;
  878. for i := 0 to High(aOutputArgs) do begin
  879. Check(EqualValues(aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  880. Check(EqualValues(aOutputArgs[i], aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  881. end;
  882. finally
  883. context.Free;
  884. end;
  885. end;
  886. procedure TTestInvokeBase.DoProcInvoke(aInst: TObject; aProc: CodePointer;
  887. aTypeInfo: PTypeInfo; aIndex: SizeInt; aData : TProcArgs);
  888. var
  889. cls: TTestInterfaceClass;
  890. name: String;
  891. context: TRttiContext;
  892. t: TRttiType;
  893. callable, res: TValue;
  894. proc: TRttiProcedureType;
  895. i: SizeInt;
  896. input: array of TValue;
  897. restype: PTypeInfo;
  898. begin
  899. input:=Nil;
  900. cls := aInst as TTestInterfaceClass;
  901. cls.Reset;
  902. if aIndex and TTestInterfaceClass.RecSizeMarker <> 0 then begin
  903. name := 'TestRecSize' + IntToStr(aIndex and not TTestInterfaceClass.RecSizeMarker);
  904. TTestInterfaceClass.ProcVarRecInst := cls;
  905. end else begin
  906. name := 'Test' + IntToStr(aIndex);
  907. TTestInterfaceClass.ProcVarInst := cls;
  908. end;
  909. TValue.Make(@aProc, aTypeInfo, callable);
  910. context := TRttiContext.Create;
  911. try
  912. t := context.GetType(aTypeInfo);
  913. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  914. proc := t as TRttiProcedureType;
  915. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  916. IValueData of managed types) }
  917. SetLength(input, Length(aData.aInputArgs));
  918. for i := 0 to High(input) do
  919. input[i] := CopyValue(aData.aInputArgs[i]);
  920. if Assigned(proc.ReturnType) then
  921. restype := PTypeInfo(proc.ReturnType.Handle)
  922. else
  923. restype := Nil;
  924. res := Rtti.Invoke(aProc, aData.aInputArgs, proc.CallingConvention, restype, True, False);
  925. CheckEquals(aIndex, cls.CalledMethod, 'Wrong method called for ' + name);
  926. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  927. Check(EqualValues(aData.aResult, res), 'Expected result value differs from returned for ' + name);
  928. CheckEquals(Length(aData.aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  929. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  930. CheckEquals(Length(aData.aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  931. for i := 0 to High(aData.aInputArgs) do begin
  932. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  933. end;
  934. for i := 0 to High(aData.aOutputArgs) do begin
  935. Check(EqualValues(aData.aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  936. Check(EqualValues(aData.aOutputArgs[i], aData.aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  937. end;
  938. finally
  939. context.Free;
  940. end;
  941. end;
  942. procedure TTestInvokeBase.DoUntypedInvoke(aInst: TObject; aProc: CodePointer;
  943. aMethod: TMethod; aTypeInfo: PTypeInfo; aInputArgs, aOutputArgs: TValueArray;
  944. aResult: TValue);
  945. var
  946. cls: TTestInterfaceClass;
  947. intf: ITestInterface;
  948. name: String;
  949. context: TRttiContext;
  950. t: TRttiType;
  951. callable, res: TValue;
  952. proc: TRttiInvokableType;
  953. method: TRttiMethod;
  954. i: SizeInt;
  955. input: array of TValue;
  956. begin
  957. input:=Nil;
  958. cls := aInst as TTestInterfaceClass;
  959. cls.Reset;
  960. name := 'TestUntyped';
  961. TTestInterfaceClass.ProcVarInst := cls;
  962. context := TRttiContext.Create;
  963. try
  964. method := Nil;
  965. proc := Nil;
  966. if Assigned(aProc) then begin
  967. TValue.Make(@aProc, aTypeInfo, callable);
  968. t := context.GetType(aTypeInfo);
  969. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  970. proc := t as TRttiProcedureType;
  971. end else if Assigned(aMethod.Code) then begin
  972. TValue.Make(@aMethod, aTypeInfo, callable);
  973. t := context.GetType(aTypeInfo);
  974. Check(t is TRttiMethodType, 'Not a method variable: ' + aTypeInfo^.Name);
  975. proc := t as TRttiMethodType;
  976. end else begin
  977. intf := cls;
  978. TValue.Make(@intf, TypeInfo(intf), callable);
  979. t := context.GetType(TypeInfo(ITestInterface));
  980. method := t.GetMethod(name);
  981. Check(Assigned(method), 'Method not found: ' + name);
  982. end;
  983. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  984. IValueData of managed types) }
  985. SetLength(input, Length(aInputArgs));
  986. SetLength(cls.ExpectedArgs, Length(aInputArgs));
  987. for i := 0 to High(input) do begin
  988. input[i] := CopyValue(aInputArgs[i]);
  989. cls.ExpectedArgs[i] := CopyValue(aInputArgs[i]);
  990. end;
  991. SetLength(cls.OutArgs, Length(aOutputArgs));
  992. for i := 0 to High(cls.OutArgs) do begin
  993. cls.OutArgs[i] := CopyValue(aOutputArgs[i]);
  994. end;
  995. if Assigned(proc) then
  996. res := proc.Invoke(callable, aInputArgs)
  997. else
  998. res := method.Invoke(callable, aInputArgs);
  999. CheckEquals(-1, cls.CalledMethod, 'Wrong method called for ' + name);
  1000. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  1001. Check(EqualValues(aResult, res), 'Expected result value differs from returned for ' + name);
  1002. CheckEquals(Length(aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  1003. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  1004. CheckEquals(Length(aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  1005. for i := 0 to High(aInputArgs) do begin
  1006. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  1007. end;
  1008. for i := 0 to High(aOutputArgs) do begin
  1009. Check(EqualValues(aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  1010. Check(EqualValues(aOutputArgs[i], aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  1011. end;
  1012. finally
  1013. context.Free;
  1014. end;
  1015. end;
  1016. procedure TTestInvokeBase.DoUntypedInvoke(aInst: TObject; aProc: CodePointer;
  1017. aMethod: TMethod; aTypeInfo: PTypeInfo; aData : TProcArgs);
  1018. var
  1019. cls: TTestInterfaceClass;
  1020. intf: ITestInterface;
  1021. name: String;
  1022. context: TRttiContext;
  1023. t: TRttiType;
  1024. callable, res: TValue;
  1025. proc: TRttiInvokableType;
  1026. method: TRttiMethod;
  1027. i: SizeInt;
  1028. input: array of TValue;
  1029. begin
  1030. input:=Nil;
  1031. cls := aInst as TTestInterfaceClass;
  1032. cls.Reset;
  1033. name := 'TestUntyped';
  1034. TTestInterfaceClass.ProcVarInst := cls;
  1035. context := TRttiContext.Create;
  1036. try
  1037. method := Nil;
  1038. proc := Nil;
  1039. if Assigned(aProc) then begin
  1040. TValue.Make(@aProc, aTypeInfo, callable);
  1041. t := context.GetType(aTypeInfo);
  1042. Check(t is TRttiProcedureType, 'Not a procedure variable: ' + aTypeInfo^.Name);
  1043. proc := t as TRttiProcedureType;
  1044. end else if Assigned(aMethod.Code) then begin
  1045. TValue.Make(@aMethod, aTypeInfo, callable);
  1046. t := context.GetType(aTypeInfo);
  1047. Check(t is TRttiMethodType, 'Not a method variable: ' + aTypeInfo^.Name);
  1048. proc := t as TRttiMethodType;
  1049. end else begin
  1050. intf := cls;
  1051. TValue.Make(@intf, TypeInfo(intf), callable);
  1052. t := context.GetType(TypeInfo(ITestInterface));
  1053. method := t.GetMethod(name);
  1054. Check(Assigned(method), 'Method not found: ' + name);
  1055. end;
  1056. { arguments might be modified by Invoke (Note: Copy() does not uniquify the
  1057. IValueData of managed types) }
  1058. SetLength(input, Length(aData.aInputArgs));
  1059. SetLength(cls.ExpectedArgs, Length(aData.aInputArgs));
  1060. for i := 0 to High(input) do begin
  1061. input[i] := CopyValue(aData.aInputArgs[i]);
  1062. cls.ExpectedArgs[i] := CopyValue(aData.aInputArgs[i]);
  1063. end;
  1064. SetLength(cls.OutArgs, Length(aData.aOutputArgs));
  1065. for i := 0 to High(cls.OutArgs) do begin
  1066. cls.OutArgs[i] := CopyValue(aData.aOutputArgs[i]);
  1067. end;
  1068. if Assigned(proc) then
  1069. res := proc.Invoke(callable, aData.aInputArgs)
  1070. else
  1071. res := method.Invoke(callable, aData.aInputArgs);
  1072. CheckEquals(-1, cls.CalledMethod, 'Wrong method called for ' + name);
  1073. Check(EqualValues(cls.ResultValue, res), 'Reported result value differs from returned for ' + name);
  1074. Check(EqualValues(aData.aResult, res), 'Expected result value differs from returned for ' + name);
  1075. CheckEquals(Length(aData.aInputArgs), Length(cls.InputArgs), 'Count of input args differs for ' + name);
  1076. CheckEquals(Length(cls.OutputArgs), Length(cls.InOutMapping), 'Count of output args and in-out-mapping differs for ' + name);
  1077. CheckEquals(Length(aData.aOutputArgs), Length(cls.OutputArgs), 'Count of output args differs for ' + name);
  1078. for i := 0 to High(aData.aInputArgs) do begin
  1079. Check(EqualValues(input[i], cls.InputArgs[i]), Format('Input argument %d differs for %s', [i + 1, name]));
  1080. end;
  1081. for i := 0 to High(aData.aOutputArgs) do begin
  1082. Check(EqualValues(aData.aOutputArgs[i], cls.OutputArgs[i]), Format('Output argument %d differs for %s', [i + 1, name]));
  1083. Check(EqualValues(aData.aOutputArgs[i], aData.aInputArgs[cls.InOutMapping[i]]), Format('New output argument %d differs from expected output for %s', [i + 1, name]));
  1084. end;
  1085. finally
  1086. context.Free;
  1087. end;
  1088. end;
  1089. function TTestInvokeBase.GetRecValue(aTypeInfo: PTypeInfo; aSize: integer;
  1090. aReverse: Boolean): TValue;
  1091. var
  1092. i: LongInt;
  1093. arr: array of Byte;
  1094. begin
  1095. Arr:=nil;
  1096. SetLength(arr, aSize);
  1097. RandSeed := $54827982;
  1098. if not aReverse then begin
  1099. for i := 0 to High(arr) do
  1100. arr[i] := Random($ff);
  1101. end else begin
  1102. for i := High(arr) downto 0 do
  1103. arr[i] := Random($ff);
  1104. end;
  1105. TValue.Make(@arr[0], aTypeInfo, Result);
  1106. end;
  1107. { ----------------------------------------------------------------------
  1108. TTestInvoke
  1109. ----------------------------------------------------------------------}
  1110. procedure TTestInvoke.TestShortString;
  1111. const
  1112. strs: array[0..5] of ShortString = (
  1113. 'This ',
  1114. 'is a ',
  1115. 'test ',
  1116. 'of ',
  1117. 'shortstring ',
  1118. 'concatenation'
  1119. );
  1120. var
  1121. values: TValueArray;
  1122. resstr: ShortString;
  1123. i: LongInt;
  1124. begin
  1125. values:=Nil;
  1126. SetLength(values, Length(strs));
  1127. resstr := '';
  1128. for i := Low(values) to High(values) do begin
  1129. TValue.Make(@strs[i], TypeInfo(ShortString), values[i]);
  1130. resstr := resstr + strs[i];
  1131. end;
  1132. DoStaticInvokeTestAnsiStringCompare('ShortString Register', @TestShortStringRegister, ccReg, values, TypeInfo(ShortString), resstr);
  1133. DoStaticInvokeTestAnsiStringCompare('ShortString Cdecl', @TestShortStringCdecl, ccCdecl, values, TypeInfo(ShortString), resstr);
  1134. DoStaticInvokeTestAnsiStringCompare('ShortString StdCall', @TestShortStringStdCall, ccStdCall, values, TypeInfo(ShortString), resstr);
  1135. DoStaticInvokeTestAnsiStringCompare('ShortString Pascal', @TestShortStringPascal, ccPascal, values, TypeInfo(ShortString), resstr);
  1136. end;
  1137. procedure TTestInvoke.TestAnsiString;
  1138. const
  1139. strs: array[0..5] of AnsiString = (
  1140. 'This ',
  1141. 'is a ',
  1142. 'test ',
  1143. 'of ',
  1144. 'AnsiString ',
  1145. 'concatenation'
  1146. );
  1147. var
  1148. values: TValueArray;
  1149. resstr: AnsiString;
  1150. i: LongInt;
  1151. begin
  1152. values:=nil;
  1153. SetLength(values, Length(strs));
  1154. resstr := '';
  1155. for i := Low(values) to High(values) do begin
  1156. TValue.Make(@strs[i], TypeInfo(AnsiString), values[i]);
  1157. resstr := resstr + strs[i];
  1158. end;
  1159. DoStaticInvokeTestAnsiStringCompare('AnsiString Register', @TestAnsiStringRegister, ccReg, values, TypeInfo(AnsiString), resstr);
  1160. DoStaticInvokeTestAnsiStringCompare('AnsiString Cdecl', @TestAnsiStringCdecl, ccCdecl, values, TypeInfo(AnsiString), resstr);
  1161. DoStaticInvokeTestAnsiStringCompare('AnsiString StdCall', @TestAnsiStringStdCall, ccStdCall, values, TypeInfo(AnsiString), resstr);
  1162. DoStaticInvokeTestAnsiStringCompare('AnsiString Pascal', @TestAnsiStringPascal, ccPascal, values, TypeInfo(AnsiString), resstr);
  1163. end;
  1164. procedure TTestInvoke.TestWideString;
  1165. const
  1166. strs: array[0..5] of WideString = (
  1167. 'This ',
  1168. 'is a ',
  1169. 'test ',
  1170. 'of ',
  1171. 'WideString ',
  1172. 'concatenation'
  1173. );
  1174. var
  1175. values: TValueArray;
  1176. resstr: WideString;
  1177. i: LongInt;
  1178. begin
  1179. values:=nil;
  1180. SetLength(values, Length(strs));
  1181. resstr := '';
  1182. for i := Low(values) to High(values) do begin
  1183. TValue.Make(@strs[i], TypeInfo(WideString), values[i]);
  1184. resstr := resstr + strs[i];
  1185. end;
  1186. DoStaticInvokeTestUnicodeStringCompare('WideString Register', @TestWideStringRegister, ccReg, values, TypeInfo(WideString), resstr);
  1187. DoStaticInvokeTestUnicodeStringCompare('WideString Cdecl', @TestWideStringCdecl, ccCdecl, values, TypeInfo(WideString), resstr);
  1188. DoStaticInvokeTestUnicodeStringCompare('WideString StdCall', @TestWideStringStdCall, ccStdCall, values, TypeInfo(WideString), resstr);
  1189. DoStaticInvokeTestUnicodeStringCompare('WideString Pascal', @TestWideStringPascal, ccPascal, values, TypeInfo(WideString), resstr);
  1190. end;
  1191. procedure TTestInvoke.TestUnicodeString;
  1192. const
  1193. strs: array[0..5] of UnicodeString = (
  1194. 'This ',
  1195. 'is a ',
  1196. 'test ',
  1197. 'of ',
  1198. 'UnicodeString ',
  1199. 'concatenation'
  1200. );
  1201. var
  1202. values: TValueArray;
  1203. resstr: UnicodeString;
  1204. i: LongInt;
  1205. begin
  1206. values:=nil;
  1207. SetLength(values, Length(strs));
  1208. resstr := '';
  1209. for i := Low(values) to High(values) do begin
  1210. TValue.Make(@strs[i], TypeInfo(UnicodeString), values[i]);
  1211. resstr := resstr + strs[i];
  1212. end;
  1213. DoStaticInvokeTestUnicodeStringCompare('UnicodeString Register', @TestUnicodeStringRegister, ccReg, values, TypeInfo(UnicodeString), resstr);
  1214. DoStaticInvokeTestUnicodeStringCompare('UnicodeString Cdecl', @TestUnicodeStringCdecl, ccCdecl, values, TypeInfo(UnicodeString), resstr);
  1215. DoStaticInvokeTestUnicodeStringCompare('UnicodeString StdCall', @TestUnicodeStringStdCall, ccStdCall, values, TypeInfo(UnicodeString), resstr);
  1216. DoStaticInvokeTestUnicodeStringCompare('UnicodeString Pascal', @TestUnicodeStringPascal, ccPascal, values, TypeInfo(UnicodeString), resstr);
  1217. end;
  1218. procedure TTestInvoke.TestLongInt;
  1219. const
  1220. vals: array[0..5] of LongInt = (
  1221. 8,
  1222. 4,
  1223. 7,
  1224. 3,
  1225. 6,
  1226. 1
  1227. );
  1228. var
  1229. values: TValueArray;
  1230. resval, factor: LongInt;
  1231. i: LongInt;
  1232. begin
  1233. values:=nil;
  1234. SetLength(values, Length(vals));
  1235. resval := 0;
  1236. factor := 1;
  1237. for i := Low(values) to High(values) do begin
  1238. TValue.Make(@vals[i], TypeInfo(LongInt), values[i]);
  1239. resval := resval + vals[i] * factor;
  1240. factor := factor * 10;
  1241. end;
  1242. DoStaticInvokeTestOrdinalCompare('LongInt Register', @TestLongIntRegister, ccReg, values, TypeInfo(LongInt), resval);
  1243. DoStaticInvokeTestOrdinalCompare('LongInt Cdecl', @TestLongIntCdecl, ccCdecl, values, TypeInfo(LongInt), resval);
  1244. DoStaticInvokeTestOrdinalCompare('LongInt StdCall', @TestLongIntStdCall, ccStdCall, values, TypeInfo(LongInt), resval);
  1245. DoStaticInvokeTestOrdinalCompare('LongInt Pascal', @TestLongIntPascal, ccPascal, values, TypeInfo(LongInt), resval);
  1246. end;
  1247. procedure TTestInvoke.TestInt64;
  1248. const
  1249. vals: array[0..5] of Int64 = (
  1250. 8,
  1251. 4,
  1252. 7,
  1253. 3,
  1254. 6,
  1255. 1
  1256. );
  1257. var
  1258. values: TValueArray;
  1259. resval, factor: Int64;
  1260. i: LongInt;
  1261. begin
  1262. values:=nil;
  1263. SetLength(values, Length(vals));
  1264. resval := 0;
  1265. factor := 1;
  1266. for i := Low(values) to High(values) do begin
  1267. TValue.Make(@vals[i], TypeInfo(Int64), values[i]);
  1268. resval := resval + vals[i] * factor;
  1269. factor := factor * 100;
  1270. end;
  1271. DoStaticInvokeTestOrdinalCompare('Int64 Register', @TestInt64Register, ccReg, values, TypeInfo(Int64), resval);
  1272. DoStaticInvokeTestOrdinalCompare('Int64 Cdecl', @TestInt64Cdecl, ccCdecl, values, TypeInfo(Int64), resval);
  1273. DoStaticInvokeTestOrdinalCompare('Int64 StdCall', @TestInt64StdCall, ccStdCall, values, TypeInfo(Int64), resval);
  1274. DoStaticInvokeTestOrdinalCompare('Int64 Pascal', @TestInt64Pascal, ccPascal, values, TypeInfo(Int64), resval);
  1275. end;
  1276. procedure TTestInvoke.TestVariant;
  1277. var
  1278. values: TValueArray;
  1279. aValue : variant;
  1280. S : AnsiString;
  1281. begin
  1282. Values:=[];
  1283. SetLength(Values,1);
  1284. S:='A nice string';
  1285. aValue:=S;
  1286. TValue.Make(@aValue, TypeInfo(Variant), Values[0]);
  1287. DoStaticInvokeTestVariant('Test register',@TestVariantRegister,ccReg,values,TypeInfo(AnsiString),S);
  1288. DoStaticInvokeTestVariant('Test cdecl',@TestVariantCdecl,ccCdecl,values,TypeInfo(AnsiString),S);
  1289. DoStaticInvokeTestVariant('Test pascal',@TestVariantPascal,ccCdecl,values,TypeInfo(AnsiString),S);
  1290. end;
  1291. procedure TTestInvoke.TestIntfVariant;
  1292. var
  1293. values,aOutput: TValueArray;
  1294. aValue : variant;
  1295. aResult : TValue;
  1296. S : AnsiString;
  1297. begin
  1298. Values:=[];
  1299. SetLength(Values,1);
  1300. S:='A nice string';
  1301. UniqueString(S);
  1302. aValue:=S;
  1303. aResult:=Default(TValue);
  1304. TValue.Make(@S, TypeInfo(AnsiString), aResult);
  1305. TValue.Make(@aValue, TypeInfo(Variant), Values[0]);
  1306. DoIntfInvoke(23,Values,aOutput,aResult);
  1307. end;
  1308. procedure TTestInvoke.TestCasts;
  1309. var
  1310. Context: TRttiContext;
  1311. procedure ExpectedInvocationException(const AMethodName: string;
  1312. const AInstance: TValue; const AArgs: array of TValue);
  1313. var
  1314. HasException: boolean;
  1315. begin
  1316. HasException := False;
  1317. try
  1318. Context.GetType(TTestInvokeCast).GetMethod(AMethodName).Invoke(AInstance, AArgs);
  1319. except
  1320. {$ifndef fpc}
  1321. on EInvalidCast do
  1322. HasException := True;
  1323. {$endif}
  1324. on EInvocationError do
  1325. HasException := True;
  1326. end;
  1327. if not HasException then
  1328. Fail('Expected exception on call method ' + AMethodName);
  1329. end;
  1330. var
  1331. Instance: TValue;
  1332. M: TRttiMethod;
  1333. T1,T2,TempV: TValue;
  1334. begin
  1335. Context := TRttiContext.Create;
  1336. try
  1337. Instance := TValue.specialize From<TTestInvokeCast>(TTestInvokeCast.Create);
  1338. M := Context.GetType(TTestInvokeCast).GetMethod('Test');
  1339. T1:=TValue.specialize From<Double>(10);
  1340. T2:=M.Invoke(Instance, [T1]);
  1341. CheckEquals(11, T2. specialize AsType<Double>, 'Test(Double(10) <> 11)');
  1342. ExpectedInvocationException('Test', TValue. specialize From<TObject>(TObject.Create), [TValue. Specialize From<Double>(10)]);
  1343. ExpectedInvocationException('Test2', Instance, [TValue.specialize From<Double>(10)]);
  1344. Context.GetType(TTestInvokeCast).GetMethod('Test3').Invoke(Instance, [TValue. specialize From<TEnum3>(en1_1)]);
  1345. ExpectedInvocationException('Test3', Instance, [TValue. specialize From<TEnum2>(en2_1)]);
  1346. Instance. specialize AsType<TTestInvokeCast>.Free;
  1347. finally
  1348. Context.Free;
  1349. end;
  1350. end;
  1351. procedure TTestInvoke.TestClassConstructor;
  1352. var
  1353. context: TRttiContext;
  1354. aclassType: TRttiType;
  1355. testClass: TTestAttr2Class;
  1356. begin
  1357. context := TRttiContext.Create(False);
  1358. aclassType := context.GetType(TTestAttr2Class);
  1359. testClass := aclassType.GetMethod('Create').Invoke(TValue.Empty, [459, 982]).AsObject as TTestAttr2Class;
  1360. AssertTrue('Created from nothing TTestClass is incorrect', (testClass.fa = 459) and (testClass.fa2 = 982));
  1361. end;
  1362. procedure TTestInvoke.TestInheritedClassConstructor;
  1363. var
  1364. context: TRttiContext;
  1365. aclassType: TRttiType;
  1366. testClass: TTestAttr2Class;
  1367. begin
  1368. context := TRttiContext.Create(False);
  1369. aclassType := context.GetType(TTestAttr2Class);
  1370. testClass := aclassType.GetMethod('Create').Invoke(TInherited2Class, [116, 904]).AsObject as TTestAttr2Class;
  1371. AssertTrue('TInheritedClass created via an ancestor constructor is incorrect',(testClass is TInherited2Class) and (testClass.fa = 116) and (testClass.fa2 = 904));
  1372. end;
  1373. procedure TTestInvoke.TestClassProperty;
  1374. var
  1375. context: TRttiContext;
  1376. aclassType: TRttiType;
  1377. begin
  1378. context := TRttiContext.Create(False);
  1379. aclassType := context.GetType(TTestAttr2Class);
  1380. aclassType.GetProperty('StaticProp').SetValue(nil, 4539);
  1381. AssertTrue('Class property is set or got incorrectly via methods',aclassType.GetProperty('StaticProp').GetValue(nil).AsInteger = 4539);
  1382. end;
  1383. procedure TTestInvoke.TestIndexedProperty;
  1384. var
  1385. context: TRttiContext;
  1386. aclassType: TRttiType;
  1387. testClass: TTestAttr2Class;
  1388. begin
  1389. context := TRttiContext.Create(False);
  1390. aclassType := context.GetType(TTestAttr2Class);
  1391. testClass:=TTestAttr2Class.Create(784,328);
  1392. aclassType.GetIndexedProperty('TestIProp').SetValue(testClass, [653, 796], testClass);
  1393. testClass := TTestAttr2Class(aclassType.GetIndexedProperty('TestIProp').GetValue(testClass, [384, 170]).AsObject);
  1394. AssertTrue('The getter of an indexed property for a class is incorrectly called', (testClass.fa = 384) and (testClass.fa2 = 170));
  1395. end;
  1396. procedure TTestInvoke.TestTObject;
  1397. procedure DoStaticInvokeTestClassCompare(
  1398. const aTestName: String; aAddress: CodePointer; aCallConv: TCallConv;
  1399. aValues: TValueArray; aReturnType: PTypeInfo; aResult: TTestClass
  1400. );
  1401. var
  1402. resval: TValue;
  1403. rescls: TTestClass;
  1404. valid: Boolean;
  1405. begin
  1406. resval := DoInvoke(aAddress, aValues, aCallConv, aReturnType, [ifStatic], valid);
  1407. if valid and Assigned(aReturnType) then begin
  1408. rescls := TTestClass(PPointer(resval.GetReferenceToRawData)^);
  1409. if (rescls.fString <> aResult.fString) or (rescls.fValue <> aResult.fValue) then
  1410. Fail('Result of test "%s" is unexpected; expected: "%s"/%s, got: "%s"/%s', [aTestName, aResult.fString, IntToStr(aResult.fValue), rescls.fString, IntToStr(rescls.fValue)]);
  1411. end;
  1412. end;
  1413. const
  1414. strs: array[0..5] of AnsiString = (
  1415. 'This ',
  1416. 'is a ',
  1417. 'test ',
  1418. 'of ',
  1419. 'AnsiString ',
  1420. 'concatenation'
  1421. );
  1422. vals: array[0..5] of Int64 = (
  1423. 8,
  1424. 4,
  1425. 7,
  1426. 3,
  1427. 6,
  1428. 1
  1429. );
  1430. var
  1431. values: TValueArray;
  1432. t, rescls: TTestClass;
  1433. i, factor: LongInt;
  1434. begin
  1435. values:=nil;
  1436. SetLength(values, Length(vals));
  1437. factor := 1;
  1438. rescls := TTestClass.Create;
  1439. for i := Low(values) to High(values) do begin
  1440. t := TTestClass.Create;
  1441. t.fString := strs[i];
  1442. t.fValue := vals[i];
  1443. TValue.Make(@t, TypeInfo(TTestClass), values[i]);
  1444. rescls.fValue := rescls.fValue + vals[i] * factor;
  1445. rescls.fString := rescls.fString + strs[i];
  1446. factor := factor * 10;
  1447. end;
  1448. DoStaticInvokeTestClassCompare('TTestClass Register', @TestTTestClassRegister, ccReg, values, TypeInfo(TTestClass), rescls);
  1449. DoStaticInvokeTestClassCompare('TTestClass Cdecl', @TestTTestClassCdecl, ccCdecl, values, TypeInfo(TTestClass), rescls);
  1450. DoStaticInvokeTestClassCompare('TTestClass StdCall', @TestTTestClassStdCall, ccStdCall, values, TypeInfo(TTestClass), rescls);
  1451. DoStaticInvokeTestClassCompare('TTestClass Pascal', @TestTTestClassPascal, ccPascal, values, TypeInfo(TTestClass), rescls);
  1452. end;
  1453. { ----------------------------------------------------------------------
  1454. TTestInvokeMethodTests
  1455. ----------------------------------------------------------------------}
  1456. procedure TTestInvokeMethodTests.DoProcVarInvoke(aProc: CodePointer;
  1457. aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs,
  1458. aOutputArgs: TValueArray; aResult: TValue);
  1459. begin
  1460. CheckNotNull(Cls,'Have class');
  1461. DoProcVarInvoke(cls,aProc,aTypeInfo,aIndex,aInputArgs,aOutputArgs,aResult);
  1462. end;
  1463. procedure TTestInvokeMethodTests.DoProcInvoke(aProc: CodePointer;
  1464. aTypeInfo: PTypeInfo; aIndex: SizeInt; const aInputArgs,
  1465. aOutputArgs: TValueArray; aResult: TValue);
  1466. begin
  1467. CheckNotNull(Cls,'Have class');
  1468. DoProcVarInvoke(cls,aProc,aTypeInfo,aIndex,aInputArgs,aOutputArgs,aResult);
  1469. end;
  1470. procedure TTestInvokeMethodTests.DoUntypedInvoke(aProc: CodePointer;
  1471. aMethod: TMethod; aTypeInfo: PTypeInfo; const aInputArgs,
  1472. aOutputArgs: TValueArray);
  1473. begin
  1474. CheckNotNull(Cls,'Have class');
  1475. DoUntypedInvoke(cls,aProc,aMethod,aTypeInfo,aInputArgs,aOutputArgs,TValue.Empty);
  1476. end;
  1477. procedure TTestInvokeMethodTests.SetUp;
  1478. begin
  1479. inherited SetUp;
  1480. cls := TTestInterfaceClass.Create;
  1481. cls.DoAddRef;
  1482. end;
  1483. procedure TTestInvokeMethodTests.TearDown;
  1484. begin
  1485. cls.DoRelease;
  1486. inherited TearDown;
  1487. end;
  1488. { ----------------------------------------------------------------------
  1489. TTestInvokeIntfMethods
  1490. ----------------------------------------------------------------------}
  1491. procedure TTestInvokeIntfMethods.Test1;
  1492. begin
  1493. DoIntfInvoke(1, [], [], TValue.Empty);
  1494. end;
  1495. procedure TTestInvokeIntfMethods.Test2;
  1496. begin
  1497. DoIntfInvoke(2, [], [], GetIntValue(42));
  1498. end;
  1499. procedure TTestInvokeIntfMethods.Test3;
  1500. begin
  1501. DoIntfInvoke(3, [
  1502. GetIntValue(7), GetIntValue(2), GetIntValue(5), GetIntValue(1), GetIntValue(10), GetIntValue(8), GetIntValue(6), GetIntValue(3), GetIntValue(9), GetIntValue(3)
  1503. ], [], GetIntValue(42));
  1504. end;
  1505. procedure TTestInvokeIntfMethods.Test4;
  1506. begin
  1507. DoIntfInvoke(4, [
  1508. GetAnsiString('Alpha'),
  1509. GetUnicodeString('Beta'),
  1510. GetWideString('Gamma'),
  1511. GetShortString('Delta')
  1512. ], [], TValue.Empty);
  1513. end;
  1514. procedure TTestInvokeIntfMethods.Test5;
  1515. begin
  1516. DoIntfInvoke(5, [], [], GetAnsiString('Hello World'));
  1517. end;
  1518. procedure TTestInvokeIntfMethods.Test6;
  1519. begin
  1520. DoIntfInvoke(6, [], [], GetUnicodeString('Hello World'));
  1521. end;
  1522. procedure TTestInvokeIntfMethods.Test7;
  1523. begin
  1524. DoIntfInvoke(7, [], [], GetWideString('Hello World'));
  1525. end;
  1526. procedure TTestInvokeIntfMethods.Test8;
  1527. begin
  1528. DoIntfInvoke(8, [], [], GetShortString('Hello World'));
  1529. end;
  1530. procedure TTestInvokeIntfMethods.Test9;
  1531. begin
  1532. DoIntfInvoke(9, [
  1533. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  1534. ], [
  1535. GetIntValue($1234), GetIntValue($5678)
  1536. ], TValue.Empty);
  1537. end;
  1538. procedure TTestInvokeIntfMethods.Test10;
  1539. begin
  1540. DoIntfInvoke(10, [
  1541. GetAnsiString('Alpha'), GetAnsiString('Beta'), GetAnsiString(''), GetAnsiString('Delta')
  1542. ], [
  1543. GetAnsiString('Foo'), GetAnsiString('Bar')
  1544. ], TValue.Empty);
  1545. end;
  1546. procedure TTestInvokeIntfMethods.Test11;
  1547. begin
  1548. DoIntfInvoke(11, [
  1549. GetShortString('Alpha'), GetShortString('Beta'), GetShortString(''), GetShortString('Delta')
  1550. ], [
  1551. GetShortString('Foo'), GetShortString('Bar')
  1552. ], TValue.Empty);
  1553. end;
  1554. procedure TTestInvokeIntfMethods.Test12;
  1555. begin
  1556. {$ifdef fpc}
  1557. DoIntfInvoke(12, [
  1558. GetArray([$1234, $2345, $3456, $4567]), GetArray([$4321, $5431, $6543, $7654]), GetArray([$5678, $6789, $7890, $8901]), GetArray([$8765, $7654, $6543, $5432])
  1559. ], [
  1560. GetArray([$4321, $4322, $4323, $4324]), GetArray([$9876, $9877, $9878, $9879])
  1561. ], TValue.Empty);
  1562. {$endif}
  1563. end;
  1564. procedure TTestInvokeIntfMethods.Test13;
  1565. begin
  1566. DoIntfInvoke(13, [
  1567. GetSingleValue(SingleArg1), GetSingleValue(SingleArg2In), GetSingleValue(0), GetSingleValue(SingleArg4)
  1568. ], [
  1569. GetSingleValue(SingleArg2Out), GetSingleValue(SingleArg3Out)
  1570. ], GetSingleValue(SingleRes));
  1571. end;
  1572. procedure TTestInvokeIntfMethods.Test14;
  1573. begin
  1574. DoIntfInvoke(14, [
  1575. GetDoubleValue(DoubleArg1), GetDoubleValue(DoubleArg2In), GetDoubleValue(0), GetDoubleValue(DoubleArg4)
  1576. ], [
  1577. GetDoubleValue(DoubleArg2Out), GetDoubleValue(DoubleArg3Out)
  1578. ], GetDoubleValue(DoubleRes));
  1579. end;
  1580. procedure TTestInvokeIntfMethods.Test15;
  1581. begin
  1582. DoIntfInvoke(15, [
  1583. GetExtendedValue(ExtendedArg1), GetExtendedValue(ExtendedArg2In), GetExtendedValue(0), GetExtendedValue(ExtendedArg4)
  1584. ], [
  1585. GetExtendedValue(ExtendedArg2Out), GetExtendedValue(ExtendedArg3Out)
  1586. ], GetExtendedValue(ExtendedRes));
  1587. end;
  1588. procedure TTestInvokeIntfMethods.Test16;
  1589. begin
  1590. DoIntfInvoke(16, [
  1591. GetCompValue(CompArg1), GetCompValue(CompArg2In), GetCompValue(0), GetCompValue(CompArg4)
  1592. ], [
  1593. GetCompValue(CompArg2Out), GetCompValue(CompArg3Out)
  1594. ], GetCompValue(CompRes));
  1595. end;
  1596. procedure TTestInvokeIntfMethods.Test17;
  1597. begin
  1598. DoIntfInvoke(17, [
  1599. GetCurrencyValue(CurrencyArg1), GetCurrencyValue(CurrencyArg2In), GetCurrencyValue(0), GetCurrencyValue(CurrencyArg4)
  1600. ], [
  1601. GetCurrencyValue(CurrencyArg2Out), GetCurrencyValue(CurrencyArg3Out)
  1602. ], GetCurrencyValue(CurrencyRes));
  1603. end;
  1604. procedure TTestInvokeIntfMethods.Test18;
  1605. begin
  1606. DoIntfInvoke(18, [
  1607. GetSingleValue(SingleAddArg1), GetSingleValue(SingleAddArg2), GetSingleValue(SingleAddArg3), GetSingleValue(SingleAddArg4), GetSingleValue(SingleAddArg5),
  1608. GetSingleValue(SingleAddArg6), GetSingleValue(SingleAddArg7), GetSingleValue(SingleAddArg8), GetSingleValue(SingleAddArg9), GetSingleValue(SingleAddArg10)
  1609. ], [], GetSingleValue(SingleAddRes));
  1610. end;
  1611. procedure TTestInvokeIntfMethods.Test19;
  1612. begin
  1613. DoIntfInvoke(19, [
  1614. GetDoubleValue(DoubleAddArg1), GetDoubleValue(DoubleAddArg2), GetDoubleValue(DoubleAddArg3), GetDoubleValue(DoubleAddArg4), GetDoubleValue(DoubleAddArg5),
  1615. GetDoubleValue(DoubleAddArg6), GetDoubleValue(DoubleAddArg7), GetDoubleValue(DoubleAddArg8), GetDoubleValue(DoubleAddArg9), GetDoubleValue(DoubleAddArg10)
  1616. ], [], GetDoubleValue(DoubleAddRes));
  1617. end;
  1618. procedure TTestInvokeIntfMethods.Test20;
  1619. begin
  1620. DoIntfInvoke(20, [
  1621. GetExtendedValue(ExtendedAddArg1), GetExtendedValue(ExtendedAddArg2), GetExtendedValue(ExtendedAddArg3), GetExtendedValue(ExtendedAddArg4), GetExtendedValue(ExtendedAddArg5),
  1622. GetExtendedValue(ExtendedAddArg6), GetExtendedValue(ExtendedAddArg7), GetExtendedValue(ExtendedAddArg8), GetExtendedValue(ExtendedAddArg9), GetExtendedValue(ExtendedAddArg10)
  1623. ], [], GetExtendedValue(ExtendedAddRes));
  1624. end;
  1625. procedure TTestInvokeIntfMethods.Test21;
  1626. begin
  1627. DoIntfInvoke(21, [
  1628. GetCompValue(CompAddArg1), GetCompValue(CompAddArg2), GetCompValue(CompAddArg3), GetCompValue(CompAddArg4), GetCompValue(CompAddArg5),
  1629. GetCompValue(CompAddArg6), GetCompValue(CompAddArg7), GetCompValue(CompAddArg8), GetCompValue(CompAddArg9), GetCompValue(CompAddArg10)
  1630. ], [], GetCompValue(CompAddRes));
  1631. end;
  1632. procedure TTestInvokeIntfMethods.Test22;
  1633. begin
  1634. DoIntfInvoke(22, [
  1635. GetCurrencyValue(CurrencyAddArg1), GetCurrencyValue(CurrencyAddArg2), GetCurrencyValue(CurrencyAddArg3), GetCurrencyValue(CurrencyAddArg4), GetCurrencyValue(CurrencyAddArg5),
  1636. GetCurrencyValue(CurrencyAddArg6), GetCurrencyValue(CurrencyAddArg7), GetCurrencyValue(CurrencyAddArg8), GetCurrencyValue(CurrencyAddArg9), GetCurrencyValue(CurrencyAddArg10)
  1637. ], [], GetCurrencyValue(CurrencyAddRes));
  1638. end;
  1639. { ----------------------------------------------------------------------
  1640. TTestInvokeIntfMethodsRecs
  1641. ----------------------------------------------------------------------}
  1642. procedure TTestInvokeIntfMethodsRecs.Test1;
  1643. begin
  1644. DoIntfInvoke(1 or TTestInterfaceClass.RecSizeMarker,
  1645. [GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),False)], [],
  1646. GetRecValue(TypeInfo(TTestRecord1),Sizeof(TTestrecord1),True));
  1647. end;
  1648. procedure TTestInvokeIntfMethodsRecs.Test2;
  1649. begin
  1650. DoIntfInvoke(2 or TTestInterfaceClass.RecSizeMarker,
  1651. [GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),False)], [],
  1652. GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),True));
  1653. end;
  1654. procedure TTestInvokeIntfMethodsRecs.Test3;
  1655. begin
  1656. DoIntfInvoke(3 or TTestInterfaceClass.RecSizeMarker,
  1657. [GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),False)], [],
  1658. GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),True));
  1659. end;
  1660. procedure TTestInvokeIntfMethodsRecs.Test4;
  1661. begin
  1662. DoIntfInvoke(4 or TTestInterfaceClass.RecSizeMarker,
  1663. [GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),False)], [],
  1664. GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),True));
  1665. end;
  1666. procedure TTestInvokeIntfMethodsRecs.Test5;
  1667. begin
  1668. DoIntfInvoke(5 or TTestInterfaceClass.RecSizeMarker,
  1669. [GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),False)], [],
  1670. GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),True));
  1671. end;
  1672. procedure TTestInvokeIntfMethodsRecs.Test6;
  1673. begin
  1674. DoIntfInvoke(6 or TTestInterfaceClass.RecSizeMarker,
  1675. [GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),False)], [],
  1676. GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),True));
  1677. end;
  1678. procedure TTestInvokeIntfMethodsRecs.Test7;
  1679. begin
  1680. DoIntfInvoke(7 or TTestInterfaceClass.RecSizeMarker,
  1681. [GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),False)], [],
  1682. GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),True));
  1683. end;
  1684. procedure TTestInvokeIntfMethodsRecs.Test8;
  1685. begin
  1686. DoIntfInvoke(8 or TTestInterfaceClass.RecSizeMarker,
  1687. [GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),False)], [],
  1688. GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),True));
  1689. end;
  1690. procedure TTestInvokeIntfMethodsRecs.Test9;
  1691. begin
  1692. DoIntfInvoke(9 or TTestInterfaceClass.RecSizeMarker,
  1693. [GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),False)], [],
  1694. GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),True));
  1695. end;
  1696. procedure TTestInvokeIntfMethodsRecs.Test10;
  1697. begin
  1698. DoIntfInvoke(10 or TTestInterfaceClass.RecSizeMarker,
  1699. [GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),False)], [],
  1700. GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),True));
  1701. end;
  1702. { ----------------------------------------------------------------------
  1703. TTestInvokeMethodVars
  1704. ----------------------------------------------------------------------}
  1705. procedure TTestInvokeMethodVars.Test1;
  1706. begin
  1707. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test1), TypeInfo(TMethodTest1),1,[], [], TValue.empty);
  1708. end;
  1709. procedure TTestInvokeMethodVars.Test2;
  1710. begin
  1711. DoMethodInvoke(cls,TMethod({$ifdef fpc}@{$endif}cls.Test2), TypeInfo(TMethodTest2), 2, [], [], GetIntValue(42));
  1712. end;
  1713. procedure TTestInvokeMethodVars.Test3;
  1714. begin
  1715. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test3), TypeInfo(TMethodTest3), 3, [
  1716. GetIntValue(7), GetIntValue(2), GetIntValue(5), GetIntValue(1), GetIntValue(10), GetIntValue(8), GetIntValue(6), GetIntValue(3), GetIntValue(9), GetIntValue(3)
  1717. ], [], GetIntValue(42));
  1718. end;
  1719. procedure TTestInvokeMethodVars.Test4;
  1720. begin
  1721. DoMethodInvoke(cls,
  1722. TMethod({$ifdef fpc}@{$endif}cls.Test4),TypeInfo(TMethodTest4), 4, [
  1723. GetAnsiString('Alpha'),
  1724. GetUnicodeString('Beta'),
  1725. GetWideString('Gamma'),
  1726. GetShortString('Delta')
  1727. ], [], TValue.Empty);
  1728. end;
  1729. procedure TTestInvokeMethodVars.Test5;
  1730. begin
  1731. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test5),TYpeInfo(TMethodTest5), 5, [], [], GetAnsiString('Hello World'));
  1732. end;
  1733. procedure TTestInvokeMethodVars.Test6;
  1734. begin
  1735. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test6),TypeInfo(TMethodTest6), 6, [], [], GetUnicodeString('Hello World'));
  1736. end;
  1737. procedure TTestInvokeMethodVars.Test7;
  1738. begin
  1739. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test7),TypeInfo(TMethodTest7), 7, [], [], GetWideString('Hello World'));
  1740. end;
  1741. procedure TTestInvokeMethodVars.Test8;
  1742. begin
  1743. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test8),TypeInfo(TMethodTest8), 8, [], [], GetShortString('Hello World'));
  1744. end;
  1745. procedure TTestInvokeMethodVars.Test9;
  1746. begin
  1747. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test9),TypeInfo(TMethodTest9), 9, [
  1748. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  1749. ], [
  1750. GetIntValue($1234), GetIntValue($5678)
  1751. ], TValue.Empty);
  1752. end;
  1753. procedure TTestInvokeMethodVars.Test10;
  1754. begin
  1755. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test10),TypeInfo(TMethodTest10), 10, [
  1756. GetAnsiString('Alpha'), GetAnsiString('Beta'), GetAnsiString(''), GetAnsiString('Delta')
  1757. ], [
  1758. GetAnsiString('Foo'), GetAnsiString('Bar')
  1759. ], TValue.Empty);
  1760. end;
  1761. procedure TTestInvokeMethodVars.Test11;
  1762. begin
  1763. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test11),TypeInfo(TMethodTest11), 11, [
  1764. GetShortString('Alpha'), GetShortString('Beta'), GetShortString(''), GetShortString('Delta')
  1765. ], [
  1766. GetShortString('Foo'), GetShortString('Bar')
  1767. ], TValue.Empty);
  1768. end;
  1769. procedure TTestInvokeMethodVars.Test12;
  1770. begin
  1771. {$ifdef fpc}
  1772. DoMethodInvoke(cls,TMethod(@cls.Test12),TypeInfo(TMethodTest12), 12, [
  1773. GetArray([$1234, $2345, $3456, $4567]), GetArray([$4321, $5431, $6543, $7654]), GetArray([$5678, $6789, $7890, $8901]), GetArray([$8765, $7654, $6543, $5432])
  1774. ], [
  1775. GetArray([$4321, $4322, $4323, $4324]), GetArray([$9876, $9877, $9878, $9879])
  1776. ], TValue.Empty);
  1777. {$endif}
  1778. end;
  1779. procedure TTestInvokeMethodVars.Test13;
  1780. begin
  1781. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test13), Typeinfo(TMethodTest13), 13, [
  1782. GetSingleValue(SingleArg1), GetSingleValue(SingleArg2In), GetSingleValue(0), GetSingleValue(SingleArg4)
  1783. ], [
  1784. GetSingleValue(SingleArg2Out), GetSingleValue(SingleArg3Out)
  1785. ], GetSingleValue(SingleRes));
  1786. end;
  1787. procedure TTestInvokeMethodVars.Test14;
  1788. begin
  1789. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test14), TypeInfo(TMethodTest14), 14, [
  1790. GetDoubleValue(DoubleArg1), GetDoubleValue(DoubleArg2In), GetDoubleValue(0), GetDoubleValue(DoubleArg4)
  1791. ], [
  1792. GetDoubleValue(DoubleArg2Out), GetDoubleValue(DoubleArg3Out)
  1793. ], GetDoubleValue(DoubleRes));
  1794. end;
  1795. procedure TTestInvokeMethodVars.Test15;
  1796. begin
  1797. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test15), TypeInfo(TMethodTest15),15, [
  1798. GetExtendedValue(ExtendedArg1), GetExtendedValue(ExtendedArg2In), GetExtendedValue(0), GetExtendedValue(ExtendedArg4)
  1799. ], [
  1800. GetExtendedValue(ExtendedArg2Out), GetExtendedValue(ExtendedArg3Out)
  1801. ], GetExtendedValue(ExtendedRes));
  1802. end;
  1803. procedure TTestInvokeMethodVars.Test16;
  1804. begin
  1805. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test16),TypeInfo(TMethodTest16), 16, [
  1806. GetCompValue(CompArg1), GetCompValue(CompArg2In), GetCompValue(0), GetCompValue(CompArg4)
  1807. ], [
  1808. GetCompValue(CompArg2Out), GetCompValue(CompArg3Out)
  1809. ], GetCompValue(CompRes));
  1810. end;
  1811. procedure TTestInvokeMethodVars.Test17;
  1812. begin
  1813. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test17),TypeInfo(TMethodTest17), 17, [
  1814. GetCurrencyValue(CurrencyArg1), GetCurrencyValue(CurrencyArg2In), GetCurrencyValue(0), GetCurrencyValue(CurrencyArg4)
  1815. ], [
  1816. GetCurrencyValue(CurrencyArg2Out), GetCurrencyValue(CurrencyArg3Out)
  1817. ], GetCurrencyValue(CurrencyRes));
  1818. end;
  1819. procedure TTestInvokeMethodVars.Test18;
  1820. begin
  1821. DoMethodInvoke(cls,TMethod({$ifdef fpc}@{$endif}cls.Test18),TypeInfo(TMethodTest18), 18, [
  1822. GetSingleValue(SingleAddArg1), GetSingleValue(SingleAddArg2), GetSingleValue(SingleAddArg3), GetSingleValue(SingleAddArg4), GetSingleValue(SingleAddArg5),
  1823. GetSingleValue(SingleAddArg6), GetSingleValue(SingleAddArg7), GetSingleValue(SingleAddArg8), GetSingleValue(SingleAddArg9), GetSingleValue(SingleAddArg10)
  1824. ], [], GetSingleValue(SingleAddRes));
  1825. end;
  1826. procedure TTestInvokeMethodVars.Test19;
  1827. begin
  1828. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test19), TypeInfo(TMethodTest19), 19, [
  1829. GetDoubleValue(DoubleAddArg1), GetDoubleValue(DoubleAddArg2), GetDoubleValue(DoubleAddArg3), GetDoubleValue(DoubleAddArg4), GetDoubleValue(DoubleAddArg5),
  1830. GetDoubleValue(DoubleAddArg6), GetDoubleValue(DoubleAddArg7), GetDoubleValue(DoubleAddArg8), GetDoubleValue(DoubleAddArg9), GetDoubleValue(DoubleAddArg10)
  1831. ], [], GetDoubleValue(DoubleAddRes));
  1832. end;
  1833. procedure TTestInvokeMethodVars.Test20;
  1834. begin
  1835. DoMethodInvoke(cls, TMethod( {$ifdef fpc}@{$endif}cls.Test20),TypeInfo(TMethodTest20), 20, [
  1836. GetExtendedValue(ExtendedAddArg1), GetExtendedValue(ExtendedAddArg2), GetExtendedValue(ExtendedAddArg3), GetExtendedValue(ExtendedAddArg4), GetExtendedValue(ExtendedAddArg5),
  1837. GetExtendedValue(ExtendedAddArg6), GetExtendedValue(ExtendedAddArg7), GetExtendedValue(ExtendedAddArg8), GetExtendedValue(ExtendedAddArg9), GetExtendedValue(ExtendedAddArg10)
  1838. ], [], GetExtendedValue(ExtendedAddRes));
  1839. end;
  1840. procedure TTestInvokeMethodVars.Test21;
  1841. begin
  1842. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test21),TypeInfo(TMethodTest21), 21, [
  1843. GetCompValue(CompAddArg1), GetCompValue(CompAddArg2), GetCompValue(CompAddArg3), GetCompValue(CompAddArg4), GetCompValue(CompAddArg5),
  1844. GetCompValue(CompAddArg6), GetCompValue(CompAddArg7), GetCompValue(CompAddArg8), GetCompValue(CompAddArg9), GetCompValue(CompAddArg10)
  1845. ], [], GetCompValue(CompAddRes));
  1846. end;
  1847. procedure TTestInvokeMethodVars.Test22;
  1848. begin
  1849. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.Test22),TypeInfo(TMethodTest22), 22, [
  1850. GetCurrencyValue(CurrencyAddArg1), GetCurrencyValue(CurrencyAddArg2), GetCurrencyValue(CurrencyAddArg3), GetCurrencyValue(CurrencyAddArg4), GetCurrencyValue(CurrencyAddArg5),
  1851. GetCurrencyValue(CurrencyAddArg6), GetCurrencyValue(CurrencyAddArg7), GetCurrencyValue(CurrencyAddArg8), GetCurrencyValue(CurrencyAddArg9), GetCurrencyValue(CurrencyAddArg10)
  1852. ], [], GetCurrencyValue(CurrencyAddRes));
  1853. end;
  1854. { ----------------------------------------------------------------------
  1855. TTestInvokeMethodVarsRecs
  1856. ----------------------------------------------------------------------}
  1857. procedure TTestInvokeMethodVarsRecs.Test1;
  1858. begin
  1859. DoMethodInvoke(cls,TMethod({$ifdef fpc}@{$endif}cls.TestRecSize1), TypeInfo(TMethodTestRecSize1), 1 or TTestInterfaceClass.RecSizeMarker,
  1860. [GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),False)], [],
  1861. GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),True));
  1862. end;
  1863. procedure TTestInvokeMethodVarsRecs.Test2;
  1864. begin
  1865. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize2),TypeInfo(TMethodTestRecSize2), 2 or TTestInterfaceClass.RecSizeMarker,
  1866. [GetRecValue(TypeInfo(TTestRecord2),SizeOF(TTestrecord2),False)], [],
  1867. GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),True));
  1868. end;
  1869. procedure TTestInvokeMethodVarsRecs.Test3;
  1870. begin
  1871. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize3), TypeInfo(TMethodTestRecSize3), 3 or TTestInterfaceClass.RecSizeMarker,
  1872. [GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),False)], [],
  1873. GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),True));
  1874. end;
  1875. procedure TTestInvokeMethodVarsRecs.Test4;
  1876. begin
  1877. DoMethodInvoke(cls,TMethod({$ifdef fpc}@{$endif}cls.TestRecSize4), TypeInfo(TMethodTestRecSize4), 4 or TTestInterfaceClass.RecSizeMarker,
  1878. [GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),False)], [],
  1879. GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),True));
  1880. end;
  1881. procedure TTestInvokeMethodVarsRecs.Test5;
  1882. begin
  1883. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize5),TypeInfo(TMethodTestRecSize5), 5 or TTestInterfaceClass.RecSizeMarker,
  1884. [GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),False)], [],
  1885. GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),True));
  1886. end;
  1887. procedure TTestInvokeMethodVarsRecs.Test6;
  1888. begin
  1889. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize6), TypeInfo(TMethodTestRecSize6), 6 or TTestInterfaceClass.RecSizeMarker,
  1890. [GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),False)], [],
  1891. GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),True));
  1892. end;
  1893. procedure TTestInvokeMethodVarsRecs.Test7;
  1894. begin
  1895. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize7),TypeInfo(TMethodTestRecSize7), 7 or TTestInterfaceClass.RecSizeMarker,
  1896. [GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),False)], [],
  1897. GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),True));
  1898. end;
  1899. procedure TTestInvokeMethodVarsRecs.Test8;
  1900. begin
  1901. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize8), TypeInfo(TMethodTestRecSize8), 8 or TTestInterfaceClass.RecSizeMarker,
  1902. [GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),False)], [],
  1903. GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),True));
  1904. end;
  1905. procedure TTestInvokeMethodVarsRecs.Test9;
  1906. begin
  1907. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize9),TypeInfo(TMethodTestRecSize9), 9 or TTestInterfaceClass.RecSizeMarker,
  1908. [GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),False)], [],
  1909. GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),True));
  1910. end;
  1911. procedure TTestInvokeMethodVarsRecs.Test10;
  1912. begin
  1913. DoMethodInvoke(cls, TMethod({$ifdef fpc}@{$endif}cls.TestRecSize10),TypeInfo(TMethodTestRecSize10), 10 or TTestInterfaceClass.RecSizeMarker,
  1914. [GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),False)], [],
  1915. GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),True));
  1916. end;
  1917. { ----------------------------------------------------------------------
  1918. TTestInvokeProcVars
  1919. ----------------------------------------------------------------------}
  1920. procedure TTestInvokeProcVars.Test1;
  1921. begin
  1922. DoProcVarInvoke(CodePointer({$ifdef fpc}@{$endif}ProcTest1),TypeInfo(TProcVarTest1), 1, [], [], TValue.Empty);
  1923. end;
  1924. procedure TTestInvokeProcVars.Test2;
  1925. begin
  1926. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest2),TypeInfo(TProcVarTest2), 2, [], [], GetIntValue(42));
  1927. end;
  1928. procedure TTestInvokeProcVars.Test3;
  1929. begin
  1930. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest3),TypeInfo(TProcVarTest3), 3, [
  1931. GetIntValue(7), GetIntValue(2), GetIntValue(5), GetIntValue(1), GetIntValue(10), GetIntValue(8), GetIntValue(6), GetIntValue(3), GetIntValue(9), GetIntValue(3)
  1932. ], [], GetIntValue(42));
  1933. end;
  1934. procedure TTestInvokeProcVars.Test4;
  1935. begin
  1936. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest4), TypeInfo(TProcVarTest4), 4, [
  1937. GetAnsiString('Alpha'),
  1938. GetUnicodeString('Beta'),
  1939. GetWideString('Gamma'),
  1940. GetShortString('Delta')
  1941. ], [], TValue.Empty);
  1942. end;
  1943. procedure TTestInvokeProcVars.Test5;
  1944. begin
  1945. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest5), TypeInfo(TProcVarTest5), 5, [], [], GetAnsiString('Hello World'));
  1946. end;
  1947. procedure TTestInvokeProcVars.Test6;
  1948. begin
  1949. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest6), TypeInfo(TProcVarTest6), 6, [], [], GetUnicodeString('Hello World'));
  1950. end;
  1951. procedure TTestInvokeProcVars.Test7;
  1952. begin
  1953. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest7), TypeInfo(TProcVarTest7), 7, [], [], GetWideString('Hello World'));
  1954. end;
  1955. procedure TTestInvokeProcVars.Test8;
  1956. begin
  1957. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest8), TypeInfo(TProcVarTest8), 8, [], [], GetShortString('Hello World'));
  1958. end;
  1959. procedure TTestInvokeProcVars.Test9;
  1960. begin
  1961. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest9), TypeInfo(TProcVarTest9) , 9, [
  1962. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  1963. ], [
  1964. GetIntValue($1234), GetIntValue($5678)
  1965. ], TValue.Empty);
  1966. end;
  1967. procedure TTestInvokeProcVars.Test10;
  1968. begin
  1969. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest10), TypeInfo(TProcVarTest10), 10, [
  1970. GetAnsiString('Alpha'), GetAnsiString('Beta'), GetAnsiString(''), GetAnsiString('Delta')
  1971. ], [
  1972. GetAnsiString('Foo'), GetAnsiString('Bar')
  1973. ], TValue.Empty);
  1974. end;
  1975. procedure TTestInvokeProcVars.Test11;
  1976. begin
  1977. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest11), TypeInfo(TProcVarTest11), 11, [
  1978. GetShortString('Alpha'), GetShortString('Beta'), GetShortString(''), GetShortString('Delta')
  1979. ], [
  1980. GetShortString('Foo'), GetShortString('Bar')
  1981. ], TValue.Empty);
  1982. end;
  1983. procedure TTestInvokeProcVars.Test12;
  1984. begin
  1985. {$ifdef fpc}
  1986. DoProcVarInvoke(CodePointer(@ProcTest12), TypeInfo(TProcVarTest12), 12, [
  1987. GetArray([$1234, $2345, $3456, $4567]), GetArray([$4321, $5431, $6543, $7654]), GetArray([$5678, $6789, $7890, $8901]), GetArray([$8765, $7654, $6543, $5432])
  1988. ], [
  1989. GetArray([$4321, $4322, $4323, $4324]), GetArray([$9876, $9877, $9878, $9879])
  1990. ], TValue.Empty);
  1991. {$endif}
  1992. end;
  1993. procedure TTestInvokeProcVars.Test13;
  1994. begin
  1995. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest13),TypeInfo(TProcVarTest13), 13, [
  1996. GetSingleValue(SingleArg1), GetSingleValue(SingleArg2In), GetSingleValue(0), GetSingleValue(SingleArg4)
  1997. ], [
  1998. GetSingleValue(SingleArg2Out), GetSingleValue(SingleArg3Out)
  1999. ], GetSingleValue(SingleRes));
  2000. end;
  2001. procedure TTestInvokeProcVars.Test14;
  2002. begin
  2003. DoProcVarInvoke(CodePointer({$ifdef fpc}@{$endif}ProcTest14), TypeInfo(TProcVarTest14), 14, [
  2004. GetDoubleValue(DoubleArg1), GetDoubleValue(DoubleArg2In), GetDoubleValue(0), GetDoubleValue(DoubleArg4)
  2005. ], [
  2006. GetDoubleValue(DoubleArg2Out), GetDoubleValue(DoubleArg3Out)
  2007. ], GetDoubleValue(DoubleRes));
  2008. end;
  2009. procedure TTestInvokeProcVars.Test15;
  2010. begin
  2011. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest15), TypeInfo(TProcVarTest15), 15, [
  2012. GetExtendedValue(ExtendedArg1), GetExtendedValue(ExtendedArg2In), GetExtendedValue(0), GetExtendedValue(ExtendedArg4)
  2013. ], [
  2014. GetExtendedValue(ExtendedArg2Out), GetExtendedValue(ExtendedArg3Out)
  2015. ], GetExtendedValue(ExtendedRes));
  2016. end;
  2017. procedure TTestInvokeProcVars.Test16;
  2018. begin
  2019. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest16), TypeInfo(TProcVarTest16), 16, [
  2020. GetCompValue(CompArg1), GetCompValue(CompArg2In), GetCompValue(0), GetCompValue(CompArg4)
  2021. ], [
  2022. GetCompValue(CompArg2Out), GetCompValue(CompArg3Out)
  2023. ], GetCompValue(CompRes));
  2024. end;
  2025. procedure TTestInvokeProcVars.Test17;
  2026. begin
  2027. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest17), TypeInfo(TProcVarTest17), 17, [
  2028. GetCurrencyValue(CurrencyArg1), GetCurrencyValue(CurrencyArg2In), GetCurrencyValue(0), GetCurrencyValue(CurrencyArg4)
  2029. ], [
  2030. GetCurrencyValue(CurrencyArg2Out), GetCurrencyValue(CurrencyArg3Out)
  2031. ], GetCurrencyValue(CurrencyRes));
  2032. end;
  2033. procedure TTestInvokeProcVars.Test18;
  2034. begin
  2035. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest18), TypeInfo(TProcVarTest18), 18, [
  2036. GetSingleValue(SingleAddArg1), GetSingleValue(SingleAddArg2), GetSingleValue(SingleAddArg3), GetSingleValue(SingleAddArg4), GetSingleValue(SingleAddArg5),
  2037. GetSingleValue(SingleAddArg6), GetSingleValue(SingleAddArg7), GetSingleValue(SingleAddArg8), GetSingleValue(SingleAddArg9), GetSingleValue(SingleAddArg10)
  2038. ], [], GetSingleValue(SingleAddRes));
  2039. end;
  2040. procedure TTestInvokeProcVars.Test19;
  2041. begin
  2042. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest19), TypeInfo(TProcVarTest19), 19, [
  2043. GetDoubleValue(DoubleAddArg1), GetDoubleValue(DoubleAddArg2), GetDoubleValue(DoubleAddArg3), GetDoubleValue(DoubleAddArg4), GetDoubleValue(DoubleAddArg5),
  2044. GetDoubleValue(DoubleAddArg6), GetDoubleValue(DoubleAddArg7), GetDoubleValue(DoubleAddArg8), GetDoubleValue(DoubleAddArg9), GetDoubleValue(DoubleAddArg10)
  2045. ], [], GetDoubleValue(DoubleAddRes));
  2046. end;
  2047. procedure TTestInvokeProcVars.Test20;
  2048. begin
  2049. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest20), TypeInfo(TProcVarTest20), 20, [
  2050. GetExtendedValue(ExtendedAddArg1), GetExtendedValue(ExtendedAddArg2), GetExtendedValue(ExtendedAddArg3), GetExtendedValue(ExtendedAddArg4), GetExtendedValue(ExtendedAddArg5),
  2051. GetExtendedValue(ExtendedAddArg6), GetExtendedValue(ExtendedAddArg7), GetExtendedValue(ExtendedAddArg8), GetExtendedValue(ExtendedAddArg9), GetExtendedValue(ExtendedAddArg10)
  2052. ], [], GetExtendedValue(ExtendedAddRes));
  2053. end;
  2054. procedure TTestInvokeProcVars.Test21;
  2055. begin
  2056. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest21), TypeInfo(TProcVarTest21), 21, [
  2057. GetCompValue(CompAddArg1), GetCompValue(CompAddArg2), GetCompValue(CompAddArg3), GetCompValue(CompAddArg4), GetCompValue(CompAddArg5),
  2058. GetCompValue(CompAddArg6), GetCompValue(CompAddArg7), GetCompValue(CompAddArg8), GetCompValue(CompAddArg9), GetCompValue(CompAddArg10)
  2059. ], [], GetCompValue(CompAddRes));
  2060. end;
  2061. procedure TTestInvokeProcVars.Test22;
  2062. begin
  2063. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest22), TypeInfo(TProcVarTest22), 22, [
  2064. GetCurrencyValue(CurrencyAddArg1), GetCurrencyValue(CurrencyAddArg2), GetCurrencyValue(CurrencyAddArg3), GetCurrencyValue(CurrencyAddArg4), GetCurrencyValue(CurrencyAddArg5),
  2065. GetCurrencyValue(CurrencyAddArg6), GetCurrencyValue(CurrencyAddArg7), GetCurrencyValue(CurrencyAddArg8), GetCurrencyValue(CurrencyAddArg9), GetCurrencyValue(CurrencyAddArg10)
  2066. ], [], GetCurrencyValue(CurrencyAddRes));
  2067. end;
  2068. { ----------------------------------------------------------------------
  2069. TTestInvokeProcVarRecs
  2070. ----------------------------------------------------------------------}
  2071. procedure TTestInvokeProcVarRecs.Test1;
  2072. begin
  2073. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize1), TypeInfo(TProcVarTestRecSize1), 1 or TTestInterfaceClass.RecSizeMarker,
  2074. [GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),False)], [],
  2075. GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),True));
  2076. end;
  2077. procedure TTestInvokeProcVarRecs.Test2;
  2078. begin
  2079. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize2), TypeInfo(TProcVarTestRecSize2), 2 or TTestInterfaceClass.RecSizeMarker,
  2080. [GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),False)], [],
  2081. GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),True));
  2082. end;
  2083. procedure TTestInvokeProcVarRecs.Test3;
  2084. begin
  2085. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize3), TypeInfo(TProcVarTestRecSize3), 3 or TTestInterfaceClass.RecSizeMarker,
  2086. [GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),False)], [],
  2087. GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),True));
  2088. end;
  2089. procedure TTestInvokeProcVarRecs.Test4;
  2090. begin
  2091. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize4), TypeInfo(TProcVarTestRecSize4), 4 or TTestInterfaceClass.RecSizeMarker,
  2092. [GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),False)], [],
  2093. GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),True));
  2094. end;
  2095. procedure TTestInvokeProcVarRecs.Test5;
  2096. begin
  2097. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize5), TypeInfo(TProcVarTestRecSize5), 5 or TTestInterfaceClass.RecSizeMarker,
  2098. [GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),False)], [],
  2099. GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),True));
  2100. end;
  2101. procedure TTestInvokeProcVarRecs.Test6;
  2102. begin
  2103. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize6), TypeInfo(TProcVarTestRecSize6), 6 or TTestInterfaceClass.RecSizeMarker,
  2104. [GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),False)], [],
  2105. GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),True));
  2106. end;
  2107. procedure TTestInvokeProcVarRecs.Test7;
  2108. begin
  2109. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize7), TypeInfo(TProcVarTestRecSize7), 7 or TTestInterfaceClass.RecSizeMarker,
  2110. [GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),False)], [],
  2111. GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),True));
  2112. end;
  2113. procedure TTestInvokeProcVarRecs.Test8;
  2114. begin
  2115. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize8), TypeInfo(TProcVarTestRecSize8), 8 or TTestInterfaceClass.RecSizeMarker,
  2116. [GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),False)], [],
  2117. GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),True));
  2118. end;
  2119. procedure TTestInvokeProcVarRecs.Test9;
  2120. begin
  2121. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize9), TypeInfo(TProcVarTestRecSize9), 9 or TTestInterfaceClass.RecSizeMarker,
  2122. [GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),False)], [],
  2123. GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),True));
  2124. end;
  2125. procedure TTestInvokeProcVarRecs.Test10;
  2126. begin
  2127. DoProcVarInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize10), TypeInfo(TProcVarTestRecSize10), 10 or TTestInterfaceClass.RecSizeMarker,
  2128. [GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),False)], [],
  2129. GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),True));
  2130. end;
  2131. { TTestInvokeTestProc }
  2132. procedure TTestInvokeTestProc.Test1;
  2133. begin
  2134. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest1),TypeInfo(TProcVarTest1), 1, [], [], TValue.Empty);
  2135. end;
  2136. procedure TTestInvokeTestProc.Test2;
  2137. begin
  2138. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest2),TypeInfo(TProcVarTest2), 2, [], [], GetIntValue(42));
  2139. end;
  2140. procedure TTestInvokeTestProc.Test3;
  2141. begin
  2142. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest3),TypeInfo(TProcVarTest3), 3, [
  2143. GetIntValue(7), GetIntValue(2), GetIntValue(5), GetIntValue(1), GetIntValue(10), GetIntValue(8), GetIntValue(6), GetIntValue(3), GetIntValue(9), GetIntValue(3)
  2144. ], [], GetIntValue(42));
  2145. end;
  2146. procedure TTestInvokeTestProc.Test4;
  2147. begin
  2148. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest4),TypeInfo(TProcVarTest4), 4, [
  2149. GetAnsiString('Alpha'),
  2150. GetUnicodeString('Beta'),
  2151. GetWideString('Gamma'),
  2152. GetShortString('Delta')
  2153. ], [], TValue.Empty);
  2154. end;
  2155. procedure TTestInvokeTestProc.Test5;
  2156. begin
  2157. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest5),TypeInfo(TProcVarTest5), 5, [], [], GetAnsiString('Hello World'));
  2158. end;
  2159. procedure TTestInvokeTestProc.Test6;
  2160. begin
  2161. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest6),TypeInfo(TProcVarTest6), 6, [], [], GetUnicodeString('Hello World'));
  2162. end;
  2163. procedure TTestInvokeTestProc.Test7;
  2164. begin
  2165. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest7),TypeInfo(TProcVarTest7), 7, [], [], GetWideString('Hello World'));
  2166. end;
  2167. procedure TTestInvokeTestProc.Test8;
  2168. begin
  2169. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest8),TypeInfo(TProcVarTest8), 8, [], [], GetShortString('Hello World'));
  2170. end;
  2171. {$ifdef NEEDS_POINTER_HELPER}
  2172. procedure TTestInvokeTestProc.Test9;
  2173. begin
  2174. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest9),TypeInfo(TProcVarTest9), 9, [
  2175. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  2176. ], [
  2177. GetIntValue($1234), GetIntValue($5678)
  2178. ], TValue.Empty);
  2179. end;
  2180. procedure TTestInvokeTestProc.Test10;
  2181. begin
  2182. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest10),TypeInfo(TProcVarTest10), 10, [
  2183. GetAnsiString('Alpha'), GetAnsiString('Beta'), GetAnsiString(''), GetAnsiString('Delta')
  2184. ], [
  2185. GetAnsiString('Foo'), GetAnsiString('Bar')
  2186. ], TValue.Empty);
  2187. end;
  2188. procedure TTestInvokeTestProc.Test11;
  2189. begin
  2190. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest11),TypeInfo(TProcVarTest11), 11, [
  2191. GetShortString('Alpha'), GetShortString('Beta'), GetShortString(''), GetShortString('Delta')
  2192. ], [
  2193. GetShortString('Foo'), GetShortString('Bar')
  2194. ], TValue.Empty);
  2195. end;
  2196. procedure TTestInvokeTestProc.Test12;
  2197. begin
  2198. {$ifdef fpc}
  2199. DoProcInvoke(CodePointer({$ifdef fpc}@{$endif}ProcTest12),TypeInfo(TProcVarTest12), 12, [
  2200. GetArray([$1234, $2345, $3456, $4567]), GetArray([$4321, $5431, $6543, $7654]), GetArray([$5678, $6789, $7890, $8901]), GetArray([$8765, $7654, $6543, $5432])
  2201. ], [
  2202. GetArray([$4321, $4322, $4323, $4324]), GetArray([$9876, $9877, $9878, $9879])
  2203. ], TValue.Empty);
  2204. {$endif}
  2205. end;
  2206. procedure TTestInvokeTestProc.Test13;
  2207. begin
  2208. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest13),TypeInfo(TProcVarTest13), 13, [
  2209. GetSingleValue(SingleArg1), GetSingleValue(SingleArg2In), GetSingleValue(0), GetSingleValue(SingleArg4)
  2210. ], [
  2211. GetSingleValue(SingleArg2Out), GetSingleValue(SingleArg3Out)
  2212. ], GetSingleValue(SingleRes));
  2213. end;
  2214. procedure TTestInvokeTestProc.Test14;
  2215. begin
  2216. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest14),TypeInfo(TProcVarTest14), 14, [
  2217. GetDoubleValue(DoubleArg1), GetDoubleValue(DoubleArg2In), GetDoubleValue(0), GetDoubleValue(DoubleArg4)
  2218. ], [
  2219. GetDoubleValue(DoubleArg2Out), GetDoubleValue(DoubleArg3Out)
  2220. ], GetDoubleValue(DoubleRes));
  2221. end;
  2222. procedure TTestInvokeTestProc.Test15;
  2223. begin
  2224. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest15),TypeInfo(TProcVarTest15), 15, [
  2225. GetExtendedValue(ExtendedArg1), GetExtendedValue(ExtendedArg2In), GetExtendedValue(0), GetExtendedValue(ExtendedArg4)
  2226. ], [
  2227. GetExtendedValue(ExtendedArg2Out), GetExtendedValue(ExtendedArg3Out)
  2228. ], GetExtendedValue(ExtendedRes));
  2229. end;
  2230. procedure TTestInvokeTestProc.Test16;
  2231. begin
  2232. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest16),TypeInfo(TProcVarTest16), 16, [
  2233. GetCompValue(CompArg1), GetCompValue(CompArg2In), GetCompValue(0), GetCompValue(CompArg4)
  2234. ], [
  2235. GetCompValue(CompArg2Out), GetCompValue(CompArg3Out)
  2236. ], GetCompValue(CompRes));
  2237. end;
  2238. procedure TTestInvokeTestProc.Test17;
  2239. begin
  2240. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest17),TypeInfo(TProcVarTest17), 17, [
  2241. GetCurrencyValue(CurrencyArg1), GetCurrencyValue(CurrencyArg2In), GetCurrencyValue(0), GetCurrencyValue(CurrencyArg4)
  2242. ], [
  2243. GetCurrencyValue(CurrencyArg2Out), GetCurrencyValue(CurrencyArg3Out)
  2244. ], GetCurrencyValue(CurrencyRes));
  2245. end;
  2246. {$endif NEEDS_POINTER_HELPER}
  2247. procedure TTestInvokeTestProc.Test18;
  2248. begin
  2249. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest18),TypeInfo(TProcVarTest18), 18, [
  2250. GetSingleValue(SingleAddArg1), GetSingleValue(SingleAddArg2), GetSingleValue(SingleAddArg3), GetSingleValue(SingleAddArg4), GetSingleValue(SingleAddArg5),
  2251. GetSingleValue(SingleAddArg6), GetSingleValue(SingleAddArg7), GetSingleValue(SingleAddArg8), GetSingleValue(SingleAddArg9), GetSingleValue(SingleAddArg10)
  2252. ], [], GetSingleValue(SingleAddRes));
  2253. end;
  2254. procedure TTestInvokeTestProc.Test19;
  2255. begin
  2256. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest19),TypeInfo(TProcVarTest19), 19, [
  2257. GetDoubleValue(DoubleAddArg1), GetDoubleValue(DoubleAddArg2), GetDoubleValue(DoubleAddArg3), GetDoubleValue(DoubleAddArg4), GetDoubleValue(DoubleAddArg5),
  2258. GetDoubleValue(DoubleAddArg6), GetDoubleValue(DoubleAddArg7), GetDoubleValue(DoubleAddArg8), GetDoubleValue(DoubleAddArg9), GetDoubleValue(DoubleAddArg10)
  2259. ], [], GetDoubleValue(DoubleAddRes));
  2260. end;
  2261. procedure TTestInvokeTestProc.Test20;
  2262. begin
  2263. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest20),TypeInfo(TProcVarTest20), 20, [
  2264. GetExtendedValue(ExtendedAddArg1), GetExtendedValue(ExtendedAddArg2), GetExtendedValue(ExtendedAddArg3), GetExtendedValue(ExtendedAddArg4), GetExtendedValue(ExtendedAddArg5),
  2265. GetExtendedValue(ExtendedAddArg6), GetExtendedValue(ExtendedAddArg7), GetExtendedValue(ExtendedAddArg8), GetExtendedValue(ExtendedAddArg9), GetExtendedValue(ExtendedAddArg10)
  2266. ], [], GetExtendedValue(ExtendedAddRes));
  2267. end;
  2268. procedure TTestInvokeTestProc.Test21;
  2269. begin
  2270. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest21),TypeInfo(TProcVarTest21), 21, [
  2271. GetCompValue(CompAddArg1), GetCompValue(CompAddArg2), GetCompValue(CompAddArg3), GetCompValue(CompAddArg4), GetCompValue(CompAddArg5),
  2272. GetCompValue(CompAddArg6), GetCompValue(CompAddArg7), GetCompValue(CompAddArg8), GetCompValue(CompAddArg9), GetCompValue(CompAddArg10)
  2273. ], [], GetCompValue(CompAddRes));
  2274. end;
  2275. procedure TTestInvokeTestProc.Test22;
  2276. begin
  2277. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTest22),TypeInfo(TProcVarTest22), 22, [
  2278. GetCurrencyValue(CurrencyAddArg1), GetCurrencyValue(CurrencyAddArg2), GetCurrencyValue(CurrencyAddArg3), GetCurrencyValue(CurrencyAddArg4), GetCurrencyValue(CurrencyAddArg5),
  2279. GetCurrencyValue(CurrencyAddArg6), GetCurrencyValue(CurrencyAddArg7), GetCurrencyValue(CurrencyAddArg8), GetCurrencyValue(CurrencyAddArg9), GetCurrencyValue(CurrencyAddArg10)
  2280. ], [], GetCurrencyValue(CurrencyAddRes));
  2281. end;
  2282. { TTestInvokeTestProcRecs }
  2283. procedure TTestInvokeTestProcRecs.Test1;
  2284. begin
  2285. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize1),TypeInfo(TProcVarTestRecSize1), 1 or TTestInterfaceClass.RecSizeMarker,
  2286. [GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),False)], [],
  2287. GetRecValue(TypeInfo(TTestRecord1),SizeOf(TTestRecord1),True));
  2288. end;
  2289. procedure TTestInvokeTestProcRecs.Test2;
  2290. begin
  2291. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize2),TypeInfo(TProcVarTestRecSize2), 2 or TTestInterfaceClass.RecSizeMarker,
  2292. [GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),False)], [],
  2293. GetRecValue(TypeInfo(TTestRecord2),SizeOf(TTestRecord2),True));
  2294. end;
  2295. procedure TTestInvokeTestProcRecs.Test3;
  2296. begin
  2297. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize3),TypeInfo(TProcVarTestRecSize3), 3 or TTestInterfaceClass.RecSizeMarker,
  2298. [GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),False)], [],
  2299. GetRecValue(TypeInfo(TTestRecord3),SizeOf(TTestRecord3),True));
  2300. end;
  2301. procedure TTestInvokeTestProcRecs.Test4;
  2302. begin
  2303. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize4),TypeInfo(TProcVarTestRecSize4), 4 or TTestInterfaceClass.RecSizeMarker,
  2304. [GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),False)], [],
  2305. GetRecValue(TypeInfo(TTestRecord4),SizeOf(TTestRecord4),True));
  2306. end;
  2307. procedure TTestInvokeTestProcRecs.Test5;
  2308. begin
  2309. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize5),TypeInfo(TProcVarTestRecSize5), 5 or TTestInterfaceClass.RecSizeMarker,
  2310. [GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),False)], [],
  2311. GetRecValue(TypeInfo(TTestRecord5),SizeOf(TTestRecord5),True));
  2312. end;
  2313. procedure TTestInvokeTestProcRecs.Test6;
  2314. begin
  2315. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize6),TypeInfo(TProcVarTestRecSize6), 6 or TTestInterfaceClass.RecSizeMarker,
  2316. [GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),False)], [],
  2317. GetRecValue(TypeInfo(TTestRecord6),SizeOf(TTestRecord6),True));
  2318. end;
  2319. procedure TTestInvokeTestProcRecs.Test7;
  2320. begin
  2321. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize7),TypeInfo(TProcVarTestRecSize7), 7 or TTestInterfaceClass.RecSizeMarker,
  2322. [GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),False)], [],
  2323. GetRecValue(TypeInfo(TTestRecord7),SizeOf(TTestRecord7),True));
  2324. end;
  2325. procedure TTestInvokeTestProcRecs.Test8;
  2326. begin
  2327. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize8),TypeInfo(TProcVarTestRecSize8), 8 or TTestInterfaceClass.RecSizeMarker,
  2328. [GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),False)], [],
  2329. GetRecValue(TypeInfo(TTestRecord8),SizeOf(TTestRecord8),True));
  2330. end;
  2331. procedure TTestInvokeTestProcRecs.Test9;
  2332. begin
  2333. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize9),TypeInfo(TProcVarTestRecSize9), 9 or TTestInterfaceClass.RecSizeMarker,
  2334. [GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),False)], [],
  2335. GetRecValue(TypeInfo(TTestRecord9),SizeOf(TTestRecord9),True));
  2336. end;
  2337. procedure TTestInvokeTestProcRecs.Test10;
  2338. begin
  2339. DoProcInvoke(CodePointer( {$ifdef fpc}@{$endif}ProcTestRecSize10),TypeInfo(TProcVarTestRecSize10), 10 or TTestInterfaceClass.RecSizeMarker,
  2340. [GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),False)], [],
  2341. GetRecValue(TypeInfo(TTestRecord10),SizeOf(TTestRecord10),True));
  2342. end;
  2343. { TTestInvokeUntyped }
  2344. procedure TTestInvokeUntyped.Test1;
  2345. begin
  2346. DoUntypedInvoke(CodePointer(Nil), Default(TMethod), PTypeInfo(Nil), [
  2347. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  2348. ], [
  2349. GetIntValue($4321), GetIntValue($5678)
  2350. ]);
  2351. end;
  2352. procedure TTestInvokeUntyped.Test2;
  2353. begin
  2354. DoUntypedInvoke(CodePointer(Nil), Default(TMethod), PTypeInfo(Nil), [
  2355. GetAnsiString('Str1'),
  2356. GetAnsiString('Str2'),
  2357. GetAnsiString('Str3'),
  2358. GetAnsiString('Str4')
  2359. ], [
  2360. GetAnsiString('StrVar'),
  2361. GetAnsiString('StrOut')
  2362. ]);
  2363. end;
  2364. procedure TTestInvokeUntyped.Test3;
  2365. begin
  2366. DoUntypedInvoke(CodePointer(Nil), Default(TMethod), PTypeInfo(Nil), [
  2367. GetShortString('Str1'),
  2368. GetShortString('Str2'),
  2369. GetShortString('Str3'),
  2370. GetShortString('Str4')
  2371. ], [
  2372. GetShortString('StrVar'),
  2373. GetShortString('StrOut')
  2374. ]);
  2375. end;
  2376. procedure TTestInvokeUntyped.Test4;
  2377. begin
  2378. DoUntypedInvoke(Nil, TMethod({$ifdef fpc}@{$endif}cls.TestUntyped), TypeInfo(TMethodTestUntyped), [
  2379. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  2380. ], [
  2381. GetIntValue($4321), GetIntValue($5678)
  2382. ]);
  2383. end;
  2384. procedure TTestInvokeUntyped.Test5;
  2385. begin
  2386. DoUntypedInvoke(Nil, TMethod({$ifdef fpc}@{$endif}cls.TestUntyped), TypeInfo(TMethodTestUntyped), [
  2387. GetAnsiString('Str1'),
  2388. GetAnsiString('Str2'),
  2389. GetAnsiString('Str3'),
  2390. GetAnsiString('Str4')
  2391. ], [
  2392. GetAnsiString('StrVar'),
  2393. GetAnsiString('StrOut')
  2394. ]);
  2395. end;
  2396. procedure TTestInvokeUntyped.Test6;
  2397. begin
  2398. DoUntypedInvoke(Nil, TMethod({$ifdef fpc}@{$endif}cls.TestUntyped), TypeInfo(TMethodTestUntyped), [
  2399. GetShortString('Str1'),
  2400. GetShortString('Str2'),
  2401. GetShortString('Str3'),
  2402. GetShortString('Str4')
  2403. ], [
  2404. GetShortString('StrVar'),
  2405. GetShortString('StrOut')
  2406. ]);
  2407. end;
  2408. procedure TTestInvokeUntyped.Test7;
  2409. begin
  2410. DoUntypedInvoke({$ifdef fpc}@{$endif}ProcTestUntyped, Default(TMethod), TypeInfo(TProcVarTestUntyped), [
  2411. GetIntValue($1234), GetIntValue($4321), GetIntValue($8765), GetIntValue($5678)
  2412. ], [
  2413. GetIntValue($4321), GetIntValue($5678)
  2414. ]);
  2415. end;
  2416. procedure TTestInvokeUntyped.Test8;
  2417. begin
  2418. DoUntypedInvoke({$ifdef fpc}@{$endif}ProcTestUntyped, Default(TMethod), TypeInfo(TProcVarTestUntyped), [
  2419. GetAnsiString('Str1'),
  2420. GetAnsiString('Str2'),
  2421. GetAnsiString('Str3'),
  2422. GetAnsiString('Str4')
  2423. ], [
  2424. GetAnsiString('StrVar'),
  2425. GetAnsiString('StrOut')
  2426. ]);
  2427. end;
  2428. procedure TTestInvokeUntyped.Test9;
  2429. begin
  2430. DoUntypedInvoke({$ifdef fpc}@{$endif}ProcTestUntyped, Default(TMethod), TypeInfo(TProcVarTestUntyped), [
  2431. GetShortString('Str1'),
  2432. GetShortString('Str2'),
  2433. GetShortString('Str3'),
  2434. GetShortString('Str4')
  2435. ], [
  2436. GetShortString('StrVar'),
  2437. GetShortString('StrOut')
  2438. ]);
  2439. end;
  2440. { TTestInvokeInstanceMethods }
  2441. function TTestInvokeInstanceMethods.CreateClass(C : TClass) : TObject;
  2442. var
  2443. t: TRttiType;
  2444. m: TRttiMethod;
  2445. V : TValue;
  2446. IT : ITestMethodCall;
  2447. begin
  2448. t := FCtx.GetType(C);
  2449. CheckNotNull(T,'No type info');
  2450. M := T.GetMethod('create');
  2451. CheckNotNull(M,'No method info');
  2452. IT:=TTest.Create;
  2453. Result:=C.NewInstance;
  2454. {$IFDEF FPC}
  2455. TValue.Make(@IT,TypeInfo(ITestMethodCall),V);
  2456. {$ELSE}
  2457. TValue.Make<ITestMethodCall>(IT,V);
  2458. {$ENDIF}
  2459. M.Invoke(Result,[V]);
  2460. end;
  2461. procedure TTestInvokeInstanceMethods.SetUp;
  2462. begin
  2463. inherited SetUp;
  2464. FCtx:=TRttiContext.Create(False);
  2465. end;
  2466. procedure TTestInvokeInstanceMethods.TearDown;
  2467. begin
  2468. FCtx.Free;
  2469. inherited TearDown;
  2470. end;
  2471. procedure TTestInvokeInstanceMethods.TestInvokeConstructor;
  2472. var
  2473. O : TObject;
  2474. P : TTestParent;
  2475. S : TTestConstructorCall;
  2476. begin
  2477. O:=CreateClass(TTestConstructorCall);
  2478. CheckEquals(TTestConstructorCall,O.ClassType,'Correct class');
  2479. S:=O as TTestConstructorCall;
  2480. CheckEquals('In test',S.DoTest,'Correct result when called as correctly typed class');
  2481. P:=O as TTestParent;
  2482. CheckEquals('In test',P.DoTest,'Correct result when called as parent class');
  2483. end;
  2484. { TTestRecordMethodInvoke }
  2485. procedure TTestRecordMethodInvoke.SetUp;
  2486. begin
  2487. inherited SetUp;
  2488. Fctx:=TRttiContext.Create(False);
  2489. recType:=FCtx.GetType(TypeInfo(TTestAttr2Record));
  2490. testRec:=Default(TTestAttr2Record);
  2491. testRec2:=Default(TTestAttr2Record);
  2492. tv_rec:=Default(TValue);
  2493. end;
  2494. procedure TTestRecordMethodInvoke.TearDown;
  2495. begin
  2496. inherited TearDown;
  2497. end;
  2498. procedure TTestRecordMethodInvoke.TestCreate;
  2499. begin
  2500. testRec.fa:=60;
  2501. testRec.fa2:=80;
  2502. testRec.fa3:=90;
  2503. TValue.Make(@testRec, TypeInfo(TTestAttr2Record), tv_rec);
  2504. testRec2 := TTestAttr2Record(recType.GetMethods('Create')[0].Invoke(tv_rec, [111, 222]).GetReferenceToRawData^);
  2505. AssertTrue( 'Original TTestRecord is broken', (testRec.fa = 60) and (testRec.fa2 = 80));
  2506. AssertTrue( 'New TTestRecord is incorrect', (testRec2.fa = 111) and (testRec2.fa2 = 222));
  2507. end;
  2508. procedure TTestRecordMethodInvoke.TestCreate2;
  2509. begin
  2510. testRec.fa:=60;
  2511. testRec.fa2:=80;
  2512. testRec.fa3:=90;
  2513. recType.GetMethod('Create').Invoke(@testRec, [333, 444]);
  2514. AssertTrue('Updated TTestRecord is incorrect',(testRec.fa = 333) and (testRec.fa2 = 444) and (testRec.fa3 = 90));
  2515. end;
  2516. procedure TTestRecordMethodInvoke.TestCreate3;
  2517. begin
  2518. testRec.fa:=111;
  2519. testRec.fa2:=222;
  2520. TValue.Make(@testRec, TypeInfo(TTestAttr2Record), tv_rec);
  2521. testRec := TTestAttr2Record(recType.GetMethods('Create')[1].Invoke(TValue.Empty, [tv_rec]).GetReferenceToRawData^);
  2522. AssertTrue('Created from nothing TTestRecord is incorrect', (testRec.fa = 111) and (testRec.fa2 = 222));
  2523. end;
  2524. procedure TTestRecordMethodInvoke.TestCreate4;
  2525. begin
  2526. testRec.fa:=111;
  2527. testRec.fa2:=222;
  2528. TValue.Make(@testRec, TypeInfo(TTestAttr2Record), tv_rec);
  2529. testRec := TTestAttr2Record(recType.GetMethods('Create')[1].Invoke(@testRec, [tv_rec]).GetReferenceToRawData^);
  2530. // tv_rec was modified by reference by the first constructor
  2531. AssertTrue( 'Created from nothing TTestRecord is incorrect',(testRec.fa = 111) and (testRec.fa2 = 222));
  2532. end;
  2533. procedure TTestRecordMethodInvoke.TestOffset1;
  2534. begin
  2535. testRec.fa:=111;
  2536. testRec.fa2:=222;
  2537. AssertTrue('Result of Offset in incorrect (by pointer)',recType.GetMethod('Offset').Invoke(@testRec, [12, 15]).AsInteger = 360);
  2538. AssertTrue('Offset of original TTestRecord is incorrect (by pointer)',(testRec.fa = 123) and (testRec.fa2 = 237));
  2539. end;
  2540. procedure TTestRecordMethodInvoke.TestOffset2;
  2541. begin
  2542. testRec.fa:=111;
  2543. testRec.fa2:=222;
  2544. TValue.Make(@testRec, TypeInfo(TTestAttr2Record), tv_rec);
  2545. AssertTrue('Result of Offset in incorrect (by TValue)',recType.GetMethod('Offset').Invoke(tv_rec, [12, 15]).AsInteger = 360);
  2546. end;
  2547. procedure TTestRecordMethodInvoke.TestStaticFunc;
  2548. var
  2549. pnt: TPoint;
  2550. rect: TRect;
  2551. tvp, tvr, exp: TValue;
  2552. begin
  2553. pnt := TPoint.Create(45, 89);
  2554. rect := TRect.Create(19, 28, 37, 26);
  2555. TValue.Make(@pnt, TypeInfo(TPoint), tvp);
  2556. TValue.Make(@rect, TypeInfo(TRect), tvr);
  2557. AssertEquals('Static call with string return is incorrect','experiment_460_45_89_19_28_37_26',recType.GetMethod('StaticFunc').Invoke(TValue.Empty, [460, tvp, tvr]).AsString);
  2558. end;
  2559. begin
  2560. {$ifdef fpc}
  2561. RegisterTest(TTestInvoke);
  2562. RegisterTest(TTestInvokeIntfMethods);
  2563. RegisterTest(TTestInvokeIntfMethodsRecs);
  2564. RegisterTest(TTestInvokeMethodVars);
  2565. RegisterTest(TTestInvokeMethodVarsRecs);
  2566. RegisterTest(TTestInvokeProcVars);
  2567. RegisterTest(TTestInvokeProcVarRecs);
  2568. RegisterTest(TTestInvokeTestProc);
  2569. RegisterTest(TTestInvokeTestProcRecs);
  2570. RegisterTest(TTestInvokeUntyped);
  2571. RegisterTest(TTestInvokeInstanceMethods);
  2572. RegisterTest(TTestRecordMethodInvoke);
  2573. {$else fpc}
  2574. RegisterTest(TTestInvoke.Suite);
  2575. RegisterTest(TTestInvokeIntfMethods.Suite);
  2576. RegisterTest(TTestInvokeIntfMethodsRecs.Suite);
  2577. RegisterTest(TTestInvokeMethodVars.Suite);
  2578. RegisterTest(TTestInvokeMethodVarsRecs.Suite);
  2579. RegisterTest(TTestInvokeProcVars.Suite);
  2580. RegisterTest(TTestInvokeProcVarRecs.Suite);
  2581. RegisterTest(TTestInvokeTestProc.Suite);
  2582. RegisterTest(TTestInvokeTestProcRecs.Suite);
  2583. RegisterTest(TTestInvokeUntyped.Suite);
  2584. RegisterTest(TTestInvokeInstanceMethods.Suite);
  2585. {$endif fpc}
  2586. end.