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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lscript_scope.h
  3.  * @brief builds nametable and checks scope
  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_SCOPE_H
  33. #define LL_LSCRIPT_SCOPE_H
  34. #include "string_table.h"
  35. #include "llmap.h"
  36. #include "lscript_byteformat.h"
  37. typedef enum e_lscript_identifier_type
  38. {
  39. LIT_INVALID,
  40. LIT_GLOBAL,
  41. LIT_VARIABLE,
  42. LIT_FUNCTION,
  43. LIT_LABEL,
  44. LIT_STATE,
  45. LIT_HANDLER,
  46. LIT_LIBRARY_FUNCTION,
  47. LIT_EOF
  48. } LSCRIPTIdentifierType;
  49. const char LSCRIPTFunctionTypeStrings[LST_EOF] =   /*Flawfinder: ignore*/
  50. {
  51. '0',
  52. 'i',
  53. 'f',
  54. 's',
  55. 'k',
  56. 'v',
  57. 'q',
  58. 'l',
  59. '0'
  60. };
  61. const char * const LSCRIPTListDescription[LST_EOF] = /*Flawfinder: ignore*/
  62. {
  63.    "PUSHARGB 0",
  64.    "PUSHARGB 1",
  65.    "PUSHARGB 2",
  66.    "PUSHARGB 3",
  67.    "PUSHARGB 4",
  68.    "PUSHARGB 5",
  69.    "PUSHARGB 6",
  70.    "PUSHARGB 7",
  71.    "PUSHARGB 0"
  72. };
  73. const char * const LSCRIPTTypePush[LST_EOF] =  /*Flawfinder: ignore*/
  74. {
  75. "INVALID",
  76. "PUSHE",
  77. "PUSHE",
  78. "PUSHE",
  79. "PUSHE",
  80. "PUSHEV",
  81. "PUSHEQ",
  82. "PUSHE",
  83. "undefined"
  84. };
  85. const char * const LSCRIPTTypeReturn[LST_EOF] =  /*Flawfinder: ignore*/
  86. {
  87. "INVALID",
  88. "LOADP -12",
  89. "LOADP -12",
  90. "STORES -12nPOP",
  91. "STORES -12nPOP",
  92. "LOADVP -20",
  93. "LOADQP -24",
  94. "LOADLP -12",
  95. "undefined"
  96. };
  97. const char * const LSCRIPTTypePop[LST_EOF] =  /*Flawfinder: ignore*/
  98. {
  99. "INVALID",
  100. "POP",
  101. "POP",
  102. "POPS",
  103. "POPS",
  104. "POPV",
  105. "POPQ",
  106. "POPL",
  107. "undefined"
  108. };
  109. const char * const LSCRIPTTypeDuplicate[LST_EOF] =    /*Flawfinder: ignore*/
  110. {
  111. "INVALID",
  112. "DUP",
  113. "DUP",
  114. "DUPS",
  115. "DUPS",
  116. "DUPV",
  117. "DUPQ",
  118. "DUPL",
  119. "undefined"
  120. };
  121. const char * const LSCRIPTTypeLocalStore[LST_EOF] =  /*Flawfinder: ignore*/
  122. {
  123. "INVALID",
  124. "STORE ",
  125. "STORE ",
  126. "STORES ",
  127. "STORES ",
  128. "STOREV ",
  129. "STOREQ ",
  130. "STOREL ",
  131. "undefined"
  132. };
  133. const char * const LSCRIPTTypeLocalDeclaration[LST_EOF] =    /*Flawfinder: ignore*/
  134. {
  135. "INVALID",
  136. "STOREP ",
  137. "STOREP ",
  138. "STORESP ",
  139. "STORESP ",
  140. "STOREVP ",
  141. "STOREQP ",
  142. "STORELP ",
  143. "undefined"
  144. };
  145. const char * const LSCRIPTTypeGlobalStore[LST_EOF] =  /*Flawfinder: ignore*/
  146. {
  147. "INVALID",
  148. "STOREG ",
  149. "STOREG ",
  150. "STORESG ",
  151. "STORESG ",
  152. "STOREGV ",
  153. "STOREGQ ",
  154. "STORELG ",
  155. "undefined"
  156. };
  157. const char * const LSCRIPTTypeLocalPush[LST_EOF] =    /*Flawfinder: ignore*/
  158. {
  159. "INVALID",
  160. "PUSH ",
  161. "PUSH ",
  162. "PUSHS ",
  163. "PUSHS ",
  164. "PUSHV ",
  165. "PUSHQ ",
  166. "PUSHL ",
  167. "undefined"
  168. };
  169. const char * const LSCRIPTTypeLocalPush1[LST_EOF] =    /*Flawfinder: ignore*/
  170. {
  171. "INVALID",
  172. "PUSHARGI 1",
  173. "PUSHARGF 1",
  174. "undefined",
  175. "undefined",
  176. "undefined",
  177. "undefined",
  178. "undefined",
  179. "undefined"
  180. };
  181. const char * const LSCRIPTTypeGlobalPush[LST_EOF] =  /*Flawfinder: ignore*/
  182. {
  183. "INVALID",
  184. "PUSHG ",
  185. "PUSHG ",
  186. "PUSHGS ",
  187. "PUSHGS ",
  188. "PUSHGV ",
  189. "PUSHGQ ",
  190. "PUSHGL ",
  191. "undefined"
  192. };
  193. class LLScriptSimpleAssignable;
  194. class LLScriptArgString
  195. {
  196. public:
  197. LLScriptArgString() : mString(NULL) {}
  198. ~LLScriptArgString() { delete [] mString; }
  199. LSCRIPTType getType(S32 count)
  200. {
  201. if (!mString)
  202. return LST_NULL;
  203. S32 length = (S32)strlen(mString);   /*Flawfinder: ignore*/
  204. if (count >= length)
  205. {
  206. return LST_NULL;
  207. }
  208. switch(mString[count])
  209. {
  210. case 'i':
  211. return LST_INTEGER;
  212. case 'f':
  213. return LST_FLOATINGPOINT;
  214. case 's':
  215. return LST_STRING;
  216. case 'k':
  217. return LST_KEY;
  218. case 'v':
  219. return LST_VECTOR;
  220. case 'q':
  221. return LST_QUATERNION;
  222. case 'l':
  223. return LST_LIST;
  224. default:
  225. return LST_NULL;
  226. }
  227. }
  228. void addType(LSCRIPTType type)
  229. {
  230. S32 count = 0;
  231. if (mString)
  232. {
  233. count = (S32)strlen(mString);   /*Flawfinder: ignore*/
  234. char *temp = new char[count + 2];
  235. memcpy(temp, mString, count);   /*Flawfinder: ignore*/
  236. delete [] mString;
  237. mString = temp;
  238. mString[count + 1] = 0;
  239. }
  240. else
  241. {
  242. mString = new char[count + 2];
  243. mString[count + 1] = 0;
  244. }
  245. mString[count++] = LSCRIPTFunctionTypeStrings[type];
  246. }
  247. S32 getNumber()
  248. {
  249. if (mString)
  250. return (S32)strlen(mString);   /*Flawfinder: ignore*/
  251. else
  252. return 0;
  253. }
  254. char *mString;
  255. };
  256. class LLScriptScopeEntry
  257. {
  258. public:
  259. LLScriptScopeEntry(const char *identifier, LSCRIPTIdentifierType idtype, LSCRIPTType type, S32 count = 0)
  260. : mIdentifier(identifier), mIDType(idtype), mType(type), mOffset(0), mSize(0), mAssignable(NULL), mCount(count), mLibraryNumber(0)
  261. {
  262. }
  263. ~LLScriptScopeEntry() {}
  264. const char *mIdentifier;
  265. LSCRIPTIdentifierType mIDType;
  266. LSCRIPTType mType;
  267. S32 mOffset;
  268. S32 mSize;
  269. LLScriptSimpleAssignable *mAssignable;
  270. S32 mCount; // NOTE: Index for locals in CIL.
  271. U16 mLibraryNumber;
  272. LLScriptArgString mFunctionArgs;
  273. LLScriptArgString mLocals;
  274. };
  275. class LLScriptScope
  276. {
  277. public:
  278. LLScriptScope(LLStringTable *stable)
  279. : mParentScope(NULL), mSTable(stable), mFunctionCount(0), mStateCount(0)
  280. }
  281. ~LLScriptScope()
  282. {
  283. mEntryMap.deleteAllData();
  284. }
  285. LLScriptScopeEntry *addEntry(const char *identifier, LSCRIPTIdentifierType idtype, LSCRIPTType type)
  286. {
  287. const char *name = mSTable->addString(identifier);
  288. if (!mEntryMap.checkData(name))
  289. {
  290. if (idtype == LIT_FUNCTION)
  291. mEntryMap[name] = new LLScriptScopeEntry(name, idtype, type, mFunctionCount++);
  292. else if (idtype == LIT_STATE)
  293. mEntryMap[name] = new LLScriptScopeEntry(name, idtype, type, mStateCount++);
  294. else
  295. mEntryMap[name] = new LLScriptScopeEntry(name, idtype, type);
  296. return mEntryMap[name];
  297. }
  298. else
  299. {
  300. // identifier already exists at this scope
  301. return NULL;
  302. }
  303. }
  304. BOOL checkEntry(const char *identifier)
  305. {
  306. const char *name = mSTable->addString(identifier);
  307. if (mEntryMap.checkData(name))
  308. {
  309. return TRUE;
  310. }
  311. else
  312. {
  313. // identifier already exists at this scope
  314. return FALSE;
  315. }
  316. }
  317. LLScriptScopeEntry *findEntry(const char *identifier)
  318. {
  319. const char *name = mSTable->addString(identifier);
  320. LLScriptScope *scope = this;
  321. while (scope)
  322. {
  323. if (scope->mEntryMap.checkData(name))
  324. {
  325. // cool, we found it at this scope
  326. return scope->mEntryMap[name];
  327. }
  328. scope = scope->mParentScope;
  329. }
  330. return NULL;
  331. }
  332. LLScriptScopeEntry *findEntryTyped(const char *identifier, LSCRIPTIdentifierType idtype)
  333. {
  334. const char *name = mSTable->addString(identifier);
  335. LLScriptScope *scope = this;
  336. while (scope)
  337. {
  338. if (scope->mEntryMap.checkData(name))
  339. {
  340. // need to check type, and if type is function we need to check both types
  341. if (idtype == LIT_FUNCTION)
  342. {
  343. if (scope->mEntryMap[name]->mIDType == LIT_FUNCTION)
  344. {
  345. return scope->mEntryMap[name];
  346. }
  347. else if (scope->mEntryMap[name]->mIDType == LIT_LIBRARY_FUNCTION)
  348. {
  349. return scope->mEntryMap[name];
  350. }
  351. }
  352. else if (scope->mEntryMap[name]->mIDType == idtype)
  353. {
  354. // cool, we found it at this scope
  355. return scope->mEntryMap[name];
  356. }
  357. }
  358. scope = scope->mParentScope;
  359. }
  360. return NULL;
  361. }
  362. void addParentScope(LLScriptScope *scope)
  363. {
  364. mParentScope = scope;
  365. }
  366. LLMap<const char *, LLScriptScopeEntry *> mEntryMap;
  367. LLScriptScope *mParentScope;
  368. LLStringTable *mSTable;
  369. S32 mFunctionCount;
  370. S32 mStateCount;
  371. };
  372. extern LLStringTable *gScopeStringTable;
  373. #endif