tests.inc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. /**--------------------------------------------------------------------------**\
  2. ===================================
  3. y_inline - PAWN inline functions.
  4. ===================================
  5. Description:
  6. This library allows a user to write inline functions in their script. It
  7. first detects all inline functions and generates data on them, such as
  8. parameter counts and addresses. When an inline function is passed in code
  9. its current context data is stored. Finally, when an inline function is
  10. found to be called at some point its current local stack is stored in global
  11. memory. When the function actually is called, the stack is restored, and
  12. additional parameters which are the inline function parameters, are passed.
  13. Legal:
  14. Version: MPL 1.1
  15. The contents of this file are subject to the Mozilla Public License Version
  16. 1.1 (the "License"); you may not use this file except in compliance with
  17. the License. You may obtain a copy of the License at
  18. http://www.mozilla.org/MPL/
  19. Software distributed under the License is distributed on an "AS IS" basis,
  20. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  21. for the specific language governing rights and limitations under the
  22. License.
  23. The Original Code is the YSI Inline Function include.
  24. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  25. Portions created by the Initial Developer are Copyright (C) 2011
  26. the Initial Developer. All Rights Reserved.
  27. Contributors:
  28. ZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice
  29. Thanks:
  30. JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
  31. ZeeX - Very productive conversations.
  32. koolk - IsPlayerinAreaEx code.
  33. TheAlpha - Danish translation.
  34. breadfish - German translation.
  35. Fireburn - Dutch translation.
  36. yom - French translation.
  37. 50p - Polish translation.
  38. Zamaroht - Spanish translation.
  39. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
  40. for me to strive to better.
  41. Pixels^ - Running XScripters where the idea was born.
  42. Matite - Pestering me to release it and using it.
  43. Very special thanks to:
  44. Thiadmer - PAWN, whose limits continue to amaze me!
  45. Kye/Kalcor - SA:MP.
  46. SA:MP Team past, present and future - SA:MP.
  47. Version:
  48. 1.0
  49. Changelog:
  50. 22/06/13:
  51. Rewrote the library from scratch for better performance all round.
  52. 20/10/12:
  53. Fixed a bug with "Callback_Release" with public functions.
  54. 15/11/11:
  55. Changed the precedence of "using" types.
  56. 19/09/11:
  57. First version
  58. \**--------------------------------------------------------------------------**/
  59. static stock bool:y_inline_Get(callback:c, ret[E_CALLBACK_DATA], f[] = "")
  60. {
  61. return Callback_Get(c, ret, f);
  62. }
  63. static stock bool:y_inline_Restore(ret[E_CALLBACK_DATA])
  64. {
  65. Callback_Restore(ret);
  66. }
  67. Test:y_inline1()
  68. {
  69. new
  70. cc[E_CALLBACK_DATA];
  71. inline func()
  72. {
  73. @return 42;
  74. }
  75. //printf("%d %d %d %d %d", func[0], func[1], func[2], func[3], func[4]);
  76. y_inline_Get(using inline func, cc);
  77. ASSERT(Callback_Call(cc) == 42);
  78. Callback_Release(cc);
  79. }
  80. Test:y_inline2()
  81. {
  82. new
  83. cc[E_CALLBACK_DATA];
  84. inline func(a)
  85. {
  86. @return a;
  87. }
  88. y_inline_Get(using inline func, cc);
  89. ASSERT(Callback_Call(cc, 50) == 50);
  90. Callback_Release(cc);
  91. }
  92. Test:y_inline3()
  93. {
  94. new
  95. cc[E_CALLBACK_DATA],
  96. r = 100;
  97. inline func(&r2)
  98. {
  99. #pragma unused r2
  100. r2 = 99;
  101. }
  102. y_inline_Get(using inline func, cc);
  103. Callback_Call(cc, r);
  104. ASSERT(r == 99);
  105. Callback_Release(cc);
  106. }
  107. Test:y_inline4()
  108. {
  109. new
  110. cc[E_CALLBACK_DATA],
  111. r = 100;
  112. inline func(&r2)
  113. {
  114. #pragma unused r2
  115. r = 99;
  116. }
  117. y_inline_Get(using inline func, cc);
  118. Callback_Call(cc, r);
  119. ASSERT(r == 100);
  120. Callback_Release(cc);
  121. }
  122. Test:y_inline5()
  123. {
  124. new
  125. cc[E_CALLBACK_DATA];
  126. inline func(a, b, c, d)
  127. {
  128. ASSERT(a == 1);
  129. ASSERT(b == 11);
  130. ASSERT(c == 111);
  131. ASSERT(d == 1111);
  132. }
  133. y_inline_Get(using inline func, cc);
  134. Callback_Call(cc, 1, 11, 111, 1111);
  135. Callback_Release(cc);
  136. }
  137. Test:y_inline6()
  138. {
  139. new
  140. cc[E_CALLBACK_DATA];
  141. inline func(string:g[])
  142. {
  143. #if !(sizeof (g) == YSI_MAX_STRING))
  144. #error sizeof (g) != YSI_MAX_STRING
  145. #endif
  146. ASSERT(!strcmp(g, "hello"));
  147. }
  148. y_inline_Get(using inline func, cc);
  149. Callback_Call(cc, "hello");
  150. Callback_Release(cc);
  151. }
  152. forward y_inline7a();
  153. public y_inline7a()
  154. {
  155. inline func7a()
  156. {
  157. }
  158. }
  159. Test:y_inline7b()
  160. {
  161. new
  162. cc[E_CALLBACK_DATA];
  163. inline func7b()
  164. {
  165. }
  166. ASSERT(y_inline_Get(using func7a, cc) == false);
  167. ASSERT(y_inline_Get(using func7b, cc));
  168. Callback_Release(cc);
  169. ASSERT(y_inline_Get(using public y_inline7a, cc));
  170. Callback_Release(cc);
  171. ASSERT(y_inline_Get(callback_tag:"func7b", cc));
  172. Callback_Release(cc);
  173. ASSERT(y_inline_Get(callback_tag:"y_inline7a", cc));
  174. Callback_Release(cc);
  175. }
  176. Test:y_inline8()
  177. {
  178. for (new i = 2; i--; )
  179. {
  180. new
  181. cc[E_CALLBACK_DATA];
  182. if (i)
  183. {
  184. inline func8b()
  185. {
  186. }
  187. }
  188. if (!i)
  189. {
  190. ASSERT(y_inline_Get(using func8a, cc) == false);
  191. ASSERT(y_inline_Get(using func8b, cc));
  192. Callback_Release(cc);
  193. ASSERT(y_inline_Get(using public y_inline8, cc) == false);
  194. Callback_Release(cc);
  195. }
  196. if (i)
  197. {
  198. inline func8a()
  199. {
  200. }
  201. }
  202. }
  203. }
  204. forward y_inline9(a);
  205. public y_inline9(a)
  206. {
  207. return 12345 + a;
  208. }
  209. Test:y_inline9()
  210. {
  211. new
  212. cc[E_CALLBACK_DATA];
  213. ASSERT(y_inline_Get(using public y_inline9, cc, _F<i>));
  214. ASSERT(Callback_Call(cc, 67) == 12345 + 67);
  215. Callback_Release(cc);
  216. }
  217. forward y_inline10(a, b[]);
  218. public y_inline10(a, b[])
  219. {
  220. return 12345 + a + b[0];
  221. }
  222. Test:y_inline10()
  223. {
  224. new
  225. cc[E_CALLBACK_DATA];
  226. ASSERT(y_inline_Get(using callback y_inline10, cc, _F<is>));
  227. ASSERT(Callback_Call(cc, 67, "50") == 12345 + 67 + '5');
  228. Callback_Release(cc);
  229. }
  230. Test:y_inline11()
  231. {
  232. new
  233. g = 5,
  234. cc[E_CALLBACK_DATA];
  235. inline func()
  236. {
  237. g = 11;
  238. }
  239. y_inline_Get(using inline func, cc);
  240. ASSERT(g == 5);
  241. Callback_Call(cc);
  242. ASSERT(g == 5);
  243. y_inline_Restore(cc);
  244. ASSERT(g == 11);
  245. Callback_Release(cc);
  246. }
  247. Test:y_inline12()
  248. {
  249. new
  250. g = 5,
  251. cc[E_CALLBACK_DATA];
  252. inline func()
  253. {
  254. ++g;
  255. }
  256. y_inline_Get(using inline func, cc);
  257. Callback_Call(cc);
  258. Callback_Call(cc);
  259. Callback_Call(cc);
  260. Callback_Call(cc);
  261. y_inline_Restore(cc);
  262. ASSERT(g == 9);
  263. Callback_Release(cc);
  264. }
  265. Test:y_inline13()
  266. {
  267. new
  268. g = 5,
  269. cc[E_CALLBACK_DATA];
  270. inline const func()
  271. {
  272. ASSERT(g == 5);
  273. ++g;
  274. }
  275. y_inline_Get(using inline func, cc);
  276. Callback_Call(cc);
  277. Callback_Call(cc);
  278. Callback_Call(cc);
  279. Callback_Call(cc);
  280. y_inline_Restore(cc);
  281. ASSERT(g == 5);
  282. Callback_Release(cc);
  283. }
  284. Test:Callback_AA()
  285. {
  286. new
  287. cc[E_CALLBACK_DATA];
  288. inline func(&a)
  289. {
  290. // printf("a2 = %d", a);
  291. a = 7;
  292. // printf("a3 = %d", a);
  293. #pragma unused a
  294. }
  295. y_inline_Get(using inline func, cc);
  296. new
  297. a = 0;
  298. // printf("%x", cc[E_CALLBACK_DATA_POINTER]);
  299. // printf("a1 = %d", a);
  300. Callback_Call(cc, a);
  301. // printf("a4 = %d", a);
  302. ASSERT(a == 7);
  303. }
  304. Test:Callback_Arr1()
  305. {
  306. new
  307. cc[E_CALLBACK_DATA];
  308. inline const func(&a)
  309. {
  310. // printf("a2 = %d", a);
  311. ASSERT(a == 0);
  312. a = 7;
  313. ASSERT(a == 7);
  314. // printf("a3 = %d", a);
  315. //#pragma unused a
  316. }
  317. y_inline_Get(using inline func, cc);
  318. new
  319. a = 0;
  320. // printf("%x", cc[E_CALLBACK_DATA_POINTER]);
  321. // printf("a1 = %d", a);
  322. ASSERT(a == 0);
  323. Callback_Call(cc, a);
  324. // printf("a4 = %d", a);
  325. ASSERT(a == 7);
  326. }
  327. Test:Callback_Arr2()
  328. {
  329. new
  330. cc[E_CALLBACK_DATA];
  331. inline const func(string:str[])
  332. {
  333. ASSERT(!strcmp(str, "hello"));
  334. }
  335. y_inline_Get(using inline func, cc);
  336. new
  337. str[YSI_MAX_STRING] = "hello";
  338. Callback_Call(cc, str);
  339. ASSERT(!strcmp(str, "hello"));
  340. Callback_Call(cc, "hello");
  341. }
  342. Test:Callback_Arr3()
  343. {
  344. new
  345. cc[E_CALLBACK_DATA];
  346. inline const func(a)
  347. {
  348. ASSERT(a == 0);
  349. a = 7;
  350. ASSERT(a == 7);
  351. }
  352. y_inline_Get(using inline func, cc);
  353. new
  354. a = 0;
  355. ASSERT(a == 0);
  356. Callback_Call(cc, a);
  357. ASSERT(a == 0);
  358. }
  359. Test:Callback_Array0()
  360. {
  361. new
  362. g = 5,
  363. cc[E_CALLBACK_DATA];
  364. inline const func()
  365. {
  366. ASSERT(g == 5);
  367. ++g;
  368. }
  369. y_inline_Get(using inline func, cc);
  370. // Test zero parameter calls.
  371. Callback_Array(cc, "", 0);
  372. Callback_Array(cc, "", 0);
  373. Callback_Array(cc, "", 0);
  374. }
  375. Test:Callback_Array1()
  376. {
  377. #emit LCTRL 6
  378. #emit LCTRL 6
  379. #emit LCTRL 6
  380. #emit LCTRL 6
  381. new
  382. cc[E_CALLBACK_DATA];
  383. inline const func(&a, string:b[], c)
  384. {
  385. //printf("%d %s", c, b);
  386. ASSERT(c == 6);
  387. ASSERT(!strcmp(b, "hey"));
  388. a = 7;
  389. #pragma unused a
  390. }
  391. //DisasmDump("inline6.asm");
  392. y_inline_Get(using inline func, cc);
  393. new
  394. a = 0,
  395. str[4] = "hey",
  396. c = 6,
  397. pars[3];
  398. Callback_Call(cc, a, str, c);
  399. ASSERT(a == 7);
  400. pars[0] = ref(a);
  401. pars[1] = ref(str);
  402. pars[2] = ref(c);
  403. // Test more parameters.
  404. a = 2;
  405. Callback_Array(cc, pars, 3);
  406. ASSERT(a == 7);
  407. a = 11;
  408. Callback_Array(cc, pars, 3);
  409. ASSERT(a == 7);
  410. a = 32;
  411. Callback_Array(cc, pars, 3);
  412. ASSERT(a == 7);
  413. }
  414. Test:y_inline_Remote0()
  415. {
  416. //printf("%08x %08x", 42, 43);
  417. new
  418. Function:f0 = GetRemoteFunction("MyTesterFunc", "m"),
  419. Function:f1 = GetRemoteFunction("MyTesterFunc", "m");
  420. ASSERT(f0 == f1);
  421. //printf("%08x %08x", f0, f1);
  422. ASSERT(GetRemoteFunction("MyTesterFunc", "m") != GetRemoteFunction("MyTesterFunc", "n"));
  423. }
  424. static stock
  425. YSI_g_sRemoteTestVar;
  426. forward y_inline_Remote1(v);
  427. public y_inline_Remote1(v)
  428. {
  429. YSI_g_sRemoteTestVar = v;
  430. return v - 10;
  431. }
  432. Test:y_inline_Remote1()
  433. {
  434. new
  435. ret;
  436. ret = strcmp("hello", "hello");
  437. ASSERT(!ret);
  438. ret = strcmp("hello", !"hello");
  439. ASSERT(!ret);
  440. ret = strcmp(!"hello", "hello");
  441. ASSERT(!ret);
  442. ret = strcmp(!"hello", !"hello");
  443. ASSERT(!ret);
  444. ret = strcmp("m", "n");
  445. ASSERT(!!ret);
  446. ret = strcmp("m", !"n");
  447. ASSERT(!!ret);
  448. ret = strcmp(!"m", "n");
  449. ASSERT(!!ret);
  450. ret = strcmp(!"m", !"n");
  451. ASSERT(!!ret);
  452. // Clearly "CallRemoteFunction" works with packed strings. Good.
  453. YSI_g_sRemoteTestVar = 5;
  454. ret = CallRemoteFunction(!"y_inline_Remote1", !"i", 74);
  455. ASSERT(ret == 64);
  456. ASSERT(YSI_g_sRemoteTestVar == 74);
  457. ret = CallRemoteFunction(!"y_inline_Remote1", "i", 75);
  458. ASSERT(ret == 65);
  459. ASSERT(YSI_g_sRemoteTestVar == 75);
  460. ret = CallRemoteFunction("y_inline_Remote1", !"i", 76);
  461. ASSERT(ret == 66);
  462. ASSERT(YSI_g_sRemoteTestVar == 76);
  463. ret = CallRemoteFunction("y_inline_Remote1", "i", 77);
  464. ASSERT(ret == 67);
  465. ASSERT(YSI_g_sRemoteTestVar == 77);
  466. }
  467. Test:y_inline_Remote2()
  468. {
  469. YSI_g_sRemoteTestVar = 5;
  470. new
  471. Function:f = GetRemoteFunction("y_inline_Remote1", "i");
  472. YSI_g_sRemoteTestVar = 5;
  473. ASSERT(CallStoredFunction(f, 99) == 89);
  474. ASSERT(YSI_g_sRemoteTestVar == 99);
  475. ASSERT(CallStoredFunction(f, 111) == 101);
  476. ASSERT(YSI_g_sRemoteTestVar == 111);
  477. ASSERT(CallStoredFunction(f, 9739) == 9729);
  478. ASSERT(YSI_g_sRemoteTestVar == 9739);
  479. ASSERT(CallStoredFunction(f, 11) == 1);
  480. ASSERT(YSI_g_sRemoteTestVar == 11);
  481. ASSERT(CallStoredFunction(f, 9) == -1);
  482. ASSERT(YSI_g_sRemoteTestVar == 9);
  483. }
  484. Test:CallStoredFunction0()
  485. {
  486. ASSERT(CallStoredFunction(Function:0) == 0);
  487. }
  488. // Test inline functions inside hooks, in which the parameter counts are mangled
  489. // so can't be used to allocate memory.
  490. static
  491. YSI_g_sInlineTestVar0;
  492. hook y_inline_InHook0@0()
  493. {
  494. new
  495. cc[E_CALLBACK_DATA],
  496. r = 100;
  497. inline func(&r2)
  498. {
  499. //printf("2");
  500. #pragma unused r2
  501. YSI_g_sInlineTestVar0 += 1;
  502. r2 = 94;
  503. /*new
  504. x;
  505. #emit LOAD.S.pri 0xFFFFFFE8
  506. #emit STOR.S.pri x
  507. printf("-24 = %d", x);
  508. #emit LOAD.S.pri 0xFFFFFFEC
  509. #emit STOR.S.pri x
  510. printf("-20 = %d", x);
  511. #emit LOAD.S.pri 0xFFFFFFF0
  512. #emit STOR.S.pri x
  513. printf("-16 = %d", x);
  514. #emit LOAD.S.pri 0xFFFFFFF4
  515. #emit STOR.S.pri x
  516. printf("-12 = %d", x);
  517. #emit LOAD.S.pri 0xFFFFFFF8
  518. #emit STOR.S.pri x
  519. printf("-8 = %d", x);
  520. #emit LOAD.S.pri 0xFFFFFFFC
  521. #emit STOR.S.pri x
  522. printf("-4 = %d", x);
  523. #emit LOAD.S.pri 0
  524. #emit STOR.S.pri x
  525. printf("0 = %d", x);
  526. #emit LOAD.S.pri 4
  527. #emit STOR.S.pri x
  528. printf("4 = %d", x);
  529. #emit LOAD.S.pri 8
  530. #emit STOR.S.pri x
  531. printf("8 = %d", x);
  532. printf("3 %d %d %x", GetCurrentFrameParameterCount(), GetCurrentFrameLocalCount(), GetCurrentFrameReturn());*/
  533. }
  534. //printf("0");
  535. y_inline_Get(using inline func, cc);
  536. //printf("1");
  537. //DisasmDump("YSI_TEST_inline.asm");
  538. Callback_Call(cc, r);
  539. //printf("4");
  540. ASSERT(r == 94);
  541. Callback_Release(cc);
  542. }
  543. hook y_inline_InHook1@0(a)
  544. {
  545. new
  546. cc[E_CALLBACK_DATA],
  547. r = 100;
  548. inline func(&r2)
  549. {
  550. #pragma unused r2
  551. YSI_g_sInlineTestVar0 += a;
  552. r2 = 95;
  553. }
  554. y_inline_Get(using inline func, cc);
  555. Callback_Call(cc, r);
  556. ASSERT(r == 95);
  557. Callback_Release(cc);
  558. }
  559. hook y_inline_InHook2@0(a, b)
  560. {
  561. new
  562. cc[E_CALLBACK_DATA],
  563. r = 100;
  564. inline func(&r2)
  565. {
  566. #pragma unused r2
  567. YSI_g_sInlineTestVar0 += a * b;
  568. r2 = 96;
  569. }
  570. y_inline_Get(using inline func, cc);
  571. Callback_Call(cc, r);
  572. ASSERT(r == 96);
  573. Callback_Release(cc);
  574. }
  575. hook y_inline_InHook0@1()
  576. {
  577. new
  578. cc[E_CALLBACK_DATA],
  579. r = 100;
  580. inline func(&r2)
  581. {
  582. #pragma unused r2
  583. YSI_g_sInlineTestVar0 += 1 * 2;
  584. r2 = 98;
  585. }
  586. y_inline_Get(using inline func, cc);
  587. Callback_Call(cc, r);
  588. ASSERT(r == 98);
  589. Callback_Release(cc);
  590. }
  591. hook y_inline_InHook1@1(a)
  592. {
  593. new
  594. cc[E_CALLBACK_DATA],
  595. r = 100;
  596. inline func(&r2)
  597. {
  598. #pragma unused r2
  599. YSI_g_sInlineTestVar0 += a * 2;
  600. r2 = 97;
  601. }
  602. y_inline_Get(using inline func, cc);
  603. Callback_Call(cc, r);
  604. ASSERT(r == 97);
  605. Callback_Release(cc);
  606. }
  607. hook y_inline_InHook2@1(a, b)
  608. {
  609. new
  610. cc[E_CALLBACK_DATA],
  611. r = 100;
  612. inline func(&r2)
  613. {
  614. #pragma unused r2
  615. YSI_g_sInlineTestVar0 += a * b * 2;
  616. r2 = 90;
  617. }
  618. y_inline_Get(using inline func, cc);
  619. Callback_Call(cc, r);
  620. ASSERT(r == 90);
  621. Callback_Release(cc);
  622. }
  623. Test:y_inline_InHook0()
  624. {
  625. // DebugLevel(7);
  626. YSI_g_sInlineTestVar0 = 0;
  627. CallLocalFunction("y_inline_InHook0", "");
  628. ASSERT(YSI_g_sInlineTestVar0 == 3);
  629. // DebugLevel(0);
  630. }
  631. Test:y_inline_InHook1()
  632. {
  633. YSI_g_sInlineTestVar0 = 0;
  634. CallLocalFunction("y_inline_InHook1", "i", 4);
  635. ASSERT(YSI_g_sInlineTestVar0 == 12);
  636. YSI_g_sInlineTestVar0 = 0;
  637. CallLocalFunction("y_inline_InHook1", "i", 5);
  638. ASSERT(YSI_g_sInlineTestVar0 == 15);
  639. YSI_g_sInlineTestVar0 = 0;
  640. CallLocalFunction("y_inline_InHook1", "i", 100);
  641. ASSERT(YSI_g_sInlineTestVar0 == 300);
  642. }
  643. Test:y_inline_InHook2()
  644. {
  645. YSI_g_sInlineTestVar0 = 0;
  646. CallLocalFunction("y_inline_InHook2", "ii", 4, 5);
  647. ASSERT(YSI_g_sInlineTestVar0 == 12 * 5);
  648. YSI_g_sInlineTestVar0 = 0;
  649. CallLocalFunction("y_inline_InHook2", "ii", 5, 6);
  650. ASSERT(YSI_g_sInlineTestVar0 == 15 * 6);
  651. YSI_g_sInlineTestVar0 = 0;
  652. CallLocalFunction("y_inline_InHook2", "ii", 100, 100);
  653. ASSERT(YSI_g_sInlineTestVar0 == 300 * 100);
  654. }
  655. static stock
  656. YSI_g_sInlineTestVar2,
  657. YSI_g_sInlineTestVar3,
  658. YSI_g_sInlineTestCB[E_CALLBACK_DATA];
  659. static stock y_inline_Getter(callback:cb)
  660. {
  661. Callback_Get(cb, YSI_g_sInlineTestCB);
  662. }
  663. static stock y_inline_TestFunc_0()
  664. {
  665. inline TestCallback1()
  666. {
  667. ++YSI_g_sInlineTestVar3;
  668. }
  669. y_inline_Getter(using inline TestCallback1);
  670. }
  671. static stock y_inline_TestFunc_1()
  672. {
  673. inline TestCallback1()
  674. {
  675. ++YSI_g_sInlineTestVar3;
  676. return;
  677. }
  678. y_inline_Getter(using inline TestCallback1);
  679. }
  680. static stock y_inline_TestFunc_2()
  681. {
  682. inline TestCallback1()
  683. {
  684. ++YSI_g_sInlineTestVar3;
  685. return 1;
  686. }
  687. y_inline_Getter(using inline TestCallback1);
  688. return 0;
  689. }
  690. static stock y_inline_TestFunc_3()
  691. {
  692. inline TestCallback1()
  693. {
  694. ++YSI_g_sInlineTestVar3;
  695. return 3;
  696. }
  697. y_inline_Getter(using inline TestCallback1);
  698. return 2;
  699. }
  700. static stock y_inline_TestFunc_4(lvar)
  701. {
  702. inline TestCallback1()
  703. {
  704. YSI_g_sInlineTestVar2 = lvar;
  705. ++YSI_g_sInlineTestVar3;
  706. return 4;
  707. }
  708. y_inline_Getter(using inline TestCallback1);
  709. return 9;
  710. }
  711. static stock y_inline_TestFunc_5()
  712. {
  713. inline TestCallback1(ivar)
  714. {
  715. YSI_g_sInlineTestVar2 = ivar;
  716. ++YSI_g_sInlineTestVar3;
  717. return 5;
  718. }
  719. y_inline_Getter(using inline TestCallback1);
  720. return 8;
  721. }
  722. static stock y_inline_TestFunc_6(lvar)
  723. {
  724. inline TestCallback1(ivar)
  725. {
  726. YSI_g_sInlineTestVar2 = ivar + lvar;
  727. ++YSI_g_sInlineTestVar3;
  728. return 6;
  729. }
  730. y_inline_Getter(using inline TestCallback1);
  731. return 7;
  732. }
  733. Test:y_inline_ParameterTypes_0()
  734. {
  735. YSI_g_sInlineTestVar2 = 0;
  736. YSI_g_sInlineTestVar3 = 0;
  737. y_inline_TestFunc_0();
  738. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 0);
  739. ASSERT(YSI_g_sInlineTestVar2 == 0);
  740. ASSERT(YSI_g_sInlineTestVar3 == 1);
  741. Callback_Release(YSI_g_sInlineTestCB);
  742. }
  743. Test:y_inline_ParameterTypes_1()
  744. {
  745. YSI_g_sInlineTestVar2 = 0;
  746. YSI_g_sInlineTestVar3 = 0;
  747. y_inline_TestFunc_1();
  748. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 0);
  749. ASSERT(YSI_g_sInlineTestVar2 == 0);
  750. ASSERT(YSI_g_sInlineTestVar3 == 1);
  751. Callback_Release(YSI_g_sInlineTestCB);
  752. }
  753. Test:y_inline_ParameterTypes_2()
  754. {
  755. YSI_g_sInlineTestVar2 = 0;
  756. YSI_g_sInlineTestVar3 = 0;
  757. ASSERT(y_inline_TestFunc_2() == 0);
  758. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 1);
  759. ASSERT(YSI_g_sInlineTestVar2 == 0);
  760. ASSERT(YSI_g_sInlineTestVar3 == 1);
  761. Callback_Release(YSI_g_sInlineTestCB);
  762. }
  763. Test:y_inline_ParameterTypes_3()
  764. {
  765. YSI_g_sInlineTestVar2 = 0;
  766. YSI_g_sInlineTestVar3 = 0;
  767. ASSERT(y_inline_TestFunc_3() == 2);
  768. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 3);
  769. ASSERT(YSI_g_sInlineTestVar2 == 0);
  770. ASSERT(YSI_g_sInlineTestVar3 == 1);
  771. Callback_Release(YSI_g_sInlineTestCB);
  772. }
  773. Test:y_inline_ParameterTypes_4()
  774. {
  775. YSI_g_sInlineTestVar2 = 0;
  776. YSI_g_sInlineTestVar3 = 0;
  777. ASSERT(y_inline_TestFunc_4(11) == 9);
  778. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 4);
  779. ASSERT(YSI_g_sInlineTestVar2 == 11);
  780. ASSERT(YSI_g_sInlineTestVar3 == 1);
  781. Callback_Release(YSI_g_sInlineTestCB);
  782. }
  783. Test:y_inline_ParameterTypes_5()
  784. {
  785. YSI_g_sInlineTestVar2 = 0;
  786. YSI_g_sInlineTestVar3 = 0;
  787. ASSERT(y_inline_TestFunc_5() == 8);
  788. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 22) == 5);
  789. ASSERT(YSI_g_sInlineTestVar2 == 22);
  790. ASSERT(YSI_g_sInlineTestVar3 == 1);
  791. Callback_Release(YSI_g_sInlineTestCB);
  792. }
  793. Test:y_inline_ParameterTypes_6()
  794. {
  795. YSI_g_sInlineTestVar2 = 0;
  796. YSI_g_sInlineTestVar3 = 0;
  797. ASSERT(y_inline_TestFunc_6(33) == 7);
  798. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 44) == 6);
  799. ASSERT(YSI_g_sInlineTestVar2 == 33 + 44);
  800. ASSERT(YSI_g_sInlineTestVar3 == 1);
  801. Callback_Release(YSI_g_sInlineTestCB);
  802. }
  803. static stock y_inline_TestFunc_7(lvar)
  804. {
  805. new
  806. cvar = 101;
  807. inline TestCallback1(ivar)
  808. {
  809. YSI_g_sInlineTestVar2 = cvar + ivar + lvar;
  810. ++YSI_g_sInlineTestVar3;
  811. return ivar;
  812. }
  813. y_inline_Getter(using inline TestCallback1);
  814. return lvar;
  815. }
  816. static stock y_inline_TestFunc_8(string:svar0[])
  817. {
  818. new
  819. svar0b[20];
  820. strcpy(svar0b, svar0);
  821. inline TestCallback1()
  822. {
  823. YSI_g_sInlineTestVar2 = strval(svar0b);
  824. ++YSI_g_sInlineTestVar3;
  825. return strval(svar0b[12]);
  826. }
  827. y_inline_Getter(using inline TestCallback1);
  828. return strval(svar0b[6]);
  829. }
  830. static stock y_inline_TestFunc_9()
  831. {
  832. inline TestCallback1(string:svar1[])
  833. {
  834. YSI_g_sInlineTestVar2 = strval(svar1);
  835. ++YSI_g_sInlineTestVar3;
  836. return strval(svar1[6]);
  837. }
  838. y_inline_Getter(using inline TestCallback1);
  839. return 99;
  840. }
  841. static stock y_inline_TestFunc_10(string:svar0[])
  842. {
  843. new
  844. svar0b[20];
  845. strcpy(svar0b, svar0);
  846. inline TestCallback1(string:svar1[])
  847. {
  848. YSI_g_sInlineTestVar2 = strval(svar0b) * strval(svar1);
  849. ++YSI_g_sInlineTestVar3;
  850. return strval(svar1[6]);
  851. }
  852. y_inline_Getter(using inline TestCallback1);
  853. return strval(svar0b[6]);
  854. }
  855. Test:y_inline_ParameterTypes_7()
  856. {
  857. YSI_g_sInlineTestVar2 = 0;
  858. YSI_g_sInlineTestVar3 = 0;
  859. ASSERT(y_inline_TestFunc_7(202) == 202);
  860. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 303) == 303);
  861. ASSERT(YSI_g_sInlineTestVar2 == 101 + 202 + 303);
  862. ASSERT(YSI_g_sInlineTestVar3 == 1);
  863. Callback_Release(YSI_g_sInlineTestCB);
  864. }
  865. Test:y_inline_ParameterTypes_8()
  866. {
  867. YSI_g_sInlineTestVar2 = 0;
  868. YSI_g_sInlineTestVar3 = 0;
  869. ASSERT(y_inline_TestFunc_8("123 456 999") == 456);
  870. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 999);
  871. ASSERT(YSI_g_sInlineTestVar2 == 123);
  872. ASSERT(YSI_g_sInlineTestVar3 == 1);
  873. Callback_Release(YSI_g_sInlineTestCB);
  874. }
  875. Test:y_inline_ParameterTypes_9()
  876. {
  877. YSI_g_sInlineTestVar2 = 0;
  878. YSI_g_sInlineTestVar3 = 0;
  879. ASSERT(y_inline_TestFunc_9() == 99);
  880. ASSERT(Callback_Call(YSI_g_sInlineTestCB, "4242 2424") == 2424);
  881. ASSERT(YSI_g_sInlineTestVar2 == 4242);
  882. ASSERT(YSI_g_sInlineTestVar3 == 1);
  883. Callback_Release(YSI_g_sInlineTestCB);
  884. }
  885. Test:y_inline_ParameterTypes_10()
  886. {
  887. YSI_g_sInlineTestVar2 = 0;
  888. YSI_g_sInlineTestVar3 = 0;
  889. ASSERT(y_inline_TestFunc_10("9999 1111") == 1111);
  890. ASSERT(Callback_Call(YSI_g_sInlineTestCB, "6543 2109") == 2109);
  891. ASSERT(YSI_g_sInlineTestVar2 == 9999 * 6543);
  892. ASSERT(YSI_g_sInlineTestVar3 == 1);
  893. Callback_Release(YSI_g_sInlineTestCB);
  894. }