LuaFunction.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. /*
  2. Copyright (c) 2015-2017 topameng(topameng@qq.com)
  3. Permission is hereby granted, free of charge, to any person obtaining a copy
  4. of this software and associated documentation files (the "Software"), to deal
  5. in the Software without restriction, including without limitation the rights
  6. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in all
  10. copies or substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  17. SOFTWARE.
  18. */
  19. using System;
  20. using System.Collections.Generic;
  21. using UnityEngine;
  22. namespace LuaInterface
  23. {
  24. public class LuaFunction : LuaBaseRef
  25. {
  26. protected struct FuncData
  27. {
  28. public int oldTop;
  29. public int stackPos;
  30. public FuncData(int top, int stack)
  31. {
  32. oldTop = top;
  33. stackPos = stack;
  34. }
  35. }
  36. protected int oldTop = -1;
  37. private int argCount = 0;
  38. private int stackPos = -1;
  39. private Stack<FuncData> stack = new Stack<FuncData>();
  40. public LuaFunction(int reference, LuaState state)
  41. {
  42. this.reference = reference;
  43. this.luaState = state;
  44. }
  45. public override void Dispose()
  46. {
  47. #if UNITY_EDITOR
  48. if (oldTop != -1 && count <= 1)
  49. {
  50. Debugger.LogError("You must call EndPCall before calling Dispose");
  51. }
  52. #endif
  53. base.Dispose();
  54. }
  55. public T ToDelegate<T>() where T : class
  56. {
  57. return DelegateTraits<T>.Create(this) as T;
  58. }
  59. public virtual int BeginPCall()
  60. {
  61. if (luaState == null)
  62. {
  63. throw new LuaException("LuaFunction has been disposed");
  64. }
  65. stack.Push(new FuncData(oldTop, stackPos));
  66. oldTop = luaState.BeginPCall(reference);
  67. stackPos = -1;
  68. argCount = 0;
  69. return oldTop;
  70. }
  71. public void PCall()
  72. {
  73. #if UNITY_EDITOR
  74. if (oldTop == -1)
  75. {
  76. Debugger.LogError("You must call BeginPCall before calling PCall");
  77. }
  78. #endif
  79. stackPos = oldTop + 1;
  80. try
  81. {
  82. luaState.PCall(argCount, oldTop);
  83. }
  84. catch (System.Threading.ThreadAbortException e)
  85. {
  86. EndPCall();
  87. DebugHelper.LogWarning(e.StackTrace);
  88. throw e;
  89. }
  90. catch (Exception e)
  91. {
  92. EndPCall();
  93. DebugHelper.LogError(e.Message);
  94. DebugHelper.LogError(e.StackTrace);
  95. throw e;
  96. }
  97. }
  98. public void EndPCall()
  99. {
  100. if (oldTop != -1)
  101. {
  102. luaState.EndPCall(oldTop);
  103. argCount = 0;
  104. FuncData data = stack.Pop();
  105. oldTop = data.oldTop;
  106. stackPos = data.stackPos;
  107. }
  108. }
  109. public void Call()
  110. {
  111. BeginPCall();
  112. PCall();
  113. EndPCall();
  114. }
  115. public void Call<T1>(T1 arg1)
  116. {
  117. BeginPCall();
  118. PushGeneric(arg1);
  119. PCall();
  120. EndPCall();
  121. }
  122. public void Call<T1, T2>(T1 arg1, T2 arg2)
  123. {
  124. BeginPCall();
  125. PushGeneric(arg1);
  126. PushGeneric(arg2);
  127. PCall();
  128. EndPCall();
  129. }
  130. public void Call<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3)
  131. {
  132. BeginPCall();
  133. PushGeneric(arg1);
  134. PushGeneric(arg2);
  135. PushGeneric(arg3);
  136. PCall();
  137. EndPCall();
  138. }
  139. public void Call<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
  140. {
  141. BeginPCall();
  142. PushGeneric(arg1);
  143. PushGeneric(arg2);
  144. PushGeneric(arg3);
  145. PushGeneric(arg4);
  146. PCall();
  147. EndPCall();
  148. }
  149. public void Call<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
  150. {
  151. BeginPCall();
  152. PushGeneric(arg1);
  153. PushGeneric(arg2);
  154. PushGeneric(arg3);
  155. PushGeneric(arg4);
  156. PushGeneric(arg5);
  157. PCall();
  158. EndPCall();
  159. }
  160. public void Call<T1, T2, T3, T4, T5, T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
  161. {
  162. BeginPCall();
  163. PushGeneric(arg1);
  164. PushGeneric(arg2);
  165. PushGeneric(arg3);
  166. PushGeneric(arg4);
  167. PushGeneric(arg5);
  168. PushGeneric(arg6);
  169. PCall();
  170. EndPCall();
  171. }
  172. public void Call<T1, T2, T3, T4, T5, T6, T7>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
  173. {
  174. BeginPCall();
  175. PushGeneric(arg1);
  176. PushGeneric(arg2);
  177. PushGeneric(arg3);
  178. PushGeneric(arg4);
  179. PushGeneric(arg5);
  180. PushGeneric(arg6);
  181. PushGeneric(arg7);
  182. PCall();
  183. EndPCall();
  184. }
  185. public void Call<T1, T2, T3, T4, T5, T6, T7, T8>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
  186. {
  187. BeginPCall();
  188. PushGeneric(arg1);
  189. PushGeneric(arg2);
  190. PushGeneric(arg3);
  191. PushGeneric(arg4);
  192. PushGeneric(arg5);
  193. PushGeneric(arg6);
  194. PushGeneric(arg7);
  195. PushGeneric(arg8);
  196. PCall();
  197. EndPCall();
  198. }
  199. public void Call<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
  200. {
  201. BeginPCall();
  202. PushGeneric(arg1);
  203. PushGeneric(arg2);
  204. PushGeneric(arg3);
  205. PushGeneric(arg4);
  206. PushGeneric(arg5);
  207. PushGeneric(arg6);
  208. PushGeneric(arg7);
  209. PushGeneric(arg8);
  210. PushGeneric(arg9);
  211. PCall();
  212. EndPCall();
  213. }
  214. public R1 Invoke<R1>()
  215. {
  216. BeginPCall();
  217. PCall();
  218. R1 ret1 = CheckValue<R1>();
  219. EndPCall();
  220. return ret1;
  221. }
  222. public R1 Invoke<T1, R1>(T1 arg1)
  223. {
  224. BeginPCall();
  225. PushGeneric(arg1);
  226. PCall();
  227. R1 ret1 = CheckValue<R1>();
  228. EndPCall();
  229. return ret1;
  230. }
  231. public R1 Invoke<T1, T2, R1>(T1 arg1, T2 arg2)
  232. {
  233. BeginPCall();
  234. PushGeneric(arg1);
  235. PushGeneric(arg2);
  236. PCall();
  237. R1 ret1 = CheckValue<R1>();
  238. EndPCall();
  239. return ret1;
  240. }
  241. public R1 Invoke<T1, T2, T3, R1>(T1 arg1, T2 arg2, T3 arg3)
  242. {
  243. BeginPCall();
  244. PushGeneric(arg1);
  245. PushGeneric(arg2);
  246. PushGeneric(arg3);
  247. PCall();
  248. R1 ret1 = CheckValue<R1>();
  249. EndPCall();
  250. return ret1;
  251. }
  252. public R1 Invoke<T1, T2, T3, T4, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
  253. {
  254. BeginPCall();
  255. PushGeneric(arg1);
  256. PushGeneric(arg2);
  257. PushGeneric(arg3);
  258. PushGeneric(arg4);
  259. PCall();
  260. R1 ret1 = CheckValue<R1>();
  261. EndPCall();
  262. return ret1;
  263. }
  264. public R1 Invoke<T1, T2, T3, T4, T5, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
  265. {
  266. BeginPCall();
  267. PushGeneric(arg1);
  268. PushGeneric(arg2);
  269. PushGeneric(arg3);
  270. PushGeneric(arg4);
  271. PushGeneric(arg5);
  272. PCall();
  273. R1 ret1 = CheckValue<R1>();
  274. EndPCall();
  275. return ret1;
  276. }
  277. public R1 Invoke<T1, T2, T3, T4, T5, T6, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
  278. {
  279. BeginPCall();
  280. PushGeneric(arg1);
  281. PushGeneric(arg2);
  282. PushGeneric(arg3);
  283. PushGeneric(arg4);
  284. PushGeneric(arg5);
  285. PushGeneric(arg6);
  286. PCall();
  287. R1 ret1 = CheckValue<R1>();
  288. EndPCall();
  289. return ret1;
  290. }
  291. public R1 Invoke<T1, T2, T3, T4, T5, T6, T7, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
  292. {
  293. BeginPCall();
  294. PushGeneric(arg1);
  295. PushGeneric(arg2);
  296. PushGeneric(arg3);
  297. PushGeneric(arg4);
  298. PushGeneric(arg5);
  299. PushGeneric(arg6);
  300. PushGeneric(arg7);
  301. PCall();
  302. R1 ret1 = CheckValue<R1>();
  303. EndPCall();
  304. return ret1;
  305. }
  306. public R1 Invoke<T1, T2, T3, T4, T5, T6, T7, T8, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
  307. {
  308. BeginPCall();
  309. PushGeneric(arg1);
  310. PushGeneric(arg2);
  311. PushGeneric(arg3);
  312. PushGeneric(arg4);
  313. PushGeneric(arg5);
  314. PushGeneric(arg6);
  315. PushGeneric(arg7);
  316. PushGeneric(arg8);
  317. PCall();
  318. R1 ret1 = CheckValue<R1>();
  319. EndPCall();
  320. return ret1;
  321. }
  322. public R1 Invoke<T1, T2, T3, T4, T5, T6, T7, T8, T9, R1>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
  323. {
  324. BeginPCall();
  325. PushGeneric(arg1);
  326. PushGeneric(arg2);
  327. PushGeneric(arg3);
  328. PushGeneric(arg4);
  329. PushGeneric(arg5);
  330. PushGeneric(arg6);
  331. PushGeneric(arg7);
  332. PushGeneric(arg8);
  333. PushGeneric(arg9);
  334. PCall();
  335. R1 ret1 = CheckValue<R1>();
  336. EndPCall();
  337. return ret1;
  338. }
  339. //慎用, 有gc alloc
  340. [System.Obsolete("LuaFunction.LazyCall() is obsolete.Use LuaFunction.Invoke()")]
  341. public object[] LazyCall(params object[] args)
  342. {
  343. BeginPCall();
  344. int count = args == null ? 0 : args.Length;
  345. if (!luaState.LuaCheckStack(count + 6))
  346. {
  347. EndPCall();
  348. throw new LuaException("stack overflow");
  349. }
  350. PushArgs(args);
  351. PCall();
  352. object[] objs = luaState.CheckObjects(oldTop);
  353. EndPCall();
  354. return objs;
  355. }
  356. public void CheckStack(int args)
  357. {
  358. luaState.LuaCheckStack(args + 6);
  359. }
  360. public bool IsBegin()
  361. {
  362. return oldTop != -1;
  363. }
  364. public void Push(double num)
  365. {
  366. luaState.Push(num);
  367. ++argCount;
  368. }
  369. public void Push(int n)
  370. {
  371. luaState.Push(n);
  372. ++argCount;
  373. }
  374. public void PushLayerMask(LayerMask n)
  375. {
  376. luaState.PushLayerMask(n);
  377. ++argCount;
  378. }
  379. public void Push(uint un)
  380. {
  381. luaState.Push(un);
  382. ++argCount;
  383. }
  384. public void Push(long num)
  385. {
  386. luaState.Push(num);
  387. ++argCount;
  388. }
  389. public void Push(ulong un)
  390. {
  391. luaState.Push(un);
  392. ++argCount;
  393. }
  394. public void Push(bool b)
  395. {
  396. luaState.Push(b);
  397. ++argCount;
  398. }
  399. public void Push(string str)
  400. {
  401. luaState.Push(str);
  402. ++argCount;
  403. }
  404. public void Push(IntPtr ptr)
  405. {
  406. luaState.Push(ptr);
  407. ++argCount;
  408. }
  409. public void Push(LuaBaseRef lbr)
  410. {
  411. luaState.Push(lbr);
  412. ++argCount;
  413. }
  414. public void Push(object o)
  415. {
  416. luaState.PushVariant(o);
  417. ++argCount;
  418. }
  419. public void Push(UnityEngine.Object o)
  420. {
  421. luaState.Push(o);
  422. ++argCount;
  423. }
  424. public void Push(Type t)
  425. {
  426. luaState.Push(t);
  427. ++argCount;
  428. }
  429. public void Push(Enum e)
  430. {
  431. luaState.Push(e);
  432. ++argCount;
  433. }
  434. public void Push(Array array)
  435. {
  436. luaState.Push(array);
  437. ++argCount;
  438. }
  439. public void Push(Vector3 v3)
  440. {
  441. luaState.Push(v3);
  442. ++argCount;
  443. }
  444. public void Push(Vector2 v2)
  445. {
  446. luaState.Push(v2);
  447. ++argCount;
  448. }
  449. public void Push(Vector4 v4)
  450. {
  451. luaState.Push(v4);
  452. ++argCount;
  453. }
  454. public void Push(Quaternion quat)
  455. {
  456. luaState.Push(quat);
  457. ++argCount;
  458. }
  459. public void Push(Color clr)
  460. {
  461. luaState.Push(clr);
  462. ++argCount;
  463. }
  464. public void Push(Ray ray)
  465. {
  466. try
  467. {
  468. luaState.Push(ray);
  469. ++argCount;
  470. }
  471. catch (Exception e)
  472. {
  473. EndPCall();
  474. throw e;
  475. }
  476. }
  477. public void Push(Bounds bounds)
  478. {
  479. try
  480. {
  481. luaState.Push(bounds);
  482. ++argCount;
  483. }
  484. catch (Exception e)
  485. {
  486. EndPCall();
  487. throw e;
  488. }
  489. }
  490. public void Push(RaycastHit hit)
  491. {
  492. try
  493. {
  494. luaState.Push(hit);
  495. ++argCount;
  496. }
  497. catch (Exception e)
  498. {
  499. EndPCall();
  500. throw e;
  501. }
  502. }
  503. public void Push(Touch t)
  504. {
  505. try
  506. {
  507. luaState.Push(t);
  508. ++argCount;
  509. }
  510. catch (Exception e)
  511. {
  512. EndPCall();
  513. throw e;
  514. }
  515. }
  516. public void Push(LuaByteBuffer buffer)
  517. {
  518. try
  519. {
  520. luaState.Push(buffer);
  521. ++argCount;
  522. }
  523. catch (Exception e)
  524. {
  525. EndPCall();
  526. throw e;
  527. }
  528. }
  529. public void PushValue<T>(T value) where T : struct
  530. {
  531. try
  532. {
  533. luaState.PushValue(value);
  534. ++argCount;
  535. }
  536. catch (Exception e)
  537. {
  538. EndPCall();
  539. throw e;
  540. }
  541. }
  542. public void PushObject(object o)
  543. {
  544. try
  545. {
  546. luaState.PushObject(o);
  547. ++argCount;
  548. }
  549. catch (Exception e)
  550. {
  551. EndPCall();
  552. throw e;
  553. }
  554. }
  555. public void PushSealed<T>(T o)
  556. {
  557. try
  558. {
  559. luaState.PushSealed(o);
  560. ++argCount;
  561. }
  562. catch (Exception e)
  563. {
  564. EndPCall();
  565. throw e;
  566. }
  567. }
  568. public void PushGeneric<T>(T t)
  569. {
  570. try
  571. {
  572. luaState.PushGeneric(t);
  573. ++argCount;
  574. }
  575. catch (Exception e)
  576. {
  577. EndPCall();
  578. throw e;
  579. }
  580. }
  581. public void PushArgs(object[] args)
  582. {
  583. if (args == null)
  584. {
  585. return;
  586. }
  587. argCount += args.Length;
  588. luaState.PushArgs(args);
  589. }
  590. public void PushByteBuffer(byte[] buffer, int len = -1)
  591. {
  592. try
  593. {
  594. if (len == -1)
  595. {
  596. len = buffer.Length;
  597. }
  598. luaState.PushByteBuffer(buffer, len);
  599. ++argCount;
  600. }
  601. catch (Exception e)
  602. {
  603. EndPCall();
  604. throw e;
  605. }
  606. }
  607. public double CheckNumber()
  608. {
  609. try
  610. {
  611. return luaState.LuaCheckNumber(stackPos++);
  612. }
  613. catch (Exception e)
  614. {
  615. EndPCall();
  616. throw e;
  617. }
  618. }
  619. public bool CheckBoolean()
  620. {
  621. try
  622. {
  623. return luaState.LuaCheckBoolean(stackPos++);
  624. }
  625. catch (Exception e)
  626. {
  627. EndPCall();
  628. throw e;
  629. }
  630. }
  631. public string CheckString()
  632. {
  633. try
  634. {
  635. return luaState.CheckString(stackPos++);
  636. }
  637. catch (Exception e)
  638. {
  639. EndPCall();
  640. throw e;
  641. }
  642. }
  643. public Vector3 CheckVector3()
  644. {
  645. try
  646. {
  647. return luaState.CheckVector3(stackPos++);
  648. }
  649. catch (Exception e)
  650. {
  651. EndPCall();
  652. throw e;
  653. }
  654. }
  655. public Quaternion CheckQuaternion()
  656. {
  657. try
  658. {
  659. return luaState.CheckQuaternion(stackPos++);
  660. }
  661. catch (Exception e)
  662. {
  663. EndPCall();
  664. throw e;
  665. }
  666. }
  667. public Vector2 CheckVector2()
  668. {
  669. try
  670. {
  671. return luaState.CheckVector2(stackPos++);
  672. }
  673. catch (Exception e)
  674. {
  675. EndPCall();
  676. throw e;
  677. }
  678. }
  679. public Vector4 CheckVector4()
  680. {
  681. try
  682. {
  683. return luaState.CheckVector4(stackPos++);
  684. }
  685. catch (Exception e)
  686. {
  687. EndPCall();
  688. throw e;
  689. }
  690. }
  691. public Color CheckColor()
  692. {
  693. try
  694. {
  695. return luaState.CheckColor(stackPos++);
  696. }
  697. catch (Exception e)
  698. {
  699. EndPCall();
  700. throw e;
  701. }
  702. }
  703. public Ray CheckRay()
  704. {
  705. try
  706. {
  707. return luaState.CheckRay(stackPos++);
  708. }
  709. catch (Exception e)
  710. {
  711. EndPCall();
  712. throw e;
  713. }
  714. }
  715. public Bounds CheckBounds()
  716. {
  717. try
  718. {
  719. return luaState.CheckBounds(stackPos++);
  720. }
  721. catch (Exception e)
  722. {
  723. EndPCall();
  724. throw e;
  725. }
  726. }
  727. public LayerMask CheckLayerMask()
  728. {
  729. try
  730. {
  731. return luaState.CheckLayerMask(stackPos++);
  732. }
  733. catch (Exception e)
  734. {
  735. EndPCall();
  736. throw e;
  737. }
  738. }
  739. public long CheckLong()
  740. {
  741. try
  742. {
  743. return luaState.CheckLong(stackPos++);
  744. }
  745. catch (Exception e)
  746. {
  747. EndPCall();
  748. throw e;
  749. }
  750. }
  751. public ulong CheckULong()
  752. {
  753. try
  754. {
  755. return luaState.CheckULong(stackPos++);
  756. }
  757. catch (Exception e)
  758. {
  759. EndPCall();
  760. throw e;
  761. }
  762. }
  763. public Delegate CheckDelegate()
  764. {
  765. try
  766. {
  767. return luaState.CheckDelegate(stackPos++);
  768. }
  769. catch (Exception e)
  770. {
  771. EndPCall();
  772. throw e;
  773. }
  774. }
  775. public object CheckVariant()
  776. {
  777. return luaState.ToVariant(stackPos++);
  778. }
  779. public char[] CheckCharBuffer()
  780. {
  781. try
  782. {
  783. return luaState.CheckCharBuffer(stackPos++);
  784. }
  785. catch (Exception e)
  786. {
  787. EndPCall();
  788. throw e;
  789. }
  790. }
  791. public byte[] CheckByteBuffer()
  792. {
  793. try
  794. {
  795. return luaState.CheckByteBuffer(stackPos++);
  796. }
  797. catch (Exception e)
  798. {
  799. EndPCall();
  800. throw e;
  801. }
  802. }
  803. public object CheckObject(Type t)
  804. {
  805. try
  806. {
  807. return luaState.CheckObject(stackPos++, t);
  808. }
  809. catch (Exception e)
  810. {
  811. EndPCall();
  812. throw e;
  813. }
  814. }
  815. public LuaFunction CheckLuaFunction()
  816. {
  817. try
  818. {
  819. return luaState.CheckLuaFunction(stackPos++);
  820. }
  821. catch (Exception e)
  822. {
  823. EndPCall();
  824. throw e;
  825. }
  826. }
  827. public LuaTable CheckLuaTable()
  828. {
  829. try
  830. {
  831. return luaState.CheckLuaTable(stackPos++);
  832. }
  833. catch (Exception e)
  834. {
  835. EndPCall();
  836. throw e;
  837. }
  838. }
  839. public LuaThread CheckLuaThread()
  840. {
  841. try
  842. {
  843. return luaState.CheckLuaThread(stackPos++);
  844. }
  845. catch (Exception e)
  846. {
  847. EndPCall();
  848. throw e;
  849. }
  850. }
  851. public T CheckValue<T>()
  852. {
  853. try
  854. {
  855. return luaState.CheckValue<T>(stackPos++);
  856. }
  857. catch (Exception e)
  858. {
  859. EndPCall();
  860. throw e;
  861. }
  862. }
  863. }
  864. }