expression.cpp 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186
  1. /*************************************************************************/
  2. /* expression.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "expression.h"
  31. #include "core/class_db.h"
  32. #include "core/func_ref.h"
  33. #include "core/io/marshalls.h"
  34. #include "core/math/math_funcs.h"
  35. #include "core/os/os.h"
  36. #include "core/reference.h"
  37. #include "core/variant_parser.h"
  38. const char *Expression::func_name[Expression::FUNC_MAX] = {
  39. "sin",
  40. "cos",
  41. "tan",
  42. "sinh",
  43. "cosh",
  44. "tanh",
  45. "asin",
  46. "acos",
  47. "atan",
  48. "atan2",
  49. "sqrt",
  50. "fmod",
  51. "fposmod",
  52. "floor",
  53. "ceil",
  54. "round",
  55. "abs",
  56. "sign",
  57. "pow",
  58. "log",
  59. "exp",
  60. "is_nan",
  61. "is_inf",
  62. "ease",
  63. "decimals",
  64. "stepify",
  65. "lerp",
  66. "inverse_lerp",
  67. "range_lerp",
  68. "smoothstep",
  69. "dectime",
  70. "randomize",
  71. "randi",
  72. "randf",
  73. "rand_range",
  74. "seed",
  75. "rand_seed",
  76. "deg2rad",
  77. "rad2deg",
  78. "linear2db",
  79. "db2linear",
  80. "polar2cartesian",
  81. "cartesian2polar",
  82. "wrapi",
  83. "wrapf",
  84. "max",
  85. "min",
  86. "clamp",
  87. "nearest_po2",
  88. "weakref",
  89. "funcref",
  90. "convert",
  91. "typeof",
  92. "type_exists",
  93. "char",
  94. "str",
  95. "print",
  96. "printerr",
  97. "printraw",
  98. "var2str",
  99. "str2var",
  100. "var2bytes",
  101. "bytes2var",
  102. "color_named",
  103. };
  104. Expression::BuiltinFunc Expression::find_function(const String &p_string) {
  105. for (int i = 0; i < FUNC_MAX; i++) {
  106. if (p_string == func_name[i])
  107. return BuiltinFunc(i);
  108. }
  109. return FUNC_MAX;
  110. }
  111. String Expression::get_func_name(BuiltinFunc p_func) {
  112. ERR_FAIL_INDEX_V(p_func, FUNC_MAX, String());
  113. return func_name[p_func];
  114. }
  115. int Expression::get_func_argument_count(BuiltinFunc p_func) {
  116. switch (p_func) {
  117. case MATH_RANDOMIZE:
  118. case MATH_RAND:
  119. case MATH_RANDF:
  120. return 0;
  121. case MATH_SIN:
  122. case MATH_COS:
  123. case MATH_TAN:
  124. case MATH_SINH:
  125. case MATH_COSH:
  126. case MATH_TANH:
  127. case MATH_ASIN:
  128. case MATH_ACOS:
  129. case MATH_ATAN:
  130. case MATH_SQRT:
  131. case MATH_FLOOR:
  132. case MATH_CEIL:
  133. case MATH_ROUND:
  134. case MATH_ABS:
  135. case MATH_SIGN:
  136. case MATH_LOG:
  137. case MATH_EXP:
  138. case MATH_ISNAN:
  139. case MATH_ISINF:
  140. case MATH_DECIMALS:
  141. case MATH_SEED:
  142. case MATH_RANDSEED:
  143. case MATH_DEG2RAD:
  144. case MATH_RAD2DEG:
  145. case MATH_LINEAR2DB:
  146. case MATH_DB2LINEAR:
  147. case LOGIC_NEAREST_PO2:
  148. case OBJ_WEAKREF:
  149. case TYPE_OF:
  150. case TEXT_CHAR:
  151. case TEXT_STR:
  152. case TEXT_PRINT:
  153. case TEXT_PRINTERR:
  154. case TEXT_PRINTRAW:
  155. case VAR_TO_STR:
  156. case STR_TO_VAR:
  157. case TYPE_EXISTS:
  158. return 1;
  159. case VAR_TO_BYTES:
  160. case BYTES_TO_VAR:
  161. case MATH_ATAN2:
  162. case MATH_FMOD:
  163. case MATH_FPOSMOD:
  164. case MATH_POW:
  165. case MATH_EASE:
  166. case MATH_STEPIFY:
  167. case MATH_RANDOM:
  168. case MATH_POLAR2CARTESIAN:
  169. case MATH_CARTESIAN2POLAR:
  170. case LOGIC_MAX:
  171. case LOGIC_MIN:
  172. case FUNC_FUNCREF:
  173. case TYPE_CONVERT:
  174. case COLORN:
  175. return 2;
  176. case MATH_LERP:
  177. case MATH_INVERSE_LERP:
  178. case MATH_SMOOTHSTEP:
  179. case MATH_DECTIME:
  180. case MATH_WRAP:
  181. case MATH_WRAPF:
  182. case LOGIC_CLAMP:
  183. return 3;
  184. case MATH_RANGE_LERP:
  185. return 5;
  186. case FUNC_MAX: {
  187. }
  188. }
  189. return 0;
  190. }
  191. #define VALIDATE_ARG_NUM(m_arg) \
  192. if (!p_inputs[m_arg]->is_num()) { \
  193. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; \
  194. r_error.argument = m_arg; \
  195. r_error.expected = Variant::REAL; \
  196. return; \
  197. }
  198. void Expression::exec_func(BuiltinFunc p_func, const Variant **p_inputs, Variant *r_return, Variant::CallError &r_error, String &r_error_str) {
  199. r_error.error = Variant::CallError::CALL_OK;
  200. switch (p_func) {
  201. case MATH_SIN: {
  202. VALIDATE_ARG_NUM(0);
  203. *r_return = Math::sin((double)*p_inputs[0]);
  204. } break;
  205. case MATH_COS: {
  206. VALIDATE_ARG_NUM(0);
  207. *r_return = Math::cos((double)*p_inputs[0]);
  208. } break;
  209. case MATH_TAN: {
  210. VALIDATE_ARG_NUM(0);
  211. *r_return = Math::tan((double)*p_inputs[0]);
  212. } break;
  213. case MATH_SINH: {
  214. VALIDATE_ARG_NUM(0);
  215. *r_return = Math::sinh((double)*p_inputs[0]);
  216. } break;
  217. case MATH_COSH: {
  218. VALIDATE_ARG_NUM(0);
  219. *r_return = Math::cosh((double)*p_inputs[0]);
  220. } break;
  221. case MATH_TANH: {
  222. VALIDATE_ARG_NUM(0);
  223. *r_return = Math::tanh((double)*p_inputs[0]);
  224. } break;
  225. case MATH_ASIN: {
  226. VALIDATE_ARG_NUM(0);
  227. *r_return = Math::asin((double)*p_inputs[0]);
  228. } break;
  229. case MATH_ACOS: {
  230. VALIDATE_ARG_NUM(0);
  231. *r_return = Math::acos((double)*p_inputs[0]);
  232. } break;
  233. case MATH_ATAN: {
  234. VALIDATE_ARG_NUM(0);
  235. *r_return = Math::atan((double)*p_inputs[0]);
  236. } break;
  237. case MATH_ATAN2: {
  238. VALIDATE_ARG_NUM(0);
  239. VALIDATE_ARG_NUM(1);
  240. *r_return = Math::atan2((double)*p_inputs[0], (double)*p_inputs[1]);
  241. } break;
  242. case MATH_SQRT: {
  243. VALIDATE_ARG_NUM(0);
  244. *r_return = Math::sqrt((double)*p_inputs[0]);
  245. } break;
  246. case MATH_FMOD: {
  247. VALIDATE_ARG_NUM(0);
  248. VALIDATE_ARG_NUM(1);
  249. *r_return = Math::fmod((double)*p_inputs[0], (double)*p_inputs[1]);
  250. } break;
  251. case MATH_FPOSMOD: {
  252. VALIDATE_ARG_NUM(0);
  253. VALIDATE_ARG_NUM(1);
  254. *r_return = Math::fposmod((double)*p_inputs[0], (double)*p_inputs[1]);
  255. } break;
  256. case MATH_FLOOR: {
  257. VALIDATE_ARG_NUM(0);
  258. *r_return = Math::floor((double)*p_inputs[0]);
  259. } break;
  260. case MATH_CEIL: {
  261. VALIDATE_ARG_NUM(0);
  262. *r_return = Math::ceil((double)*p_inputs[0]);
  263. } break;
  264. case MATH_ROUND: {
  265. VALIDATE_ARG_NUM(0);
  266. *r_return = Math::round((double)*p_inputs[0]);
  267. } break;
  268. case MATH_ABS: {
  269. if (p_inputs[0]->get_type() == Variant::INT) {
  270. int64_t i = *p_inputs[0];
  271. *r_return = ABS(i);
  272. } else if (p_inputs[0]->get_type() == Variant::REAL) {
  273. real_t r = *p_inputs[0];
  274. *r_return = Math::abs(r);
  275. } else {
  276. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  277. r_error.argument = 0;
  278. r_error.expected = Variant::REAL;
  279. }
  280. } break;
  281. case MATH_SIGN: {
  282. if (p_inputs[0]->get_type() == Variant::INT) {
  283. int64_t i = *p_inputs[0];
  284. *r_return = i < 0 ? -1 : (i > 0 ? +1 : 0);
  285. } else if (p_inputs[0]->get_type() == Variant::REAL) {
  286. real_t r = *p_inputs[0];
  287. *r_return = r < 0.0 ? -1.0 : (r > 0.0 ? +1.0 : 0.0);
  288. } else {
  289. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  290. r_error.argument = 0;
  291. r_error.expected = Variant::REAL;
  292. }
  293. } break;
  294. case MATH_POW: {
  295. VALIDATE_ARG_NUM(0);
  296. VALIDATE_ARG_NUM(1);
  297. *r_return = Math::pow((double)*p_inputs[0], (double)*p_inputs[1]);
  298. } break;
  299. case MATH_LOG: {
  300. VALIDATE_ARG_NUM(0);
  301. *r_return = Math::log((double)*p_inputs[0]);
  302. } break;
  303. case MATH_EXP: {
  304. VALIDATE_ARG_NUM(0);
  305. *r_return = Math::exp((double)*p_inputs[0]);
  306. } break;
  307. case MATH_ISNAN: {
  308. VALIDATE_ARG_NUM(0);
  309. *r_return = Math::is_nan((double)*p_inputs[0]);
  310. } break;
  311. case MATH_ISINF: {
  312. VALIDATE_ARG_NUM(0);
  313. *r_return = Math::is_inf((double)*p_inputs[0]);
  314. } break;
  315. case MATH_EASE: {
  316. VALIDATE_ARG_NUM(0);
  317. VALIDATE_ARG_NUM(1);
  318. *r_return = Math::ease((double)*p_inputs[0], (double)*p_inputs[1]);
  319. } break;
  320. case MATH_DECIMALS: {
  321. VALIDATE_ARG_NUM(0);
  322. *r_return = Math::step_decimals((double)*p_inputs[0]);
  323. } break;
  324. case MATH_STEPIFY: {
  325. VALIDATE_ARG_NUM(0);
  326. VALIDATE_ARG_NUM(1);
  327. *r_return = Math::stepify((double)*p_inputs[0], (double)*p_inputs[1]);
  328. } break;
  329. case MATH_LERP: {
  330. VALIDATE_ARG_NUM(0);
  331. VALIDATE_ARG_NUM(1);
  332. VALIDATE_ARG_NUM(2);
  333. *r_return = Math::lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
  334. } break;
  335. case MATH_INVERSE_LERP: {
  336. VALIDATE_ARG_NUM(0);
  337. VALIDATE_ARG_NUM(1);
  338. VALIDATE_ARG_NUM(2);
  339. *r_return = Math::inverse_lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
  340. } break;
  341. case MATH_RANGE_LERP: {
  342. VALIDATE_ARG_NUM(0);
  343. VALIDATE_ARG_NUM(1);
  344. VALIDATE_ARG_NUM(2);
  345. VALIDATE_ARG_NUM(3);
  346. VALIDATE_ARG_NUM(4);
  347. *r_return = Math::range_lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2], (double)*p_inputs[3], (double)*p_inputs[4]);
  348. } break;
  349. case MATH_SMOOTHSTEP: {
  350. VALIDATE_ARG_NUM(0);
  351. VALIDATE_ARG_NUM(1);
  352. VALIDATE_ARG_NUM(2);
  353. *r_return = Math::smoothstep((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
  354. } break;
  355. case MATH_DECTIME: {
  356. VALIDATE_ARG_NUM(0);
  357. VALIDATE_ARG_NUM(1);
  358. VALIDATE_ARG_NUM(2);
  359. *r_return = Math::dectime((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
  360. } break;
  361. case MATH_RANDOMIZE: {
  362. Math::randomize();
  363. } break;
  364. case MATH_RAND: {
  365. *r_return = Math::rand();
  366. } break;
  367. case MATH_RANDF: {
  368. *r_return = Math::randf();
  369. } break;
  370. case MATH_RANDOM: {
  371. VALIDATE_ARG_NUM(0);
  372. VALIDATE_ARG_NUM(1);
  373. *r_return = Math::random((double)*p_inputs[0], (double)*p_inputs[1]);
  374. } break;
  375. case MATH_SEED: {
  376. VALIDATE_ARG_NUM(0);
  377. uint64_t seed = *p_inputs[0];
  378. Math::seed(seed);
  379. } break;
  380. case MATH_RANDSEED: {
  381. VALIDATE_ARG_NUM(0);
  382. uint64_t seed = *p_inputs[0];
  383. int ret = Math::rand_from_seed(&seed);
  384. Array reta;
  385. reta.push_back(ret);
  386. reta.push_back(seed);
  387. *r_return = reta;
  388. } break;
  389. case MATH_DEG2RAD: {
  390. VALIDATE_ARG_NUM(0);
  391. *r_return = Math::deg2rad((double)*p_inputs[0]);
  392. } break;
  393. case MATH_RAD2DEG: {
  394. VALIDATE_ARG_NUM(0);
  395. *r_return = Math::rad2deg((double)*p_inputs[0]);
  396. } break;
  397. case MATH_LINEAR2DB: {
  398. VALIDATE_ARG_NUM(0);
  399. *r_return = Math::linear2db((double)*p_inputs[0]);
  400. } break;
  401. case MATH_DB2LINEAR: {
  402. VALIDATE_ARG_NUM(0);
  403. *r_return = Math::db2linear((double)*p_inputs[0]);
  404. } break;
  405. case MATH_POLAR2CARTESIAN: {
  406. VALIDATE_ARG_NUM(0);
  407. VALIDATE_ARG_NUM(1);
  408. double r = *p_inputs[0];
  409. double th = *p_inputs[1];
  410. *r_return = Vector2(r * Math::cos(th), r * Math::sin(th));
  411. } break;
  412. case MATH_CARTESIAN2POLAR: {
  413. VALIDATE_ARG_NUM(0);
  414. VALIDATE_ARG_NUM(1);
  415. double x = *p_inputs[0];
  416. double y = *p_inputs[1];
  417. *r_return = Vector2(Math::sqrt(x * x + y * y), Math::atan2(y, x));
  418. } break;
  419. case MATH_WRAP: {
  420. VALIDATE_ARG_NUM(0);
  421. VALIDATE_ARG_NUM(1);
  422. VALIDATE_ARG_NUM(2);
  423. *r_return = Math::wrapi((int64_t)*p_inputs[0], (int64_t)*p_inputs[1], (int64_t)*p_inputs[2]);
  424. } break;
  425. case MATH_WRAPF: {
  426. VALIDATE_ARG_NUM(0);
  427. VALIDATE_ARG_NUM(1);
  428. VALIDATE_ARG_NUM(2);
  429. *r_return = Math::wrapf((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
  430. } break;
  431. case LOGIC_MAX: {
  432. if (p_inputs[0]->get_type() == Variant::INT && p_inputs[1]->get_type() == Variant::INT) {
  433. int64_t a = *p_inputs[0];
  434. int64_t b = *p_inputs[1];
  435. *r_return = MAX(a, b);
  436. } else {
  437. VALIDATE_ARG_NUM(0);
  438. VALIDATE_ARG_NUM(1);
  439. real_t a = *p_inputs[0];
  440. real_t b = *p_inputs[1];
  441. *r_return = MAX(a, b);
  442. }
  443. } break;
  444. case LOGIC_MIN: {
  445. if (p_inputs[0]->get_type() == Variant::INT && p_inputs[1]->get_type() == Variant::INT) {
  446. int64_t a = *p_inputs[0];
  447. int64_t b = *p_inputs[1];
  448. *r_return = MIN(a, b);
  449. } else {
  450. VALIDATE_ARG_NUM(0);
  451. VALIDATE_ARG_NUM(1);
  452. real_t a = *p_inputs[0];
  453. real_t b = *p_inputs[1];
  454. *r_return = MIN(a, b);
  455. }
  456. } break;
  457. case LOGIC_CLAMP: {
  458. if (p_inputs[0]->get_type() == Variant::INT && p_inputs[1]->get_type() == Variant::INT && p_inputs[2]->get_type() == Variant::INT) {
  459. int64_t a = *p_inputs[0];
  460. int64_t b = *p_inputs[1];
  461. int64_t c = *p_inputs[2];
  462. *r_return = CLAMP(a, b, c);
  463. } else {
  464. VALIDATE_ARG_NUM(0);
  465. VALIDATE_ARG_NUM(1);
  466. VALIDATE_ARG_NUM(2);
  467. real_t a = *p_inputs[0];
  468. real_t b = *p_inputs[1];
  469. real_t c = *p_inputs[2];
  470. *r_return = CLAMP(a, b, c);
  471. }
  472. } break;
  473. case LOGIC_NEAREST_PO2: {
  474. VALIDATE_ARG_NUM(0);
  475. int64_t num = *p_inputs[0];
  476. *r_return = next_power_of_2(num);
  477. } break;
  478. case OBJ_WEAKREF: {
  479. if (p_inputs[0]->get_type() != Variant::OBJECT) {
  480. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  481. r_error.argument = 0;
  482. r_error.expected = Variant::OBJECT;
  483. return;
  484. }
  485. if (p_inputs[0]->is_ref()) {
  486. REF r = *p_inputs[0];
  487. if (!r.is_valid()) {
  488. return;
  489. }
  490. Ref<WeakRef> wref = memnew(WeakRef);
  491. wref->set_ref(r);
  492. *r_return = wref;
  493. } else {
  494. Object *obj = *p_inputs[0];
  495. if (!obj) {
  496. return;
  497. }
  498. Ref<WeakRef> wref = memnew(WeakRef);
  499. wref->set_obj(obj);
  500. *r_return = wref;
  501. }
  502. } break;
  503. case FUNC_FUNCREF: {
  504. if (p_inputs[0]->get_type() != Variant::OBJECT) {
  505. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  506. r_error.argument = 0;
  507. r_error.expected = Variant::OBJECT;
  508. return;
  509. }
  510. if (p_inputs[1]->get_type() != Variant::STRING && p_inputs[1]->get_type() != Variant::NODE_PATH) {
  511. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  512. r_error.argument = 1;
  513. r_error.expected = Variant::STRING;
  514. return;
  515. }
  516. Ref<FuncRef> fr = memnew(FuncRef);
  517. fr->set_instance(*p_inputs[0]);
  518. fr->set_function(*p_inputs[1]);
  519. *r_return = fr;
  520. } break;
  521. case TYPE_CONVERT: {
  522. VALIDATE_ARG_NUM(1);
  523. int type = *p_inputs[1];
  524. if (type < 0 || type >= Variant::VARIANT_MAX) {
  525. r_error_str = RTR("Invalid type argument to convert(), use TYPE_* constants.");
  526. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  527. r_error.argument = 0;
  528. r_error.expected = Variant::INT;
  529. return;
  530. } else {
  531. *r_return = Variant::construct(Variant::Type(type), p_inputs, 1, r_error);
  532. }
  533. } break;
  534. case TYPE_OF: {
  535. *r_return = p_inputs[0]->get_type();
  536. } break;
  537. case TYPE_EXISTS: {
  538. *r_return = ClassDB::class_exists(*p_inputs[0]);
  539. } break;
  540. case TEXT_CHAR: {
  541. CharType result[2] = { *p_inputs[0], 0 };
  542. *r_return = String(result);
  543. } break;
  544. case TEXT_STR: {
  545. String str = *p_inputs[0];
  546. *r_return = str;
  547. } break;
  548. case TEXT_PRINT: {
  549. String str = *p_inputs[0];
  550. print_line(str);
  551. } break;
  552. case TEXT_PRINTERR: {
  553. String str = *p_inputs[0];
  554. print_error(str);
  555. } break;
  556. case TEXT_PRINTRAW: {
  557. String str = *p_inputs[0];
  558. OS::get_singleton()->print("%s", str.utf8().get_data());
  559. } break;
  560. case VAR_TO_STR: {
  561. String vars;
  562. VariantWriter::write_to_string(*p_inputs[0], vars);
  563. *r_return = vars;
  564. } break;
  565. case STR_TO_VAR: {
  566. if (p_inputs[0]->get_type() != Variant::STRING) {
  567. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  568. r_error.argument = 0;
  569. r_error.expected = Variant::STRING;
  570. return;
  571. }
  572. VariantParser::StreamString ss;
  573. ss.s = *p_inputs[0];
  574. String errs;
  575. int line;
  576. Error err = VariantParser::parse(&ss, *r_return, errs, line);
  577. if (err != OK) {
  578. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  579. r_error.argument = 0;
  580. r_error.expected = Variant::STRING;
  581. *r_return = "Parse error at line " + itos(line) + ": " + errs;
  582. return;
  583. }
  584. } break;
  585. case VAR_TO_BYTES: {
  586. PoolByteArray barr;
  587. bool full_objects = *p_inputs[1];
  588. int len;
  589. Error err = encode_variant(*p_inputs[0], NULL, len, full_objects);
  590. if (err) {
  591. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  592. r_error.argument = 0;
  593. r_error.expected = Variant::NIL;
  594. r_error_str = "Unexpected error encoding variable to bytes, likely unserializable type found (Object or RID).";
  595. return;
  596. }
  597. barr.resize(len);
  598. {
  599. PoolByteArray::Write w = barr.write();
  600. encode_variant(*p_inputs[0], w.ptr(), len, full_objects);
  601. }
  602. *r_return = barr;
  603. } break;
  604. case BYTES_TO_VAR: {
  605. if (p_inputs[0]->get_type() != Variant::POOL_BYTE_ARRAY) {
  606. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  607. r_error.argument = 0;
  608. r_error.expected = Variant::POOL_BYTE_ARRAY;
  609. return;
  610. }
  611. PoolByteArray varr = *p_inputs[0];
  612. bool allow_objects = *p_inputs[1];
  613. Variant ret;
  614. {
  615. PoolByteArray::Read r = varr.read();
  616. Error err = decode_variant(ret, r.ptr(), varr.size(), NULL, allow_objects);
  617. if (err != OK) {
  618. r_error_str = RTR("Not enough bytes for decoding bytes, or invalid format.");
  619. r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  620. r_error.argument = 0;
  621. r_error.expected = Variant::POOL_BYTE_ARRAY;
  622. return;
  623. }
  624. }
  625. *r_return = ret;
  626. } break;
  627. case COLORN: {
  628. VALIDATE_ARG_NUM(1);
  629. Color color = Color::named(*p_inputs[0]);
  630. color.a = *p_inputs[1];
  631. *r_return = String(color);
  632. } break;
  633. default: {
  634. }
  635. }
  636. }
  637. ////////
  638. static bool _is_number(CharType c) {
  639. return (c >= '0' && c <= '9');
  640. }
  641. Error Expression::_get_token(Token &r_token) {
  642. while (true) {
  643. #define GET_CHAR() (str_ofs >= expression.length() ? 0 : expression[str_ofs++])
  644. CharType cchar = GET_CHAR();
  645. if (cchar == 0) {
  646. r_token.type = TK_EOF;
  647. return OK;
  648. }
  649. switch (cchar) {
  650. case 0: {
  651. r_token.type = TK_EOF;
  652. return OK;
  653. } break;
  654. case '{': {
  655. r_token.type = TK_CURLY_BRACKET_OPEN;
  656. return OK;
  657. };
  658. case '}': {
  659. r_token.type = TK_CURLY_BRACKET_CLOSE;
  660. return OK;
  661. };
  662. case '[': {
  663. r_token.type = TK_BRACKET_OPEN;
  664. return OK;
  665. };
  666. case ']': {
  667. r_token.type = TK_BRACKET_CLOSE;
  668. return OK;
  669. };
  670. case '(': {
  671. r_token.type = TK_PARENTHESIS_OPEN;
  672. return OK;
  673. };
  674. case ')': {
  675. r_token.type = TK_PARENTHESIS_CLOSE;
  676. return OK;
  677. };
  678. case ',': {
  679. r_token.type = TK_COMMA;
  680. return OK;
  681. };
  682. case ':': {
  683. r_token.type = TK_COLON;
  684. return OK;
  685. };
  686. case '$': {
  687. r_token.type = TK_INPUT;
  688. int index = 0;
  689. do {
  690. if (!_is_number(expression[str_ofs])) {
  691. _set_error("Expected number after '$'");
  692. r_token.type = TK_ERROR;
  693. return ERR_PARSE_ERROR;
  694. }
  695. index *= 10;
  696. index += expression[str_ofs] - '0';
  697. str_ofs++;
  698. } while (_is_number(expression[str_ofs]));
  699. r_token.value = index;
  700. return OK;
  701. };
  702. case '=': {
  703. cchar = GET_CHAR();
  704. if (cchar == '=') {
  705. r_token.type = TK_OP_EQUAL;
  706. } else {
  707. _set_error("Expected '='");
  708. r_token.type = TK_ERROR;
  709. return ERR_PARSE_ERROR;
  710. }
  711. return OK;
  712. };
  713. case '!': {
  714. if (expression[str_ofs] == '=') {
  715. r_token.type = TK_OP_NOT_EQUAL;
  716. str_ofs++;
  717. } else {
  718. r_token.type = TK_OP_NOT;
  719. }
  720. return OK;
  721. };
  722. case '>': {
  723. if (expression[str_ofs] == '=') {
  724. r_token.type = TK_OP_GREATER_EQUAL;
  725. str_ofs++;
  726. } else if (expression[str_ofs] == '>') {
  727. r_token.type = TK_OP_SHIFT_RIGHT;
  728. str_ofs++;
  729. } else {
  730. r_token.type = TK_OP_GREATER;
  731. }
  732. return OK;
  733. };
  734. case '<': {
  735. if (expression[str_ofs] == '=') {
  736. r_token.type = TK_OP_LESS_EQUAL;
  737. str_ofs++;
  738. } else if (expression[str_ofs] == '<') {
  739. r_token.type = TK_OP_SHIFT_LEFT;
  740. str_ofs++;
  741. } else {
  742. r_token.type = TK_OP_LESS;
  743. }
  744. return OK;
  745. };
  746. case '+': {
  747. r_token.type = TK_OP_ADD;
  748. return OK;
  749. };
  750. case '-': {
  751. r_token.type = TK_OP_SUB;
  752. return OK;
  753. };
  754. case '/': {
  755. r_token.type = TK_OP_DIV;
  756. return OK;
  757. };
  758. case '*': {
  759. r_token.type = TK_OP_MUL;
  760. return OK;
  761. };
  762. case '%': {
  763. r_token.type = TK_OP_MOD;
  764. return OK;
  765. };
  766. case '&': {
  767. if (expression[str_ofs] == '&') {
  768. r_token.type = TK_OP_AND;
  769. str_ofs++;
  770. } else {
  771. r_token.type = TK_OP_BIT_AND;
  772. }
  773. return OK;
  774. };
  775. case '|': {
  776. if (expression[str_ofs] == '|') {
  777. r_token.type = TK_OP_OR;
  778. str_ofs++;
  779. } else {
  780. r_token.type = TK_OP_BIT_OR;
  781. }
  782. return OK;
  783. };
  784. case '^': {
  785. r_token.type = TK_OP_BIT_XOR;
  786. return OK;
  787. };
  788. case '~': {
  789. r_token.type = TK_OP_BIT_INVERT;
  790. return OK;
  791. };
  792. case '"': {
  793. String str;
  794. while (true) {
  795. CharType ch = GET_CHAR();
  796. if (ch == 0) {
  797. _set_error("Unterminated String");
  798. r_token.type = TK_ERROR;
  799. return ERR_PARSE_ERROR;
  800. } else if (ch == '"') {
  801. break;
  802. } else if (ch == '\\') {
  803. //escaped characters...
  804. CharType next = GET_CHAR();
  805. if (next == 0) {
  806. _set_error("Unterminated String");
  807. r_token.type = TK_ERROR;
  808. return ERR_PARSE_ERROR;
  809. }
  810. CharType res = 0;
  811. switch (next) {
  812. case 'b': res = 8; break;
  813. case 't': res = 9; break;
  814. case 'n': res = 10; break;
  815. case 'f': res = 12; break;
  816. case 'r': res = 13; break;
  817. case 'u': {
  818. //hexnumbarh - oct is deprecated
  819. for (int j = 0; j < 4; j++) {
  820. CharType c = GET_CHAR();
  821. if (c == 0) {
  822. _set_error("Unterminated String");
  823. r_token.type = TK_ERROR;
  824. return ERR_PARSE_ERROR;
  825. }
  826. if (!(_is_number(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) {
  827. _set_error("Malformed hex constant in string");
  828. r_token.type = TK_ERROR;
  829. return ERR_PARSE_ERROR;
  830. }
  831. CharType v;
  832. if (_is_number(c)) {
  833. v = c - '0';
  834. } else if (c >= 'a' && c <= 'f') {
  835. v = c - 'a';
  836. v += 10;
  837. } else if (c >= 'A' && c <= 'F') {
  838. v = c - 'A';
  839. v += 10;
  840. } else {
  841. ERR_PRINT("BUG");
  842. v = 0;
  843. }
  844. res <<= 4;
  845. res |= v;
  846. }
  847. } break;
  848. //case '\"': res='\"'; break;
  849. //case '\\': res='\\'; break;
  850. //case '/': res='/'; break;
  851. default: {
  852. res = next;
  853. //r_err_str="Invalid escape sequence";
  854. //return ERR_PARSE_ERROR;
  855. } break;
  856. }
  857. str += res;
  858. } else {
  859. str += ch;
  860. }
  861. }
  862. r_token.type = TK_CONSTANT;
  863. r_token.value = str;
  864. return OK;
  865. } break;
  866. default: {
  867. if (cchar <= 32) {
  868. break;
  869. }
  870. CharType next_char = (str_ofs >= expression.length()) ? 0 : expression[str_ofs];
  871. if (_is_number(cchar) || (cchar == '.' && _is_number(next_char))) {
  872. //a number
  873. String num;
  874. #define READING_SIGN 0
  875. #define READING_INT 1
  876. #define READING_DEC 2
  877. #define READING_EXP 3
  878. #define READING_DONE 4
  879. int reading = READING_INT;
  880. CharType c = cchar;
  881. bool exp_sign = false;
  882. bool exp_beg = false;
  883. bool is_float = false;
  884. while (true) {
  885. switch (reading) {
  886. case READING_INT: {
  887. if (_is_number(c)) {
  888. //pass
  889. } else if (c == '.') {
  890. reading = READING_DEC;
  891. is_float = true;
  892. } else if (c == 'e') {
  893. reading = READING_EXP;
  894. } else {
  895. reading = READING_DONE;
  896. }
  897. } break;
  898. case READING_DEC: {
  899. if (_is_number(c)) {
  900. } else if (c == 'e') {
  901. reading = READING_EXP;
  902. } else {
  903. reading = READING_DONE;
  904. }
  905. } break;
  906. case READING_EXP: {
  907. if (_is_number(c)) {
  908. exp_beg = true;
  909. } else if ((c == '-' || c == '+') && !exp_sign && !exp_beg) {
  910. if (c == '-')
  911. is_float = true;
  912. exp_sign = true;
  913. } else {
  914. reading = READING_DONE;
  915. }
  916. } break;
  917. }
  918. if (reading == READING_DONE)
  919. break;
  920. num += String::chr(c);
  921. c = GET_CHAR();
  922. }
  923. str_ofs--;
  924. r_token.type = TK_CONSTANT;
  925. if (is_float)
  926. r_token.value = num.to_double();
  927. else
  928. r_token.value = num.to_int();
  929. return OK;
  930. } else if ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_') {
  931. String id;
  932. bool first = true;
  933. while ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_' || (!first && _is_number(cchar))) {
  934. id += String::chr(cchar);
  935. cchar = GET_CHAR();
  936. first = false;
  937. }
  938. str_ofs--; //go back one
  939. if (id == "in") {
  940. r_token.type = TK_OP_IN;
  941. } else if (id == "null") {
  942. r_token.type = TK_CONSTANT;
  943. r_token.value = Variant();
  944. } else if (id == "true") {
  945. r_token.type = TK_CONSTANT;
  946. r_token.value = true;
  947. } else if (id == "false") {
  948. r_token.type = TK_CONSTANT;
  949. r_token.value = false;
  950. } else if (id == "PI") {
  951. r_token.type = TK_CONSTANT;
  952. r_token.value = Math_PI;
  953. } else if (id == "TAU") {
  954. r_token.type = TK_CONSTANT;
  955. r_token.value = Math_TAU;
  956. } else if (id == "INF") {
  957. r_token.type = TK_CONSTANT;
  958. r_token.value = Math_INF;
  959. } else if (id == "NAN") {
  960. r_token.type = TK_CONSTANT;
  961. r_token.value = Math_NAN;
  962. } else if (id == "not") {
  963. r_token.type = TK_OP_NOT;
  964. } else if (id == "or") {
  965. r_token.type = TK_OP_OR;
  966. } else if (id == "and") {
  967. r_token.type = TK_OP_AND;
  968. } else if (id == "self") {
  969. r_token.type = TK_SELF;
  970. } else {
  971. for (int i = 0; i < Variant::VARIANT_MAX; i++) {
  972. if (id == Variant::get_type_name(Variant::Type(i))) {
  973. r_token.type = TK_BASIC_TYPE;
  974. r_token.value = i;
  975. return OK;
  976. }
  977. }
  978. BuiltinFunc bifunc = find_function(id);
  979. if (bifunc != FUNC_MAX) {
  980. r_token.type = TK_BUILTIN_FUNC;
  981. r_token.value = bifunc;
  982. return OK;
  983. }
  984. r_token.type = TK_IDENTIFIER;
  985. r_token.value = id;
  986. }
  987. return OK;
  988. } else if (cchar == '.') {
  989. // Handled down there as we support '.[0-9]' as numbers above
  990. r_token.type = TK_PERIOD;
  991. return OK;
  992. } else {
  993. _set_error("Unexpected character.");
  994. r_token.type = TK_ERROR;
  995. return ERR_PARSE_ERROR;
  996. }
  997. }
  998. }
  999. #undef GET_CHAR
  1000. }
  1001. r_token.type = TK_ERROR;
  1002. return ERR_PARSE_ERROR;
  1003. }
  1004. const char *Expression::token_name[TK_MAX] = {
  1005. "CURLY BRACKET OPEN",
  1006. "CURLY BRACKET CLOSE",
  1007. "BRACKET OPEN",
  1008. "BRACKET CLOSE",
  1009. "PARENTHESIS OPEN",
  1010. "PARENTHESIS CLOSE",
  1011. "IDENTIFIER",
  1012. "BUILTIN FUNC",
  1013. "SELF",
  1014. "CONSTANT",
  1015. "BASIC TYPE",
  1016. "COLON",
  1017. "COMMA",
  1018. "PERIOD",
  1019. "OP IN",
  1020. "OP EQUAL",
  1021. "OP NOT EQUAL",
  1022. "OP LESS",
  1023. "OP LESS EQUAL",
  1024. "OP GREATER",
  1025. "OP GREATER EQUAL",
  1026. "OP AND",
  1027. "OP OR",
  1028. "OP NOT",
  1029. "OP ADD",
  1030. "OP SUB",
  1031. "OP MUL",
  1032. "OP DIV",
  1033. "OP MOD",
  1034. "OP SHIFT LEFT",
  1035. "OP SHIFT RIGHT",
  1036. "OP BIT AND",
  1037. "OP BIT OR",
  1038. "OP BIT XOR",
  1039. "OP BIT INVERT",
  1040. "OP INPUT",
  1041. "EOF",
  1042. "ERROR"
  1043. };
  1044. Expression::ENode *Expression::_parse_expression() {
  1045. Vector<ExpressionNode> expression;
  1046. while (true) {
  1047. //keep appending stuff to expression
  1048. ENode *expr = NULL;
  1049. Token tk;
  1050. _get_token(tk);
  1051. if (error_set)
  1052. return NULL;
  1053. switch (tk.type) {
  1054. case TK_CURLY_BRACKET_OPEN: {
  1055. //a dictionary
  1056. DictionaryNode *dn = alloc_node<DictionaryNode>();
  1057. while (true) {
  1058. int cofs = str_ofs;
  1059. _get_token(tk);
  1060. if (tk.type == TK_CURLY_BRACKET_CLOSE) {
  1061. break;
  1062. }
  1063. str_ofs = cofs; //revert
  1064. //parse an expression
  1065. ENode *subexpr = _parse_expression();
  1066. if (!subexpr)
  1067. return NULL;
  1068. dn->dict.push_back(subexpr);
  1069. _get_token(tk);
  1070. if (tk.type != TK_COLON) {
  1071. _set_error("Expected ':'");
  1072. return NULL;
  1073. }
  1074. subexpr = _parse_expression();
  1075. if (!subexpr)
  1076. return NULL;
  1077. dn->dict.push_back(subexpr);
  1078. cofs = str_ofs;
  1079. _get_token(tk);
  1080. if (tk.type == TK_COMMA) {
  1081. //all good
  1082. } else if (tk.type == TK_CURLY_BRACKET_CLOSE) {
  1083. str_ofs = cofs;
  1084. } else {
  1085. _set_error("Expected ',' or '}'");
  1086. }
  1087. }
  1088. expr = dn;
  1089. } break;
  1090. case TK_BRACKET_OPEN: {
  1091. //an array
  1092. ArrayNode *an = alloc_node<ArrayNode>();
  1093. while (true) {
  1094. int cofs = str_ofs;
  1095. _get_token(tk);
  1096. if (tk.type == TK_BRACKET_CLOSE) {
  1097. break;
  1098. }
  1099. str_ofs = cofs; //revert
  1100. //parse an expression
  1101. ENode *subexpr = _parse_expression();
  1102. if (!subexpr)
  1103. return NULL;
  1104. an->array.push_back(subexpr);
  1105. cofs = str_ofs;
  1106. _get_token(tk);
  1107. if (tk.type == TK_COMMA) {
  1108. //all good
  1109. } else if (tk.type == TK_BRACKET_CLOSE) {
  1110. str_ofs = cofs;
  1111. } else {
  1112. _set_error("Expected ',' or ']'");
  1113. }
  1114. }
  1115. expr = an;
  1116. } break;
  1117. case TK_PARENTHESIS_OPEN: {
  1118. //a suexpression
  1119. ENode *e = _parse_expression();
  1120. if (error_set)
  1121. return NULL;
  1122. _get_token(tk);
  1123. if (tk.type != TK_PARENTHESIS_CLOSE) {
  1124. _set_error("Expected ')'");
  1125. return NULL;
  1126. }
  1127. expr = e;
  1128. } break;
  1129. case TK_IDENTIFIER: {
  1130. String identifier = tk.value;
  1131. int cofs = str_ofs;
  1132. _get_token(tk);
  1133. if (tk.type == TK_PARENTHESIS_OPEN) {
  1134. //function call
  1135. CallNode *func_call = alloc_node<CallNode>();
  1136. func_call->method = identifier;
  1137. SelfNode *self_node = alloc_node<SelfNode>();
  1138. func_call->base = self_node;
  1139. while (true) {
  1140. int cofs2 = str_ofs;
  1141. _get_token(tk);
  1142. if (tk.type == TK_PARENTHESIS_CLOSE) {
  1143. break;
  1144. }
  1145. str_ofs = cofs2; //revert
  1146. //parse an expression
  1147. ENode *subexpr = _parse_expression();
  1148. if (!subexpr)
  1149. return NULL;
  1150. func_call->arguments.push_back(subexpr);
  1151. cofs2 = str_ofs;
  1152. _get_token(tk);
  1153. if (tk.type == TK_COMMA) {
  1154. //all good
  1155. } else if (tk.type == TK_PARENTHESIS_CLOSE) {
  1156. str_ofs = cofs2;
  1157. } else {
  1158. _set_error("Expected ',' or ')'");
  1159. }
  1160. }
  1161. expr = func_call;
  1162. } else {
  1163. //named indexing
  1164. str_ofs = cofs;
  1165. int input_index = -1;
  1166. for (int i = 0; i < input_names.size(); i++) {
  1167. if (input_names[i] == identifier) {
  1168. input_index = i;
  1169. break;
  1170. }
  1171. }
  1172. if (input_index != -1) {
  1173. InputNode *input = alloc_node<InputNode>();
  1174. input->index = input_index;
  1175. expr = input;
  1176. } else {
  1177. NamedIndexNode *index = alloc_node<NamedIndexNode>();
  1178. SelfNode *self_node = alloc_node<SelfNode>();
  1179. index->base = self_node;
  1180. index->name = identifier;
  1181. expr = index;
  1182. }
  1183. }
  1184. } break;
  1185. case TK_INPUT: {
  1186. InputNode *input = alloc_node<InputNode>();
  1187. input->index = tk.value;
  1188. expr = input;
  1189. } break;
  1190. case TK_SELF: {
  1191. SelfNode *self = alloc_node<SelfNode>();
  1192. expr = self;
  1193. } break;
  1194. case TK_CONSTANT: {
  1195. ConstantNode *constant = alloc_node<ConstantNode>();
  1196. constant->value = tk.value;
  1197. expr = constant;
  1198. } break;
  1199. case TK_BASIC_TYPE: {
  1200. //constructor..
  1201. Variant::Type bt = Variant::Type(int(tk.value));
  1202. _get_token(tk);
  1203. if (tk.type != TK_PARENTHESIS_OPEN) {
  1204. _set_error("Expected '('");
  1205. return NULL;
  1206. }
  1207. ConstructorNode *constructor = alloc_node<ConstructorNode>();
  1208. constructor->data_type = bt;
  1209. while (true) {
  1210. int cofs = str_ofs;
  1211. _get_token(tk);
  1212. if (tk.type == TK_PARENTHESIS_CLOSE) {
  1213. break;
  1214. }
  1215. str_ofs = cofs; //revert
  1216. //parse an expression
  1217. ENode *subexpr = _parse_expression();
  1218. if (!subexpr)
  1219. return NULL;
  1220. constructor->arguments.push_back(subexpr);
  1221. cofs = str_ofs;
  1222. _get_token(tk);
  1223. if (tk.type == TK_COMMA) {
  1224. //all good
  1225. } else if (tk.type == TK_PARENTHESIS_CLOSE) {
  1226. str_ofs = cofs;
  1227. } else {
  1228. _set_error("Expected ',' or ')'");
  1229. }
  1230. }
  1231. expr = constructor;
  1232. } break;
  1233. case TK_BUILTIN_FUNC: {
  1234. //builtin function
  1235. _get_token(tk);
  1236. if (tk.type != TK_PARENTHESIS_OPEN) {
  1237. _set_error("Expected '('");
  1238. return NULL;
  1239. }
  1240. BuiltinFuncNode *bifunc = alloc_node<BuiltinFuncNode>();
  1241. bifunc->func = BuiltinFunc(int(tk.value));
  1242. while (true) {
  1243. int cofs = str_ofs;
  1244. _get_token(tk);
  1245. if (tk.type == TK_PARENTHESIS_CLOSE) {
  1246. break;
  1247. }
  1248. str_ofs = cofs; //revert
  1249. //parse an expression
  1250. ENode *subexpr = _parse_expression();
  1251. if (!subexpr)
  1252. return NULL;
  1253. bifunc->arguments.push_back(subexpr);
  1254. cofs = str_ofs;
  1255. _get_token(tk);
  1256. if (tk.type == TK_COMMA) {
  1257. //all good
  1258. } else if (tk.type == TK_PARENTHESIS_CLOSE) {
  1259. str_ofs = cofs;
  1260. } else {
  1261. _set_error("Expected ',' or ')'");
  1262. }
  1263. }
  1264. int expected_args = get_func_argument_count(bifunc->func);
  1265. if (bifunc->arguments.size() != expected_args) {
  1266. _set_error("Builtin func '" + get_func_name(bifunc->func) + "' expects " + itos(expected_args) + " arguments.");
  1267. }
  1268. expr = bifunc;
  1269. } break;
  1270. case TK_OP_SUB: {
  1271. ExpressionNode e;
  1272. e.is_op = true;
  1273. e.op = Variant::OP_NEGATE;
  1274. expression.push_back(e);
  1275. continue;
  1276. } break;
  1277. case TK_OP_NOT: {
  1278. ExpressionNode e;
  1279. e.is_op = true;
  1280. e.op = Variant::OP_NOT;
  1281. expression.push_back(e);
  1282. continue;
  1283. } break;
  1284. default: {
  1285. _set_error("Expected expression.");
  1286. return NULL;
  1287. } break;
  1288. }
  1289. //before going to operators, must check indexing!
  1290. while (true) {
  1291. int cofs2 = str_ofs;
  1292. _get_token(tk);
  1293. if (error_set)
  1294. return NULL;
  1295. bool done = false;
  1296. switch (tk.type) {
  1297. case TK_BRACKET_OPEN: {
  1298. //value indexing
  1299. IndexNode *index = alloc_node<IndexNode>();
  1300. index->base = expr;
  1301. ENode *what = _parse_expression();
  1302. if (!what)
  1303. return NULL;
  1304. index->index = what;
  1305. _get_token(tk);
  1306. if (tk.type != TK_BRACKET_CLOSE) {
  1307. _set_error("Expected ']' at end of index.");
  1308. return NULL;
  1309. }
  1310. expr = index;
  1311. } break;
  1312. case TK_PERIOD: {
  1313. //named indexing or function call
  1314. _get_token(tk);
  1315. if (tk.type != TK_IDENTIFIER) {
  1316. _set_error("Expected identifier after '.'");
  1317. return NULL;
  1318. }
  1319. StringName identifier = tk.value;
  1320. int cofs = str_ofs;
  1321. _get_token(tk);
  1322. if (tk.type == TK_PARENTHESIS_OPEN) {
  1323. //function call
  1324. CallNode *func_call = alloc_node<CallNode>();
  1325. func_call->method = identifier;
  1326. func_call->base = expr;
  1327. while (true) {
  1328. int cofs3 = str_ofs;
  1329. _get_token(tk);
  1330. if (tk.type == TK_PARENTHESIS_CLOSE) {
  1331. break;
  1332. }
  1333. str_ofs = cofs3; //revert
  1334. //parse an expression
  1335. ENode *subexpr = _parse_expression();
  1336. if (!subexpr)
  1337. return NULL;
  1338. func_call->arguments.push_back(subexpr);
  1339. cofs3 = str_ofs;
  1340. _get_token(tk);
  1341. if (tk.type == TK_COMMA) {
  1342. //all good
  1343. } else if (tk.type == TK_PARENTHESIS_CLOSE) {
  1344. str_ofs = cofs3;
  1345. } else {
  1346. _set_error("Expected ',' or ')'");
  1347. }
  1348. }
  1349. expr = func_call;
  1350. } else {
  1351. //named indexing
  1352. str_ofs = cofs;
  1353. NamedIndexNode *index = alloc_node<NamedIndexNode>();
  1354. index->base = expr;
  1355. index->name = identifier;
  1356. expr = index;
  1357. }
  1358. } break;
  1359. default: {
  1360. str_ofs = cofs2;
  1361. done = true;
  1362. } break;
  1363. }
  1364. if (done)
  1365. break;
  1366. }
  1367. //push expression
  1368. {
  1369. ExpressionNode e;
  1370. e.is_op = false;
  1371. e.node = expr;
  1372. expression.push_back(e);
  1373. }
  1374. //ok finally look for an operator
  1375. int cofs = str_ofs;
  1376. _get_token(tk);
  1377. if (error_set)
  1378. return NULL;
  1379. Variant::Operator op = Variant::OP_MAX;
  1380. switch (tk.type) {
  1381. case TK_OP_IN: op = Variant::OP_IN; break;
  1382. case TK_OP_EQUAL: op = Variant::OP_EQUAL; break;
  1383. case TK_OP_NOT_EQUAL: op = Variant::OP_NOT_EQUAL; break;
  1384. case TK_OP_LESS: op = Variant::OP_LESS; break;
  1385. case TK_OP_LESS_EQUAL: op = Variant::OP_LESS_EQUAL; break;
  1386. case TK_OP_GREATER: op = Variant::OP_GREATER; break;
  1387. case TK_OP_GREATER_EQUAL: op = Variant::OP_GREATER_EQUAL; break;
  1388. case TK_OP_AND: op = Variant::OP_AND; break;
  1389. case TK_OP_OR: op = Variant::OP_OR; break;
  1390. case TK_OP_NOT: op = Variant::OP_NOT; break;
  1391. case TK_OP_ADD: op = Variant::OP_ADD; break;
  1392. case TK_OP_SUB: op = Variant::OP_SUBTRACT; break;
  1393. case TK_OP_MUL: op = Variant::OP_MULTIPLY; break;
  1394. case TK_OP_DIV: op = Variant::OP_DIVIDE; break;
  1395. case TK_OP_MOD: op = Variant::OP_MODULE; break;
  1396. case TK_OP_SHIFT_LEFT: op = Variant::OP_SHIFT_LEFT; break;
  1397. case TK_OP_SHIFT_RIGHT: op = Variant::OP_SHIFT_RIGHT; break;
  1398. case TK_OP_BIT_AND: op = Variant::OP_BIT_AND; break;
  1399. case TK_OP_BIT_OR: op = Variant::OP_BIT_OR; break;
  1400. case TK_OP_BIT_XOR: op = Variant::OP_BIT_XOR; break;
  1401. case TK_OP_BIT_INVERT: op = Variant::OP_BIT_NEGATE; break;
  1402. default: {
  1403. };
  1404. }
  1405. if (op == Variant::OP_MAX) { //stop appending stuff
  1406. str_ofs = cofs;
  1407. break;
  1408. }
  1409. //push operator and go on
  1410. {
  1411. ExpressionNode e;
  1412. e.is_op = true;
  1413. e.op = op;
  1414. expression.push_back(e);
  1415. }
  1416. }
  1417. /* Reduce the set set of expressions and place them in an operator tree, respecting precedence */
  1418. while (expression.size() > 1) {
  1419. int next_op = -1;
  1420. int min_priority = 0xFFFFF;
  1421. bool is_unary = false;
  1422. for (int i = 0; i < expression.size(); i++) {
  1423. if (!expression[i].is_op) {
  1424. continue;
  1425. }
  1426. int priority;
  1427. bool unary = false;
  1428. switch (expression[i].op) {
  1429. case Variant::OP_BIT_NEGATE:
  1430. priority = 0;
  1431. unary = true;
  1432. break;
  1433. case Variant::OP_NEGATE:
  1434. priority = 1;
  1435. unary = true;
  1436. break;
  1437. case Variant::OP_MULTIPLY: priority = 2; break;
  1438. case Variant::OP_DIVIDE: priority = 2; break;
  1439. case Variant::OP_MODULE: priority = 2; break;
  1440. case Variant::OP_ADD: priority = 3; break;
  1441. case Variant::OP_SUBTRACT: priority = 3; break;
  1442. case Variant::OP_SHIFT_LEFT: priority = 4; break;
  1443. case Variant::OP_SHIFT_RIGHT: priority = 4; break;
  1444. case Variant::OP_BIT_AND: priority = 5; break;
  1445. case Variant::OP_BIT_XOR: priority = 6; break;
  1446. case Variant::OP_BIT_OR: priority = 7; break;
  1447. case Variant::OP_LESS: priority = 8; break;
  1448. case Variant::OP_LESS_EQUAL: priority = 8; break;
  1449. case Variant::OP_GREATER: priority = 8; break;
  1450. case Variant::OP_GREATER_EQUAL: priority = 8; break;
  1451. case Variant::OP_EQUAL: priority = 8; break;
  1452. case Variant::OP_NOT_EQUAL: priority = 8; break;
  1453. case Variant::OP_IN: priority = 10; break;
  1454. case Variant::OP_NOT:
  1455. priority = 11;
  1456. unary = true;
  1457. break;
  1458. case Variant::OP_AND: priority = 12; break;
  1459. case Variant::OP_OR: priority = 13; break;
  1460. default: {
  1461. _set_error("Parser bug, invalid operator in expression: " + itos(expression[i].op));
  1462. return NULL;
  1463. }
  1464. }
  1465. if (priority < min_priority) {
  1466. // < is used for left to right (default)
  1467. // <= is used for right to left
  1468. next_op = i;
  1469. min_priority = priority;
  1470. is_unary = unary;
  1471. }
  1472. }
  1473. if (next_op == -1) {
  1474. _set_error("Yet another parser bug....");
  1475. ERR_FAIL_COND_V(next_op == -1, NULL);
  1476. }
  1477. // OK! create operator..
  1478. if (is_unary) {
  1479. int expr_pos = next_op;
  1480. while (expression[expr_pos].is_op) {
  1481. expr_pos++;
  1482. if (expr_pos == expression.size()) {
  1483. //can happen..
  1484. _set_error("Unexpected end of expression...");
  1485. return NULL;
  1486. }
  1487. }
  1488. //consecutively do unary opeators
  1489. for (int i = expr_pos - 1; i >= next_op; i--) {
  1490. OperatorNode *op = alloc_node<OperatorNode>();
  1491. op->op = expression[i].op;
  1492. op->nodes[0] = expression[i + 1].node;
  1493. op->nodes[1] = NULL;
  1494. expression.write[i].is_op = false;
  1495. expression.write[i].node = op;
  1496. expression.remove(i + 1);
  1497. }
  1498. } else {
  1499. if (next_op < 1 || next_op >= (expression.size() - 1)) {
  1500. _set_error("Parser bug...");
  1501. ERR_FAIL_V(NULL);
  1502. }
  1503. OperatorNode *op = alloc_node<OperatorNode>();
  1504. op->op = expression[next_op].op;
  1505. if (expression[next_op - 1].is_op) {
  1506. _set_error("Parser bug...");
  1507. ERR_FAIL_V(NULL);
  1508. }
  1509. if (expression[next_op + 1].is_op) {
  1510. // this is not invalid and can really appear
  1511. // but it becomes invalid anyway because no binary op
  1512. // can be followed by a unary op in a valid combination,
  1513. // due to how precedence works, unaries will always disappear first
  1514. _set_error("Unexpected two consecutive operators.");
  1515. return NULL;
  1516. }
  1517. op->nodes[0] = expression[next_op - 1].node; //expression goes as left
  1518. op->nodes[1] = expression[next_op + 1].node; //next expression goes as right
  1519. //replace all 3 nodes by this operator and make it an expression
  1520. expression.write[next_op - 1].node = op;
  1521. expression.remove(next_op);
  1522. expression.remove(next_op);
  1523. }
  1524. }
  1525. return expression[0].node;
  1526. }
  1527. bool Expression::_compile_expression() {
  1528. if (!expression_dirty)
  1529. return error_set;
  1530. if (nodes) {
  1531. memdelete(nodes);
  1532. nodes = NULL;
  1533. root = NULL;
  1534. }
  1535. error_str = String();
  1536. error_set = false;
  1537. str_ofs = 0;
  1538. root = _parse_expression();
  1539. if (error_set) {
  1540. root = NULL;
  1541. if (nodes) {
  1542. memdelete(nodes);
  1543. }
  1544. nodes = NULL;
  1545. return true;
  1546. }
  1547. expression_dirty = false;
  1548. return false;
  1549. }
  1550. bool Expression::_execute(const Array &p_inputs, Object *p_instance, Expression::ENode *p_node, Variant &r_ret, String &r_error_str) {
  1551. switch (p_node->type) {
  1552. case Expression::ENode::TYPE_INPUT: {
  1553. const Expression::InputNode *in = static_cast<const Expression::InputNode *>(p_node);
  1554. if (in->index < 0 || in->index >= p_inputs.size()) {
  1555. r_error_str = vformat(RTR("Invalid input %i (not passed) in expression"), in->index);
  1556. return true;
  1557. }
  1558. r_ret = p_inputs[in->index];
  1559. } break;
  1560. case Expression::ENode::TYPE_CONSTANT: {
  1561. const Expression::ConstantNode *c = static_cast<const Expression::ConstantNode *>(p_node);
  1562. r_ret = c->value;
  1563. } break;
  1564. case Expression::ENode::TYPE_SELF: {
  1565. if (!p_instance) {
  1566. r_error_str = RTR("self can't be used because instance is null (not passed)");
  1567. return true;
  1568. }
  1569. r_ret = p_instance;
  1570. } break;
  1571. case Expression::ENode::TYPE_OPERATOR: {
  1572. const Expression::OperatorNode *op = static_cast<const Expression::OperatorNode *>(p_node);
  1573. Variant a;
  1574. bool ret = _execute(p_inputs, p_instance, op->nodes[0], a, r_error_str);
  1575. if (ret)
  1576. return true;
  1577. Variant b;
  1578. if (op->nodes[1]) {
  1579. ret = _execute(p_inputs, p_instance, op->nodes[1], b, r_error_str);
  1580. if (ret)
  1581. return true;
  1582. }
  1583. bool valid = true;
  1584. Variant::evaluate(op->op, a, b, r_ret, valid);
  1585. if (!valid) {
  1586. r_error_str = vformat(RTR("Invalid operands to operator %s, %s and %s."), Variant::get_operator_name(op->op), Variant::get_type_name(a.get_type()), Variant::get_type_name(b.get_type()));
  1587. return true;
  1588. }
  1589. } break;
  1590. case Expression::ENode::TYPE_INDEX: {
  1591. const Expression::IndexNode *index = static_cast<const Expression::IndexNode *>(p_node);
  1592. Variant base;
  1593. bool ret = _execute(p_inputs, p_instance, index->base, base, r_error_str);
  1594. if (ret)
  1595. return true;
  1596. Variant idx;
  1597. ret = _execute(p_inputs, p_instance, index->index, idx, r_error_str);
  1598. if (ret)
  1599. return true;
  1600. bool valid;
  1601. r_ret = base.get(idx, &valid);
  1602. if (!valid) {
  1603. r_error_str = vformat(RTR("Invalid index of type %s for base type %s"), Variant::get_type_name(idx.get_type()), Variant::get_type_name(base.get_type()));
  1604. return true;
  1605. }
  1606. } break;
  1607. case Expression::ENode::TYPE_NAMED_INDEX: {
  1608. const Expression::NamedIndexNode *index = static_cast<const Expression::NamedIndexNode *>(p_node);
  1609. Variant base;
  1610. bool ret = _execute(p_inputs, p_instance, index->base, base, r_error_str);
  1611. if (ret)
  1612. return true;
  1613. bool valid;
  1614. r_ret = base.get_named(index->name, &valid);
  1615. if (!valid) {
  1616. r_error_str = vformat(RTR("Invalid named index '%s' for base type %s"), String(index->name), Variant::get_type_name(base.get_type()));
  1617. return true;
  1618. }
  1619. } break;
  1620. case Expression::ENode::TYPE_ARRAY: {
  1621. const Expression::ArrayNode *array = static_cast<const Expression::ArrayNode *>(p_node);
  1622. Array arr;
  1623. arr.resize(array->array.size());
  1624. for (int i = 0; i < array->array.size(); i++) {
  1625. Variant value;
  1626. bool ret = _execute(p_inputs, p_instance, array->array[i], value, r_error_str);
  1627. if (ret)
  1628. return true;
  1629. arr[i] = value;
  1630. }
  1631. r_ret = arr;
  1632. } break;
  1633. case Expression::ENode::TYPE_DICTIONARY: {
  1634. const Expression::DictionaryNode *dictionary = static_cast<const Expression::DictionaryNode *>(p_node);
  1635. Dictionary d;
  1636. for (int i = 0; i < dictionary->dict.size(); i += 2) {
  1637. Variant key;
  1638. bool ret = _execute(p_inputs, p_instance, dictionary->dict[i + 0], key, r_error_str);
  1639. if (ret)
  1640. return true;
  1641. Variant value;
  1642. ret = _execute(p_inputs, p_instance, dictionary->dict[i + 1], value, r_error_str);
  1643. if (ret)
  1644. return true;
  1645. d[key] = value;
  1646. }
  1647. r_ret = d;
  1648. } break;
  1649. case Expression::ENode::TYPE_CONSTRUCTOR: {
  1650. const Expression::ConstructorNode *constructor = static_cast<const Expression::ConstructorNode *>(p_node);
  1651. Vector<Variant> arr;
  1652. Vector<const Variant *> argp;
  1653. arr.resize(constructor->arguments.size());
  1654. argp.resize(constructor->arguments.size());
  1655. for (int i = 0; i < constructor->arguments.size(); i++) {
  1656. Variant value;
  1657. bool ret = _execute(p_inputs, p_instance, constructor->arguments[i], value, r_error_str);
  1658. if (ret)
  1659. return true;
  1660. arr.write[i] = value;
  1661. argp.write[i] = &arr[i];
  1662. }
  1663. Variant::CallError ce;
  1664. r_ret = Variant::construct(constructor->data_type, (const Variant **)argp.ptr(), argp.size(), ce);
  1665. if (ce.error != Variant::CallError::CALL_OK) {
  1666. r_error_str = vformat(RTR("Invalid arguments to construct '%s'"), Variant::get_type_name(constructor->data_type));
  1667. return true;
  1668. }
  1669. } break;
  1670. case Expression::ENode::TYPE_BUILTIN_FUNC: {
  1671. const Expression::BuiltinFuncNode *bifunc = static_cast<const Expression::BuiltinFuncNode *>(p_node);
  1672. Vector<Variant> arr;
  1673. Vector<const Variant *> argp;
  1674. arr.resize(bifunc->arguments.size());
  1675. argp.resize(bifunc->arguments.size());
  1676. for (int i = 0; i < bifunc->arguments.size(); i++) {
  1677. Variant value;
  1678. bool ret = _execute(p_inputs, p_instance, bifunc->arguments[i], value, r_error_str);
  1679. if (ret)
  1680. return true;
  1681. arr.write[i] = value;
  1682. argp.write[i] = &arr[i];
  1683. }
  1684. Variant::CallError ce;
  1685. exec_func(bifunc->func, (const Variant **)argp.ptr(), &r_ret, ce, r_error_str);
  1686. if (ce.error != Variant::CallError::CALL_OK) {
  1687. r_error_str = "Builtin Call Failed. " + r_error_str;
  1688. return true;
  1689. }
  1690. } break;
  1691. case Expression::ENode::TYPE_CALL: {
  1692. const Expression::CallNode *call = static_cast<const Expression::CallNode *>(p_node);
  1693. Variant base;
  1694. bool ret = _execute(p_inputs, p_instance, call->base, base, r_error_str);
  1695. if (ret)
  1696. return true;
  1697. Vector<Variant> arr;
  1698. Vector<const Variant *> argp;
  1699. arr.resize(call->arguments.size());
  1700. argp.resize(call->arguments.size());
  1701. for (int i = 0; i < call->arguments.size(); i++) {
  1702. Variant value;
  1703. ret = _execute(p_inputs, p_instance, call->arguments[i], value, r_error_str);
  1704. if (ret)
  1705. return true;
  1706. arr.write[i] = value;
  1707. argp.write[i] = &arr[i];
  1708. }
  1709. Variant::CallError ce;
  1710. r_ret = base.call(call->method, (const Variant **)argp.ptr(), argp.size(), ce);
  1711. if (ce.error != Variant::CallError::CALL_OK) {
  1712. r_error_str = vformat(RTR("On call to '%s':"), String(call->method));
  1713. return true;
  1714. }
  1715. } break;
  1716. }
  1717. return false;
  1718. }
  1719. Error Expression::parse(const String &p_expression, const Vector<String> &p_input_names) {
  1720. if (nodes) {
  1721. memdelete(nodes);
  1722. nodes = NULL;
  1723. root = NULL;
  1724. }
  1725. error_str = String();
  1726. error_set = false;
  1727. str_ofs = 0;
  1728. input_names = p_input_names;
  1729. expression = p_expression;
  1730. root = _parse_expression();
  1731. if (error_set) {
  1732. root = NULL;
  1733. if (nodes) {
  1734. memdelete(nodes);
  1735. }
  1736. nodes = NULL;
  1737. return ERR_INVALID_PARAMETER;
  1738. }
  1739. return OK;
  1740. }
  1741. Variant Expression::execute(Array p_inputs, Object *p_base, bool p_show_error) {
  1742. if (error_set) {
  1743. ERR_EXPLAIN("There was previously a parse error: " + error_str);
  1744. ERR_FAIL_V(Variant());
  1745. }
  1746. execution_error = false;
  1747. Variant output;
  1748. String error_txt;
  1749. bool err = _execute(p_inputs, p_base, root, output, error_txt);
  1750. if (err) {
  1751. execution_error = true;
  1752. error_str = error_txt;
  1753. if (p_show_error) {
  1754. ERR_EXPLAIN(error_str);
  1755. ERR_FAIL_V(Variant());
  1756. }
  1757. }
  1758. return output;
  1759. }
  1760. bool Expression::has_execute_failed() const {
  1761. return execution_error;
  1762. }
  1763. String Expression::get_error_text() const {
  1764. return error_str;
  1765. }
  1766. void Expression::_bind_methods() {
  1767. ClassDB::bind_method(D_METHOD("parse", "expression", "input_names"), &Expression::parse, DEFVAL(Vector<String>()));
  1768. ClassDB::bind_method(D_METHOD("execute", "inputs", "base_instance", "show_error"), &Expression::execute, DEFVAL(Array()), DEFVAL(Variant()), DEFVAL(true));
  1769. ClassDB::bind_method(D_METHOD("has_execute_failed"), &Expression::has_execute_failed);
  1770. ClassDB::bind_method(D_METHOD("get_error_text"), &Expression::get_error_text);
  1771. }
  1772. Expression::Expression() :
  1773. output_type(Variant::NIL),
  1774. sequenced(false),
  1775. error_set(true),
  1776. root(NULL),
  1777. nodes(NULL),
  1778. execution_error(false) {
  1779. }
  1780. Expression::~Expression() {
  1781. if (nodes) {
  1782. memdelete(nodes);
  1783. }
  1784. }