lscript_tree.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:399k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lscript_tree.cpp
  3.  * @brief implements methods for lscript_tree.h classes
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. // TO DO: Move print functionality from .h file to here
  33. #include "linden_common.h"
  34. #include "lscript_tree.h"
  35. #include "lscript_typecheck.h"
  36. #include "lscript_resource.h"
  37. #include "lscript_bytecode.h"
  38. #include "lscript_heap.h"
  39. #include "lscript_library.h"
  40. #include "lscript_alloc.h"
  41. //#define LSL_INCLUDE_DEBUG_INFO
  42. static void print_cil_box(LLFILE* fp, LSCRIPTType type)
  43. {
  44. switch(type)
  45. {
  46. case LST_INTEGER:
  47. fprintf(fp, "box [mscorlib]System.Int32n");
  48. break;
  49. case LST_FLOATINGPOINT:
  50. fprintf(fp, "box [mscorlib]System.Singlen");
  51. break;
  52. case LST_STRING:
  53. // System.String is not a System.ValueType,
  54. // so does not need to be boxed.
  55. break;
  56. case LST_KEY:
  57. fprintf(fp, "box [ScriptTypes]LindenLab.SecondLife.Keyn");
  58. break;
  59. case LST_VECTOR:
  60. fprintf(fp, "box [ScriptTypes]LindenLab.SecondLife.Vectorn");
  61. break;
  62. case LST_QUATERNION:
  63. fprintf(fp, "box [ScriptTypes]LindenLab.SecondLife.Quaternionn");
  64. break;
  65. default:
  66. llassert(false);
  67. break;
  68. }
  69. }
  70. static void print_cil_type(LLFILE* fp, LSCRIPTType type)
  71. {
  72. switch(type)
  73. {
  74. case LST_INTEGER:
  75. fprintf(fp, "int32");
  76. break;
  77. case LST_FLOATINGPOINT:
  78. fprintf(fp, "float32");
  79. break;
  80. case LST_STRING:
  81. fprintf(fp, "string");
  82. break;
  83. case LST_KEY:
  84. fprintf(fp, "valuetype [ScriptTypes]LindenLab.SecondLife.Key");
  85. break;
  86. case LST_VECTOR:
  87. fprintf(fp, "class [ScriptTypes]LindenLab.SecondLife.Vector");
  88. break;
  89. case LST_QUATERNION:
  90. fprintf(fp, "class [ScriptTypes]LindenLab.SecondLife.Quaternion");
  91. break;
  92. case LST_LIST:
  93. fprintf(fp, "class [mscorlib]System.Collections.ArrayList");
  94. break;
  95. case LST_NULL:
  96. fprintf(fp, "void");
  97. break;
  98. default:
  99. break;
  100. }
  101. }
  102. void LLScriptType::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  103. {
  104. if (gErrorToText.getErrors())
  105. {
  106. return;
  107. }
  108. switch(pass)
  109. {
  110. case LSCP_PRETTY_PRINT:
  111. case LSCP_EMIT_ASSEMBLY:
  112. fprintf(fp,"%s",LSCRIPTTypeNames[mType]);
  113. break;
  114. case LSCP_TYPE:
  115. type = mType;
  116. break;
  117. case LSCP_EMIT_CIL_ASSEMBLY:
  118. print_cil_type(fp, mType);
  119. break;
  120. default:
  121. break;
  122. }
  123. }
  124. S32 LLScriptType::getSize()
  125. {
  126. return LSCRIPTDataSize[mType];
  127. }
  128. void LLScriptConstant::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  129. {
  130. if (gErrorToText.getErrors())
  131. {
  132. return;
  133. }
  134. switch(pass)
  135. {
  136. case LSCP_PRETTY_PRINT:
  137. case LSCP_EMIT_ASSEMBLY:
  138. fprintf(fp,"Script Constant Base class -- should never get here!n");
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. S32 LLScriptConstant::getSize()
  145. {
  146. printf("Script Constant Base class -- should never get here!n");
  147. return 0;
  148. }
  149. void LLScriptConstantInteger::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  150. {
  151. if (gErrorToText.getErrors())
  152. {
  153. return;
  154. }
  155. switch(pass)
  156. {
  157. case LSCP_PRETTY_PRINT:
  158. fprintf(fp, "%d", mValue);
  159. break;
  160. case LSCP_EMIT_ASSEMBLY:
  161. fprintf(fp, "PUSHARGI %dn", mValue);
  162. break;
  163. case LSCP_TYPE:
  164. type = mType;
  165. break;
  166. case LSCP_EMIT_BYTE_CODE:
  167. {
  168. chunk->addInteger(mValue);
  169. type = mType;
  170. }
  171. break;
  172. case LSCP_TO_STACK:
  173. {
  174. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHARGI]);
  175. chunk->addInteger(mValue);
  176. type = mType;
  177. }
  178. break;
  179. case LSCP_LIST_BUILD_SIMPLE:
  180. {
  181. *ldata = new LLScriptLibData(mValue);
  182. }
  183. break;
  184. case LSCP_EMIT_CIL_ASSEMBLY:
  185. fprintf(fp, "ldc.i4 %dn", mValue);
  186. type = mType;
  187. break;
  188. default:
  189. break;
  190. }
  191. }
  192. S32 LLScriptConstantInteger::getSize()
  193. {
  194. return LSCRIPTDataSize[LST_INTEGER];
  195. }
  196. void LLScriptConstantFloat::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  197. {
  198. if (gErrorToText.getErrors())
  199. {
  200. return;
  201. }
  202. switch(pass)
  203. {
  204. case LSCP_PRETTY_PRINT:
  205. fprintf(fp, "%5.5f", mValue);
  206. break;
  207. case LSCP_EMIT_ASSEMBLY:
  208. fprintf(fp, "PUSHARGF %5.5fn", mValue);
  209. break;
  210. case LSCP_TYPE:
  211. type = mType;
  212. break;
  213. case LSCP_EMIT_BYTE_CODE:
  214. {
  215. chunk->addFloat(mValue);
  216. type = mType;
  217. }
  218. break;
  219. case LSCP_TO_STACK:
  220. {
  221. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHARGF]);
  222. chunk->addFloat(mValue);
  223. type = mType;
  224. }
  225. break;
  226. case LSCP_LIST_BUILD_SIMPLE:
  227. {
  228. *ldata = new LLScriptLibData(mValue);
  229. }
  230. break;
  231. case LSCP_EMIT_CIL_ASSEMBLY:
  232.         {
  233.         double v = (double)mValue;
  234. U8 * p = (U8 *)&v; // See ECMA-335 Partition VI, Appendix C.4.6 Examples, line 4
  235. fprintf(fp, "ldc.r8 (%02x %02x %02x %02x %02x %02x %02x %02x)n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
  236. type = mType;
  237. }
  238. break;
  239. default:
  240. break;
  241. }
  242. }
  243. S32 LLScriptConstantFloat::getSize()
  244. {
  245. return LSCRIPTDataSize[LST_FLOATINGPOINT];
  246. }
  247. void print_escaped(LLFILE* fp, const char* str)
  248. {
  249.   putc('"', fp);
  250.   for(const char* c = str; *c != ''; ++c)
  251.   {
  252.   switch(*c)
  253.   {
  254.   case '"':
  255. putc('\', fp);
  256. putc(*c, fp);
  257. break;
  258.   case 'n':
  259. putc('\', fp);
  260. putc('n', fp);
  261. break;
  262.   case 't':
  263. putc(' ', fp);
  264. putc(' ', fp);
  265. putc(' ', fp);
  266. putc(' ', fp);
  267. break;
  268.   case '\':
  269. putc('\', fp);
  270. putc('\', fp);
  271. break;
  272.   default:
  273. putc(*c, fp);
  274.   }
  275.   }
  276.   putc('"', fp);
  277. }
  278. void LLScriptConstantString::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  279. {
  280. if (gErrorToText.getErrors())
  281. {
  282. return;
  283. }
  284. switch(pass)
  285. {
  286. case LSCP_PRETTY_PRINT:
  287. fprintf(fp, ""%s"", mValue);
  288. break;
  289. case LSCP_EMIT_ASSEMBLY:
  290. fprintf(fp, "PUSHARGS "%s"n", mValue);
  291. break;
  292. case LSCP_TYPE:
  293. type = mType;
  294. break;
  295. case LSCP_EMIT_BYTE_CODE:
  296. {
  297. chunk->addInteger(heap->mCurrentOffset + 1);
  298. LLScriptLibData *data = new LLScriptLibData(mValue);
  299. U8 *temp;
  300. S32 size = lsa_create_data_block(&temp, data, heap->mCurrentOffset);
  301. heap->addBytes(temp, size);
  302. delete [] temp;
  303. delete data;
  304. }
  305. break;
  306. case LSCP_TO_STACK:
  307. {
  308. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHARGS]);
  309. chunk->addBytes(mValue, (S32)strlen(mValue) + 1);
  310. type = mType;
  311. }
  312. break;
  313. case LSCP_LIST_BUILD_SIMPLE:
  314. {
  315. *ldata = new LLScriptLibData(mValue);
  316. }
  317. break;
  318. case LSCP_EMIT_CIL_ASSEMBLY:
  319. fprintf(fp, "ldstr ");
  320. print_escaped(fp, mValue);
  321. fprintf(fp, "n");
  322. default:
  323. break;
  324. }
  325. }
  326. S32 LLScriptConstantString::getSize()
  327. {
  328. return (S32)strlen(mValue) + 1;
  329. }
  330. void LLScriptIdentifier::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  331. {
  332. if (gErrorToText.getErrors())
  333. {
  334. return;
  335. }
  336. switch(pass)
  337. {
  338. case LSCP_PRETTY_PRINT:
  339. fprintf(fp, "%s", mName);
  340. break;
  341. case LSCP_EMIT_ASSEMBLY:
  342. if (mScopeEntry)
  343. {
  344. if (mScopeEntry->mIDType == LIT_VARIABLE)
  345. {
  346. fprintf(fp, "$BP + %d [%s]", mScopeEntry->mOffset, mName);
  347. }
  348. else if (mScopeEntry->mIDType == LIT_GLOBAL)
  349. {
  350. fprintf(fp, "$GVR + %d [%s]", mScopeEntry->mOffset, mName);
  351. }
  352. else
  353. {
  354. fprintf(fp, "%s", mName);
  355. }
  356. }
  357. break;
  358. case LSCP_TYPE:
  359. if (mScopeEntry)
  360. type = mScopeEntry->mType;
  361. else
  362. type = LST_NULL;
  363. break;
  364. case LSCP_RESOURCE:
  365. if (mScopeEntry)
  366. {
  367. if (mScopeEntry->mIDType == LIT_VARIABLE)
  368. {
  369. // fprintf(fp, "LOCAL : %d : %d : %sn", mScopeEntry->mOffset, mScopeEntry->mSize, mName);
  370. }
  371. else if (mScopeEntry->mIDType == LIT_GLOBAL)
  372. {
  373. // fprintf(fp, "GLOBAL: %d : %d : %sn", mScopeEntry->mOffset, mScopeEntry->mSize, mName);
  374. }
  375. }
  376. break;
  377. case LSCP_LIST_BUILD_SIMPLE:
  378. {
  379. if (mScopeEntry)
  380. {
  381. if (mScopeEntry->mType == LST_LIST)
  382. {
  383. gErrorToText.writeError(fp, this, LSERROR_NO_LISTS_IN_LISTS);
  384. }
  385. else if (mScopeEntry->mAssignable)
  386. {
  387. mScopeEntry->mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, ldata);
  388. }
  389. else
  390. {
  391. gErrorToText.writeError(fp, this, LSERROR_NO_UNITIALIZED_VARIABLES_IN_LISTS);
  392. }
  393. }
  394. else
  395. {
  396. gErrorToText.writeError(fp, this, LSERROR_UNDEFINED_NAME);
  397. }
  398. }
  399. break;
  400. case LSCP_EMIT_CIL_ASSEMBLY:
  401. fprintf(fp, "'%s'", mName);
  402. break;
  403. default:
  404. break;
  405. }
  406. }
  407. S32 LLScriptIdentifier::getSize()
  408. {
  409. return 0;
  410. }
  411. void LLScriptSimpleAssignable::addAssignable(LLScriptSimpleAssignable *assign)
  412. {
  413. if (mNextp)
  414. {
  415. assign->mNextp = mNextp;
  416. }
  417. mNextp = assign;
  418. }
  419. void LLScriptSimpleAssignable::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  420. {
  421. if (gErrorToText.getErrors())
  422. {
  423. return;
  424. }
  425. fprintf(fp, "Simple Assignable Base Class -- should never get here!n");
  426. }
  427. S32 LLScriptSimpleAssignable::getSize()
  428. {
  429. printf("Simple Assignable Base Class -- should never get here!n");
  430. return 0;
  431. }
  432. static void print_cil_member(LLFILE* fp, LLScriptIdentifier *ident)
  433. {
  434. print_cil_type(fp, ident->mScopeEntry->mType);
  435. fprintf(fp, " %s::'%s'n", gScriptp->getClassName(), ident->mScopeEntry->mIdentifier);
  436. }
  437. void LLScriptSAIdentifier::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  438. {
  439. if (gErrorToText.getErrors())
  440. {
  441. return;
  442. }
  443. switch(pass)
  444. {
  445. case LSCP_PRETTY_PRINT:
  446. case LSCP_EMIT_ASSEMBLY:
  447. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  448. if (mNextp)
  449. {
  450. fprintf(fp, ", ");
  451. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  452. }
  453. break;
  454. case LSCP_SCOPE_PASS1:
  455. LLScriptScopeEntry *entry = scope->findEntry(mIdentifier->mName);
  456. if (!entry)
  457. {
  458. gErrorToText.writeError(fp, this, LSERROR_UNDEFINED_NAME);
  459. }
  460. else
  461. {
  462. // if we did find it, make sure this identifier is associated with the correct scope entry
  463. mIdentifier->mScopeEntry = entry;
  464. }
  465. if (mNextp)
  466. {
  467. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  468. }
  469. }
  470. break;
  471. case LSCP_EMIT_BYTE_CODE:
  472. {
  473. if (mIdentifier->mScopeEntry)
  474. {
  475. if(mIdentifier->mScopeEntry->mAssignable)
  476. {
  477. mIdentifier->mScopeEntry->mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  478. }
  479. else
  480. {
  481. // Babbage: 29/8/06: If the scope entry has no mAssignable,
  482. // set the default type and add the default 0 value to the 
  483. // chunk. Without this SAVectors and SAQuaternions will 
  484. // assume the arbitrary current type is the assignable type 
  485. // and may attempt to access a null chunk. (SL-20156)
  486. type = mIdentifier->mScopeEntry->mType;
  487. chunk->addBytes(LSCRIPTDataSize[type]);
  488. }
  489. }
  490. if (mNextp)
  491. {
  492. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  493. }
  494. }
  495. break;
  496. case LSCP_LIST_BUILD_SIMPLE:
  497. {
  498. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, ldata);
  499. if (mNextp)
  500. {
  501. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, &(*ldata)->mListp);
  502. }
  503. }
  504. break;
  505. case LSCP_EMIT_CIL_ASSEMBLY:
  506. {
  507. fprintf(fp, "ldarg.0n");
  508. fprintf(fp, "ldfld ");
  509. print_cil_member(fp, mIdentifier);
  510. fprintf(fp, "n");
  511. if (mNextp)
  512. {
  513. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  514. }
  515. break;
  516. }
  517. default:
  518. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  519. if (mNextp)
  520. {
  521. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  522. }
  523. break;
  524. }
  525. }
  526. S32 LLScriptSAIdentifier::getSize()
  527. {
  528. return mIdentifier->getSize();
  529. }
  530. void LLScriptSAConstant::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  531. {
  532. if (gErrorToText.getErrors())
  533. {
  534. return;
  535. }
  536. switch(pass)
  537. {
  538. case LSCP_PRETTY_PRINT:
  539. case LSCP_EMIT_ASSEMBLY:
  540. mConstant->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  541. if (mNextp)
  542. {
  543. fprintf(fp, ", ");
  544. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  545. }
  546. break;
  547. case LSCP_LIST_BUILD_SIMPLE:
  548. {
  549. mConstant->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, ldata);
  550. if (mNextp)
  551. {
  552. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, &(*ldata)->mListp);
  553. }
  554. }
  555. break;
  556. default:
  557. mConstant->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  558. if (mNextp)
  559. {
  560. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  561. }
  562. break;
  563. }
  564. }
  565. S32 LLScriptSAConstant::getSize()
  566. {
  567. return mConstant->getSize();
  568. }
  569. static void print_cil_cast(LLFILE* fp, LSCRIPTType srcType, LSCRIPTType targetType)
  570. {
  571. switch(srcType)
  572. {
  573. case LST_INTEGER:
  574. switch(targetType)
  575. {
  576. case LST_FLOATINGPOINT:
  577. fprintf(fp, "conv.r8n");
  578. break;
  579. case LST_STRING:
  580. fprintf(fp, "call string class [mscorlib]System.Convert::ToString(int32)n");
  581. break;
  582. case LST_LIST:
  583. print_cil_box(fp, LST_INTEGER);
  584. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  585. break;
  586. default:
  587. break;
  588. }
  589. break;
  590. case LST_FLOATINGPOINT:
  591. switch(targetType)
  592. {
  593. case LST_INTEGER:
  594. fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)n");
  595. break;
  596. case LST_STRING:
  597. fprintf(fp, "call string [LslLibrary]LindenLab.SecondLife.LslRunTime::ToString(float32)n");
  598. break;
  599. case LST_LIST:
  600. print_cil_box(fp, LST_FLOATINGPOINT);
  601. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  602. break;
  603. default:
  604. break;
  605. }
  606. break;
  607. case LST_STRING:
  608. switch(targetType)
  609. {
  610. case LST_INTEGER:
  611. fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::StringToInt(string)n");
  612. break;
  613. case LST_FLOATINGPOINT:
  614. fprintf(fp, "call float32 [LslLibrary]LindenLab.SecondLife.LslRunTime::StringToFloat(string)n");
  615. break;
  616. case LST_KEY:
  617. fprintf(fp, "call valuetype [ScriptTypes]LindenLab.SecondLife.Key class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateKey'(string)n");
  618. break;
  619. case LST_LIST:
  620. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  621. break;
  622. case LST_VECTOR:
  623. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'ParseVector'(string)n");
  624. break;
  625. case LST_QUATERNION:
  626. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'ParseQuaternion'(string)n");
  627. break;
  628. default:
  629. break;
  630. }
  631. break;
  632. case LST_KEY:
  633. switch(targetType)
  634. {
  635. case LST_KEY:
  636. break;
  637. case LST_STRING:
  638. fprintf(fp, "call string [LslUserScript]LindenLab.SecondLife.LslUserScript::'ToString'(valuetype [ScriptTypes]LindenLab.SecondLife.Key)n");
  639. break;
  640. case LST_LIST:
  641. print_cil_box(fp, LST_KEY);
  642. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  643. break;
  644. default:
  645. break;
  646. }
  647. break;
  648. case LST_VECTOR:
  649. switch(targetType)
  650. {
  651. case LST_VECTOR:
  652. break;
  653. case LST_STRING:
  654. fprintf(fp, "call string [LslUserScript]LindenLab.SecondLife.LslUserScript::'ToString'(valuetype [ScriptTypes]LindenLab.SecondLife.Vector)n");
  655. break;
  656. case LST_LIST:
  657. print_cil_box(fp, LST_VECTOR);
  658. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  659. break;
  660. default:
  661. break;
  662. }
  663. break;
  664. case LST_QUATERNION:
  665. switch(targetType)
  666. {
  667. case LST_QUATERNION:
  668. break;
  669. case LST_STRING:
  670. fprintf(fp, "call string [LslUserScript]LindenLab.SecondLife.LslUserScript::'ToString'(valuetype [ScriptTypes]LindenLab.SecondLife.Quaternion)n");
  671. break;
  672. case LST_LIST:
  673. print_cil_box(fp, LST_QUATERNION);
  674. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList(object)n");
  675. break;
  676. default:
  677. break;
  678. }
  679. break;
  680. case LST_LIST:
  681. switch(targetType)
  682. {
  683. case LST_LIST:
  684. break;
  685. case LST_STRING:
  686. fprintf(fp, "call string [LslLibrary]LindenLab.SecondLife.LslRunTime::ListToString(class [mscorlib]System.Collections.ArrayList)n");
  687. break;
  688. default:
  689. break;
  690. }
  691. break;
  692. default:
  693. break;
  694. }
  695. }
  696. static void print_cil_numeric_cast(LLFILE* fp, LSCRIPTType currentArg, LSCRIPTType otherArg)
  697. {
  698. if((currentArg == LST_INTEGER) && ((otherArg == LST_FLOATINGPOINT) || (otherArg == LST_VECTOR)))
  699. {
  700. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  701. }
  702. }
  703. static void print_cil_assignment_cast(LLFILE* fp, LSCRIPTType src,
  704.   LSCRIPTType dest)
  705. {
  706. if (LST_STRING == src && LST_KEY == dest)
  707. {
  708. print_cil_cast(fp, src, dest);
  709. }
  710. else if(LST_KEY == src && LST_STRING == dest)
  711. {
  712. print_cil_cast(fp, src, dest);
  713. }
  714. else
  715. {
  716. print_cil_numeric_cast(fp, src, dest);
  717. }
  718. }
  719.  
  720. // HACK! Babbage: should be converted to virtual on LSCRIPTSimpleAssignableType to avoid downcasts.
  721. LSCRIPTType get_type(LLScriptSimpleAssignable* sa)
  722. {
  723. LSCRIPTType result = LST_NULL;
  724. switch(sa->mType)
  725. {
  726. case LSSAT_IDENTIFIER:
  727. result = ((LLScriptSAIdentifier*) sa)->mIdentifier->mScopeEntry->mType;
  728. break;
  729. case LSSAT_CONSTANT:
  730. result = ((LLScriptSAConstant*) sa)->mConstant->mType;
  731. break;
  732. case LSSAT_VECTOR_CONSTANT:
  733. result = LST_VECTOR;
  734. break;
  735. case LSSAT_QUATERNION_CONSTANT:
  736. result = LST_QUATERNION;
  737. break;
  738. case LSSAT_LIST_CONSTANT:
  739. result = LST_LIST;
  740. break;
  741. default:
  742. result = LST_UNDEFINED;
  743. break;
  744. }
  745. return result;
  746. }
  747. void LLScriptSAVector::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  748. {
  749. if (gErrorToText.getErrors())
  750. {
  751. return;
  752. }
  753. switch(pass)
  754. {
  755. case LSCP_PRETTY_PRINT:
  756. case LSCP_EMIT_ASSEMBLY:
  757. fprintf(fp, "< ");
  758. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  759. fprintf(fp, ", ");
  760. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  761. fprintf(fp, ", ");
  762. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  763. fprintf(fp, " >");
  764. if (mNextp)
  765. {
  766. fprintf(fp, ", ");
  767. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  768. }
  769. break;
  770. case LSCP_TYPE:
  771. // vector's take floats
  772. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  773. if (!legal_assignment(LST_FLOATINGPOINT, type))
  774. {
  775. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  776. }
  777. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  778. if (!legal_assignment(LST_FLOATINGPOINT, type))
  779. {
  780. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  781. }
  782. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  783. if (!legal_assignment(LST_FLOATINGPOINT, type))
  784. {
  785. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  786. }
  787. type = LST_VECTOR;
  788. if (mNextp)
  789. {
  790. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  791. }
  792. break;
  793. case LSCP_EMIT_BYTE_CODE:
  794. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  795. if (type == LST_INTEGER)
  796. {
  797. S32 offset = chunk->mCurrentOffset - 4;
  798. bytestream_int2float(chunk->mCodeChunk, offset);
  799. }
  800. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  801. if (type == LST_INTEGER)
  802. {
  803. S32 offset = chunk->mCurrentOffset - 4;
  804. bytestream_int2float(chunk->mCodeChunk, offset);
  805. }
  806. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  807. if (type == LST_INTEGER)
  808. {
  809. S32 offset = chunk->mCurrentOffset - 4;
  810. bytestream_int2float(chunk->mCodeChunk, offset);
  811. }
  812. if (mNextp)
  813. {
  814. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  815. }
  816. break;
  817. case LSCP_LIST_BUILD_SIMPLE:
  818. {
  819. LLScriptByteCodeChunk *list = new LLScriptByteCodeChunk(FALSE);
  820. mEntry3->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  821. if (type == LST_INTEGER)
  822. {
  823. S32 offset = list->mCurrentOffset - 4;
  824. bytestream_int2float(list->mCodeChunk, offset);
  825. }
  826. mEntry2->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  827. if (type == LST_INTEGER)
  828. {
  829. S32 offset = list->mCurrentOffset - 4;
  830. bytestream_int2float(list->mCodeChunk, offset);
  831. }
  832. mEntry1->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  833. if (type == LST_INTEGER)
  834. {
  835. S32 offset = list->mCurrentOffset - 4;
  836. bytestream_int2float(list->mCodeChunk, offset);
  837. }
  838. LLVector3 vec;
  839. S32 offset = 0;
  840. bytestream2vector(vec, list->mCodeChunk, offset);
  841. *ldata = new LLScriptLibData(vec);
  842. delete list;
  843. if (mNextp)
  844. {
  845. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, &(*ldata)->mListp);
  846. }
  847. }
  848. break;
  849. case LSCP_EMIT_CIL_ASSEMBLY:
  850. // Load arguments.
  851. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  852. if(LST_INTEGER == get_type(mEntry1))
  853. {
  854. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  855. }
  856. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  857. if(LST_INTEGER == get_type(mEntry2))
  858. {
  859. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  860. }
  861. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  862. if(LST_INTEGER == get_type(mEntry3))
  863. {
  864. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  865. }
  866. // Call named ctor, which leaves new Vector on stack, so it can be saved in to local or argument just like a primitive type.
  867. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateVector'(float32, float32, float32)n");
  868. // Next.
  869. if (mNextp)
  870. {
  871. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  872. }
  873. break;
  874. default:
  875. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  876. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  877. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  878. if (mNextp)
  879. {
  880. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  881. }
  882. break;
  883. }
  884. }
  885. S32 LLScriptSAVector::getSize()
  886. {
  887. return mEntry1->getSize() + mEntry2->getSize() + mEntry3->getSize();
  888. }
  889. void LLScriptSAQuaternion::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  890. {
  891. if (gErrorToText.getErrors())
  892. {
  893. return;
  894. }
  895. switch(pass)
  896. {
  897. case LSCP_PRETTY_PRINT:
  898. case LSCP_EMIT_ASSEMBLY:
  899. fprintf(fp, "< ");
  900. mEntry4->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  901. fprintf(fp, ", ");
  902. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  903. fprintf(fp, ", ");
  904. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  905. fprintf(fp, ", ");
  906. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  907. fprintf(fp, " >");
  908. if (mNextp)
  909. {
  910. fprintf(fp, ", ");
  911. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  912. }
  913. break;
  914. case LSCP_TYPE:
  915. // vector's take floats
  916. mEntry4->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  917. if (!legal_assignment(LST_FLOATINGPOINT, type))
  918. {
  919. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  920. }
  921. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  922. if (!legal_assignment(LST_FLOATINGPOINT, type))
  923. {
  924. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  925. }
  926. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  927. if (!legal_assignment(LST_FLOATINGPOINT, type))
  928. {
  929. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  930. }
  931. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  932. if (!legal_assignment(LST_FLOATINGPOINT, type))
  933. {
  934. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  935. }
  936. type = LST_QUATERNION;
  937. if (mNextp)
  938. {
  939. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  940. }
  941. break;
  942. case LSCP_EMIT_BYTE_CODE:
  943. mEntry4->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  944. if (type == LST_INTEGER)
  945. {
  946. S32 offset = chunk->mCurrentOffset - 4;
  947. bytestream_int2float(chunk->mCodeChunk, offset);
  948. }
  949. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  950. if (type == LST_INTEGER)
  951. {
  952. S32 offset = chunk->mCurrentOffset - 4;
  953. bytestream_int2float(chunk->mCodeChunk, offset);
  954. }
  955. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  956. if (type == LST_INTEGER)
  957. {
  958. S32 offset = chunk->mCurrentOffset - 4;
  959. bytestream_int2float(chunk->mCodeChunk, offset);
  960. }
  961. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  962. if (type == LST_INTEGER)
  963. {
  964. S32 offset = chunk->mCurrentOffset - 4;
  965. bytestream_int2float(chunk->mCodeChunk, offset);
  966. }
  967. if (mNextp)
  968. {
  969. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  970. }
  971. break;
  972. case LSCP_LIST_BUILD_SIMPLE:
  973. {
  974. LLScriptByteCodeChunk *list = new LLScriptByteCodeChunk(FALSE);
  975. mEntry4->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  976. if (type == LST_INTEGER)
  977. {
  978. S32 offset = list->mCurrentOffset - 4;
  979. bytestream_int2float(list->mCodeChunk, offset);
  980. }
  981. mEntry3->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  982. if (type == LST_INTEGER)
  983. {
  984. S32 offset = list->mCurrentOffset - 4;
  985. bytestream_int2float(list->mCodeChunk, offset);
  986. }
  987. mEntry2->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  988. if (type == LST_INTEGER)
  989. {
  990. S32 offset = list->mCurrentOffset - 4;
  991. bytestream_int2float(list->mCodeChunk, offset);
  992. }
  993. mEntry1->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, list, heap, stacksize, entry, entrycount, NULL);
  994. if (type == LST_INTEGER)
  995. {
  996. S32 offset = list->mCurrentOffset - 4;
  997. bytestream_int2float(list->mCodeChunk, offset);
  998. }
  999. LLQuaternion quat;
  1000. S32 offset = 0;
  1001. bytestream2quaternion(quat, list->mCodeChunk, offset);
  1002. *ldata = new LLScriptLibData(quat);
  1003. delete list;
  1004. if (mNextp)
  1005. {
  1006. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, &(*ldata)->mListp);
  1007. }
  1008. }
  1009. break;
  1010. case LSCP_EMIT_CIL_ASSEMBLY:
  1011. // Load arguments.
  1012. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1013. if(LST_INTEGER == get_type(mEntry1))
  1014. {
  1015. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  1016. }
  1017. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1018. if(LST_INTEGER == get_type(mEntry2))
  1019. {
  1020. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  1021. }
  1022. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1023. if(LST_INTEGER == get_type(mEntry3))
  1024. {
  1025. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  1026. }
  1027. mEntry4->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1028. if(LST_INTEGER == get_type(mEntry4))
  1029. {
  1030. print_cil_cast(fp, LST_INTEGER, LST_FLOATINGPOINT);
  1031. }
  1032. // Call named ctor, which leaves new Vector on stack, so it can be saved in to local or argument just like a primitive type.
  1033. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateQuaternion'(float32, float32, float32, float32)n");
  1034. // Next.
  1035. if (mNextp)
  1036. {
  1037. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1038. }
  1039. break;
  1040. default:
  1041. mEntry4->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1042. mEntry3->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1043. mEntry2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1044. mEntry1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1045. if (mNextp)
  1046. {
  1047. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1048. }
  1049. break;
  1050. }
  1051. }
  1052. S32 LLScriptSAQuaternion::getSize()
  1053. {
  1054. return mEntry1->getSize() + mEntry2->getSize() + mEntry3->getSize() + mEntry4->getSize();
  1055. }
  1056. void LLScriptSAList::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1057. {
  1058. if (gErrorToText.getErrors())
  1059. {
  1060. return;
  1061. }
  1062. switch(pass)
  1063. {
  1064. case LSCP_PRETTY_PRINT:
  1065. case LSCP_EMIT_ASSEMBLY:
  1066. fprintf(fp, "[ ");
  1067. if (mEntryList)
  1068. mEntryList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1069. fprintf(fp, " ]");
  1070. if (mNextp)
  1071. {
  1072. fprintf(fp, ", ");
  1073. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1074. }
  1075. break;
  1076. case LSCP_TYPE:
  1077. if (mEntryList)
  1078. mEntryList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1079. type = LST_LIST;
  1080. if (mNextp)
  1081. {
  1082. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1083. }
  1084. break;
  1085. case LSCP_EMIT_BYTE_CODE:
  1086. {
  1087. LLScriptLibData *list_data = new LLScriptLibData;
  1088. list_data->mType = LST_LIST;
  1089. if (mEntryList)
  1090. mEntryList->recurse(fp, tabs, tabsize, LSCP_LIST_BUILD_SIMPLE, ptype, prunearg, scope, type, basetype, count, chunk, NULL, stacksize, entry, entrycount, &(list_data->mListp));
  1091. U8 *temp;
  1092. chunk->addInteger(heap->mCurrentOffset + 1);
  1093. S32 size = lsa_create_data_block(&temp, list_data, heap->mCurrentOffset);
  1094. heap->addBytes(temp, size);
  1095. delete list_data;
  1096. delete [] temp;
  1097. if (mNextp)
  1098. {
  1099. mNextp->recurse(fp, tabs, tabsize, LSCP_EMIT_BYTE_CODE, ptype, prunearg, scope, type, basetype, count, chunk, NULL, stacksize, entry, entrycount, NULL);
  1100. }
  1101. }
  1102. break;
  1103. case LSCP_EMIT_CIL_ASSEMBLY:
  1104. {
  1105. // Create list.
  1106. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList()n");
  1107. // Add elements.
  1108. LLScriptSimpleAssignable* current_entry = mEntryList;
  1109. LLScriptSimpleAssignable* next_entry = NULL;
  1110. while(NULL != current_entry)
  1111. {
  1112. next_entry = current_entry->mNextp;
  1113. // Null mNextp pointer, so only current list element is processed.
  1114. current_entry->mNextp = NULL;
  1115. current_entry->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1116. // Restore mNextp pointer.
  1117. current_entry->mNextp = next_entry;
  1118. // Box element and store in list.
  1119. print_cil_box(fp, get_type(current_entry));
  1120. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(class [mscorlib]System.Collections.ArrayList, object)n");
  1121. // Process next element.
  1122. current_entry = next_entry;
  1123. }
  1124. // Process next list.
  1125. if (mNextp)
  1126. {
  1127. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1128. }
  1129. }
  1130. break;
  1131. default:
  1132. if (mEntryList)
  1133. mEntryList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, ldata);
  1134. if (mNextp)
  1135. {
  1136. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, ldata);
  1137. }
  1138. break;
  1139. }
  1140. }
  1141. S32 LLScriptSAList::getSize()
  1142. {
  1143. return mEntryList->getSize();
  1144. }
  1145. void LLScriptGlobalVariable::addGlobal(LLScriptGlobalVariable *global)
  1146. {
  1147. if (mNextp)
  1148. {
  1149. global->mNextp = mNextp;
  1150. }
  1151. mNextp = global;
  1152. }
  1153. void LLScriptGlobalVariable::gonext(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1154. {
  1155. switch(pass)
  1156. {
  1157. case LSCP_PRETTY_PRINT:
  1158. if (mNextp)
  1159. {
  1160. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1161. }
  1162. break;
  1163. default:
  1164. if (mNextp)
  1165. {
  1166. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1167. }
  1168. break;
  1169. }
  1170. }
  1171. // Push initialised variable of type on to stack.
  1172. static void print_cil_init_variable(LLFILE* fp, LSCRIPTType type)
  1173. {
  1174. switch(type)
  1175. {
  1176. case LST_INTEGER:
  1177. fprintf(fp, "ldc.i4.0n");
  1178. break;
  1179. case LST_FLOATINGPOINT:
  1180. fprintf(fp, "ldc.r8 0n");
  1181. break;
  1182. case LST_STRING:
  1183. fprintf(fp, "ldstr ""n");
  1184. break;
  1185. case LST_KEY:
  1186. fprintf(fp, "ldstr ""n");
  1187. fprintf(fp, "call valuetype [ScriptTypes]LindenLab.SecondLife.Key class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateKey'(string)n");
  1188. break;
  1189. case LST_VECTOR:
  1190. fprintf(fp, "ldc.r8 0n");
  1191. fprintf(fp, "ldc.r8 0n");
  1192. fprintf(fp, "ldc.r8 0n");
  1193. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateVector'(float32, float32, float32)n");
  1194. break;
  1195. case LST_QUATERNION:
  1196. fprintf(fp, "ldc.r8 0n");
  1197. fprintf(fp, "ldc.r8 0n");
  1198. fprintf(fp, "ldc.r8 0n");
  1199. fprintf(fp, "ldc.r8 1n");
  1200. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateQuaternion'(float32, float32, float32, float32)n");
  1201. break;
  1202. case LST_LIST:
  1203. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::CreateList()n");
  1204. break;
  1205. default:
  1206. break;
  1207. }
  1208. }
  1209. void LLScriptGlobalVariable::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1210. {
  1211. if (gErrorToText.getErrors())
  1212. {
  1213. return;
  1214. }
  1215. switch(pass)
  1216. {
  1217. case LSCP_PRETTY_PRINT:
  1218. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1219. fprintf(fp,"t");
  1220. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1221. if (mAssignable)
  1222. {
  1223. fprintf(fp, " = ");
  1224. mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1225. }
  1226. fprintf(fp, ";n");
  1227. break;
  1228. case LSCP_EMIT_ASSEMBLY:
  1229. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1230. fprintf(fp,"t");
  1231. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1232. if (mAssignable)
  1233. {
  1234. fprintf(fp, " = ");
  1235. mAssignable->recurse(fp, tabs, tabsize, LSCP_PRETTY_PRINT, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1236. fprintf(fp, "n");
  1237. fprintf(fp, "Offset: %d Type: %dn", mIdentifier->mScopeEntry->mOffset, (S32)LSCRIPTTypeByte[mType->mType]);
  1238. }
  1239. else
  1240. {
  1241. fprintf(fp, "n");
  1242. fprintf(fp, "Offset: %d Type: %dn", mIdentifier->mScopeEntry->mOffset, (S32)LSCRIPTTypeByte[mType->mType]);
  1243. }
  1244. break;
  1245. case LSCP_SCOPE_PASS1:
  1246. if (scope->checkEntry(mIdentifier->mName))
  1247. {
  1248. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1249. }
  1250. else
  1251. {
  1252. if (mAssignable)
  1253. {
  1254. mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1255. }
  1256. // this needs to go after expression decent to make sure that we don't add ourselves or something silly
  1257. mIdentifier->mScopeEntry = scope->addEntry(mIdentifier->mName, LIT_GLOBAL, mType->mType);
  1258. if (mIdentifier->mScopeEntry && mAssignable)
  1259. mIdentifier->mScopeEntry->mAssignable = mAssignable;
  1260. }
  1261. break;
  1262. case LSCP_TYPE:
  1263. // if the variable has an assignable, it must assignable to the variable's type
  1264. if (mAssignable)
  1265. {
  1266. mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1267. mAssignableType = type;
  1268. if (!legal_assignment(mType->mType, mAssignableType))
  1269. {
  1270. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  1271. }
  1272. }
  1273. break;
  1274. case LSCP_RESOURCE:
  1275. {
  1276. // we're just tryng to determine how much space the variable needs
  1277. // it also includes the name of the variable as well as the type
  1278. // plus 4 bytes of offset from it's apparent address to the actual data
  1279. #ifdef LSL_INCLUDE_DEBUG_INFO
  1280. count += strlen(mIdentifier->mName) + 1 + 1 + 4;
  1281. #else
  1282. count += 1 + 1 + 4;
  1283. #endif
  1284. mIdentifier->mScopeEntry->mOffset = (S32)count;
  1285. mIdentifier->mScopeEntry->mSize = mType->getSize();
  1286. count += mIdentifier->mScopeEntry->mSize;
  1287. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1288. }
  1289. break;
  1290. case LSCP_EMIT_BYTE_CODE:
  1291. {
  1292. // order for global variables
  1293. // 0 - 4: offset to actual data
  1294. S32 offsetoffset = chunk->mCurrentOffset;
  1295. S32 offsetdelta = 0;
  1296. chunk->addBytes(4);
  1297. // type
  1298. char vtype;
  1299. vtype = LSCRIPTTypeByte[mType->mType]; 
  1300. chunk->addBytes(&vtype, 1);
  1301. // null terminated name
  1302. #ifdef LSL_INCLUDE_DEBUG_INFO
  1303. chunk->addBytes(mIdentifier->mName, strlen(mIdentifier->mName) + 1);
  1304. #else
  1305. chunk->addBytes(1);
  1306. #endif
  1307. // put correct offset delta in
  1308. offsetdelta = chunk->mCurrentOffset - offsetoffset;
  1309. integer2bytestream(chunk->mCodeChunk, offsetoffset, offsetdelta);
  1310. // now we need space for the variable itself
  1311. LLScriptByteCodeChunk *value = new LLScriptByteCodeChunk(FALSE);
  1312. if (mAssignable)
  1313. {
  1314. mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, value, heap, stacksize, entry, entrycount, NULL);
  1315. // need to put sneaky type conversion here
  1316. if (mAssignableType != mType->mType)
  1317. {
  1318. // the only legal case that is a problem is int->float
  1319. if (mType->mType == LST_FLOATINGPOINT && mAssignableType == LST_INTEGER)
  1320. {
  1321. S32 offset = value->mCurrentOffset - 4;
  1322. bytestream_int2float(value->mCodeChunk, offset);
  1323. }
  1324. }
  1325. }
  1326. else
  1327. {
  1328. if (  (mType->mType == LST_STRING)
  1329. ||(mType->mType == LST_KEY))
  1330. {
  1331. // string and keys (even empty ones) need heap entries
  1332. chunk->addInteger(heap->mCurrentOffset + 1);
  1333. LLScriptLibData *data = new LLScriptLibData("");
  1334. U8 *temp;
  1335. S32 size = lsa_create_data_block(&temp, data, heap->mCurrentOffset);
  1336. heap->addBytes(temp, size);
  1337. delete [] temp;
  1338. delete data;
  1339. }
  1340. else if (mType->mType == LST_LIST)
  1341. {
  1342. chunk->addInteger(heap->mCurrentOffset + 1);
  1343. LLScriptLibData *data = new LLScriptLibData;
  1344. data->mType = LST_LIST;
  1345. U8 *temp;
  1346. S32 size = lsa_create_data_block(&temp, data, heap->mCurrentOffset);
  1347. heap->addBytes(temp, size);
  1348. delete [] temp;
  1349. delete data;
  1350. }
  1351. else if (mType->mType == LST_QUATERNION)
  1352. {
  1353. chunk->addFloat(1.f);
  1354. chunk->addFloat(0.f);
  1355. chunk->addFloat(0.f);
  1356. chunk->addFloat(0.f);
  1357. }
  1358. else
  1359. {
  1360. value->addBytes(LSCRIPTDataSize[mType->mType]);
  1361. }
  1362. }
  1363. chunk->addBytes(value->mCodeChunk, value->mCurrentOffset);
  1364. delete value;
  1365. }
  1366. break;
  1367. case LSCP_EMIT_CIL_ASSEMBLY:
  1368. // Initialisation inside ctor.
  1369. fprintf(fp, "ldarg.0n");
  1370. if (mAssignable)
  1371. {
  1372. // Initialise to value.
  1373. mAssignable->recurse(fp, tabs, tabsize, LSCP_EMIT_CIL_ASSEMBLY,
  1374.  ptype, prunearg, scope, type, basetype,
  1375.  count, chunk, heap, stacksize, entry,
  1376.  entrycount, NULL);
  1377. print_cil_assignment_cast(fp, get_type(mAssignable), mType->mType);
  1378. }
  1379. else
  1380. {
  1381. // Initialise to zero.
  1382. print_cil_init_variable(fp, mType->mType);
  1383. }
  1384. // Store value.
  1385. fprintf(fp, "stfld ");
  1386. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1387. fprintf(fp," %s::", gScriptp->getClassName());
  1388. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1389. fprintf(fp, "n");
  1390. break;
  1391. default:
  1392. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1393. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1394. if (mAssignable)
  1395. {
  1396. mAssignable->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1397. }
  1398. break;
  1399. }
  1400. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1401. }
  1402. S32 LLScriptGlobalVariable::getSize()
  1403. {
  1404. S32 return_size;
  1405. return_size = mType->getSize();
  1406. return return_size;
  1407. }
  1408. void LLScriptEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1409. {
  1410. fprintf(fp, "Event Base Class -- should never get here!n");
  1411. }
  1412. S32 LLScriptEvent::getSize()
  1413. {
  1414. printf("Event Base Class -- should never get here!n");
  1415. return 0;
  1416. }
  1417. static void checkForDuplicateHandler(LLFILE *fp, LLScriptFilePosition *pos, 
  1418.      LLScriptScope *scope,
  1419.      const char* name)
  1420. {
  1421.     LLScriptScope *parent = scope->mParentScope;
  1422.     if (parent->checkEntry((char*)name))
  1423.     {
  1424.         gErrorToText.writeError(fp, pos, LSERROR_DUPLICATE_NAME);
  1425.     }
  1426.     else
  1427.     {
  1428.         parent->addEntry(((char*)name), LIT_HANDLER, LST_NULL);
  1429.     }
  1430. }
  1431. void LLScriptStateEntryEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1432. {
  1433. if (gErrorToText.getErrors())
  1434. {
  1435. return;
  1436. }
  1437. switch(pass)
  1438. {
  1439. case LSCP_PRETTY_PRINT:
  1440. fdotabs(fp, tabs, tabsize);
  1441. fprintf(fp, "state_entry()n");
  1442. break;
  1443. case LSCP_EMIT_ASSEMBLY:
  1444. fprintf(fp, "state_entry()n");
  1445. break;
  1446. case LSCP_SCOPE_PASS1:
  1447.         checkForDuplicateHandler(fp, this, scope, "state_entry");
  1448.         break;
  1449. case LSCP_EMIT_BYTE_CODE:
  1450. {
  1451. #ifdef LSL_INCLUDE_DEBUG_INFO
  1452. char name[] = "state_entry";
  1453. chunk->addBytes(name, strlen(name) + 1);
  1454. #endif
  1455. }
  1456. break;
  1457. case LSCP_EMIT_CIL_ASSEMBLY:
  1458. fprintf(fp, "state_entry()");
  1459. break;
  1460. default:
  1461. break;
  1462. }
  1463. }
  1464. S32 LLScriptStateEntryEvent::getSize()
  1465. {
  1466. return 0;
  1467. }
  1468. void LLScriptStateExitEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1469. {
  1470. if (gErrorToText.getErrors())
  1471. {
  1472. return;
  1473. }
  1474. switch(pass)
  1475. {
  1476. case LSCP_PRETTY_PRINT:
  1477. fdotabs(fp, tabs, tabsize);
  1478. fprintf(fp, "state_exit()n");
  1479. break;
  1480.         case LSCP_SCOPE_PASS1:
  1481.                 checkForDuplicateHandler(fp, this, scope, "state_exit");
  1482.         break;
  1483. case LSCP_EMIT_ASSEMBLY:
  1484. fprintf(fp, "state_exit()n");
  1485. break;
  1486. case LSCP_EMIT_BYTE_CODE:
  1487. {
  1488. #ifdef LSL_INCLUDE_DEBUG_INFO
  1489. char name[] = "state_exit";
  1490. chunk->addBytes(name, strlen(name) + 1);
  1491. #endif
  1492. }
  1493. break;
  1494. case LSCP_EMIT_CIL_ASSEMBLY:
  1495. fprintf(fp, "state_exit()");
  1496. break;
  1497. default:
  1498. break;
  1499. }
  1500. }
  1501. S32 LLScriptStateExitEvent::getSize()
  1502. {
  1503. return 0;
  1504. }
  1505. void LLScriptTouchStartEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1506. {
  1507. if (gErrorToText.getErrors())
  1508. {
  1509. return;
  1510. }
  1511. switch(pass)
  1512. {
  1513. case LSCP_PRETTY_PRINT:
  1514. case LSCP_EMIT_ASSEMBLY:
  1515. fdotabs(fp, tabs, tabsize);
  1516. fprintf(fp, "touch_start( integer ");
  1517. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1518. fprintf(fp, " )n");
  1519. break;
  1520. break;
  1521. case LSCP_SCOPE_PASS1:
  1522.         checkForDuplicateHandler(fp, this, scope, "touch_start");
  1523. if (scope->checkEntry(mCount->mName))
  1524. {
  1525. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1526. }
  1527. else
  1528. {
  1529. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1530. }
  1531. break;
  1532. case LSCP_RESOURCE:
  1533. {
  1534. // we're just tryng to determine how much space the variable needs
  1535. if (mCount->mScopeEntry)
  1536. {
  1537. mCount->mScopeEntry->mOffset = (S32)count;
  1538. mCount->mScopeEntry->mSize = 4;
  1539. count += mCount->mScopeEntry->mSize;
  1540. }
  1541. }
  1542. break;
  1543. case LSCP_EMIT_BYTE_CODE:
  1544. {
  1545. #ifdef LSL_INCLUDE_DEBUG_INFO
  1546. char name[] = "touch_start";
  1547. chunk->addBytes(name, strlen(name) + 1);
  1548. chunk->addBytes(mCount->mName, strlen(mCount->mName) + 1);
  1549. #endif
  1550. }
  1551. break;
  1552. case LSCP_EMIT_CIL_ASSEMBLY:
  1553. fdotabs(fp, tabs, tabsize);
  1554. fprintf(fp, "touch_start( int32 ");
  1555. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1556. fprintf(fp, " )");
  1557. break;
  1558. break;
  1559. default:
  1560. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1561. break;
  1562. }
  1563. }
  1564. S32 LLScriptTouchStartEvent::getSize()
  1565. {
  1566. // integer = 4
  1567. return 4;
  1568. }
  1569. void LLScriptTouchEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1570. {
  1571. if (gErrorToText.getErrors())
  1572. {
  1573. return;
  1574. }
  1575. switch(pass)
  1576. {
  1577. case LSCP_PRETTY_PRINT:
  1578. case LSCP_EMIT_ASSEMBLY:
  1579. fdotabs(fp, tabs, tabsize);
  1580. fprintf(fp, "touch( integer ");
  1581. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1582. fprintf(fp, " )n");
  1583. break;
  1584. break;
  1585. case LSCP_SCOPE_PASS1:
  1586.         checkForDuplicateHandler(fp, this, scope, "touch");
  1587. if (scope->checkEntry(mCount->mName))
  1588. {
  1589. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1590. }
  1591. else
  1592. {
  1593. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1594. }
  1595. break;
  1596. case LSCP_RESOURCE:
  1597. {
  1598. // we're just tryng to determine how much space the variable needs
  1599. if (mCount->mScopeEntry)
  1600. {
  1601. mCount->mScopeEntry->mOffset = (S32)count;
  1602. mCount->mScopeEntry->mSize = 4;
  1603. count += mCount->mScopeEntry->mSize;
  1604. }
  1605. }
  1606. break;
  1607. case LSCP_EMIT_BYTE_CODE:
  1608. {
  1609. #ifdef LSL_INCLUDE_DEBUG_INFO
  1610. char name[] = "touch";
  1611. chunk->addBytes(name, strlen(name) + 1);
  1612. chunk->addBytes(mCount->mName, strlen(mCount->mName) + 1);
  1613. #endif
  1614. }
  1615. break;
  1616. case LSCP_EMIT_CIL_ASSEMBLY:
  1617. fdotabs(fp, tabs, tabsize);
  1618. fprintf(fp, "touch( int32 ");
  1619. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1620. fprintf(fp, " )");
  1621. break;
  1622. break;
  1623. default:
  1624. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1625. break;
  1626. }
  1627. }
  1628. S32 LLScriptTouchEvent::getSize()
  1629. {
  1630. // integer = 4
  1631. return 4;
  1632. }
  1633. void LLScriptTouchEndEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1634. {
  1635. if (gErrorToText.getErrors())
  1636. {
  1637. return;
  1638. }
  1639. switch(pass)
  1640. {
  1641. case LSCP_PRETTY_PRINT:
  1642. case LSCP_EMIT_ASSEMBLY:
  1643. fdotabs(fp, tabs, tabsize);
  1644. fprintf(fp, "touch_end( integer ");
  1645. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1646. fprintf(fp, " )n");
  1647. break;
  1648. break;
  1649. case LSCP_SCOPE_PASS1:
  1650.         checkForDuplicateHandler(fp, this, scope, "touch_end");
  1651. if (scope->checkEntry(mCount->mName))
  1652. {
  1653. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1654. }
  1655. else
  1656. {
  1657. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1658. }
  1659. break;
  1660. case LSCP_RESOURCE:
  1661. {
  1662. // we're just tryng to determine how much space the variable needs
  1663. if (mCount->mScopeEntry)
  1664. {
  1665. mCount->mScopeEntry->mOffset = (S32)count;
  1666. mCount->mScopeEntry->mSize = 4;
  1667. count += mCount->mScopeEntry->mSize;
  1668. }
  1669. }
  1670. break;
  1671. case LSCP_EMIT_BYTE_CODE:
  1672. {
  1673. #ifdef LSL_INCLUDE_DEBUG_INFO
  1674. char name[] = "touch_end";
  1675. chunk->addBytes(name, strlen(name) + 1);
  1676. chunk->addBytes(mCount->mName, strlen(mCount->mName) + 1);
  1677. #endif
  1678. }
  1679. break;
  1680. case LSCP_EMIT_CIL_ASSEMBLY:
  1681. fdotabs(fp, tabs, tabsize);
  1682. fprintf(fp, "touch_end( int32 ");
  1683. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1684. fprintf(fp, " )");
  1685. break;
  1686. break;
  1687. default:
  1688. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1689. break;
  1690. }
  1691. }
  1692. S32 LLScriptTouchEndEvent::getSize()
  1693. {
  1694. // integer = 4
  1695. return 4;
  1696. }
  1697. void LLScriptCollisionStartEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1698. {
  1699. if (gErrorToText.getErrors())
  1700. {
  1701. return;
  1702. }
  1703. switch(pass)
  1704. {
  1705. case LSCP_PRETTY_PRINT:
  1706. case LSCP_EMIT_ASSEMBLY:
  1707. fdotabs(fp, tabs, tabsize);
  1708. fprintf(fp, "collision_start( integer ");
  1709. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1710. fprintf(fp, " )n");
  1711. break;
  1712. break;
  1713. case LSCP_SCOPE_PASS1:
  1714.         checkForDuplicateHandler(fp, this, scope, "collision_start");
  1715. if (scope->checkEntry(mCount->mName))
  1716. {
  1717. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1718. }
  1719. else
  1720. {
  1721. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1722. }
  1723. break;
  1724. case LSCP_RESOURCE:
  1725. {
  1726. // we're just tryng to determine how much space the variable needs
  1727. if (mCount->mScopeEntry)
  1728. {
  1729. mCount->mScopeEntry->mOffset = (S32)count;
  1730. mCount->mScopeEntry->mSize = 4;
  1731. count += mCount->mScopeEntry->mSize;
  1732. }
  1733. }
  1734. break;
  1735. case LSCP_EMIT_BYTE_CODE:
  1736. {
  1737. #ifdef LSL_INCLUDE_DEBUG_INFO
  1738. char name[] = "collision_start";
  1739. chunk->addBytes(name, (S32)strlen(name) + 1);
  1740. chunk->addBytes(mCount->mName, (S32)strlen(mCount->mName) + 1);
  1741. #endif
  1742. }
  1743. break;
  1744. case LSCP_EMIT_CIL_ASSEMBLY:
  1745. fdotabs(fp, tabs, tabsize);
  1746. fprintf(fp, "collision_start( int32 ");
  1747. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1748. fprintf(fp, " )");
  1749. break;
  1750. default:
  1751. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1752. break;
  1753. }
  1754. }
  1755. S32 LLScriptCollisionStartEvent::getSize()
  1756. {
  1757. // integer = 4
  1758. return 4;
  1759. }
  1760. void LLScriptCollisionEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1761. {
  1762. if (gErrorToText.getErrors())
  1763. {
  1764. return;
  1765. }
  1766. switch(pass)
  1767. {
  1768. case LSCP_PRETTY_PRINT:
  1769. case LSCP_EMIT_ASSEMBLY:
  1770. fdotabs(fp, tabs, tabsize);
  1771. fprintf(fp, "collision( integer ");
  1772. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1773. fprintf(fp, " )n");
  1774. break;
  1775. break;
  1776. case LSCP_SCOPE_PASS1:
  1777.         checkForDuplicateHandler(fp, this, scope, "collision");
  1778. if (scope->checkEntry(mCount->mName))
  1779. {
  1780. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1781. }
  1782. else
  1783. {
  1784. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1785. }
  1786. break;
  1787. case LSCP_RESOURCE:
  1788. {
  1789. // we're just tryng to determine how much space the variable needs
  1790. if (mCount->mScopeEntry)
  1791. {
  1792. mCount->mScopeEntry->mOffset = (S32)count;
  1793. mCount->mScopeEntry->mSize = 4;
  1794. count += mCount->mScopeEntry->mSize;
  1795. }
  1796. }
  1797. break;
  1798. case LSCP_EMIT_BYTE_CODE:
  1799. {
  1800. #ifdef LSL_INCLUDE_DEBUG_INFO
  1801. char name[] = "collision";
  1802. chunk->addBytes(name, strlen(name) + 1);
  1803. chunk->addBytes(mCount->mName, strlen(mCount->mName) + 1);
  1804. #endif
  1805. }
  1806. break;
  1807. case LSCP_EMIT_CIL_ASSEMBLY:
  1808. fprintf(fp, "collision( int32 ");
  1809. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1810. fprintf(fp, " )");
  1811. break;
  1812. default:
  1813. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1814. break;
  1815. }
  1816. }
  1817. S32 LLScriptCollisionEvent::getSize()
  1818. {
  1819. // integer = 4
  1820. return 4;
  1821. }
  1822. void LLScriptCollisionEndEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1823. {
  1824. if (gErrorToText.getErrors())
  1825. {
  1826. return;
  1827. }
  1828. switch(pass)
  1829. {
  1830. case LSCP_PRETTY_PRINT:
  1831. case LSCP_EMIT_ASSEMBLY:
  1832. fdotabs(fp, tabs, tabsize);
  1833. fprintf(fp, "collision_end( integer ");
  1834. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1835. fprintf(fp, " )n");
  1836. break;
  1837. break;
  1838. case LSCP_SCOPE_PASS1:
  1839.   checkForDuplicateHandler(fp, this, scope, "collision_end");
  1840. if (scope->checkEntry(mCount->mName))
  1841. {
  1842. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1843. }
  1844. else
  1845. {
  1846. mCount->mScopeEntry = scope->addEntry(mCount->mName, LIT_VARIABLE, LST_INTEGER);
  1847. }
  1848. break;
  1849. case LSCP_RESOURCE:
  1850. {
  1851. // we're just tryng to determine how much space the variable needs
  1852. if (mCount->mScopeEntry)
  1853. {
  1854. mCount->mScopeEntry->mOffset = (S32)count;
  1855. mCount->mScopeEntry->mSize = 4;
  1856. count += mCount->mScopeEntry->mSize;
  1857. }
  1858. }
  1859. break;
  1860. case LSCP_EMIT_BYTE_CODE:
  1861. {
  1862. #ifdef LSL_INCLUDE_DEBUG_INFO
  1863. char name[] = "collision_end";
  1864. chunk->addBytes(name, strlen(name) + 1);
  1865. chunk->addBytes(mCount->mName, strlen(mCount->mName) + 1);
  1866. #endif
  1867. }
  1868. break;
  1869. case LSCP_EMIT_CIL_ASSEMBLY:
  1870. fdotabs(fp, tabs, tabsize);
  1871. fprintf(fp, "collision_end( int32 ");
  1872. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1873. fprintf(fp, " )");
  1874. break;
  1875. default:
  1876. mCount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1877. break;
  1878. }
  1879. }
  1880. S32 LLScriptCollisionEndEvent::getSize()
  1881. {
  1882. // integer = 4
  1883. return 4;
  1884. }
  1885. void LLScriptLandCollisionStartEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1886. {
  1887. if (gErrorToText.getErrors())
  1888. {
  1889. return;
  1890. }
  1891. switch(pass)
  1892. {
  1893. case LSCP_PRETTY_PRINT:
  1894. case LSCP_EMIT_ASSEMBLY:
  1895. fdotabs(fp, tabs, tabsize);
  1896. fprintf(fp, "land_collision_start( vector ");
  1897. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1898. fprintf(fp, " )n");
  1899. break;
  1900. case LSCP_SCOPE_PASS1:
  1901.   checkForDuplicateHandler(fp, this, scope, "land_collision_start");
  1902. if (scope->checkEntry(mPosition->mName))
  1903. {
  1904. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1905. }
  1906. else
  1907. {
  1908. mPosition->mScopeEntry = scope->addEntry(mPosition->mName, LIT_VARIABLE, LST_VECTOR);
  1909. }
  1910. break;
  1911. case LSCP_RESOURCE:
  1912. {
  1913. // we're just tryng to determine how much space the variable needs
  1914. if (mPosition->mScopeEntry)
  1915. {
  1916. mPosition->mScopeEntry->mOffset = (S32)count;
  1917. mPosition->mScopeEntry->mSize = 12;
  1918. count += mPosition->mScopeEntry->mSize;
  1919. }
  1920. }
  1921. break;
  1922. case LSCP_EMIT_BYTE_CODE:
  1923. {
  1924. #ifdef LSL_INCLUDE_DEBUG_INFO
  1925. char name[] = "land_collision_start";
  1926. chunk->addBytes(name, strlen(name) + 1);
  1927. chunk->addBytes(mPosition->mName, strlen(mPosition->mName) + 1);
  1928. #endif
  1929. }
  1930. break;
  1931. case LSCP_EMIT_CIL_ASSEMBLY:
  1932. fdotabs(fp, tabs, tabsize);
  1933. fprintf(fp, "land_collision_start( class [ScriptTypes]LindenLab.SecondLife.Vector ");
  1934. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1935. fprintf(fp, " )");
  1936. break;
  1937. default:
  1938. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1939. break;
  1940. }
  1941. }
  1942. S32 LLScriptLandCollisionStartEvent::getSize()
  1943. {
  1944. // vector = 12
  1945. return 12;
  1946. }
  1947. void LLScriptLandCollisionEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  1948. {
  1949. if (gErrorToText.getErrors())
  1950. {
  1951. return;
  1952. }
  1953. switch(pass)
  1954. {
  1955. case LSCP_PRETTY_PRINT:
  1956. case LSCP_EMIT_ASSEMBLY:
  1957. fdotabs(fp, tabs, tabsize);
  1958. fprintf(fp, "land_collision( vector ");
  1959. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1960. fprintf(fp, " )n");
  1961. break;
  1962. case LSCP_SCOPE_PASS1:
  1963.   checkForDuplicateHandler(fp, this, scope, "land_collision");
  1964. if (scope->checkEntry(mPosition->mName))
  1965. {
  1966. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1967. }
  1968. else
  1969. {
  1970. mPosition->mScopeEntry = scope->addEntry(mPosition->mName, LIT_VARIABLE, LST_VECTOR);
  1971. }
  1972. break;
  1973. case LSCP_RESOURCE:
  1974. {
  1975. // we're just tryng to determine how much space the variable needs
  1976. if (mPosition->mScopeEntry)
  1977. {
  1978. mPosition->mScopeEntry->mOffset = (S32)count;
  1979. mPosition->mScopeEntry->mSize = 12;
  1980. count += mPosition->mScopeEntry->mSize;
  1981. }
  1982. }
  1983. break;
  1984. case LSCP_EMIT_BYTE_CODE:
  1985. {
  1986. #ifdef LSL_INCLUDE_DEBUG_INFO
  1987. char name[] = "land_collision";
  1988. chunk->addBytes(name, strlen(name) + 1);
  1989. chunk->addBytes(mPosition->mName, strlen(mPosition->mName) + 1);
  1990. #endif
  1991. }
  1992. break;
  1993. case LSCP_EMIT_CIL_ASSEMBLY:
  1994. fdotabs(fp, tabs, tabsize);
  1995. fprintf(fp, "land_collision( class [ScriptTypes]LindenLab.SecondLife.Vector ");
  1996. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1997. fprintf(fp, " )");
  1998. break;
  1999. default:
  2000. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2001. break;
  2002. }
  2003. }
  2004. S32 LLScriptLandCollisionEvent::getSize()
  2005. {
  2006. // vector = 12
  2007. return 12;
  2008. }
  2009. void LLScriptLandCollisionEndEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2010. {
  2011. if (gErrorToText.getErrors())
  2012. {
  2013. return;
  2014. }
  2015. switch(pass)
  2016. {
  2017. case LSCP_PRETTY_PRINT:
  2018. case LSCP_EMIT_ASSEMBLY:
  2019. fdotabs(fp, tabs, tabsize);
  2020. fprintf(fp, "land_collision_end( vector ");
  2021. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2022. fprintf(fp, " )n");
  2023. break;
  2024. case LSCP_SCOPE_PASS1:
  2025.   checkForDuplicateHandler(fp, this, scope, "land_collision_end");
  2026. if (scope->checkEntry(mPosition->mName))
  2027. {
  2028. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2029. }
  2030. else
  2031. {
  2032. mPosition->mScopeEntry = scope->addEntry(mPosition->mName, LIT_VARIABLE, LST_VECTOR);
  2033. }
  2034. break;
  2035. case LSCP_RESOURCE:
  2036. {
  2037. // we're just tryng to determine how much space the variable needs
  2038. if (mPosition->mScopeEntry)
  2039. {
  2040. mPosition->mScopeEntry->mOffset = (S32)count;
  2041. mPosition->mScopeEntry->mSize = 12;
  2042. count += mPosition->mScopeEntry->mSize;
  2043. }
  2044. }
  2045. break;
  2046. case LSCP_EMIT_BYTE_CODE:
  2047. {
  2048. #ifdef LSL_INCLUDE_DEBUG_INFO
  2049. char name[] = "land_collision_end";
  2050. chunk->addBytes(name, strlen(name) + 1);
  2051. chunk->addBytes(mPosition->mName, strlen(mPosition->mName) + 1);
  2052. #endif
  2053. }
  2054. break;
  2055. case LSCP_EMIT_CIL_ASSEMBLY:
  2056. fdotabs(fp, tabs, tabsize);
  2057. fprintf(fp, "land_collision_end( class [ScriptTypes]LindenLab.SecondLife.Vector ");
  2058. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2059. fprintf(fp, " )");
  2060. break;
  2061. default:
  2062. mPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2063. break;
  2064. }
  2065. }
  2066. S32 LLScriptLandCollisionEndEvent::getSize()
  2067. {
  2068. // vector = 12
  2069. return 12;
  2070. }
  2071. void LLScriptInventoryEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2072. {
  2073. if (gErrorToText.getErrors())
  2074. {
  2075. return;
  2076. }
  2077. switch(pass)
  2078. {
  2079. case LSCP_PRETTY_PRINT:
  2080. case LSCP_EMIT_ASSEMBLY:
  2081. fdotabs(fp, tabs, tabsize);
  2082. fprintf(fp, "changed( integer ");
  2083. mChange->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2084. fprintf(fp, " )n");
  2085. break;
  2086. case LSCP_SCOPE_PASS1:
  2087.   checkForDuplicateHandler(fp, this, scope, "changed");
  2088. if (scope->checkEntry(mChange->mName))
  2089. {
  2090. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2091. }
  2092. else
  2093. {
  2094. mChange->mScopeEntry = scope->addEntry(mChange->mName, LIT_VARIABLE, LST_INTEGER);
  2095. }
  2096. break;
  2097. case LSCP_RESOURCE:
  2098. {
  2099. // we're just tryng to determine how much space the variable needs
  2100. if (mChange->mScopeEntry)
  2101. {
  2102. mChange->mScopeEntry->mOffset = (S32)count;
  2103. mChange->mScopeEntry->mSize = 4;
  2104. count += mChange->mScopeEntry->mSize;
  2105. }
  2106. }
  2107. break;
  2108. case LSCP_EMIT_BYTE_CODE:
  2109. {
  2110. #ifdef LSL_INCLUDE_DEBUG_INFO
  2111. char name[] = "changed";
  2112. chunk->addBytes(name, strlen(name) + 1);
  2113. chunk->addBytes(mChange->mName, strlen(mChange->mName) + 1);
  2114. #endif
  2115. }
  2116. break;
  2117. case LSCP_EMIT_CIL_ASSEMBLY:
  2118. fdotabs(fp, tabs, tabsize);
  2119. fprintf(fp, "changed( int32 ");
  2120. mChange->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2121. fprintf(fp, " )");
  2122. break;
  2123. default:
  2124. mChange->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2125. break;
  2126. }
  2127. }
  2128. S32 LLScriptInventoryEvent::getSize()
  2129. {
  2130. // integer = 4
  2131. return 4;
  2132. }
  2133. void LLScriptAttachEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2134. {
  2135. if (gErrorToText.getErrors())
  2136. {
  2137. return;
  2138. }
  2139. switch(pass)
  2140. {
  2141. case LSCP_PRETTY_PRINT:
  2142. case LSCP_EMIT_ASSEMBLY:
  2143. fdotabs(fp, tabs, tabsize);
  2144. fprintf(fp, "attach( key ");
  2145. mAttach->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2146. fprintf(fp, " )n");
  2147. break;
  2148. case LSCP_SCOPE_PASS1:
  2149.   checkForDuplicateHandler(fp, this, scope, "attach");
  2150. if (scope->checkEntry(mAttach->mName))
  2151. {
  2152. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2153. }
  2154. else
  2155. {
  2156. mAttach->mScopeEntry = scope->addEntry(mAttach->mName, LIT_VARIABLE, LST_KEY);
  2157. }
  2158. break;
  2159. case LSCP_RESOURCE:
  2160. {
  2161. // we're just tryng to determine how much space the variable needs
  2162. if (mAttach->mScopeEntry)
  2163. {
  2164. mAttach->mScopeEntry->mOffset = (S32)count;
  2165. mAttach->mScopeEntry->mSize = 4;
  2166. count += mAttach->mScopeEntry->mSize;
  2167. }
  2168. }
  2169. break;
  2170. case LSCP_EMIT_BYTE_CODE:
  2171. {
  2172. #ifdef LSL_INCLUDE_DEBUG_INFO
  2173. char name[] = "attach";
  2174. chunk->addBytes(name, strlen(name) + 1);
  2175. chunk->addBytes(mAttach->mName, strlen(mAttach->mName) + 1);
  2176. #endif
  2177. }
  2178. break;
  2179. case LSCP_EMIT_CIL_ASSEMBLY:
  2180. fdotabs(fp, tabs, tabsize);
  2181. fprintf(fp, "attach( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  2182. mAttach->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2183. fprintf(fp, " )n");
  2184. break;
  2185. default:
  2186. mAttach->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2187. break;
  2188. }
  2189. }
  2190. S32 LLScriptAttachEvent::getSize()
  2191. {
  2192. // key = 4
  2193. return 4;
  2194. }
  2195. void LLScriptDataserverEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2196. {
  2197. if (gErrorToText.getErrors())
  2198. {
  2199. return;
  2200. }
  2201. switch(pass)
  2202. {
  2203. case LSCP_PRETTY_PRINT:
  2204. case LSCP_EMIT_ASSEMBLY:
  2205. fdotabs(fp, tabs, tabsize);
  2206. fprintf(fp, "dataserver( key ");
  2207. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2208. fprintf(fp, ", string ");
  2209. mData->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2210. fprintf(fp, " )n");
  2211. break;
  2212. case LSCP_SCOPE_PASS1:
  2213.   checkForDuplicateHandler(fp, this, scope, "dataserver");
  2214. if (scope->checkEntry(mID->mName))
  2215. {
  2216. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2217. }
  2218. else
  2219. {
  2220. mID->mScopeEntry = scope->addEntry(mID->mName, LIT_VARIABLE, LST_KEY);
  2221. }
  2222. if (scope->checkEntry(mData->mName))
  2223. {
  2224. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2225. }
  2226. else
  2227. {
  2228. mData->mScopeEntry = scope->addEntry(mData->mName, LIT_VARIABLE, LST_STRING);
  2229. }
  2230. break;
  2231. case LSCP_RESOURCE:
  2232. {
  2233. // we're just tryng to determine how much space the variable needs
  2234. if (mID->mScopeEntry)
  2235. {
  2236. mID->mScopeEntry->mOffset = (S32)count;
  2237. mID->mScopeEntry->mSize = 4;
  2238. count += mID->mScopeEntry->mSize;
  2239. mData->mScopeEntry->mOffset = (S32)count;
  2240. mData->mScopeEntry->mSize = 4;
  2241. count += mData->mScopeEntry->mSize;
  2242. }
  2243. }
  2244. break;
  2245. case LSCP_EMIT_BYTE_CODE:
  2246. {
  2247. #ifdef LSL_INCLUDE_DEBUG_INFO
  2248. char name[] = "dataserver";
  2249. chunk->addBytes(name, strlen(name) + 1);
  2250. chunk->addBytes(mID->mName, strlen(mID->mName) + 1);
  2251. chunk->addBytes(mData->mName, strlen(mData->mName) + 1);
  2252. #endif
  2253. }
  2254. break;
  2255. case LSCP_EMIT_CIL_ASSEMBLY:
  2256. fdotabs(fp, tabs, tabsize);
  2257. fprintf(fp, "dataserver( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  2258. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2259. fprintf(fp, ", string ");
  2260. mData->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2261. fprintf(fp, " )");
  2262. break;
  2263. default:
  2264. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2265. mData->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2266. break;
  2267. }
  2268. }
  2269. S32 LLScriptDataserverEvent::getSize()
  2270. {
  2271. // key + string = 8
  2272. return 8;
  2273. }
  2274. void LLScriptTimerEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2275. {
  2276. if (gErrorToText.getErrors())
  2277. {
  2278. return;
  2279. }
  2280. switch(pass)
  2281. {
  2282. case LSCP_PRETTY_PRINT:
  2283. fdotabs(fp, tabs, tabsize);
  2284. fprintf(fp, "timer()n");
  2285. break;
  2286. case LSCP_EMIT_ASSEMBLY:
  2287. fprintf(fp, "timer()n");
  2288. break;
  2289.         case LSCP_SCOPE_PASS1:
  2290.   checkForDuplicateHandler(fp, this, scope, "timer");
  2291.   break;
  2292. case LSCP_EMIT_BYTE_CODE:
  2293. {
  2294. #ifdef LSL_INCLUDE_DEBUG_INFO
  2295. char name[] = "timer";
  2296. chunk->addBytes(name, strlen(name) + 1);
  2297. #endif
  2298. }
  2299. break;
  2300. case LSCP_EMIT_CIL_ASSEMBLY:
  2301. fprintf(fp, "timer()");
  2302. break;
  2303. default:
  2304. break;
  2305. }
  2306. }
  2307. S32 LLScriptTimerEvent::getSize()
  2308. {
  2309. return 0;
  2310. }
  2311. void LLScriptMovingStartEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2312. {
  2313. if (gErrorToText.getErrors())
  2314. {
  2315. return;
  2316. }
  2317. switch(pass)
  2318. {
  2319. case LSCP_PRETTY_PRINT:
  2320. case LSCP_EMIT_ASSEMBLY:
  2321. fdotabs(fp, tabs, tabsize);
  2322. fprintf(fp, "moving_start()n");
  2323. break;
  2324.         case LSCP_SCOPE_PASS1:
  2325.   checkForDuplicateHandler(fp, this, scope, "moving_start");
  2326.   break;
  2327. case LSCP_EMIT_BYTE_CODE:
  2328. {
  2329. #ifdef LSL_INCLUDE_DEBUG_INFO
  2330. char name[] = "moving_start";
  2331. chunk->addBytes(name, strlen(name) + 1);
  2332. #endif
  2333. }
  2334. break;
  2335. case LSCP_EMIT_CIL_ASSEMBLY:
  2336. fprintf(fp, "moving_start()");
  2337. break;
  2338. default:
  2339. break;
  2340. }
  2341. }
  2342. S32 LLScriptMovingStartEvent::getSize()
  2343. {
  2344. return 0;
  2345. }
  2346. void LLScriptMovingEndEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2347. {
  2348. if (gErrorToText.getErrors())
  2349. {
  2350. return;
  2351. }
  2352. switch(pass)
  2353. {
  2354. case LSCP_PRETTY_PRINT:
  2355. case LSCP_EMIT_ASSEMBLY:
  2356. fdotabs(fp, tabs, tabsize);
  2357. fprintf(fp, "moving_end()n");
  2358. break;
  2359.         case LSCP_SCOPE_PASS1:
  2360.           checkForDuplicateHandler(fp, this, scope, "moving_end");
  2361.           break;
  2362. case LSCP_EMIT_BYTE_CODE:
  2363. {
  2364. #ifdef LSL_INCLUDE_DEBUG_INFO
  2365. char name[] = "moving_end";
  2366. chunk->addBytes(name, strlen(name) + 1);
  2367. #endif
  2368. }
  2369. break;
  2370. case LSCP_EMIT_CIL_ASSEMBLY:
  2371. fprintf(fp, "moving_end()");
  2372. break;
  2373. default:
  2374. break;
  2375. }
  2376. }
  2377. S32 LLScriptMovingEndEvent::getSize()
  2378. {
  2379. return 0;
  2380. }
  2381. void LLScriptRTPEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2382. {
  2383. if (gErrorToText.getErrors())
  2384. {
  2385. return;
  2386. }
  2387. switch(pass)
  2388. {
  2389. case LSCP_PRETTY_PRINT:
  2390. case LSCP_EMIT_ASSEMBLY:
  2391. fdotabs(fp, tabs, tabsize);
  2392. fprintf(fp, "chat( integer ");
  2393. mRTPermissions->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2394. fprintf(fp, " )n");
  2395. break;
  2396. case LSCP_SCOPE_PASS1:
  2397.   checkForDuplicateHandler(fp, this, scope, "run_time_perms");
  2398. if (scope->checkEntry(mRTPermissions->mName))
  2399. {
  2400. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2401. }
  2402. else
  2403. {
  2404. mRTPermissions->mScopeEntry = scope->addEntry(mRTPermissions->mName, LIT_VARIABLE, LST_INTEGER);
  2405. }
  2406. break;
  2407. case LSCP_RESOURCE:
  2408. {
  2409. // we're just tryng to determine how much space the variable needs
  2410. if (mRTPermissions->mScopeEntry)
  2411. {
  2412. mRTPermissions->mScopeEntry->mOffset = (S32)count;
  2413. mRTPermissions->mScopeEntry->mSize = 4;
  2414. count += mRTPermissions->mScopeEntry->mSize;
  2415. }
  2416. }
  2417. break;
  2418. case LSCP_EMIT_BYTE_CODE:
  2419. {
  2420. #ifdef LSL_INCLUDE_DEBUG_INFO
  2421. char name[] = "chat";
  2422. chunk->addBytes(name, strlen(name) + 1);
  2423. chunk->addBytes(mRTPermissions->mName, strlen(mRTPermissions->mName) + 1);
  2424. #endif
  2425. }
  2426. break;
  2427. case LSCP_EMIT_CIL_ASSEMBLY:
  2428. // NOTE: Not replicating LSL2 bug by calling RTP event hander "chat"
  2429. fdotabs(fp, tabs, tabsize);
  2430. fprintf(fp, "run_time_perms( int32 ");
  2431. mRTPermissions->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2432. fprintf(fp, " )");
  2433. break;
  2434. default:
  2435. mRTPermissions->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2436. break;
  2437. }
  2438. }
  2439. S32 LLScriptRTPEvent::getSize()
  2440. {
  2441. // integer = 4
  2442. return 4;
  2443. }
  2444. void LLScriptChatEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2445. {
  2446. if (gErrorToText.getErrors())
  2447. {
  2448. return;
  2449. }
  2450. switch(pass)
  2451. {
  2452. case LSCP_PRETTY_PRINT:
  2453. case LSCP_EMIT_ASSEMBLY:
  2454. fdotabs(fp, tabs, tabsize);
  2455. fprintf(fp, "chat( integer ");
  2456. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2457. fprintf(fp, ", string ");
  2458. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2459. fprintf(fp, ", key ");
  2460. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2461. fprintf(fp, ", string ");
  2462. mMessage->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2463. fprintf(fp, " )n");
  2464. break;
  2465. case LSCP_SCOPE_PASS1:
  2466. checkForDuplicateHandler(fp, this, scope, "listen"); // note: this is actually listen in lsl source
  2467. if (scope->checkEntry(mChannel->mName))
  2468. {
  2469. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2470. }
  2471. else
  2472. {
  2473. mChannel->mScopeEntry = scope->addEntry(mChannel->mName, LIT_VARIABLE, LST_INTEGER);
  2474. }
  2475. if (scope->checkEntry(mName->mName))
  2476. {
  2477. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2478. }
  2479. else
  2480. {
  2481. mName->mScopeEntry = scope->addEntry(mName->mName, LIT_VARIABLE, LST_STRING);
  2482. }
  2483. if (scope->checkEntry(mID->mName))
  2484. {
  2485. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2486. }
  2487. else
  2488. {
  2489. mID->mScopeEntry = scope->addEntry(mID->mName, LIT_VARIABLE, LST_KEY);
  2490. }
  2491. if (scope->checkEntry(mMessage->mName))
  2492. {
  2493. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2494. }
  2495. else
  2496. {
  2497. mMessage->mScopeEntry = scope->addEntry(mMessage->mName, LIT_VARIABLE, LST_STRING);
  2498. }
  2499. break;
  2500. case LSCP_RESOURCE:
  2501. {
  2502. // we're just tryng to determine how much space the variable needs
  2503. if (mName->mScopeEntry)
  2504. {
  2505. mChannel->mScopeEntry->mOffset = (S32)count;
  2506. mChannel->mScopeEntry->mSize = 4;
  2507. count += mChannel->mScopeEntry->mSize;
  2508. mName->mScopeEntry->mOffset = (S32)count;
  2509. mName->mScopeEntry->mSize = 4;
  2510. count += mName->mScopeEntry->mSize;
  2511. mID->mScopeEntry->mOffset = (S32)count;
  2512. mID->mScopeEntry->mSize = 4;
  2513. count += mID->mScopeEntry->mSize;
  2514. mMessage->mScopeEntry->mOffset = (S32)count;
  2515. mMessage->mScopeEntry->mSize = 4;
  2516. count += mMessage->mScopeEntry->mSize;
  2517. }
  2518. }
  2519. break;
  2520. case LSCP_EMIT_BYTE_CODE:
  2521. {
  2522. #ifdef LSL_INCLUDE_DEBUG_INFO
  2523. char name[] = "chat";
  2524. chunk->addBytes(name, strlen(name) + 1);
  2525. chunk->addBytes(mChannel->mName, strlen(mChannel->mName) + 1);
  2526. chunk->addBytes(mName->mName, strlen(mName->mName) + 1);
  2527. chunk->addBytes(mID->mName, strlen(mID->mName) + 1);
  2528. chunk->addBytes(mMessage->mName, strlen(mMessage->mName) + 1);
  2529. #endif
  2530. }
  2531. break;
  2532. case LSCP_EMIT_CIL_ASSEMBLY:
  2533. fdotabs(fp, tabs, tabsize);
  2534. fprintf(fp, "chat( int32 ");
  2535. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2536. fprintf(fp, ", string ");
  2537. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2538. fprintf(fp, ", valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  2539. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2540. fprintf(fp, ", string ");
  2541. mMessage->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2542. fprintf(fp, " )");
  2543. break;
  2544. default:
  2545. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2546. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2547. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2548. mMessage->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2549. break;
  2550. }
  2551. }
  2552. S32 LLScriptChatEvent::getSize()
  2553. {
  2554. // integer + key + string + string = 16
  2555. return 16;
  2556. }
  2557. void LLScriptSensorEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type, LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata)
  2558. {
  2559. if (gErrorToText.getErrors())
  2560. {
  2561. return;
  2562. }
  2563. switch(pass)
  2564. {
  2565. case LSCP_PRETTY_PRINT:
  2566. case LSCP_EMIT_ASSEMBLY:
  2567. fdotabs(fp, tabs, tabsize);
  2568. fprintf(fp, "sensor( integer ");
  2569. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2570. fprintf(fp, " )n");
  2571. break;
  2572. case LSCP_SCOPE_PASS1:
  2573.   checkForDuplicateHandler(fp, this, scope, "sensor");
  2574. if (scope->checkEntry(mNumber->mName))
  2575. {
  2576. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  2577. }
  2578. else
  2579. {
  2580. mNumber->mScopeEntry = scope->addEntry(mNumber->mName, LIT_VARIABLE, LST_INTEGER);
  2581. }
  2582. break;
  2583. case LSCP_RESOURCE:
  2584. {
  2585. // we're just tryng to determine how much space the variable needs
  2586. if (mNumber->mScopeEntry)
  2587. {
  2588. mNumber->mScopeEntry->mOffset = (S32)count;
  2589. mNumber->mScopeEntry->mSize = 4;
  2590. count += mNumber->mScopeEntry->mSize;
  2591. }
  2592. }
  2593. break;
  2594. case LSCP_EMIT_BYTE_CODE:
  2595. {
  2596. #ifdef LSL_INCLUDE_DEBUG_INFO
  2597. char name[] = "sensor";
  2598. chunk->addBytes(name, strlen(name) + 1);
  2599. chunk->addBytes(mNumber->mName, strlen(mNumber->mName) + 1);
  2600. #endif
  2601. }
  2602. break;
  2603. case LSCP_EMIT_CIL_ASSEMBLY:
  2604. fdotabs(fp, tabs, tabsize);
  2605. fprintf(fp, "sensor( int32 ");