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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lscript_execute.h
  3.  * @brief Classes to execute bytecode
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LSCRIPT_EXECUTE_H
  33. #define LL_LSCRIPT_EXECUTE_H
  34. #include "lscript_byteconvert.h"
  35. #include "linked_lists.h"
  36. #include "lscript_library.h"
  37. class LLTimer;
  38. // Return values for run() methods
  39. const U32 NO_DELETE_FLAG = 0x0000;
  40. const U32 DELETE_FLAG = 0x0001;
  41. const U32 CREDIT_MONEY_FLAG = 0x0002;
  42. // list of op code execute functions
  43. BOOL run_noop(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  44. BOOL run_pop(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  45. BOOL run_pops(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  46. BOOL run_popl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  47. BOOL run_popv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  48. BOOL run_popq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  49. BOOL run_poparg(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  50. BOOL run_popip(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  51. BOOL run_popbp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  52. BOOL run_popsp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  53. BOOL run_popslr(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  54. BOOL run_dup(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  55. BOOL run_dups(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  56. BOOL run_dupl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  57. BOOL run_dupv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  58. BOOL run_dupq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  59. BOOL run_store(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  60. BOOL run_stores(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  61. BOOL run_storel(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  62. BOOL run_storev(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  63. BOOL run_storeq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  64. BOOL run_storeg(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  65. BOOL run_storegs(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  66. BOOL run_storegl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  67. BOOL run_storegv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  68. BOOL run_storegq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  69. BOOL run_loadp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  70. BOOL run_loadsp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  71. BOOL run_loadlp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  72. BOOL run_loadvp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  73. BOOL run_loadqp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  74. BOOL run_loadgp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  75. BOOL run_loadgsp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  76. BOOL run_loadglp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  77. BOOL run_loadgvp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  78. BOOL run_loadgqp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  79. BOOL run_push(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  80. BOOL run_pushs(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  81. BOOL run_pushl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  82. BOOL run_pushv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  83. BOOL run_pushq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  84. BOOL run_pushg(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  85. BOOL run_pushgs(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  86. BOOL run_pushgl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  87. BOOL run_pushgv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  88. BOOL run_pushgq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  89. BOOL run_puship(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  90. BOOL run_pushbp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  91. BOOL run_pushsp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  92. BOOL run_pushargb(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  93. BOOL run_pushargi(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  94. BOOL run_pushargf(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  95. BOOL run_pushargs(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  96. BOOL run_pushargv(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  97. BOOL run_pushargq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  98. BOOL run_pushe(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  99. BOOL run_pushev(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  100. BOOL run_pusheq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  101. BOOL run_pusharge(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  102. BOOL run_add(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  103. BOOL run_sub(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  104. BOOL run_mul(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  105. BOOL run_div(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  106. BOOL run_mod(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  107. BOOL run_eq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  108. BOOL run_neq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  109. BOOL run_leq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  110. BOOL run_geq(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  111. BOOL run_less(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  112. BOOL run_greater(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  113. BOOL run_bitand(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  114. BOOL run_bitor(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  115. BOOL run_bitxor(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  116. BOOL run_booland(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  117. BOOL run_boolor(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  118. BOOL run_shl(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  119. BOOL run_shr(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  120. BOOL run_neg(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  121. BOOL run_bitnot(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  122. BOOL run_boolnot(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  123. BOOL run_jump(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  124. BOOL run_jumpif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  125. BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  126. BOOL run_state(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  127. BOOL run_call(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  128. BOOL run_return(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  129. BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  130. BOOL run_stacktos(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  131. BOOL run_stacktol(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  132. BOOL run_print(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  133. BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  134. BOOL run_calllib_two_byte(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  135. void unknown_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  136. void integer_integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  137. void integer_float_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  138. void integer_vector_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  139. void float_integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  140. void float_float_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  141. void float_vector_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  142. void string_string_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  143. void string_key_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  144. void key_string_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  145. void key_key_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  146. void vector_integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  147. void vector_float_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  148. void vector_vector_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  149. void vector_quaternion_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  150. void quaternion_quaternion_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  151. void integer_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  152. void float_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  153. void string_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  154. void key_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  155. void vector_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  156. void quaternion_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  157. void list_integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  158. void list_float_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  159. void list_string_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  160. void list_key_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  161. void list_vector_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  162. void list_quaternion_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  163. void list_list_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  164. void integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  165. void float_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  166. void vector_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  167. void quaternion_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode);
  168. class LLScriptDataCollection
  169. {
  170. public:
  171. LLScriptDataCollection(LSCRIPTStateEventType type, LLScriptLibData *data)
  172. : mType(type), mData(data)
  173. {
  174. }
  175. LLScriptDataCollection(U8 *src, S32 &offset)
  176. {
  177. S32 i, number;
  178. mType = (LSCRIPTStateEventType)bytestream2integer(src, offset);
  179. number = bytestream2integer(src,  offset);
  180. mData = new LLScriptLibData[number];
  181. for (i = 0; i < number; i++)
  182. {
  183. mData[i].set(src, offset);
  184. }
  185. }
  186. ~LLScriptDataCollection()
  187. {
  188. delete [] mData;
  189. mData = NULL;
  190. }
  191. S32  getSavedSize()
  192. {
  193. S32 size = 0;
  194. // mTyoe
  195. size += 4;
  196. // number of entries
  197. size += 4;
  198. S32 i = 0;
  199. do
  200. {
  201. size += mData[i].getSavedSize();;
  202. }
  203. while (mData[i++].mType != LST_NULL);
  204. return size;
  205. }
  206. S32  write2bytestream(U8 *dest)
  207. {
  208. S32 offset = 0;
  209. // mTyoe
  210. integer2bytestream(dest, offset, mType);
  211. // count number of entries
  212. S32 number = 0;
  213. while (mData[number++].mType != LST_NULL)
  214. ;
  215. integer2bytestream(dest, offset, number);
  216. // now the entries themselves
  217. number = 0;
  218. do
  219. {
  220. offset += mData[number].write2bytestream(dest + offset);
  221. }
  222. while (mData[number++].mType != LST_NULL);
  223. return offset;
  224. }
  225. LSCRIPTStateEventType mType;
  226. LLScriptLibData *mData;
  227. };
  228. const S32 MAX_EVENTS_IN_QUEUE = 64;
  229. class LLScriptEventData
  230. {
  231. public:
  232. LLScriptEventData() {}
  233. LLScriptEventData(U8 *src, S32 &offset)
  234. {
  235. S32 i, number = bytestream2integer(src, offset);
  236. for (i = 0; i < number; i++)
  237. {
  238. mEventDataList.addData(new LLScriptDataCollection(src, offset));
  239. }
  240. }
  241. void set(U8 *src, S32 &offset)
  242. {
  243. S32 i, number = bytestream2integer(src, offset);
  244. for (i = 0; i < number; i++)
  245. {
  246. mEventDataList.addData(new LLScriptDataCollection(src, offset));
  247. }
  248. }
  249. ~LLScriptEventData()
  250. {
  251. mEventDataList.deleteAllData();
  252. }
  253. void addEventData(LLScriptDataCollection *data)
  254. {
  255. if (mEventDataList.getLength() < MAX_EVENTS_IN_QUEUE)
  256. mEventDataList.addDataAtEnd(data);
  257. else
  258. delete data;
  259. }
  260. LLScriptDataCollection *getNextEvent(LSCRIPTStateEventType type)
  261. {
  262. LLScriptDataCollection *temp;
  263. for (temp = mEventDataList.getFirstData();
  264.  temp;
  265.  temp = mEventDataList.getNextData())
  266. {
  267. if (temp->mType == type)
  268. {
  269. mEventDataList.removeCurrentData();
  270. return temp;
  271. }
  272. }
  273. return NULL;
  274. }
  275. LLScriptDataCollection *getNextEvent()
  276. {
  277. LLScriptDataCollection *temp;
  278. temp = mEventDataList.getFirstData();
  279. if (temp)
  280. {
  281. mEventDataList.removeCurrentData();
  282. return temp;
  283. }
  284. return NULL;
  285. }
  286. void removeEventType(LSCRIPTStateEventType type)
  287. {
  288. LLScriptDataCollection *temp;
  289. for (temp = mEventDataList.getFirstData();
  290.  temp;
  291.  temp = mEventDataList.getNextData())
  292. {
  293. if (temp->mType == type)
  294. {
  295. mEventDataList.deleteCurrentData();
  296. }
  297. }
  298. }
  299. S32  getSavedSize()
  300. {
  301. S32 size = 0;
  302. // number in linked list
  303. size += 4;
  304. LLScriptDataCollection *temp;
  305. for (temp = mEventDataList.getFirstData();
  306.  temp;
  307.  temp = mEventDataList.getNextData())
  308. {
  309. size += temp->getSavedSize();
  310. }
  311. return size;
  312. }
  313. S32  write2bytestream(U8 *dest)
  314. {
  315. S32 offset = 0;
  316. // number in linked list
  317. S32 number = mEventDataList.getLength();
  318. integer2bytestream(dest, offset, number);
  319. LLScriptDataCollection *temp;
  320. for (temp = mEventDataList.getFirstData();
  321.  temp;
  322.  temp = mEventDataList.getNextData())
  323. {
  324. offset += temp->write2bytestream(dest + offset);
  325. }
  326. return offset;
  327. }
  328. LLLinkedList<LLScriptDataCollection> mEventDataList;
  329. };
  330. class LLScriptExecute
  331. {
  332. public:
  333. LLScriptExecute();
  334. virtual ~LLScriptExecute()  = 0;
  335. virtual S32 getVersion() const = 0;
  336. virtual void deleteAllEvents() = 0;
  337. virtual void addEvent(LLScriptDataCollection* event) = 0;
  338. virtual U32 getEventCount() = 0;
  339. virtual void removeEventType(LSCRIPTStateEventType event_type) = 0;
  340. virtual S32 getFaults() = 0;
  341. virtual void setFault(LSCRIPTRunTimeFaults fault) = 0;
  342. virtual U32 getFreeMemory() = 0;
  343. virtual S32 getParameter() = 0;
  344. virtual void setParameter(S32 value) = 0;
  345. virtual F32 getSleep() const = 0;
  346. virtual void setSleep(F32 value) = 0;
  347. virtual F32 getEnergy() const = 0;
  348. virtual void setEnergy(F32 value) = 0;
  349. virtual U64 getCurrentEvents() = 0;
  350. virtual void setCurrentEvents(U64 value) = 0;
  351. virtual U64 getEventHandlers() = 0;
  352. virtual void setEventHandlers(U64 value) = 0;
  353. virtual U64 getCurrentHandler() = 0;
  354. virtual void setCurrentHandler(U64 value) = 0;
  355. virtual BOOL isFinished() const = 0;
  356. virtual BOOL isStateChangePending() const = 0;
  357. virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size) = 0; // Allocate memory for header, state and footer return size of state.
  358. virtual U32 getEventsSavedSize() = 0; // Returns 0 if events are written with state.
  359. virtual S32 writeEvents(U8 *dest) = 0; // Must write and return exactly the number of bytes returned by getEventsSavedSize.
  360. virtual void readEvents(U8* src, S32& offset) = 0;
  361. virtual S32 readState(U8 *src) = 0; // Returns number of bytes read.
  362. virtual void reset();
  363. virtual const U8* getBytecode() const = 0;
  364. virtual U32 getBytecodeSize() const = 0;
  365. virtual bool isMono() const = 0;
  366. virtual void error() {;} // Processing that must be performed when error flag is set and so run is not called.
  367. virtual U32 getUsedMemory() = 0;
  368. // Run current event handler for a maximum of time_slice seconds.
  369. // Updates current handler and current events registers.
  370. virtual void resumeEventHandler(BOOL b_print, const LLUUID &id, F32 time_slice) = 0;
  371. // Run handler for event for a maximum of time_slice seconds.
  372. // Updates current handler and current events registers.
  373. virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;;
  374. // Run handler for next queued event for maximum of time_slice seconds. 
  375. // Updates current handler and current events registers.
  376. // Removes processed event from queue.
  377. virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice) = 0;
  378. // Run handler for event for a maximum of time_slice seconds.
  379. // Updates current handler and current events registers.
  380. // Removes processed event from queue.
  381. virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;
  382. // Switch to next state.
  383. // Returns new set of handled events.
  384. virtual U64 nextState() = 0; 
  385. // Returns time taken.
  386. virtual F32 runQuanta(BOOL b_print, const LLUUID &id,
  387.   const char **errorstr, 
  388.   F32 quanta,
  389.   U32& events_processed, LLTimer& timer);
  390. // NOTE: babbage: this must be used on occasions where another script may already be executing. Only 2 levels of nesting are allowed.
  391. // Provided to support bizarre detach behaviour only. Do not use.
  392. virtual F32 runNested(BOOL b_print, const LLUUID &id,
  393.   const char **errorstr, 
  394.   F32 quanta,
  395.   U32& events_processed, LLTimer& timer);
  396. // Run smallest possible amount of code: an instruction for LSL2, a segment
  397. // between save tests for Mono
  398. void runInstructions(BOOL b_print, const LLUUID &id,
  399.  const char **errorstr, 
  400.  U32& events_processed,
  401.  F32 quanta);
  402. bool isYieldDue() const;
  403. void setReset(BOOL b) {mReset = b;}
  404. BOOL getReset() const { return mReset; }
  405. // Called when the script is scheduled to be run from newsim/LLScriptData
  406. virtual void startRunning() = 0;
  407. // Called when the script is scheduled to be stopped from newsim/LLScriptData
  408. virtual void stopRunning() = 0;
  409. // A timer is regularly checked to see if script takes too long, but we
  410. // don't do it every opcode due to performance hits.
  411. static void setTimerCheckSkip( S32 value ) { sTimerCheckSkip = value; }
  412. static S32 getTimerCheckSkip() { return sTimerCheckSkip; }
  413. private:
  414. BOOL mReset;
  415. static S32 sTimerCheckSkip; // Number of times to skip the timer check for performance reasons
  416. };
  417. class LLScriptExecuteLSL2 : public LLScriptExecute
  418. {
  419. public:
  420. LLScriptExecuteLSL2(LLFILE *fp);
  421. LLScriptExecuteLSL2(const U8* bytecode, U32 bytecode_size);
  422. virtual ~LLScriptExecuteLSL2();
  423. virtual S32 getVersion() const {return get_register(mBuffer, LREG_VN);}
  424. virtual void deleteAllEvents() {mEventData.mEventDataList.deleteAllData();}
  425. virtual void addEvent(LLScriptDataCollection* event);
  426. virtual U32 getEventCount() {return mEventData.mEventDataList.getLength();}
  427. virtual void removeEventType(LSCRIPTStateEventType event_type);
  428. virtual S32 getFaults() {return get_register(mBuffer, LREG_FR);}
  429. virtual void setFault(LSCRIPTRunTimeFaults fault) {set_fault(mBuffer, fault);}
  430. virtual U32 getFreeMemory();
  431. virtual S32 getParameter();
  432. virtual void setParameter(S32 value);
  433. virtual F32 getSleep() const;
  434. virtual void setSleep(F32 value);
  435. virtual F32 getEnergy() const;
  436. virtual void setEnergy(F32 value);
  437. virtual U64 getCurrentEvents() {return get_event_register(mBuffer, LREG_CE, getMajorVersion());}
  438. virtual void setCurrentEvents(U64 value) {return set_event_register(mBuffer, LREG_CE, value, getMajorVersion());}
  439. virtual U64 getEventHandlers() {return get_event_register(mBuffer, LREG_ER, getMajorVersion());}
  440. virtual void setEventHandlers(U64 value) {set_event_register(mBuffer, LREG_ER, value, getMajorVersion());}
  441. virtual U64 getCurrentHandler();
  442. virtual void setCurrentHandler(U64 value) {return set_event_register(mBuffer, LREG_IE, value, getMajorVersion());}
  443. virtual BOOL isFinished() const {return get_register(mBuffer, LREG_IP) == 0;}
  444. virtual BOOL isStateChangePending() const {return get_register(mBuffer, LREG_CS) != get_register(mBuffer, LREG_NS);}
  445. virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size); // Not including Events.
  446. virtual U32 getEventsSavedSize() {return mEventData.getSavedSize();}
  447. virtual S32 writeEvents(U8 *dest) {return mEventData.write2bytestream(dest);}
  448. virtual void readEvents(U8* src, S32& offset) {mEventData.set(src, offset);}
  449. virtual S32 writeBytecode(U8 **dest);
  450. virtual S32 readState(U8 *src);
  451. virtual void reset();
  452. virtual const U8* getBytecode() const {return mBytecode;}
  453. virtual U32 getBytecodeSize() const {return mBytecodeSize;}
  454. virtual bool isMono() const {return false;}
  455. virtual U32 getUsedMemory();
  456. // Run current event handler for a maximum of time_slice seconds.
  457. // Updates current handler and current events registers.
  458. virtual void resumeEventHandler(BOOL b_print, const LLUUID &id, F32 time_slice);
  459. // Run handler for event for a maximum of time_slice seconds.
  460. // Updates current handler and current events registers.
  461. virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
  462. // Run handler for next queued event for maximum of time_slice seconds. 
  463. // Updates current handler and current events registers.
  464. // Removes processed event from queue.
  465. virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice);
  466. // Run handler for event for a maximum of time_slice seconds.
  467. // Updates current handler and current events registers.
  468. // Removes processed event from queue.
  469. virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
  470. // Switch to next state.
  471. // Returns new set of handled events.
  472. virtual U64 nextState(); 
  473. void init();
  474. BOOL (*mExecuteFuncs[0x100])(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id);
  475. U32 mInstructionCount;
  476. U8 *mBuffer;
  477. LLScriptEventData mEventData;
  478. U8* mBytecode; // Initial state and bytecode.
  479. U32 mBytecodeSize;
  480. private:
  481. S32 getMajorVersion() const;
  482. void recordBoundaryError( const LLUUID &id );
  483. void setStateEventOpcoodeStartSafely( S32 state, LSCRIPTStateEventType event, const LLUUID &id );
  484. // Called when the script is scheduled to be run from newsim/LLScriptData
  485. virtual void startRunning();
  486. // Called when the script is scheduled to be stopped from newsim/LLScriptData
  487. virtual void stopRunning();
  488. };
  489. #endif