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

游戏引擎

开发平台:

C++ Builder

  1. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2. fprintf(fp, " )");
  3. break;
  4. default:
  5. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  6. break;
  7. }
  8. }
  9. S32 LLScriptSensorEvent::getSize()
  10. {
  11. // integer = 4
  12. return 4;
  13. }
  14. void LLScriptObjectRezEvent::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)
  15. {
  16. if (gErrorToText.getErrors())
  17. {
  18. return;
  19. }
  20. switch(pass)
  21. {
  22. case LSCP_PRETTY_PRINT:
  23. case LSCP_EMIT_ASSEMBLY:
  24. fdotabs(fp, tabs, tabsize);
  25. fprintf(fp, "object_rez( key ");
  26. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  27. fprintf(fp, " )n");
  28. break;
  29. case LSCP_SCOPE_PASS1:
  30.   checkForDuplicateHandler(fp, this, scope, "object_rez");
  31. if (scope->checkEntry(mID->mName))
  32. {
  33. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  34. }
  35. else
  36. {
  37. mID->mScopeEntry = scope->addEntry(mID->mName, LIT_VARIABLE, LST_KEY);
  38. }
  39. break;
  40. case LSCP_RESOURCE:
  41. {
  42. // we're just tryng to determine how much space the variable needs
  43. if (mID->mScopeEntry)
  44. {
  45. mID->mScopeEntry->mOffset = (S32)count;
  46. mID->mScopeEntry->mSize = 4;
  47. count += mID->mScopeEntry->mSize;
  48. }
  49. }
  50. break;
  51. case LSCP_EMIT_BYTE_CODE:
  52. {
  53. #ifdef LSL_INCLUDE_DEBUG_INFO
  54. char name[] = "sensor";
  55. chunk->addBytes(name, strlen(name) + 1);
  56. chunk->addBytes(mID->mName, strlen(mID->mName) + 1);
  57. #endif
  58. }
  59. break;
  60. case LSCP_EMIT_CIL_ASSEMBLY:
  61. fdotabs(fp, tabs, tabsize);
  62. fprintf(fp, "object_rez( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  63. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  64. fprintf(fp, " )");
  65. break;
  66. default:
  67. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  68. break;
  69. }
  70. }
  71. S32 LLScriptObjectRezEvent::getSize()
  72. {
  73. // key = 4
  74. return 4;
  75. }
  76. void LLScriptControlEvent::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)
  77. {
  78. if (gErrorToText.getErrors())
  79. {
  80. return;
  81. }
  82. switch(pass)
  83. {
  84. case LSCP_PRETTY_PRINT:
  85. case LSCP_EMIT_ASSEMBLY:
  86. fdotabs(fp, tabs, tabsize);
  87. fprintf(fp, "control( key ");
  88. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  89. fprintf(fp, ", integer ");
  90. mLevels->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  91. fprintf(fp, ", integer ");
  92. mEdges->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  93. fprintf(fp, " )n");
  94. break;
  95. case LSCP_SCOPE_PASS1:
  96.   checkForDuplicateHandler(fp, this, scope, "control");
  97. if (scope->checkEntry(mName->mName))
  98. {
  99. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  100. }
  101. else
  102. {
  103. mName->mScopeEntry = scope->addEntry(mName->mName, LIT_VARIABLE, LST_KEY);
  104. }
  105. if (scope->checkEntry(mLevels->mName))
  106. {
  107. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  108. }
  109. else
  110. {
  111. mLevels->mScopeEntry = scope->addEntry(mLevels->mName, LIT_VARIABLE, LST_INTEGER);
  112. }
  113. if (scope->checkEntry(mEdges->mName))
  114. {
  115. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  116. }
  117. else
  118. {
  119. mEdges->mScopeEntry = scope->addEntry(mEdges->mName, LIT_VARIABLE, LST_INTEGER);
  120. }
  121. break;
  122. case LSCP_RESOURCE:
  123. {
  124. // we're just tryng to determine how much space the variable needs
  125. if (mName->mScopeEntry)
  126. {
  127. mName->mScopeEntry->mOffset = (S32)count;
  128. mName->mScopeEntry->mSize = 4;
  129. count += mName->mScopeEntry->mSize;
  130. mLevels->mScopeEntry->mOffset = (S32)count;
  131. mLevels->mScopeEntry->mSize = 4;
  132. count += mLevels->mScopeEntry->mSize;
  133. mEdges->mScopeEntry->mOffset = (S32)count;
  134. mEdges->mScopeEntry->mSize = 4;
  135. count += mEdges->mScopeEntry->mSize;
  136. }
  137. }
  138. break;
  139. case LSCP_EMIT_BYTE_CODE:
  140. {
  141. #ifdef LSL_INCLUDE_DEBUG_INFO
  142. char name[] = "control";
  143. chunk->addBytes(name, strlen(name) + 1);
  144. chunk->addBytes(mName->mName, strlen(mName->mName) + 1);
  145. chunk->addBytes(mLevels->mName, strlen(mLevels->mName) + 1);
  146. chunk->addBytes(mEdges->mName, strlen(mEdges->mName) + 1);
  147. #endif
  148. }
  149. break;
  150. case LSCP_EMIT_CIL_ASSEMBLY:
  151. fdotabs(fp, tabs, tabsize);
  152. fprintf(fp, "control( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  153. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  154. fprintf(fp, ", int32 ");
  155. mLevels->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  156. fprintf(fp, ", int32 ");
  157. mEdges->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  158. fprintf(fp, " )");
  159. break;
  160. default:
  161. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  162. mLevels->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  163. mEdges->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  164. break;
  165. }
  166. }
  167. S32 LLScriptControlEvent::getSize()
  168. {
  169. // key + integer + integer = 12
  170. return 12;
  171. }
  172. void LLScriptLinkMessageEvent::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)
  173. {
  174. if (gErrorToText.getErrors())
  175. {
  176. return;
  177. }
  178. switch(pass)
  179. {
  180. case LSCP_PRETTY_PRINT:
  181. case LSCP_EMIT_ASSEMBLY:
  182. fdotabs(fp, tabs, tabsize);
  183. fprintf(fp, "link_message( integer ");
  184. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  185. fprintf(fp, ", integer ");
  186. mNum->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  187. fprintf(fp, ", string ");
  188. mStr->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  189. fprintf(fp, ", key ");
  190. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  191. fprintf(fp, " )n");
  192. break;
  193. case LSCP_SCOPE_PASS1:
  194.   checkForDuplicateHandler(fp, this, scope, "link_message");
  195. if (scope->checkEntry(mSender->mName))
  196. {
  197. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  198. }
  199. else
  200. {
  201. mSender->mScopeEntry = scope->addEntry(mSender->mName, LIT_VARIABLE, LST_INTEGER);
  202. }
  203. if (scope->checkEntry(mNum->mName))
  204. {
  205. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  206. }
  207. else
  208. {
  209. mNum->mScopeEntry = scope->addEntry(mNum->mName, LIT_VARIABLE, LST_INTEGER);
  210. }
  211. if (scope->checkEntry(mStr->mName))
  212. {
  213. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  214. }
  215. else
  216. {
  217. mStr->mScopeEntry = scope->addEntry(mStr->mName, LIT_VARIABLE, LST_STRING);
  218. }
  219. if (scope->checkEntry(mID->mName))
  220. {
  221. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  222. }
  223. else
  224. {
  225. mID->mScopeEntry = scope->addEntry(mID->mName, LIT_VARIABLE, LST_KEY);
  226. }
  227. break;
  228. case LSCP_RESOURCE:
  229. {
  230. // we're just tryng to determine how much space the variable needs
  231. if (mSender->mScopeEntry)
  232. {
  233. mSender->mScopeEntry->mOffset = (S32)count;
  234. mSender->mScopeEntry->mSize = 4;
  235. count += mSender->mScopeEntry->mSize;
  236. mNum->mScopeEntry->mOffset = (S32)count;
  237. mNum->mScopeEntry->mSize = 4;
  238. count += mNum->mScopeEntry->mSize;
  239. mStr->mScopeEntry->mOffset = (S32)count;
  240. mStr->mScopeEntry->mSize = 4;
  241. count += mStr->mScopeEntry->mSize;
  242. mID->mScopeEntry->mOffset = (S32)count;
  243. mID->mScopeEntry->mSize = 4;
  244. count += mID->mScopeEntry->mSize;
  245. }
  246. }
  247. break;
  248. case LSCP_EMIT_BYTE_CODE:
  249. {
  250. #ifdef LSL_INCLUDE_DEBUG_INFO
  251. char name[] = "link_message";
  252. chunk->addBytes(name, strlen(name) + 1);
  253. chunk->addBytes(mSender->mName, strlen(mSender->mName) + 1);
  254. chunk->addBytes(mNum->mName, strlen(mNum->mName) + 1);
  255. chunk->addBytes(mStr->mName, strlen(mStr->mName) + 1);
  256. chunk->addBytes(mID->mName, strlen(mID->mName) + 1);
  257. #endif
  258. }
  259. break;
  260. case LSCP_EMIT_CIL_ASSEMBLY:
  261. fdotabs(fp, tabs, tabsize);
  262. fprintf(fp, "link_message( int32 ");
  263. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  264. fprintf(fp, ", int32 ");
  265. mNum->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  266. fprintf(fp, ", string ");
  267. mStr->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  268. fprintf(fp, ", valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  269. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  270. fprintf(fp, " )");
  271. break;
  272. default:
  273. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  274. mNum->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  275. mStr->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  276. mID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  277. break;
  278. }
  279. }
  280. S32 LLScriptLinkMessageEvent::getSize()
  281. {
  282. // integer + key + integer + string = 16
  283. return 16;
  284. }
  285. void LLScriptRemoteEvent::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)
  286. {
  287. if (gErrorToText.getErrors())
  288. {
  289. return;
  290. }
  291. switch(pass)
  292. {
  293. case LSCP_PRETTY_PRINT:
  294. case LSCP_EMIT_ASSEMBLY:
  295. fdotabs(fp, tabs, tabsize);
  296. fprintf(fp, "remote_event( integer ");
  297. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  298. fprintf(fp, ", key ");
  299. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  300. fprintf(fp, ", key ");
  301. mMessageID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  302. fprintf(fp, ", string ");
  303. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  304. fprintf(fp, ", integer ");
  305. mIntVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  306. fprintf(fp, ", string ");
  307. mStrVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  308. fprintf(fp, " )n");
  309. break;
  310. case LSCP_SCOPE_PASS1:
  311.   checkForDuplicateHandler(fp, this, scope, "remote_event");
  312. if (scope->checkEntry(mType->mName))
  313. {
  314. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  315. }
  316. else
  317. {
  318. mType->mScopeEntry = scope->addEntry(mType->mName, LIT_VARIABLE, LST_INTEGER);
  319. }
  320. if (scope->checkEntry(mChannel->mName))
  321. {
  322. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  323. }
  324. else
  325. {
  326. mChannel->mScopeEntry = scope->addEntry(mChannel->mName, LIT_VARIABLE, LST_KEY);
  327. }
  328. if (scope->checkEntry(mMessageID->mName))
  329. {
  330. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  331. }
  332. else
  333. {
  334. mMessageID->mScopeEntry = scope->addEntry(mMessageID->mName, LIT_VARIABLE, LST_KEY);
  335. }
  336. if (scope->checkEntry(mSender->mName))
  337. {
  338. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  339. }
  340. else
  341. {
  342. mSender->mScopeEntry = scope->addEntry(mSender->mName, LIT_VARIABLE, LST_STRING);
  343. }
  344. if (scope->checkEntry(mIntVal->mName))
  345. {
  346. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  347. }
  348. else
  349. {
  350. mIntVal->mScopeEntry = scope->addEntry(mIntVal->mName, LIT_VARIABLE, LST_INTEGER);
  351. }
  352. if (scope->checkEntry(mStrVal->mName))
  353. {
  354. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  355. }
  356. else
  357. {
  358. mStrVal->mScopeEntry = scope->addEntry(mStrVal->mName, LIT_VARIABLE, LST_STRING);
  359. }
  360. break;
  361. case LSCP_RESOURCE:
  362. {
  363. // we're just tryng to determine how much space the variable needs
  364. if (mType->mScopeEntry)
  365. {
  366. mType->mScopeEntry->mOffset = (S32)count;
  367. mType->mScopeEntry->mSize = 4;
  368. count += mType->mScopeEntry->mSize;
  369. mChannel->mScopeEntry->mOffset = (S32)count;
  370. mChannel->mScopeEntry->mSize = 4;
  371. count += mChannel->mScopeEntry->mSize;
  372. mMessageID->mScopeEntry->mOffset = (S32)count;
  373. mMessageID->mScopeEntry->mSize = 4;
  374. count += mMessageID->mScopeEntry->mSize;
  375. mSender->mScopeEntry->mOffset = (S32)count;
  376. mSender->mScopeEntry->mSize = 4;
  377. count += mSender->mScopeEntry->mSize;
  378. mIntVal->mScopeEntry->mOffset = (S32)count;
  379. mIntVal->mScopeEntry->mSize = 4;
  380. count += mIntVal->mScopeEntry->mSize;
  381. mStrVal->mScopeEntry->mOffset = (S32)count;
  382. mStrVal->mScopeEntry->mSize = 4;
  383. count += mStrVal->mScopeEntry->mSize;
  384. }
  385. }
  386. break;
  387. case LSCP_EMIT_BYTE_CODE:
  388. {
  389. #ifdef LSL_INCLUDE_DEBUG_INFO
  390. char name[] = "remote_event";
  391. chunk->addBytes(name, strlen(name) + 1);
  392. chunk->addBytes(mType->mName, strlen(mType->mName) + 1);
  393. chunk->addBytes(mChannel->mName, strlen(mChannel->mName) + 1);
  394. chunk->addBytes(mMessageID->mName, strlen(mMessageID->mName) + 1);
  395. chunk->addBytes(mSender->mName, strlen(mSender->mName) + 1);
  396. chunk->addBytes(mIntVal->mName, strlen(mIntVal->mName) + 1);
  397. chunk->addBytes(mStrVal->mName, strlen(mStrVal->mName) + 1);
  398. #endif
  399. }
  400. break;
  401. case LSCP_EMIT_CIL_ASSEMBLY:
  402. fdotabs(fp, tabs, tabsize);
  403. fprintf(fp, "remote_event( int32 ");
  404. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  405. fprintf(fp, ", valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  406. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  407. fprintf(fp, ", valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  408. mMessageID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  409. fprintf(fp, ", string ");
  410. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  411. fprintf(fp, ", int32 ");
  412. mIntVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  413. fprintf(fp, ", string ");
  414. mStrVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  415. fprintf(fp, " )");
  416. break;
  417. default:
  418. mType->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  419. mChannel->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  420. mMessageID->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  421. mSender->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  422. mIntVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  423. mStrVal->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  424. break;
  425. }
  426. }
  427. S32 LLScriptRemoteEvent::getSize()
  428. {
  429. // integer + key + key + string + integer + string = 24
  430. return 24;
  431. }
  432. void LLScriptHTTPResponseEvent::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)
  433. {
  434. if (gErrorToText.getErrors())
  435. {
  436. return;
  437. }
  438. switch(pass)
  439. {
  440. case LSCP_PRETTY_PRINT:
  441. case LSCP_EMIT_ASSEMBLY:
  442. fdotabs(fp, tabs, tabsize);
  443. fprintf(fp, "http_response( key ");
  444. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  445. fprintf(fp, ", integer ");
  446. mStatus->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  447. fprintf(fp, ", class [mscorlib]System.Collections.ArrayList ");
  448. mMetadata->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  449. fprintf(fp, ", string ");
  450. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  451. fprintf(fp, " )n");
  452. break;
  453. case LSCP_SCOPE_PASS1:
  454.   checkForDuplicateHandler(fp, this, scope, "http_response");
  455. if (scope->checkEntry(mRequestId->mName))
  456. {
  457. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  458. }
  459. else
  460. {
  461. mRequestId->mScopeEntry = scope->addEntry(mRequestId->mName, LIT_VARIABLE, LST_KEY);
  462. }
  463. if (scope->checkEntry(mStatus->mName))
  464. {
  465. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  466. }
  467. else
  468. {
  469. mStatus->mScopeEntry = scope->addEntry(mStatus->mName, LIT_VARIABLE, LST_INTEGER);
  470. }
  471. if (scope->checkEntry(mMetadata->mName))
  472. {
  473. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  474. }
  475. else
  476. {
  477. mMetadata->mScopeEntry = scope->addEntry(mMetadata->mName, LIT_VARIABLE, LST_LIST);
  478. }
  479. if (scope->checkEntry(mBody->mName))
  480. {
  481. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  482. }
  483. else
  484. {
  485. mBody->mScopeEntry = scope->addEntry(mBody->mName, LIT_VARIABLE, LST_STRING);
  486. }
  487. break;
  488. case LSCP_RESOURCE:
  489. {
  490. // we're just tryng to determine how much space the variable needs
  491. if (mRequestId->mScopeEntry)
  492. {
  493. mRequestId->mScopeEntry->mOffset = (S32)count;
  494. mRequestId->mScopeEntry->mSize = 4;
  495. count += mRequestId->mScopeEntry->mSize;
  496. mStatus->mScopeEntry->mOffset = (S32)count;
  497. mStatus->mScopeEntry->mSize = 4;
  498. count += mStatus->mScopeEntry->mSize;
  499. mMetadata->mScopeEntry->mOffset = (S32)count;
  500. mMetadata->mScopeEntry->mSize = 4;
  501. count += mMetadata->mScopeEntry->mSize;
  502. mBody->mScopeEntry->mOffset = (S32)count;
  503. mBody->mScopeEntry->mSize = 4;
  504. count += mBody->mScopeEntry->mSize;
  505. }
  506. }
  507. break;
  508. case LSCP_EMIT_BYTE_CODE:
  509. {
  510. #ifdef LSL_INCLUDE_DEBUG_INFO
  511. char name[] = "http_response";
  512. chunk->addBytes(name, strlen(name) + 1);
  513. chunk->addBytes(mRequestId->mName, strlen(mRequestId->mName) + 1);
  514. chunk->addBytes(mStatus->mName, strlen(mStatus->mName) + 1);
  515. chunk->addBytes(mMetadata->mName, strlen(mMetadata->mName) + 1);
  516. chunk->addBytes(mBody->mName, strlen(mBody->mName) + 1);
  517. #endif
  518. }
  519. break;
  520. case LSCP_EMIT_CIL_ASSEMBLY:
  521.         fdotabs(fp, tabs, tabsize);
  522.             fprintf(fp, "http_response( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  523. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  524. fprintf(fp, ", int32 ");
  525. mStatus->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  526. fprintf(fp, ", class [mscorlib]System.Collections.ArrayList ");
  527. mMetadata->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  528. fprintf(fp, ", string ");
  529. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  530. fprintf(fp, " )n");
  531. break;
  532. default:
  533. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  534. mStatus->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  535. mMetadata->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  536. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  537. break;
  538. }
  539. }
  540. S32 LLScriptHTTPResponseEvent::getSize()
  541. {
  542. // key + integer + list + string = 16
  543. return 16;
  544. }
  545. void LLScriptHTTPRequestEvent::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)
  546. {
  547. if (gErrorToText.getErrors())
  548. {
  549. return;
  550. }
  551. switch(pass)
  552. {
  553. case LSCP_PRETTY_PRINT:
  554. case LSCP_EMIT_ASSEMBLY:
  555. fdotabs(fp, tabs, tabsize);
  556. fprintf(fp, "http_request( key ");
  557. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  558. fprintf(fp, ", string ");
  559. mMethod->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  560. fprintf(fp, ", string ");
  561. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  562. fprintf(fp, " )n");
  563. break;
  564. case LSCP_SCOPE_PASS1:
  565. checkForDuplicateHandler(fp, this, scope, "http_request");
  566. if (scope->checkEntry(mRequestId->mName))
  567. {
  568. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  569. }
  570. else
  571. {
  572. mRequestId->mScopeEntry = scope->addEntry(mRequestId->mName, LIT_VARIABLE, LST_KEY);
  573. }
  574. if (scope->checkEntry(mMethod->mName))
  575. {
  576. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  577. }
  578. else
  579. {
  580. mMethod->mScopeEntry = scope->addEntry(mMethod->mName, LIT_VARIABLE, LST_STRING);
  581. }
  582. if (scope->checkEntry(mBody->mName))
  583. {
  584. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  585. }
  586. else
  587. {
  588. mBody->mScopeEntry = scope->addEntry(mBody->mName, LIT_VARIABLE, LST_STRING);
  589. }
  590. break;
  591. case LSCP_RESOURCE:
  592. {
  593. // we're just tryng to determine how much space the variable needs
  594. if (mRequestId->mScopeEntry)
  595. {
  596. mRequestId->mScopeEntry->mOffset = (S32)count;
  597. mRequestId->mScopeEntry->mSize = 4;
  598. count += mRequestId->mScopeEntry->mSize;
  599. mMethod->mScopeEntry->mOffset = (S32)count;
  600. mMethod->mScopeEntry->mSize = 4;
  601. count += mMethod->mScopeEntry->mSize;
  602. mBody->mScopeEntry->mOffset = (S32)count;
  603. mBody->mScopeEntry->mSize = 4;
  604. count += mBody->mScopeEntry->mSize;
  605. }
  606. }
  607. break;
  608. case LSCP_EMIT_BYTE_CODE:
  609. {
  610. #ifdef LSL_INCLUDE_DEBUG_INFO
  611. char name[] = "http_request";
  612. chunk->addBytes(name, strlen(name) + 1);  /*Flawfinder: ignore*/
  613. chunk->addBytes(mRequestId->mName, strlen(mRequestId->mName) + 1);  /*Flawfinder: ignore*/
  614. chunk->addBytes(mMethod->mName, strlen(mMethod->mName) + 1);  /*Flawfinder: ignore*/
  615. chunk->addBytes(mBody->mName, strlen(mBody->mName) + 1);  /*Flawfinder: ignore*/
  616. #endif
  617. }
  618. break;
  619. case LSCP_EMIT_CIL_ASSEMBLY:
  620.         fdotabs(fp, tabs, tabsize);
  621.             fprintf(fp, "http_request( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  622. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  623. fprintf(fp, ", string ");
  624. mMethod->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  625. fprintf(fp, ", string ");
  626. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  627. fprintf(fp, " )n");
  628. break;
  629. default:
  630. mRequestId->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  631. mMethod->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  632. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  633. break;
  634. }
  635. }
  636. S32 LLScriptHTTPRequestEvent::getSize()
  637. {
  638. // key + string + string = 12
  639. return 12;
  640. }
  641. void LLScriptMoneyEvent::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)
  642. {
  643. if (gErrorToText.getErrors())
  644. {
  645. return;
  646. }
  647. switch(pass)
  648. {
  649. case LSCP_PRETTY_PRINT:
  650. case LSCP_EMIT_ASSEMBLY:
  651. fdotabs(fp, tabs, tabsize);
  652. fprintf(fp, "money( key ");
  653. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  654. fprintf(fp, ", integer ");
  655. mAmount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  656. fprintf(fp, " )n");
  657. break;
  658. case LSCP_SCOPE_PASS1:
  659.   checkForDuplicateHandler(fp, this, scope, "money");
  660. if (scope->checkEntry(mName->mName))
  661. {
  662. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  663. }
  664. else
  665. {
  666. mName->mScopeEntry = scope->addEntry(mName->mName, LIT_VARIABLE, LST_KEY);
  667. }
  668. if (scope->checkEntry(mAmount->mName))
  669. {
  670. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  671. }
  672. else
  673. {
  674. mAmount->mScopeEntry = scope->addEntry(mAmount->mName, LIT_VARIABLE, LST_INTEGER);
  675. }
  676. break;
  677. case LSCP_RESOURCE:
  678. {
  679. // we're just tryng to determine how much space the variable needs
  680. if (mName->mScopeEntry)
  681. {
  682. mName->mScopeEntry->mOffset = (S32)count;
  683. mName->mScopeEntry->mSize = 4;
  684. count += mName->mScopeEntry->mSize;
  685. mAmount->mScopeEntry->mOffset = (S32)count;
  686. mAmount->mScopeEntry->mSize = 4;
  687. count += mAmount->mScopeEntry->mSize;
  688. }
  689. }
  690. break;
  691. case LSCP_EMIT_BYTE_CODE:
  692. {
  693. #ifdef LSL_INCLUDE_DEBUG_INFO
  694. char name[] = "money";
  695. chunk->addBytes(name, strlen(name) + 1);
  696. chunk->addBytes(mName->mName, strlen(mName->mName) + 1);
  697. chunk->addBytes(mAmount->mName, strlen(mAmount->mName) + 1);
  698. #endif
  699. }
  700. break;
  701. case LSCP_EMIT_CIL_ASSEMBLY:
  702. fdotabs(fp, tabs, tabsize);
  703. fprintf(fp, "money( valuetype [ScriptTypes]LindenLab.SecondLife.Key ");
  704. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  705. fprintf(fp, ", int32 ");
  706. mAmount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  707. fprintf(fp, " )");
  708. break;
  709. default:
  710. mName->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  711. mAmount->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  712. break;
  713. }
  714. }
  715. S32 LLScriptMoneyEvent::getSize()
  716. {
  717. // key + integer = 8
  718. return 8;
  719. }
  720. void LLScriptEmailEvent::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)
  721. {
  722. if (gErrorToText.getErrors())
  723. {
  724. return;
  725. }
  726. switch(pass)
  727. {
  728. case LSCP_PRETTY_PRINT:
  729. case LSCP_EMIT_ASSEMBLY:
  730. fdotabs(fp, tabs, tabsize);
  731. fprintf(fp, "email( string ");
  732. mTime->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  733. fprintf(fp, ", string ");
  734. mAddress->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  735. fprintf(fp, ", string ");
  736. mSubject->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  737. fprintf(fp, ", string ");
  738. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  739. fprintf(fp, ", integer ");
  740. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  741. fprintf(fp, " )n");
  742. break;
  743. case LSCP_SCOPE_PASS1:
  744.   checkForDuplicateHandler(fp, this, scope, "email");
  745. if (scope->checkEntry(mTime->mName))
  746. {
  747. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  748. }
  749. else
  750. {
  751. mTime->mScopeEntry = scope->addEntry(mTime->mName, LIT_VARIABLE, LST_STRING);
  752. }
  753. if (scope->checkEntry(mAddress->mName))
  754. {
  755. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  756. }
  757. else
  758. {
  759. mAddress->mScopeEntry = scope->addEntry(mAddress->mName, LIT_VARIABLE, LST_STRING);
  760. }
  761. if (scope->checkEntry(mSubject->mName))
  762. {
  763. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  764. }
  765. else
  766. {
  767. mSubject->mScopeEntry = scope->addEntry(mSubject->mName, LIT_VARIABLE, LST_STRING);
  768. }
  769. if (scope->checkEntry(mBody->mName))
  770. {
  771. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  772. }
  773. else
  774. {
  775. mBody->mScopeEntry = scope->addEntry(mBody->mName, LIT_VARIABLE, LST_STRING);
  776. }
  777. if (scope->checkEntry(mNumber->mName))
  778. {
  779. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  780. }
  781. else
  782. {
  783. mNumber->mScopeEntry = scope->addEntry(mNumber->mName, LIT_VARIABLE, LST_INTEGER);
  784. }
  785. break;
  786. case LSCP_RESOURCE:
  787. {
  788. // we're just tryng to determine how much space the variable needs
  789. if (mAddress->mScopeEntry)
  790. {
  791. mTime->mScopeEntry->mOffset = (S32)count;
  792. mTime->mScopeEntry->mSize = 4;
  793. count += mTime->mScopeEntry->mSize;
  794. mAddress->mScopeEntry->mOffset = (S32)count;
  795. mAddress->mScopeEntry->mSize = 4;
  796. count += mAddress->mScopeEntry->mSize;
  797. mSubject->mScopeEntry->mOffset = (S32)count;
  798. mSubject->mScopeEntry->mSize = 4;
  799. count += mSubject->mScopeEntry->mSize;
  800. mBody->mScopeEntry->mOffset = (S32)count;
  801. mBody->mScopeEntry->mSize = 4;
  802. count += mBody->mScopeEntry->mSize;
  803. mNumber->mScopeEntry->mOffset = (S32)count;
  804. mNumber->mScopeEntry->mSize = 4;
  805. count += mNumber->mScopeEntry->mSize;
  806. }
  807. }
  808. break;
  809. case LSCP_EMIT_BYTE_CODE:
  810. {
  811. #ifdef LSL_INCLUDE_DEBUG_INFO
  812. char name[] = "email";
  813. chunk->addBytes(name, strlen(name) + 1);
  814. chunk->addBytes(mTime->mName, strlen(mTime->mName) + 1);
  815. chunk->addBytes(mAddress->mName, strlen(mAddress->mName) + 1);
  816. chunk->addBytes(mSubject->mName, strlen(mSubject->mName) + 1);
  817. chunk->addBytes(mBody->mName, strlen(mBody->mName) + 1);
  818. chunk->addBytes(mNumber->mName, strlen(mNumber->mName) + 1);
  819. #endif
  820. }
  821. break;
  822. case LSCP_EMIT_CIL_ASSEMBLY:
  823. fdotabs(fp, tabs, tabsize);
  824. fprintf(fp, "email( string ");
  825. mTime->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  826. fprintf(fp, ", string ");
  827. mAddress->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  828. fprintf(fp, ", string ");
  829. mSubject->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  830. fprintf(fp, ", string ");
  831. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  832. fprintf(fp, ", int32 ");
  833. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  834. fprintf(fp, " )");
  835. break;
  836. default:
  837. mTime->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  838. mAddress->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  839. mSubject->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  840. mBody->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  841. mNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  842. break;
  843. }
  844. }
  845. S32 LLScriptEmailEvent::getSize()
  846. {
  847. // string + string + string + string + integer = 16
  848. return 20;
  849. }
  850. void LLScriptRezEvent::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)
  851. {
  852. if (gErrorToText.getErrors())
  853. {
  854. return;
  855. }
  856. switch(pass)
  857. {
  858. case LSCP_PRETTY_PRINT:
  859. case LSCP_EMIT_ASSEMBLY:
  860. fdotabs(fp, tabs, tabsize);
  861. fprintf(fp, "rez( integer ");
  862. mStartParam->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  863. fprintf(fp, " )n");
  864. break;
  865. case LSCP_SCOPE_PASS1:
  866. checkForDuplicateHandler(fp, this, scope, "on_rez");
  867. if (scope->checkEntry(mStartParam->mName))
  868. {
  869. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  870. }
  871. else
  872. {
  873. mStartParam->mScopeEntry = scope->addEntry(mStartParam->mName, LIT_VARIABLE, LST_INTEGER);
  874. }
  875. break;
  876. case LSCP_RESOURCE:
  877. {
  878. // we're just tryng to determine how much space the variable needs
  879. if (mStartParam->mScopeEntry)
  880. {
  881. mStartParam->mScopeEntry->mOffset = (S32)count;
  882. mStartParam->mScopeEntry->mSize = 4;
  883. count += mStartParam->mScopeEntry->mSize;
  884. }
  885. }
  886. break;
  887. case LSCP_EMIT_BYTE_CODE:
  888. {
  889. #ifdef LSL_INCLUDE_DEBUG_INFO
  890. char name[] = "rez";
  891. chunk->addBytes(name, strlen(name) + 1);
  892. chunk->addBytes(mStartParam->mName, strlen(mStartParam->mName) + 1);
  893. #endif
  894. }
  895. break;
  896. case LSCP_EMIT_CIL_ASSEMBLY:
  897. fdotabs(fp, tabs, tabsize);
  898. fprintf(fp, "rez( int32 ");
  899. mStartParam->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  900. fprintf(fp, " )");
  901. break;
  902. default:
  903. mStartParam->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  904. break;
  905. }
  906. }
  907. S32 LLScriptRezEvent::getSize()
  908. {
  909. // integer = 4
  910. return 4;
  911. }
  912. void LLScriptNoSensorEvent::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)
  913. {
  914. if (gErrorToText.getErrors())
  915. {
  916. return;
  917. }
  918. switch(pass)
  919. {
  920. case LSCP_PRETTY_PRINT:
  921. fdotabs(fp, tabs, tabsize);
  922. fprintf(fp, "no_sensor()n");
  923. break;
  924. case LSCP_EMIT_ASSEMBLY:
  925. fprintf(fp, "no_sensor()n");
  926. break;
  927.         case LSCP_SCOPE_PASS1:
  928.               checkForDuplicateHandler(fp, this, scope, "no_sensor");
  929.         break;
  930.    case LSCP_EMIT_BYTE_CODE:
  931. {
  932. #ifdef LSL_INCLUDE_DEBUG_INFO
  933. char name[] = "no_sensor";
  934. chunk->addBytes(name, strlen(name) + 1);
  935. #endif
  936. }
  937. break;
  938. case LSCP_EMIT_CIL_ASSEMBLY:
  939. fprintf(fp, "no_sensor()");
  940. break;
  941. default:
  942. break;
  943. }
  944. }
  945. S32 LLScriptNoSensorEvent::getSize()
  946. {
  947. return 0;
  948. }
  949. void LLScriptAtTarget::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)
  950. {
  951. if (gErrorToText.getErrors())
  952. {
  953. return;
  954. }
  955. switch(pass)
  956. {
  957. case LSCP_PRETTY_PRINT:
  958. case LSCP_EMIT_ASSEMBLY:
  959. fdotabs(fp, tabs, tabsize);
  960. fprintf(fp, "at_target( integer ");
  961. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  962. fprintf(fp, ", vector ");
  963. mTargetPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  964. fprintf(fp, ", vector ");
  965. mOurPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  966. fprintf(fp, " )n");
  967. break;
  968. case LSCP_SCOPE_PASS1:
  969.         checkForDuplicateHandler(fp, this, scope, "at_target");
  970. if (scope->checkEntry(mTargetNumber->mName))
  971. {
  972. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  973. }
  974. else
  975. {
  976. mTargetNumber->mScopeEntry = scope->addEntry(mTargetNumber->mName, LIT_VARIABLE, LST_INTEGER);
  977. }
  978. if (scope->checkEntry(mTargetPosition->mName))
  979. {
  980. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  981. }
  982. else
  983. {
  984. mTargetPosition->mScopeEntry = scope->addEntry(mTargetPosition->mName, LIT_VARIABLE, LST_VECTOR);
  985. }
  986. if (scope->checkEntry(mOurPosition->mName))
  987. {
  988. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  989. }
  990. else
  991. {
  992. mOurPosition->mScopeEntry = scope->addEntry(mOurPosition->mName, LIT_VARIABLE, LST_VECTOR);
  993. }
  994. break;
  995. case LSCP_RESOURCE:
  996. {
  997. // we're just tryng to determine how much space the variable needs
  998. if (mTargetNumber->mScopeEntry)
  999. {
  1000. mTargetNumber->mScopeEntry->mOffset = (S32)count;
  1001. mTargetNumber->mScopeEntry->mSize = 4;
  1002. count += mTargetNumber->mScopeEntry->mSize;
  1003. mTargetPosition->mScopeEntry->mOffset = (S32)count;
  1004. mTargetPosition->mScopeEntry->mSize = 12;
  1005. count += mTargetPosition->mScopeEntry->mSize;
  1006. mOurPosition->mScopeEntry->mOffset = (S32)count;
  1007. mOurPosition->mScopeEntry->mSize = 12;
  1008. count += mOurPosition->mScopeEntry->mSize;
  1009. }
  1010. }
  1011. break;
  1012. case LSCP_EMIT_BYTE_CODE:
  1013. {
  1014. #ifdef LSL_INCLUDE_DEBUG_INFO
  1015. char name[] = "at_target";
  1016. chunk->addBytes(name, strlen(name) + 1);
  1017. chunk->addBytes(mTargetNumber->mName, strlen(mTargetNumber->mName) + 1);
  1018. chunk->addBytes(mTargetPosition->mName, strlen(mTargetPosition->mName) + 1);
  1019. chunk->addBytes(mOurPosition->mName, strlen(mOurPosition->mName) + 1);
  1020. #endif
  1021. }
  1022. break;
  1023. case LSCP_EMIT_CIL_ASSEMBLY:
  1024. fdotabs(fp, tabs, tabsize);
  1025. fprintf(fp, "at_target( int32 ");
  1026. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1027. fprintf(fp, ", class [ScriptTypes]LindenLab.SecondLife.Vector ");
  1028. mTargetPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1029. fprintf(fp, ", class [ScriptTypes]LindenLab.SecondLife.Vector ");
  1030. mOurPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1031. fprintf(fp, " )");
  1032. break;
  1033. default:
  1034. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1035. mTargetPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1036. mOurPosition->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1037. break;
  1038. }
  1039. }
  1040. S32 LLScriptAtTarget::getSize()
  1041. {
  1042. // integer + vector + vector = 28
  1043. return 28;
  1044. }
  1045. void LLScriptNotAtTarget::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)
  1046. {
  1047. if (gErrorToText.getErrors())
  1048. {
  1049. return;
  1050. }
  1051. switch(pass)
  1052. {
  1053. case LSCP_PRETTY_PRINT:
  1054. fdotabs(fp, tabs, tabsize);
  1055. fprintf(fp, "not_at_target()n");
  1056. break;
  1057. case LSCP_EMIT_ASSEMBLY:
  1058. fprintf(fp, "not_at_target()n");
  1059. break;
  1060.         case LSCP_SCOPE_PASS1:
  1061.         checkForDuplicateHandler(fp, this, scope, "not_at_target");
  1062.         break;
  1063. case LSCP_EMIT_BYTE_CODE:
  1064. {
  1065. #ifdef LSL_INCLUDE_DEBUG_INFO
  1066. char name[] = "not_at_target";
  1067. chunk->addBytes(name, strlen(name) + 1);
  1068. #endif
  1069. }
  1070. break;
  1071. case LSCP_EMIT_CIL_ASSEMBLY:
  1072. fprintf(fp, "not_at_target()");
  1073. break;
  1074. default:
  1075. break;
  1076. }
  1077. }
  1078. S32 LLScriptNotAtTarget::getSize()
  1079. {
  1080. return 0;
  1081. }
  1082. void LLScriptAtRotTarget::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)
  1083. {
  1084. if (gErrorToText.getErrors())
  1085. {
  1086. return;
  1087. }
  1088. switch(pass)
  1089. {
  1090. case LSCP_PRETTY_PRINT:
  1091. case LSCP_EMIT_ASSEMBLY:
  1092. fdotabs(fp, tabs, tabsize);
  1093. fprintf(fp, "at_rot_target( integer ");
  1094. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1095. fprintf(fp, ", quaternion ");
  1096. mTargetRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1097. fprintf(fp, ", quaternion ");
  1098. mOurRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1099. fprintf(fp, " )n");
  1100. break;
  1101. case LSCP_SCOPE_PASS1:
  1102. checkForDuplicateHandler(fp, this, scope, "at_rot_target");
  1103. if (scope->checkEntry(mTargetNumber->mName))
  1104. {
  1105. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1106. }
  1107. else
  1108. {
  1109. mTargetNumber->mScopeEntry = scope->addEntry(mTargetNumber->mName, LIT_VARIABLE, LST_INTEGER);
  1110. }
  1111. if (scope->checkEntry(mTargetRotation->mName))
  1112. {
  1113. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1114. }
  1115. else
  1116. {
  1117. mTargetRotation->mScopeEntry = scope->addEntry(mTargetRotation->mName, LIT_VARIABLE, LST_QUATERNION);
  1118. }
  1119. if (scope->checkEntry(mOurRotation->mName))
  1120. {
  1121. gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
  1122. }
  1123. else
  1124. {
  1125. mOurRotation->mScopeEntry = scope->addEntry(mOurRotation->mName, LIT_VARIABLE, LST_QUATERNION);
  1126. }
  1127. break;
  1128. case LSCP_RESOURCE:
  1129. {
  1130. // we're just tryng to determine how much space the variable needs
  1131. if (mTargetNumber->mScopeEntry)
  1132. {
  1133. mTargetNumber->mScopeEntry->mOffset = (S32)count;
  1134. mTargetNumber->mScopeEntry->mSize = 4;
  1135. count += mTargetNumber->mScopeEntry->mSize;
  1136. mTargetRotation->mScopeEntry->mOffset = (S32)count;
  1137. mTargetRotation->mScopeEntry->mSize = 16;
  1138. count += mTargetRotation->mScopeEntry->mSize;
  1139. mOurRotation->mScopeEntry->mOffset = (S32)count;
  1140. mOurRotation->mScopeEntry->mSize = 16;
  1141. count += mOurRotation->mScopeEntry->mSize;
  1142. }
  1143. }
  1144. break;
  1145. case LSCP_EMIT_BYTE_CODE:
  1146. {
  1147. #ifdef LSL_INCLUDE_DEBUG_INFO
  1148. char name[] = "at_rot_target";
  1149. chunk->addBytes(name, strlen(name) + 1);
  1150. chunk->addBytes(mTargetNumber->mName, strlen(mTargetNumber->mName) + 1);
  1151. chunk->addBytes(mTargetRotation->mName, strlen(mTargetRotation->mName) + 1);
  1152. chunk->addBytes(mOurRotation->mName, strlen(mOurRotation->mName) + 1);
  1153. #endif
  1154. }
  1155. break;
  1156. case LSCP_EMIT_CIL_ASSEMBLY:
  1157. fdotabs(fp, tabs, tabsize);
  1158. fprintf(fp, "at_rot_target( int32 ");
  1159. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1160. fprintf(fp, ", class [ScriptTypes]LindenLab.SecondLife.Quaternion ");
  1161. mTargetRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1162. fprintf(fp, ", class [ScriptTypes]LindenLab.SecondLife.Quaternion ");
  1163. mOurRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1164. fprintf(fp, " )");
  1165. break;
  1166. default:
  1167. mTargetNumber->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1168. mTargetRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1169. mOurRotation->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1170. break;
  1171. }
  1172. }
  1173. S32 LLScriptAtRotTarget::getSize()
  1174. {
  1175. // integer + quaternion + quaternion = 36
  1176. return 36;
  1177. }
  1178. void LLScriptNotAtRotTarget::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)
  1179. {
  1180. if (gErrorToText.getErrors())
  1181. {
  1182. return;
  1183. }
  1184. switch(pass)
  1185. {
  1186. case LSCP_PRETTY_PRINT:
  1187. fdotabs(fp, tabs, tabsize);
  1188. fprintf(fp, "not_at_rot_target()n");
  1189. break;
  1190. case LSCP_EMIT_ASSEMBLY:
  1191. fprintf(fp, "not_at_rot_target()n");
  1192. break;
  1193. case LSCP_EMIT_BYTE_CODE:
  1194. {
  1195. #ifdef LSL_INCLUDE_DEBUG_INFO
  1196. char name[] = "not_at_rot_target";
  1197. chunk->addBytes(name, strlen(name) + 1);
  1198. #endif
  1199. }
  1200. break;
  1201.         case LSCP_SCOPE_PASS1:
  1202.   checkForDuplicateHandler(fp, this, scope, "not_at_rot_target");
  1203.   break;
  1204. case LSCP_EMIT_CIL_ASSEMBLY:
  1205. fprintf(fp, "not_at_rot_target()");
  1206. break;
  1207. default:
  1208. break;
  1209. }
  1210. }
  1211. S32 LLScriptNotAtRotTarget::getSize()
  1212. {
  1213. return 0;
  1214. }
  1215. void LLScriptExpression::addExpression(LLScriptExpression *expression)
  1216. {
  1217. if (mNextp)
  1218. {
  1219. expression->mNextp = mNextp;
  1220. }
  1221. mNextp = expression;
  1222. }
  1223. void LLScriptExpression::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)
  1224. {
  1225. fprintf(fp, "Expression Base Class -- should never get here!n");
  1226. }
  1227. S32 LLScriptExpression::getSize()
  1228. {
  1229. printf("Expression Base Class -- should never get here!n");
  1230. return 0;
  1231. }
  1232. void LLScriptExpression::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)
  1233. {
  1234. if (gErrorToText.getErrors())
  1235. {
  1236. return;
  1237. }
  1238. switch(pass)
  1239. {
  1240. case LSCP_PRETTY_PRINT:
  1241. if (mNextp)
  1242. {
  1243. fprintf(fp, ", ");
  1244. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1245. }
  1246. break;
  1247. default:
  1248. if (mNextp)
  1249. {
  1250. mNextp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1251. }
  1252. break;
  1253. }
  1254. }
  1255. void LLScriptForExpressionList::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)
  1256. {
  1257. if (gErrorToText.getErrors())
  1258. {
  1259. return;
  1260. }
  1261. switch(pass)
  1262. {
  1263. case LSCP_PRETTY_PRINT:
  1264. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1265. if (mSecondp)
  1266. {
  1267. fprintf(fp, ", ");
  1268. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1269. }
  1270. break;
  1271. case LSCP_EMIT_ASSEMBLY:
  1272. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1273. if (mFirstp->mReturnType)
  1274. {
  1275. fprintf(fp, "%sn", LSCRIPTTypePop[mFirstp->mReturnType]);
  1276. }
  1277. if (mSecondp)
  1278. {
  1279. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1280. if (mSecondp->mReturnType)
  1281. {
  1282. fprintf(fp, "%sn", LSCRIPTTypePop[mSecondp->mReturnType]);
  1283. }
  1284. }
  1285. break;
  1286. case LSCP_TO_STACK:
  1287. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1288. switch(mFirstp->mReturnType)
  1289. {
  1290. case LST_INTEGER:
  1291. case LST_FLOATINGPOINT:
  1292. chunk->addByte(LSCRIPTOpCodes[LOPC_POP]);
  1293. break;
  1294. case LST_STRING:
  1295. case LST_KEY:
  1296. chunk->addByte(LSCRIPTOpCodes[LOPC_POPS]);
  1297. break;
  1298. case LST_LIST:
  1299. chunk->addByte(LSCRIPTOpCodes[LOPC_POPL]);
  1300. break;
  1301. case LST_VECTOR:
  1302. chunk->addByte(LSCRIPTOpCodes[LOPC_POPV]);
  1303. break;
  1304. case LST_QUATERNION:
  1305. chunk->addByte(LSCRIPTOpCodes[LOPC_POPQ]);
  1306. break;
  1307. default:
  1308. break;
  1309. }
  1310. if (mSecondp)
  1311. {
  1312. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1313. switch(mSecondp->mReturnType)
  1314. {
  1315. case LST_INTEGER:
  1316. case LST_FLOATINGPOINT:
  1317. chunk->addByte(LSCRIPTOpCodes[LOPC_POP]);
  1318. break;
  1319. case LST_STRING:
  1320. case LST_KEY:
  1321. chunk->addByte(LSCRIPTOpCodes[LOPC_POPS]);
  1322. break;
  1323. case LST_LIST:
  1324. chunk->addByte(LSCRIPTOpCodes[LOPC_POPL]);
  1325. break;
  1326. case LST_VECTOR:
  1327. chunk->addByte(LSCRIPTOpCodes[LOPC_POPV]);
  1328. break;
  1329. case LST_QUATERNION:
  1330. chunk->addByte(LSCRIPTOpCodes[LOPC_POPQ]);
  1331. break;
  1332. default:
  1333. break;
  1334. }
  1335. }
  1336. break;
  1337. case LSCP_EMIT_CIL_ASSEMBLY:
  1338. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1339. if (mFirstp->mReturnType)
  1340. {
  1341. fprintf(fp, "popn");
  1342. }
  1343. if (mSecondp)
  1344. {
  1345. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1346. if (mSecondp->mReturnType)
  1347. {
  1348. fprintf(fp, "popn");
  1349. }
  1350. }
  1351. break;
  1352. default:
  1353. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1354. if (mSecondp)
  1355. {
  1356. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1357. }
  1358. break;
  1359. }
  1360. }
  1361. S32 LLScriptForExpressionList::getSize()
  1362. {
  1363. return 0;
  1364. }
  1365. // CIL code generation requires both caller and callee scope entries, so cannot use normal recurse signature.
  1366. // TODO: Refactor general purpose recurse calls in to pass specific virtuals using visitor pattern to select method by pass and node type.
  1367. static void print_cil_func_expression_list(LLScriptFuncExpressionList* self, 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, LLScriptScopeEntry *callee_entry)
  1368. {
  1369. self->mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1370. LSCRIPTType argtype = callee_entry->mFunctionArgs.getType(entrycount);
  1371. if (argtype != self->mFirstp->mReturnType)
  1372. {
  1373. print_cil_cast(fp, self->mFirstp->mReturnType, argtype);
  1374. }
  1375. entrycount++;
  1376. if (self->mSecondp)
  1377. {
  1378. llassert(LET_FUNC_EXPRESSION_LIST == self->mSecondp->mType);
  1379. print_cil_func_expression_list((LLScriptFuncExpressionList*) self->mSecondp, fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL, callee_entry);
  1380. }
  1381. }
  1382. void LLScriptFuncExpressionList::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)
  1383. {
  1384. if (gErrorToText.getErrors())
  1385. {
  1386. return;
  1387. }
  1388. switch(pass)
  1389. {
  1390. case LSCP_PRETTY_PRINT:
  1391. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1392. if (mSecondp)
  1393. {
  1394. fprintf(fp, ", ");
  1395. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1396. }
  1397. break;
  1398. case LSCP_TYPE:
  1399. {
  1400. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1401. if (!entry->mFunctionArgs.getType(entrycount))
  1402. {
  1403. gErrorToText.writeError(fp, this, LSERROR_FUNCTION_TYPE_ERROR);
  1404. }
  1405. if (!legal_assignment(entry->mFunctionArgs.getType(entrycount), mFirstp->mReturnType))
  1406. {
  1407. gErrorToText.writeError(fp, this, LSERROR_FUNCTION_TYPE_ERROR);
  1408. }
  1409. count++;
  1410. entrycount++;
  1411. if (mSecondp)
  1412. {
  1413. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1414. if (mSecondp->mReturnType)
  1415. {
  1416. count++;
  1417. if (!entry->mFunctionArgs.getType(entrycount))
  1418. {
  1419. gErrorToText.writeError(fp, this, LSERROR_FUNCTION_TYPE_ERROR);
  1420. }
  1421. if (!legal_assignment(entry->mFunctionArgs.getType(entrycount), mSecondp->mReturnType))
  1422. {
  1423. gErrorToText.writeError(fp, this, LSERROR_FUNCTION_TYPE_ERROR);
  1424. }
  1425. }
  1426. }
  1427. }
  1428. break;
  1429. case LSCP_EMIT_ASSEMBLY:
  1430. {
  1431. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1432. LSCRIPTType argtype = entry->mFunctionArgs.getType(entrycount);
  1433. if (argtype != mFirstp->mReturnType)
  1434. {
  1435. fprintf(fp, "CAST %s->%sn", LSCRIPTTypeNames[mFirstp->mReturnType], LSCRIPTTypeNames[argtype]);
  1436. }
  1437. entrycount++;
  1438. if (mSecondp)
  1439. {
  1440. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1441. if (mSecondp->mReturnType)
  1442. {
  1443. argtype = entry->mFunctionArgs.getType(entrycount);
  1444. if (argtype != mSecondp->mReturnType)
  1445. {
  1446. fprintf(fp, "CAST %s->%sn", LSCRIPTTypeNames[mSecondp->mReturnType], LSCRIPTTypeNames[argtype]);
  1447. }
  1448. }
  1449. }
  1450. }
  1451. break;
  1452. case LSCP_TO_STACK:
  1453. {
  1454. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1455. LSCRIPTType argtype = entry->mFunctionArgs.getType(entrycount);
  1456. if (argtype != mFirstp->mReturnType)
  1457. {
  1458. chunk->addByte(LSCRIPTOpCodes[LOPC_CAST]);
  1459. U8 castbyte = LSCRIPTTypeByte[argtype] | LSCRIPTTypeHi4Bits[mFirstp->mReturnType];
  1460. chunk->addByte(castbyte);
  1461. }
  1462. entrycount++;
  1463. if (mSecondp)
  1464. {
  1465. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1466. if (mSecondp->mReturnType)
  1467. {
  1468. argtype = entry->mFunctionArgs.getType(entrycount);
  1469. if (argtype != mSecondp->mReturnType)
  1470. {
  1471. chunk->addByte(LSCRIPTOpCodes[LOPC_CAST]);
  1472. U8 castbyte = LSCRIPTTypeByte[argtype] | LSCRIPTTypeHi4Bits[mSecondp->mReturnType];
  1473. chunk->addByte(castbyte);
  1474. }
  1475. }
  1476. }
  1477. }
  1478. break;
  1479. default:
  1480. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1481. if (mSecondp)
  1482. {
  1483. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1484. }
  1485. break;
  1486. }
  1487. }
  1488. S32 LLScriptFuncExpressionList::getSize()
  1489. {
  1490. return 0;
  1491. }
  1492. void LLScriptListExpressionList::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)
  1493. {
  1494. if (gErrorToText.getErrors())
  1495. {
  1496. return;
  1497. }
  1498. switch(pass)
  1499. {
  1500. case LSCP_PRETTY_PRINT:
  1501. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1502. if (mSecondp)
  1503. {
  1504. fprintf(fp, ", ");
  1505. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1506. }
  1507. break;
  1508. case LSCP_EMIT_ASSEMBLY:
  1509. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1510. if (mFirstp->mType != LET_LIST_EXPRESSION_LIST)
  1511. {
  1512. fprintf(fp, "%sn", LSCRIPTListDescription[mFirstp->mReturnType]);
  1513. count++;
  1514. }
  1515. if (mSecondp)
  1516. {
  1517. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1518. if (mSecondp->mType != LET_LIST_EXPRESSION_LIST)
  1519. {
  1520. fprintf(fp, "%sn", LSCRIPTListDescription[mSecondp->mReturnType]);
  1521. count++;
  1522. }
  1523. }
  1524. break;
  1525. case LSCP_TO_STACK:
  1526. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1527. if (mFirstp->mType != LET_LIST_EXPRESSION_LIST)
  1528. {
  1529. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHARGB]);
  1530. chunk->addByte(LSCRIPTTypeByte[mFirstp->mReturnType]);
  1531. count++;
  1532. }
  1533. if (mSecondp)
  1534. {
  1535. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1536. if (mSecondp->mType != LET_LIST_EXPRESSION_LIST)
  1537. {
  1538. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHARGB]);
  1539. chunk->addByte(LSCRIPTTypeByte[mSecondp->mReturnType]);
  1540. count++;
  1541. }
  1542. }
  1543. break;
  1544. case LSCP_EMIT_CIL_ASSEMBLY:
  1545. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1546. if (mFirstp->mType != LET_LIST_EXPRESSION_LIST)
  1547. {
  1548. // Box value.
  1549. print_cil_box(fp, mFirstp->mReturnType);
  1550. ++count;
  1551. }
  1552. if (mSecondp)
  1553. {
  1554. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1555. if (mSecondp->mType != LET_LIST_EXPRESSION_LIST)
  1556. {
  1557. // Box value.
  1558. print_cil_box(fp, mSecondp->mReturnType);
  1559. ++count;
  1560. }
  1561. }
  1562. break;
  1563. default:
  1564. mFirstp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1565. if (mSecondp)
  1566. {
  1567. mSecondp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1568. }
  1569. break;
  1570. }
  1571. }
  1572. S32 LLScriptListExpressionList::getSize()
  1573. {
  1574. return 0;
  1575. }
  1576. // Returns true if identifier is a parameter and false if identifier is a local variable within function_scope.
  1577. bool is_parameter(LLScriptIdentifier* identifier, LLScriptScopeEntry* function_scope)
  1578. {
  1579. // Function stores offset of first local.
  1580. if(0 == function_scope->mOffset)
  1581. {
  1582. // Function offset 0 -> no parameters -> identifier is a local.
  1583. return false;
  1584. }
  1585. else
  1586. {
  1587. // Compare variable offset with function offset to
  1588. // determine whether variable is local or parameter.
  1589. return (identifier->mScopeEntry->mOffset < function_scope->mOffset);
  1590. }
  1591. }
  1592. // If assignment is to global variable, pushes this pointer on to stack.
  1593. static void print_cil_load_address(LLFILE* fp, LLScriptExpression* exp, LLScriptScopeEntry* function_scope)
  1594. {
  1595. LLScriptLValue *lvalue = (LLScriptLValue *) exp;
  1596. LLScriptIdentifier *ident = lvalue->mIdentifier;
  1597. // If global (member), load this pointer.
  1598. if(ident->mScopeEntry->mIDType == LIT_GLOBAL)
  1599. {
  1600. fprintf(fp, "ldarg.0n");
  1601. }
  1602. // If accessor, load value type address, consumed by ldfld.
  1603. if(lvalue->mAccessor)
  1604. {
  1605. if(ident->mScopeEntry->mIDType == LIT_VARIABLE)
  1606. {
  1607. if(is_parameter(ident, function_scope))
  1608. {
  1609. // Parameter, load by name.
  1610. fprintf(fp, "ldarga.s '%s'n", ident->mScopeEntry->mIdentifier);
  1611. }
  1612. else
  1613. {
  1614. // Local, load by index.
  1615. fprintf(fp, "ldloca.s %dn", ident->mScopeEntry->mCount);
  1616. }
  1617. }
  1618. else if (ident->mScopeEntry->mIDType == LIT_GLOBAL)
  1619. {
  1620. fprintf(fp, "ldflda ");
  1621. print_cil_member(fp, ident);
  1622. }
  1623. }
  1624. }
  1625. static void print_cil_accessor(LLFILE* fp, LLScriptLValue *lvalue)
  1626. {
  1627. LLScriptIdentifier *ident = lvalue->mIdentifier;
  1628. print_cil_type(fp, lvalue->mReturnType);
  1629. fprintf(fp, " ");
  1630. print_cil_type(fp, ident->mScopeEntry->mType);
  1631. fprintf(fp, "::%sn", lvalue->mAccessor->mName);
  1632. }
  1633. void LLScriptLValue::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. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1643. if (mAccessor)
  1644. {
  1645. fprintf(fp, ".");
  1646. mAccessor->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1647. }
  1648. break;
  1649. case LSCP_EMIT_ASSEMBLY:
  1650. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1651. {
  1652. if (mAccessor)
  1653. {
  1654. fprintf(fp, "%s%d [%s.%s]n", LSCRIPTTypeLocalPush[mReturnType], mIdentifier->mScopeEntry->mOffset + mOffset, mIdentifier->mName, mAccessor->mName);
  1655. }
  1656. else
  1657. {
  1658. fprintf(fp, "%s%d [%s]n", LSCRIPTTypeLocalPush[mIdentifier->mScopeEntry->mType], mIdentifier->mScopeEntry->mOffset, mIdentifier->mName);
  1659. }
  1660. }
  1661. else if (mIdentifier->mScopeEntry->mIDType == LIT_GLOBAL)
  1662. {
  1663. if (mAccessor)
  1664. {
  1665. fprintf(fp, "%s%d [%s.%s]n", LSCRIPTTypeGlobalPush[mReturnType], mIdentifier->mScopeEntry->mOffset + mOffset, mIdentifier->mName, mAccessor->mName);
  1666. }
  1667. else
  1668. {
  1669. fprintf(fp, "%s%d [%s]n", LSCRIPTTypeGlobalPush[mIdentifier->mScopeEntry->mType], mIdentifier->mScopeEntry->mOffset, mIdentifier->mName);
  1670. }
  1671. }
  1672. else
  1673. {
  1674. fprintf(fp, "Unexpected LValue!n");
  1675. }
  1676. break;
  1677. case LSCP_SCOPE_PASS1:
  1678. {
  1679. LLScriptScopeEntry *entry = scope->findEntry(mIdentifier->mName);
  1680. if (!entry || (  (entry->mIDType != LIT_GLOBAL) && (entry->mIDType != LIT_VARIABLE)))
  1681. {
  1682. gErrorToText.writeError(fp, this, LSERROR_UNDEFINED_NAME);
  1683. }
  1684. else
  1685. {
  1686. // if we did find it, make sure this identifier is associated with the correct scope entry
  1687. mIdentifier->mScopeEntry = entry;
  1688. }
  1689. }
  1690. break;
  1691. case LSCP_TYPE:
  1692. // if we have an accessor, we need to change what type our identifier returns and set our offset value
  1693. if (mIdentifier->mScopeEntry)
  1694. {
  1695. if (mAccessor)
  1696. {
  1697. BOOL b_ok = FALSE;
  1698. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1699. {
  1700. if (mIdentifier->mScopeEntry->mType == LST_VECTOR)
  1701. {
  1702. if (!strcmp("x", mAccessor->mName))
  1703. {
  1704. mOffset = 0;
  1705. b_ok = TRUE;
  1706. }
  1707. else if (!strcmp("y", mAccessor->mName))
  1708. {
  1709. mOffset = 4;
  1710. b_ok = TRUE;
  1711. }
  1712. else if (!strcmp("z", mAccessor->mName))
  1713. {
  1714. mOffset = 8;
  1715. b_ok = TRUE;
  1716. }
  1717. }
  1718. else if (mIdentifier->mScopeEntry->mType == LST_QUATERNION)
  1719. {
  1720. if (!strcmp("x", mAccessor->mName))
  1721. {
  1722. mOffset = 0;
  1723. b_ok = TRUE;
  1724. }
  1725. else if (!strcmp("y", mAccessor->mName))
  1726. {
  1727. mOffset = 4;
  1728. b_ok = TRUE;
  1729. }
  1730. else if (!strcmp("z", mAccessor->mName))
  1731. {
  1732. mOffset = 8;
  1733. b_ok = TRUE;
  1734. }
  1735. else if (!strcmp("s", mAccessor->mName))
  1736. {
  1737. mOffset = 12;
  1738. b_ok = TRUE;
  1739. }
  1740. }
  1741. }
  1742. else
  1743. {
  1744. if (mIdentifier->mScopeEntry->mType == LST_VECTOR)
  1745. {
  1746. if (!strcmp("x", mAccessor->mName))
  1747. {
  1748. mOffset = 8;
  1749. b_ok = TRUE;
  1750. }
  1751. else if (!strcmp("y", mAccessor->mName))
  1752. {
  1753. mOffset = 4;
  1754. b_ok = TRUE;
  1755. }
  1756. else if (!strcmp("z", mAccessor->mName))
  1757. {
  1758. mOffset = 0;
  1759. b_ok = TRUE;
  1760. }
  1761. }
  1762. else if (mIdentifier->mScopeEntry->mType == LST_QUATERNION)
  1763. {
  1764. if (!strcmp("x", mAccessor->mName))
  1765. {
  1766. mOffset = 12;
  1767. b_ok = TRUE;
  1768. }
  1769. else if (!strcmp("y", mAccessor->mName))
  1770. {
  1771. mOffset = 8;
  1772. b_ok = TRUE;
  1773. }
  1774. else if (!strcmp("z", mAccessor->mName))
  1775. {
  1776. mOffset = 4;
  1777. b_ok = TRUE;
  1778. }
  1779. else if (!strcmp("s", mAccessor->mName))
  1780. {
  1781. mOffset = 0;
  1782. b_ok = TRUE;
  1783. }
  1784. }
  1785. }
  1786. if (b_ok)
  1787. {
  1788. mReturnType = type =  LST_FLOATINGPOINT;
  1789. }
  1790. else
  1791. {
  1792. gErrorToText.writeError(fp, this, LSERROR_VECTOR_METHOD_ERROR);
  1793. }
  1794. }
  1795. else
  1796. {
  1797. mReturnType = type = mIdentifier->mScopeEntry->mType;
  1798. }
  1799. }
  1800. else
  1801. {
  1802. mReturnType = type = LST_UNDEFINED;
  1803. }
  1804. break;
  1805. case LSCP_TO_STACK:
  1806. {
  1807. switch(mReturnType)
  1808. {
  1809. case LST_INTEGER:
  1810. case LST_FLOATINGPOINT:
  1811. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1812. {
  1813. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSH]);
  1814. }
  1815. else
  1816. {
  1817. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHG]);
  1818. }
  1819. break;
  1820. case LST_KEY:
  1821. case LST_STRING:
  1822. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1823. {
  1824. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHS]);
  1825. }
  1826. else
  1827. {
  1828. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHGS]);
  1829. }
  1830. break;
  1831. case LST_LIST:
  1832. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1833. {
  1834. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHL]);
  1835. }
  1836. else
  1837. {
  1838. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHGL]);
  1839. }
  1840. break;
  1841. case LST_VECTOR:
  1842. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1843. {
  1844. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHV]);
  1845. }
  1846. else
  1847. {
  1848. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHGV]);
  1849. }
  1850. break;
  1851. case LST_QUATERNION:
  1852. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1853. {
  1854. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHQ]);
  1855. }
  1856. else
  1857. {
  1858. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHGQ]);
  1859. }
  1860. break;
  1861. default:
  1862. if (mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1863. {
  1864. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSH]);
  1865. }
  1866. else
  1867. {
  1868. chunk->addByte(LSCRIPTOpCodes[LOPC_PUSHG]);
  1869. }
  1870. break;
  1871. }
  1872. S32 address = mIdentifier->mScopeEntry->mOffset + mOffset;
  1873. chunk->addInteger(address);
  1874. }
  1875. break;
  1876. case LSCP_EMIT_CIL_ASSEMBLY:
  1877. print_cil_load_address(fp, this, entry);
  1878. if(mAccessor)
  1879. {
  1880. fprintf(fp, "ldfld ");
  1881. print_cil_accessor(fp, this);
  1882. }
  1883. else if(mIdentifier->mScopeEntry->mIDType == LIT_VARIABLE)
  1884. {
  1885. if(is_parameter(mIdentifier, entry))
  1886. {
  1887. // Parameter, load by name.
  1888. fprintf(fp, "ldarg.s '%s'n", mIdentifier->mScopeEntry->mIdentifier);
  1889. }
  1890. else
  1891. {
  1892. // Local, load by index.
  1893. fprintf(fp, "ldloc.s %dn", mIdentifier->mScopeEntry->mCount);
  1894. }
  1895. }
  1896. else if (mIdentifier->mScopeEntry->mIDType == LIT_GLOBAL)
  1897. {
  1898. fprintf(fp, "ldfld ");
  1899. print_cil_member(fp, mIdentifier);
  1900. }
  1901. else
  1902. {
  1903. fprintf(fp, "Unexpected LValue!n");
  1904. }
  1905. break;
  1906. default:
  1907. mIdentifier->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1908. break;
  1909. }
  1910. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  1911. }
  1912. S32 LLScriptLValue::getSize()
  1913. {
  1914. return 0;
  1915. }
  1916. static void print_assignment(LLFILE *fp, LLScriptExpression *exp)
  1917. {
  1918. LLScriptLValue *lvalue = (LLScriptLValue *)exp;
  1919. LLScriptIdentifier *ident = lvalue->mIdentifier;
  1920. if (lvalue->mAccessor)
  1921. {
  1922. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  1923. {
  1924. fprintf(fp, "%s%d [%s.%s]n", LSCRIPTTypeLocalStore[ident->mScopeEntry->mType], ident->mScopeEntry->mOffset + lvalue->mOffset, ident->mName, lvalue->mAccessor->mName);
  1925. }
  1926. else if (ident->mScopeEntry->mIDType == LIT_GLOBAL)
  1927. {
  1928. fprintf(fp, "%s%d [%s.%s]n", LSCRIPTTypeGlobalStore[ident->mScopeEntry->mType], ident->mScopeEntry->mOffset + lvalue->mOffset, ident->mName, lvalue->mAccessor->mName);
  1929. }
  1930. }
  1931. else
  1932. {
  1933. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  1934. {
  1935. fprintf(fp, "%s%d [%s]n", LSCRIPTTypeLocalStore[ident->mScopeEntry->mType], ident->mScopeEntry->mOffset, ident->mName);
  1936. }
  1937. else if (ident->mScopeEntry->mIDType == LIT_GLOBAL)
  1938. {
  1939. fprintf(fp, "%s%d [%s]n", LSCRIPTTypeGlobalStore[ident->mScopeEntry->mType], ident->mScopeEntry->mOffset, ident->mName);
  1940. }
  1941. }
  1942. }
  1943. static void print_cil_assignment(LLFILE *fp, LLScriptExpression *exp, LLScriptScopeEntry* function_scope)
  1944. {
  1945. LLScriptLValue *lvalue = (LLScriptLValue *) exp;
  1946. LLScriptIdentifier *ident = lvalue->mIdentifier;
  1947. if (lvalue->mAccessor)
  1948. {
  1949. // Object address loaded, store in to field.
  1950. fprintf(fp, "stfld ");
  1951. print_cil_accessor(fp, lvalue);
  1952. // Load object address.
  1953. print_cil_load_address(fp, exp, function_scope);
  1954. // Load field.
  1955. fprintf(fp, "ldfld ");
  1956. print_cil_accessor(fp, lvalue);
  1957. }
  1958. else
  1959. {
  1960. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  1961. {
  1962. // Language semantics require value of assignment to be left on stack. 
  1963. // TODO: Optimise away redundant dup/pop pairs.
  1964. fprintf(fp, "dupn"); 
  1965. if(is_parameter(ident, function_scope))
  1966. {
  1967. // Parameter, store by name.
  1968. fprintf(fp, "starg.s '%s'n", ident->mScopeEntry->mIdentifier);
  1969. }
  1970. else
  1971. {
  1972. // Local, store by index.
  1973. fprintf(fp, "stloc.s %dn", ident->mScopeEntry->mCount);
  1974. }
  1975. }
  1976. else if (ident->mScopeEntry->mIDType == LIT_GLOBAL)
  1977. {
  1978. // Object address loaded, store in to field.
  1979. fprintf(fp, "stfld ");
  1980. print_cil_member(fp, ident);
  1981. // Load object address.
  1982. print_cil_load_address(fp, exp, function_scope);
  1983. // Load field.
  1984. fprintf(fp, "ldfld ");
  1985. print_cil_member(fp, ident);
  1986. }
  1987. }
  1988. }
  1989. void print_cast(LLFILE *fp, LSCRIPTType ret_type, LSCRIPTType right_type)
  1990. {
  1991. if (right_type != ret_type)
  1992. {
  1993. fprintf(fp, "CAST %s->%sn", LSCRIPTTypeNames[right_type], LSCRIPTTypeNames[ret_type]);
  1994. }
  1995. }
  1996. void cast2stack(LLScriptByteCodeChunk *chunk, LSCRIPTType ret_type, LSCRIPTType right_type)
  1997. {
  1998. if (right_type != ret_type)
  1999. {
  2000. chunk->addByte(LSCRIPTOpCodes[LOPC_CAST]);
  2001. U8 castbyte = LSCRIPTTypeByte[right_type] | LSCRIPTTypeHi4Bits[ret_type];
  2002. chunk->addByte(castbyte);
  2003. }
  2004. }
  2005. void operation2stack(LLScriptByteCodeChunk *chunk, LSCRIPTType ret_type, LSCRIPTType right_type)
  2006. {
  2007. U8 typebyte = LSCRIPTTypeByte[right_type] | LSCRIPTTypeHi4Bits[ret_type];
  2008. chunk->addByte(typebyte);
  2009. }
  2010. void store2stack(LLScriptExpression *exp, LLScriptExpression *lv, LLScriptByteCodeChunk *chunk, LSCRIPTType right_type)
  2011. {
  2012. LLScriptLValue *lvalue = (LLScriptLValue *)lv;
  2013. LLScriptIdentifier *ident = lvalue->mIdentifier;
  2014. LSCRIPTType rettype = exp->mReturnType;
  2015. if (exp->mRightType != LST_NULL)
  2016. {
  2017. if (legal_binary_expression(rettype, exp->mLeftType, exp->mRightType, exp->mType)) 
  2018. cast2stack(chunk, right_type, exp->mReturnType);
  2019. }
  2020. switch(exp->mReturnType)
  2021. {
  2022. case LST_INTEGER:
  2023. case LST_FLOATINGPOINT:
  2024. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2025. {
  2026. chunk->addByte(LSCRIPTOpCodes[LOPC_STORE]);
  2027. }
  2028. else
  2029. {
  2030. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREG]);
  2031. }
  2032. break;
  2033. case LST_KEY:
  2034. case LST_STRING:
  2035. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2036. {
  2037. chunk->addByte(LSCRIPTOpCodes[LOPC_STORES]);
  2038. }
  2039. else
  2040. {
  2041. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREGS]);
  2042. }
  2043. break;
  2044. case LST_LIST:
  2045. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2046. {
  2047. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREL]);
  2048. }
  2049. else
  2050. {
  2051. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREGL]);
  2052. }
  2053. break;
  2054. case LST_VECTOR:
  2055. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2056. {
  2057. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREV]);
  2058. }
  2059. else
  2060. {
  2061. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREGV]);
  2062. }
  2063. break;
  2064. case LST_QUATERNION:
  2065. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2066. {
  2067. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREQ]);
  2068. }
  2069. else
  2070. {
  2071. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREGQ]);
  2072. }
  2073. break;
  2074. default:
  2075. if (ident->mScopeEntry->mIDType == LIT_VARIABLE)
  2076. {
  2077. chunk->addByte(LSCRIPTOpCodes[LOPC_STORE]);
  2078. }
  2079. else
  2080. {
  2081. chunk->addByte(LSCRIPTOpCodes[LOPC_STOREG]);
  2082. }
  2083. break;
  2084. }
  2085. S32 address = ident->mScopeEntry->mOffset + lvalue->mOffset;
  2086. chunk->addInteger(address);
  2087. }
  2088. void LLScriptAssignment::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)
  2089. {
  2090. if (gErrorToText.getErrors())
  2091. {
  2092. return;
  2093. }
  2094. switch(pass)
  2095. {
  2096. case LSCP_PRETTY_PRINT:
  2097. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2098. fprintf(fp, " = ");
  2099. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2100. break;
  2101. case LSCP_EMIT_ASSEMBLY:
  2102. {
  2103. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2104. print_cast(fp, mReturnType, mRightType);
  2105. print_assignment(fp, mLValue);
  2106. }
  2107. break;
  2108. case LSCP_TYPE:
  2109. {
  2110. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2111. mLeftType = type;
  2112. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2113. mRightType = type;
  2114. if (!legal_assignment(mLeftType, mRightType))
  2115. {
  2116. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  2117. }
  2118. type = mReturnType = mLeftType;
  2119. }
  2120. break;
  2121. case LSCP_TO_STACK:
  2122. {
  2123. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2124. store2stack(this, mLValue, chunk, mRightType);
  2125. }
  2126. break;
  2127. case LSCP_EMIT_CIL_ASSEMBLY:
  2128. {
  2129. print_cil_load_address(fp, mLValue, entry);
  2130. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2131. print_cil_assignment_cast(fp, mRightType, mReturnType);
  2132. print_cil_assignment(fp, mLValue, entry);
  2133. }
  2134. break;
  2135. default:
  2136. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2137. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2138. break;
  2139. }
  2140. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2141. }
  2142. S32 LLScriptAssignment::getSize()
  2143. {
  2144. return 0;
  2145. }
  2146. static void print_cil_add(LLFILE* fp, LSCRIPTType left_type, LSCRIPTType right_type)
  2147. {
  2148. if(LST_LIST == right_type && LST_LIST != left_type)
  2149. {
  2150. print_cil_box(fp, left_type);
  2151. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Prepend(class [mscorlib]System.Collections.ArrayList, object)n");
  2152. return;
  2153. }
  2154. switch(left_type)
  2155. {
  2156. case LST_INTEGER:
  2157. case LST_FLOATINGPOINT:
  2158. // Numeric addition.
  2159. fprintf(fp, "addn");
  2160. break;
  2161. case LST_STRING:
  2162. case LST_KEY:
  2163. // String concatenation.
  2164. fprintf(fp, "call string valuetype [LslUserScript]LindenLab.SecondLife.LslUserScript::Add(string, string)n");
  2165. break;
  2166. case LST_VECTOR:
  2167. // Vector addition.
  2168. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Add'(class [ScriptTypes]LindenLab.SecondLife.Vector, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2169. break;
  2170. case LST_QUATERNION:
  2171. // Rotation addition.
  2172. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Add'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Quaternion)n");
  2173. break;
  2174. case LST_LIST:
  2175. switch(right_type)
  2176. {
  2177. case LST_LIST:
  2178. // Concatenate lists.
  2179. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(class [mscorlib]System.Collections.ArrayList, class [mscorlib]System.Collections.ArrayList)n");
  2180. break;
  2181. case LST_INTEGER:
  2182. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(int32, class [mscorlib]System.Collections.ArrayList)n");
  2183. break;
  2184. case LST_FLOATINGPOINT:
  2185. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(float32, class [mscorlib]System.Collections.ArrayList)n");
  2186. break;
  2187. case LST_STRING:
  2188. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(string, class [mscorlib]System.Collections.ArrayList)n");
  2189. break;
  2190. case LST_KEY:
  2191. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(valuetype [ScriptTypes]LindenLab.SecondLife.Key, class [mscorlib]System.Collections.ArrayList)n");
  2192. break;
  2193. case LST_VECTOR:
  2194. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(valuetype [ScriptTypes]LindenLab.SecondLife.Vector, class [mscorlib]System.Collections.ArrayList)n");
  2195. break;
  2196. case LST_QUATERNION:
  2197. fprintf(fp, "call class [mscorlib]System.Collections.ArrayList class [LslUserScript]LindenLab.SecondLife.LslUserScript::Append(valuetype [ScriptTypes]LindenLab.SecondLife.Quaternion, class [mscorlib]System.Collections.ArrayList)n");
  2198. break;
  2199. default:
  2200. break;
  2201. }
  2202. default:
  2203. break;
  2204. }
  2205. }
  2206. void LLScriptAddAssignment::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)
  2207. {
  2208. if (gErrorToText.getErrors())
  2209. {
  2210. return;
  2211. }
  2212. switch(pass)
  2213. {
  2214. case LSCP_PRETTY_PRINT:
  2215. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2216. fprintf(fp, " += ");
  2217. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2218. break;
  2219. case LSCP_EMIT_ASSEMBLY:
  2220. {
  2221. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2222. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2223. fprintf(fp, "ADD %s, %sn", LSCRIPTTypeNames[mRightType], LSCRIPTTypeNames[mLeftType]);
  2224. print_assignment(fp, mLValue);
  2225. }
  2226. break;
  2227. case LSCP_TYPE:
  2228. {
  2229. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2230. mLeftType = type;
  2231. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2232. mRightType = type;
  2233. if (!legal_binary_expression(mReturnType, mLeftType, mRightType, mType))
  2234. {
  2235. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  2236. }
  2237. type = mReturnType;
  2238. }
  2239. break;
  2240. case LSCP_TO_STACK:
  2241. {
  2242. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2243. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2244. chunk->addByte(LSCRIPTOpCodes[LOPC_ADD]);
  2245. operation2stack(chunk, mReturnType, mRightType);
  2246. store2stack(this, mLValue, chunk, mReturnType);
  2247. }
  2248. break;
  2249. case LSCP_EMIT_CIL_ASSEMBLY:
  2250. {
  2251. print_cil_load_address(fp, mLValue, entry);
  2252. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2253. print_cil_numeric_cast(fp, mRightSide->mReturnType, mLValue->mReturnType);
  2254. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2255. print_cil_numeric_cast(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2256. print_cil_add(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2257. print_cil_assignment(fp, mLValue, entry);
  2258. }
  2259. break;
  2260. default:
  2261. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2262. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2263. break;
  2264. }
  2265. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2266. }
  2267. S32 LLScriptAddAssignment::getSize()
  2268. {
  2269. return 0;
  2270. }
  2271. static void print_cil_sub(LLFILE* fp, LSCRIPTType left_type, LSCRIPTType right_type)
  2272. {
  2273. switch(left_type)
  2274. {
  2275. case LST_INTEGER:
  2276. if(LST_INTEGER == right_type)
  2277. {
  2278. fprintf(fp, "call int32 [LslUserScript]LindenLab.SecondLife.LslUserScript::Subtract(int32, int32)n");
  2279. break;
  2280. }
  2281. case LST_FLOATINGPOINT:
  2282. // Numeric subtraction.
  2283. fprintf(fp, "call float64 [LslUserScript]LindenLab.SecondLife.LslUserScript::Subtract(float64, float64)n");
  2284. break;
  2285. case LST_VECTOR:
  2286. // Vector subtraction.
  2287. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Subtract'(class [ScriptTypes]LindenLab.SecondLife.Vector, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2288. break;
  2289. case LST_QUATERNION:
  2290. // Rotation subtraction.
  2291. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Subtract'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Quaternion)n");
  2292. break;
  2293. default:
  2294. // Error.
  2295. break;
  2296. }
  2297. }
  2298. void LLScriptSubAssignment::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)
  2299. {
  2300. if (gErrorToText.getErrors())
  2301. {
  2302. return;
  2303. }
  2304. switch(pass)
  2305. {
  2306. case LSCP_PRETTY_PRINT:
  2307. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2308. fprintf(fp, " -= ");
  2309. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2310. break;
  2311. case LSCP_EMIT_ASSEMBLY:
  2312. {
  2313. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2314. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2315. fprintf(fp, "SUB %s, %sn", LSCRIPTTypeNames[mRightType], LSCRIPTTypeNames[mLeftType]);
  2316. print_assignment(fp, mLValue);
  2317. }
  2318. break;
  2319. case LSCP_TYPE:
  2320. {
  2321. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2322. mLeftType = type;
  2323. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2324. mRightType = type;
  2325. if (!legal_binary_expression(mReturnType, mLeftType, mRightType, mType))
  2326. {
  2327. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  2328. }
  2329. type = mReturnType;
  2330. }
  2331. break;
  2332. case LSCP_TO_STACK:
  2333. {
  2334. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2335. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2336. chunk->addByte(LSCRIPTOpCodes[LOPC_SUB]);
  2337. operation2stack(chunk, mReturnType, mRightType);
  2338. store2stack(this, mLValue, chunk, mReturnType);
  2339. }
  2340. break;
  2341. case LSCP_EMIT_CIL_ASSEMBLY:
  2342. {
  2343. print_cil_load_address(fp, mLValue, entry);
  2344. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2345. print_cil_numeric_cast(fp, mRightSide->mReturnType, mLValue->mReturnType);
  2346. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2347. print_cil_numeric_cast(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2348. print_cil_sub(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2349. print_cil_assignment(fp, mLValue, entry);
  2350. }
  2351. break;
  2352. default:
  2353. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2354. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2355. break;
  2356. }
  2357. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2358. }
  2359. S32 LLScriptSubAssignment::getSize()
  2360. {
  2361. return 0;
  2362. }
  2363. static void print_cil_neg(LLFILE* fp, LSCRIPTType type)
  2364. {
  2365.         switch(type)
  2366. {
  2367. case LST_INTEGER:
  2368. case LST_FLOATINGPOINT:
  2369.   fprintf(fp, "negn");
  2370.   break;
  2371. case LST_VECTOR:
  2372.   fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Negate'(class [ScriptTypes]LindenLab.SecondLife.Vector)n");   
  2373.   break;
  2374. case LST_QUATERNION:
  2375.   fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Negate'(class [ScriptTypes]LindenLab.SecondLife.Quaternion)n");   
  2376.   break;
  2377. default:
  2378.   break;
  2379. }
  2380. }
  2381. static void print_cil_mul(LLFILE* fp, LSCRIPTType left_type, LSCRIPTType right_type)
  2382. {
  2383. switch(left_type)
  2384. {
  2385. case LST_INTEGER:
  2386. switch(right_type)
  2387. {
  2388. case LST_INTEGER:
  2389. case LST_FLOATINGPOINT:
  2390. // Numeric multiplication.
  2391. fprintf(fp, "muln");
  2392. break;
  2393. case LST_VECTOR:
  2394. // Vector scaling.
  2395. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(class [ScriptTypes]LindenLab.SecondLife.Vector, float32)n");
  2396. break;
  2397. default:
  2398. break;
  2399. }
  2400. break;
  2401. case LST_FLOATINGPOINT:
  2402. switch(right_type)
  2403. {
  2404. case LST_INTEGER:
  2405. case LST_FLOATINGPOINT:
  2406. // Numeric multiplication.
  2407. fprintf(fp, "muln");
  2408. break;
  2409. case LST_VECTOR:
  2410. // Vector scaling.
  2411. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(class [ScriptTypes]LindenLab.SecondLife.Vector, float32)n");
  2412. break;
  2413. default:
  2414. break;
  2415. }
  2416. break;
  2417. case LST_VECTOR:
  2418. switch(right_type)
  2419. {
  2420. case LST_INTEGER:
  2421. case LST_FLOATINGPOINT:
  2422. // Vector scaling.
  2423. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(float32, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2424. break;
  2425. case LST_VECTOR:
  2426. // Dot product.
  2427. fprintf(fp, "call float32 class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(class [ScriptTypes]LindenLab.SecondLife.Vector, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2428. break;
  2429. case LST_QUATERNION:
  2430. // Vector rotation.
  2431. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2432. break;
  2433. default:
  2434. break;
  2435. }
  2436. break;
  2437. case LST_QUATERNION:
  2438. // Rotation multiplication.
  2439. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Multiply'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Quaternion)n");
  2440. break;
  2441. default:
  2442. // Error.
  2443. break;
  2444. }
  2445. }
  2446. void LLScriptMulAssignment::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)
  2447. {
  2448. if (gErrorToText.getErrors())
  2449. {
  2450. return;
  2451. }
  2452. switch(pass)
  2453. {
  2454. case LSCP_PRETTY_PRINT:
  2455. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2456. fprintf(fp, " *= ");
  2457. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2458. break;
  2459. case LSCP_EMIT_ASSEMBLY:
  2460. {
  2461. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2462. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2463. fprintf(fp, "MUL %s, %sn", LSCRIPTTypeNames[mRightType], LSCRIPTTypeNames[mLeftType]);
  2464. print_assignment(fp, mLValue);
  2465. }
  2466. break;
  2467. case LSCP_TYPE:
  2468. {
  2469. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2470. mLeftType = type;
  2471. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2472. mRightType = type;
  2473. if (!legal_binary_expression(mReturnType, mLeftType, mRightType, mType) /*|| !legal_assignment(mLValue->mReturnType, mReturnType)*/)
  2474. {
  2475. gErrorToText.writeError(fp, this, LSERROR_TYPE_MISMATCH);
  2476. }
  2477. type = mReturnType;
  2478. }
  2479. break;
  2480. case LSCP_TO_STACK:
  2481. {
  2482. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2483. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2484. chunk->addByte(LSCRIPTOpCodes[LOPC_MUL]);
  2485. operation2stack(chunk, mReturnType, mRightType);
  2486. store2stack(this, mLValue, chunk, mReturnType);
  2487. }
  2488. break;
  2489. case LSCP_EMIT_CIL_ASSEMBLY:
  2490. {
  2491. print_cil_load_address(fp, mLValue, entry);
  2492. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2493. print_cil_numeric_cast(fp, mRightSide->mReturnType, mLValue->mReturnType);
  2494. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2495. print_cil_numeric_cast(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2496. print_cil_mul(fp, mLValue->mReturnType, mRightSide->mReturnType);
  2497. if((mLValue->mReturnType == LST_INTEGER) && 
  2498.    (mRightSide->mReturnType == LST_FLOATINGPOINT))
  2499. {
  2500.     print_cil_cast(fp, LST_FLOATINGPOINT, LST_INTEGER);
  2501. print_cil_assignment(fp, mLValue, entry);
  2502. }
  2503. break;
  2504. default:
  2505. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2506. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2507. break;
  2508. }
  2509. gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2510. }
  2511. S32 LLScriptMulAssignment::getSize()
  2512. {
  2513. return 0;
  2514. }
  2515. static void print_cil_div(LLFILE* fp, LSCRIPTType left_type, LSCRIPTType right_type)
  2516. {
  2517. switch(left_type)
  2518. {
  2519. case LST_INTEGER:
  2520. if(LST_INTEGER == right_type)
  2521. {
  2522. fprintf(fp, "call int32 [LslUserScript]LindenLab.SecondLife.LslUserScript::Divide(int32, int32)n");
  2523. break;
  2524. }
  2525. case LST_FLOATINGPOINT:
  2526. // Numeric division.
  2527. fprintf(fp, "call float64 [LslUserScript]LindenLab.SecondLife.LslUserScript::Divide(float64, float64)n");
  2528. break;
  2529. case LST_VECTOR:
  2530. switch(right_type)
  2531. {
  2532. case LST_INTEGER:
  2533. case LST_FLOATINGPOINT:
  2534. // Scale.
  2535. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Divide'(float32, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2536. break;
  2537. case LST_QUATERNION:
  2538. // Inverse rotation.
  2539. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Divide'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Vector)n");
  2540. break;
  2541. default:
  2542. break;
  2543. }
  2544. break;
  2545. case LST_QUATERNION:
  2546. fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'Divide'(class [ScriptTypes]LindenLab.SecondLife.Quaternion, class [ScriptTypes]LindenLab.SecondLife.Quaternion)n");
  2547. break;
  2548. default:
  2549. // Error.
  2550. break;
  2551. }
  2552. }
  2553. void LLScriptDivAssignment::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)
  2554. {
  2555. if (gErrorToText.getErrors())
  2556. {
  2557. return;
  2558. }
  2559. switch(pass)
  2560. {
  2561. case LSCP_PRETTY_PRINT:
  2562. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2563. fprintf(fp, " /= ");
  2564. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2565. break;
  2566. case LSCP_EMIT_ASSEMBLY:
  2567. {
  2568. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2569. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2570. fprintf(fp, "DIV %s, %sn", LSCRIPTTypeNames[mRightType], LSCRIPTTypeNames[mLeftType]);
  2571. print_assignment(fp, mLValue);
  2572. }
  2573. break;
  2574. case LSCP_TYPE:
  2575. {
  2576. mLValue->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2577. mLeftType = type;
  2578. mRightSide->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
  2579. mRightType = type;