| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | /*  gdscript_tokenizer.cpp                                               */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-01-01 11:16:22 +01:00
										 |  |  | /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | #include "gdscript_tokenizer.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-27 21:07:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/io/marshalls.h"
 | 
					
						
							|  |  |  | #include "core/map.h"
 | 
					
						
							|  |  |  | #include "core/print_string.h"
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | #include "gdscript_functions.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | const char *GDScriptTokenizer::token_names[TK_MAX] = { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"Empty", | 
					
						
							|  |  |  | 	"Identifier", | 
					
						
							|  |  |  | 	"Constant", | 
					
						
							|  |  |  | 	"Self", | 
					
						
							|  |  |  | 	"Built-In Type", | 
					
						
							|  |  |  | 	"Built-In Func", | 
					
						
							|  |  |  | 	"In", | 
					
						
							|  |  |  | 	"'=='", | 
					
						
							|  |  |  | 	"'!='", | 
					
						
							|  |  |  | 	"'<'", | 
					
						
							|  |  |  | 	"'<='", | 
					
						
							|  |  |  | 	"'>'", | 
					
						
							|  |  |  | 	"'>='", | 
					
						
							|  |  |  | 	"'and'", | 
					
						
							|  |  |  | 	"'or'", | 
					
						
							|  |  |  | 	"'not'", | 
					
						
							|  |  |  | 	"'+'", | 
					
						
							|  |  |  | 	"'-'", | 
					
						
							|  |  |  | 	"'*'", | 
					
						
							|  |  |  | 	"'/'", | 
					
						
							|  |  |  | 	"'%'", | 
					
						
							|  |  |  | 	"'<<'", | 
					
						
							|  |  |  | 	"'>>'", | 
					
						
							|  |  |  | 	"'='", | 
					
						
							|  |  |  | 	"'+='", | 
					
						
							|  |  |  | 	"'-='", | 
					
						
							|  |  |  | 	"'*='", | 
					
						
							|  |  |  | 	"'/='", | 
					
						
							|  |  |  | 	"'%='", | 
					
						
							|  |  |  | 	"'<<='", | 
					
						
							|  |  |  | 	"'>>='", | 
					
						
							|  |  |  | 	"'&='", | 
					
						
							|  |  |  | 	"'|='", | 
					
						
							|  |  |  | 	"'^='", | 
					
						
							|  |  |  | 	"'&'", | 
					
						
							|  |  |  | 	"'|'", | 
					
						
							|  |  |  | 	"'^'", | 
					
						
							|  |  |  | 	"'~'", | 
					
						
							|  |  |  | 	//"Plus Plus",
 | 
					
						
							|  |  |  | 	//"Minus Minus",
 | 
					
						
							|  |  |  | 	"if", | 
					
						
							|  |  |  | 	"elif", | 
					
						
							|  |  |  | 	"else", | 
					
						
							|  |  |  | 	"for", | 
					
						
							|  |  |  | 	"while", | 
					
						
							|  |  |  | 	"break", | 
					
						
							|  |  |  | 	"continue", | 
					
						
							|  |  |  | 	"pass", | 
					
						
							|  |  |  | 	"return", | 
					
						
							|  |  |  | 	"match", | 
					
						
							|  |  |  | 	"func", | 
					
						
							|  |  |  | 	"class", | 
					
						
							| 
									
										
										
										
											2018-07-15 19:29:00 -03:00
										 |  |  | 	"class_name", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"extends", | 
					
						
							| 
									
										
										
										
											2017-05-26 19:45:39 +02:00
										 |  |  | 	"is", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"onready", | 
					
						
							|  |  |  | 	"tool", | 
					
						
							|  |  |  | 	"static", | 
					
						
							|  |  |  | 	"export", | 
					
						
							|  |  |  | 	"setget", | 
					
						
							|  |  |  | 	"const", | 
					
						
							|  |  |  | 	"var", | 
					
						
							| 
									
										
										
										
											2018-05-29 23:16:51 -03:00
										 |  |  | 	"as", | 
					
						
							|  |  |  | 	"void", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"enum", | 
					
						
							|  |  |  | 	"preload", | 
					
						
							|  |  |  | 	"assert", | 
					
						
							|  |  |  | 	"yield", | 
					
						
							|  |  |  | 	"signal", | 
					
						
							|  |  |  | 	"breakpoint", | 
					
						
							|  |  |  | 	"rpc", | 
					
						
							|  |  |  | 	"sync", | 
					
						
							|  |  |  | 	"master", | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 	"puppet", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"slave", | 
					
						
							| 
									
										
										
										
											2018-05-26 10:30:36 +02:00
										 |  |  | 	"remotesync", | 
					
						
							|  |  |  | 	"mastersync", | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 	"puppetsync", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"'['", | 
					
						
							|  |  |  | 	"']'", | 
					
						
							|  |  |  | 	"'{'", | 
					
						
							|  |  |  | 	"'}'", | 
					
						
							|  |  |  | 	"'('", | 
					
						
							|  |  |  | 	"')'", | 
					
						
							|  |  |  | 	"','", | 
					
						
							|  |  |  | 	"';'", | 
					
						
							|  |  |  | 	"'.'", | 
					
						
							|  |  |  | 	"'?'", | 
					
						
							|  |  |  | 	"':'", | 
					
						
							| 
									
										
										
										
											2017-03-31 21:53:22 +03:00
										 |  |  | 	"'$'", | 
					
						
							| 
									
										
										
										
											2018-10-14 23:34:53 +02:00
										 |  |  | 	"'->'", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"'\\n'", | 
					
						
							|  |  |  | 	"PI", | 
					
						
							| 
									
										
										
										
											2017-11-04 10:34:27 +01:00
										 |  |  | 	"TAU", | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	"_", | 
					
						
							|  |  |  | 	"INF", | 
					
						
							|  |  |  | 	"NAN", | 
					
						
							|  |  |  | 	"Error", | 
					
						
							|  |  |  | 	"EOF", | 
					
						
							|  |  |  | 	"Cursor" | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | struct _bit { | 
					
						
							|  |  |  | 	Variant::Type type; | 
					
						
							|  |  |  | 	const char *text; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | //built in types
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const _bit _type_list[] = { | 
					
						
							|  |  |  | 	//types
 | 
					
						
							|  |  |  | 	{ Variant::BOOL, "bool" }, | 
					
						
							|  |  |  | 	{ Variant::INT, "int" }, | 
					
						
							|  |  |  | 	{ Variant::REAL, "float" }, | 
					
						
							|  |  |  | 	{ Variant::STRING, "String" }, | 
					
						
							|  |  |  | 	{ Variant::VECTOR2, "Vector2" }, | 
					
						
							|  |  |  | 	{ Variant::RECT2, "Rect2" }, | 
					
						
							|  |  |  | 	{ Variant::TRANSFORM2D, "Transform2D" }, | 
					
						
							|  |  |  | 	{ Variant::VECTOR3, "Vector3" }, | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 	{ Variant::AABB, "AABB" }, | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	{ Variant::PLANE, "Plane" }, | 
					
						
							|  |  |  | 	{ Variant::QUAT, "Quat" }, | 
					
						
							|  |  |  | 	{ Variant::BASIS, "Basis" }, | 
					
						
							|  |  |  | 	{ Variant::TRANSFORM, "Transform" }, | 
					
						
							|  |  |  | 	{ Variant::COLOR, "Color" }, | 
					
						
							|  |  |  | 	{ Variant::_RID, "RID" }, | 
					
						
							|  |  |  | 	{ Variant::OBJECT, "Object" }, | 
					
						
							|  |  |  | 	{ Variant::NODE_PATH, "NodePath" }, | 
					
						
							|  |  |  | 	{ Variant::DICTIONARY, "Dictionary" }, | 
					
						
							|  |  |  | 	{ Variant::ARRAY, "Array" }, | 
					
						
							|  |  |  | 	{ Variant::POOL_BYTE_ARRAY, "PoolByteArray" }, | 
					
						
							|  |  |  | 	{ Variant::POOL_INT_ARRAY, "PoolIntArray" }, | 
					
						
							| 
									
										
										
										
											2017-07-20 12:51:15 +03:00
										 |  |  | 	{ Variant::POOL_REAL_ARRAY, "PoolRealArray" }, | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	{ Variant::POOL_STRING_ARRAY, "PoolStringArray" }, | 
					
						
							|  |  |  | 	{ Variant::POOL_VECTOR2_ARRAY, "PoolVector2Array" }, | 
					
						
							|  |  |  | 	{ Variant::POOL_VECTOR3_ARRAY, "PoolVector3Array" }, | 
					
						
							|  |  |  | 	{ Variant::POOL_COLOR_ARRAY, "PoolColorArray" }, | 
					
						
							|  |  |  | 	{ Variant::VARIANT_MAX, NULL }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _kws { | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	GDScriptTokenizer::Token token; | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	const char *text; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const _kws _keyword_list[] = { | 
					
						
							|  |  |  | 	//ops
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_OP_IN, "in" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_OP_NOT, "not" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_OP_OR, "or" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_OP_AND, "and" }, | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	//func
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_FUNCTION, "func" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_CLASS, "class" }, | 
					
						
							| 
									
										
										
										
											2018-07-15 19:29:00 -03:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_CLASS_NAME, "class_name" }, | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_EXTENDS, "extends" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_IS, "is" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_ONREADY, "onready" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_TOOL, "tool" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_STATIC, "static" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_EXPORT, "export" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_SETGET, "setget" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_VAR, "var" }, | 
					
						
							| 
									
										
										
										
											2018-05-29 23:16:51 -03:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_AS, "as" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_VOID, "void" }, | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_PRELOAD, "preload" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_ASSERT, "assert" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_YIELD, "yield" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_SIGNAL, "signal" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_BREAKPOINT, "breakpoint" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_REMOTE, "remote" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_MASTER, "master" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_SLAVE, "slave" }, | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_PUPPET, "puppet" }, | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_SYNC, "sync" }, | 
					
						
							| 
									
										
										
										
											2018-05-26 10:30:36 +02:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_REMOTESYNC, "remotesync" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_MASTERSYNC, "mastersync" }, | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_PUPPETSYNC, "puppetsync" }, | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_PR_CONST, "const" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_PR_ENUM, "enum" }, | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	//controlflow
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	{ GDScriptTokenizer::TK_CF_IF, "if" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_ELIF, "elif" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_ELSE, "else" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_FOR, "for" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_WHILE, "while" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_BREAK, "break" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_CONTINUE, "continue" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_RETURN, "return" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_MATCH, "match" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CF_PASS, "pass" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_SELF, "self" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CONST_PI, "PI" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CONST_TAU, "TAU" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_WILDCARD, "_" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CONST_INF, "INF" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_CONST_NAN, "NAN" }, | 
					
						
							|  |  |  | 	{ GDScriptTokenizer::TK_ERROR, NULL } | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | const char *GDScriptTokenizer::get_token_name(Token p_token) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX_V(p_token, TK_MAX, "<error>"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return token_names[p_token]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | bool GDScriptTokenizer::is_token_literal(int p_offset, bool variable_safe) const { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	switch (get_token(p_offset)) { | 
					
						
							|  |  |  | 		// Can always be literal:
 | 
					
						
							|  |  |  | 		case TK_IDENTIFIER: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case TK_PR_ONREADY: | 
					
						
							|  |  |  | 		case TK_PR_TOOL: | 
					
						
							|  |  |  | 		case TK_PR_STATIC: | 
					
						
							|  |  |  | 		case TK_PR_EXPORT: | 
					
						
							|  |  |  | 		case TK_PR_SETGET: | 
					
						
							|  |  |  | 		case TK_PR_SIGNAL: | 
					
						
							|  |  |  | 		case TK_PR_REMOTE: | 
					
						
							|  |  |  | 		case TK_PR_MASTER: | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 		case TK_PR_PUPPET: | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 		case TK_PR_SYNC: | 
					
						
							| 
									
										
										
										
											2018-05-26 10:30:36 +02:00
										 |  |  | 		case TK_PR_REMOTESYNC: | 
					
						
							|  |  |  | 		case TK_PR_MASTERSYNC: | 
					
						
							| 
									
										
										
										
											2018-09-14 21:59:47 +02:00
										 |  |  | 		case TK_PR_PUPPETSYNC: | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Literal for non-variables only:
 | 
					
						
							|  |  |  | 		case TK_BUILT_IN_TYPE: | 
					
						
							|  |  |  | 		case TK_BUILT_IN_FUNC: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case TK_OP_IN: | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 			//case TK_OP_NOT:
 | 
					
						
							|  |  |  | 			//case TK_OP_OR:
 | 
					
						
							|  |  |  | 			//case TK_OP_AND:
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case TK_PR_CLASS: | 
					
						
							|  |  |  | 		case TK_PR_CONST: | 
					
						
							|  |  |  | 		case TK_PR_ENUM: | 
					
						
							|  |  |  | 		case TK_PR_PRELOAD: | 
					
						
							|  |  |  | 		case TK_PR_FUNCTION: | 
					
						
							|  |  |  | 		case TK_PR_EXTENDS: | 
					
						
							|  |  |  | 		case TK_PR_ASSERT: | 
					
						
							|  |  |  | 		case TK_PR_YIELD: | 
					
						
							|  |  |  | 		case TK_PR_VAR: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case TK_CF_IF: | 
					
						
							|  |  |  | 		case TK_CF_ELIF: | 
					
						
							|  |  |  | 		case TK_CF_ELSE: | 
					
						
							|  |  |  | 		case TK_CF_FOR: | 
					
						
							|  |  |  | 		case TK_CF_WHILE: | 
					
						
							|  |  |  | 		case TK_CF_BREAK: | 
					
						
							|  |  |  | 		case TK_CF_CONTINUE: | 
					
						
							|  |  |  | 		case TK_CF_RETURN: | 
					
						
							|  |  |  | 		case TK_CF_MATCH: | 
					
						
							|  |  |  | 		case TK_CF_PASS: | 
					
						
							|  |  |  | 		case TK_SELF: | 
					
						
							|  |  |  | 		case TK_CONST_PI: | 
					
						
							| 
									
										
										
										
											2017-11-04 10:34:27 +01:00
										 |  |  | 		case TK_CONST_TAU: | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 		case TK_WILDCARD: | 
					
						
							|  |  |  | 		case TK_CONST_INF: | 
					
						
							|  |  |  | 		case TK_CONST_NAN: | 
					
						
							|  |  |  | 		case TK_ERROR: | 
					
						
							|  |  |  | 			return !variable_safe; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case TK_CONSTANT: { | 
					
						
							|  |  |  | 			switch (get_token_constant(p_offset).get_type()) { | 
					
						
							|  |  |  | 				case Variant::NIL: | 
					
						
							|  |  |  | 				case Variant::BOOL: | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				default: | 
					
						
							|  |  |  | 					return false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | StringName GDScriptTokenizer::get_token_literal(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 	Token token = get_token(p_offset); | 
					
						
							|  |  |  | 	switch (token) { | 
					
						
							|  |  |  | 		case TK_IDENTIFIER: | 
					
						
							|  |  |  | 			return get_token_identifier(p_offset); | 
					
						
							|  |  |  | 		case TK_BUILT_IN_TYPE: { | 
					
						
							|  |  |  | 			Variant::Type type = get_token_type(p_offset); | 
					
						
							|  |  |  | 			int idx = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			while (_type_list[idx].text) { | 
					
						
							|  |  |  | 				if (type == _type_list[idx].type) { | 
					
						
							|  |  |  | 					return _type_list[idx].text; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				idx++; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} break; // Shouldn't get here, stuff happens
 | 
					
						
							|  |  |  | 		case TK_BUILT_IN_FUNC: | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 			return GDScriptFunctions::get_func_name(get_token_built_in_func(p_offset)); | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 		case TK_CONSTANT: { | 
					
						
							|  |  |  | 			const Variant value = get_token_constant(p_offset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			switch (value.get_type()) { | 
					
						
							|  |  |  | 				case Variant::NIL: | 
					
						
							|  |  |  | 					return "null"; | 
					
						
							|  |  |  | 				case Variant::BOOL: | 
					
						
							|  |  |  | 					return value ? "true" : "false"; | 
					
						
							| 
									
										
										
										
											2019-04-09 17:08:36 +02:00
										 |  |  | 				default: { | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		case TK_OP_AND: | 
					
						
							|  |  |  | 		case TK_OP_OR: | 
					
						
							|  |  |  | 			break; // Don't get into default, since they can be non-literal
 | 
					
						
							|  |  |  | 		default: { | 
					
						
							|  |  |  | 			int idx = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			while (_keyword_list[idx].text) { | 
					
						
							|  |  |  | 				if (token == _keyword_list[idx].token) { | 
					
						
							|  |  |  | 					return _keyword_list[idx].text; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				idx++; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_V_MSG("", "Failed to get token literal."); | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | static bool _is_text_char(CharType c) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static bool _is_number(CharType c) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return (c >= '0' && c <= '9'); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static bool _is_hex(CharType c) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | static bool _is_bin(CharType c) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return (c == '0' || c == '1'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_token(Token p_type) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.type = p_type; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_identifier(const StringName &p_identifier) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.type = TK_IDENTIFIER; | 
					
						
							|  |  |  | 	tk.identifier = p_identifier; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_built_in_func(GDScriptFunctions::Function p_func) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.type = TK_BUILT_IN_FUNC; | 
					
						
							|  |  |  | 	tk.func = p_func; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_constant(const Variant &p_constant) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.type = TK_CONSTANT; | 
					
						
							|  |  |  | 	tk.constant = p_constant; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_type(const Variant::Type &p_type) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.type = TK_BUILT_IN_TYPE; | 
					
						
							|  |  |  | 	tk.vtype = p_type; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_make_error(const String &p_error) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	error_flag = true; | 
					
						
							|  |  |  | 	last_error = p_error; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							|  |  |  | 	tk.type = TK_ERROR; | 
					
						
							|  |  |  | 	tk.constant = p_error; | 
					
						
							|  |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							|  |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | void GDScriptTokenizerText::_make_newline(int p_indentation, int p_tabs) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TokenData &tk = tk_rb[tk_rb_pos]; | 
					
						
							|  |  |  | 	tk.type = TK_NEWLINE; | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 	tk.constant = Vector2(p_indentation, p_tabs); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tk.line = line; | 
					
						
							|  |  |  | 	tk.col = column; | 
					
						
							|  |  |  | 	tk_rb_pos = (tk_rb_pos + 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::_advance() { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (error_flag) { | 
					
						
							|  |  |  | 		//parser broke
 | 
					
						
							|  |  |  | 		_make_error(last_error); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (code_pos >= len) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_make_token(TK_EOF); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #define GETCHAR(m_ofs) ((m_ofs + code_pos) >= len ? 0 : _code[m_ofs + code_pos])
 | 
					
						
							|  |  |  | #define INCPOS(m_amount)      \
 | 
					
						
							|  |  |  | 	{                         \ | 
					
						
							|  |  |  | 		code_pos += m_amount; \ | 
					
						
							|  |  |  | 		column += m_amount;   \ | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	while (true) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		bool is_node_path = false; | 
					
						
							|  |  |  | 		StringMode string_mode = STRING_DOUBLE_QUOTE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		switch (GETCHAR(0)) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			case 0: | 
					
						
							|  |  |  | 				_make_token(TK_EOF); | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 			case '\\': | 
					
						
							|  |  |  | 				INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(0) == '\r') { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(0) != '\n') { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 					_make_error("Expected newline after '\\'."); | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				INCPOS(1); | 
					
						
							| 
									
										
										
										
											2016-01-02 13:56:58 -03:00
										 |  |  | 				line++; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				while (GETCHAR(0) == ' ' || GETCHAR(0) == '\t') { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				continue; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			case '\t': | 
					
						
							|  |  |  | 			case '\r': | 
					
						
							|  |  |  | 			case ' ': | 
					
						
							|  |  |  | 				INCPOS(1); | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			case '#': { // line comment skip
 | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 				String comment; | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				while (GETCHAR(0) != '\n') { | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 					comment += GETCHAR(0); | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					code_pos++; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					if (GETCHAR(0) == 0) { //end of file
 | 
					
						
							| 
									
										
										
										
											2014-09-19 21:01:41 -03:00
										 |  |  | 						//_make_error("Unterminated Comment");
 | 
					
						
							|  |  |  | 						_make_token(TK_EOF); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2019-03-17 18:42:59 +01:00
										 |  |  | 				String comment_content = comment.trim_prefix("#").trim_prefix(" "); | 
					
						
							|  |  |  | 				if (comment_content.begins_with("warning-ignore:")) { | 
					
						
							|  |  |  | 					String code = comment_content.get_slice(":", 1); | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | 					warning_skips.push_back(Pair<int, String>(line, code.strip_edges().to_lower())); | 
					
						
							| 
									
										
										
										
											2019-03-17 18:42:59 +01:00
										 |  |  | 				} else if (comment_content.begins_with("warning-ignore-all:")) { | 
					
						
							|  |  |  | 					String code = comment_content.get_slice(":", 1); | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | 					warning_global_skips.insert(code.strip_edges().to_lower()); | 
					
						
							| 
									
										
										
										
											2019-03-17 18:42:59 +01:00
										 |  |  | 				} else if (comment_content.strip_edges() == "warnings-disable") { | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | 					ignore_warnings = true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 				FALLTHROUGH; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			case '\n': { | 
					
						
							|  |  |  | 				line++; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				INCPOS(1); | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 				bool used_spaces = false; | 
					
						
							|  |  |  | 				int tabs = 0; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				column = 1; | 
					
						
							|  |  |  | 				int i = 0; | 
					
						
							| 
									
										
										
										
											2019-07-26 21:24:34 +03:00
										 |  |  | 				while (true) { | 
					
						
							|  |  |  | 					if (GETCHAR(i) == ' ') { | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 						i++; | 
					
						
							|  |  |  | 						used_spaces = true; | 
					
						
							| 
									
										
										
										
											2019-07-26 21:24:34 +03:00
										 |  |  | 					} else if (GETCHAR(i) == '\t') { | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 						if (used_spaces) { | 
					
						
							|  |  |  | 							_make_error("Spaces used before tabs on a line"); | 
					
						
							| 
									
										
										
										
											2019-07-26 21:24:34 +03:00
										 |  |  | 							return; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 						i++; | 
					
						
							|  |  |  | 						tabs++; | 
					
						
							| 
									
										
										
										
											2019-07-26 21:24:34 +03:00
										 |  |  | 					} else { | 
					
						
							|  |  |  | 						break; // not indentation anymore
 | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-07-26 21:24:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 				_make_newline(i, tabs); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			case '/': { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				switch (GETCHAR(1)) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					case '=': { // diveq
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						_make_token(TK_OP_ASSIGN_DIV); | 
					
						
							|  |  |  | 						INCPOS(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					} break; | 
					
						
							|  |  |  | 					default: | 
					
						
							|  |  |  | 						_make_token(TK_OP_DIV); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '=': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_EQUAL); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				} else | 
					
						
							|  |  |  | 					_make_token(TK_OP_ASSIGN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '<': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					_make_token(TK_OP_LESS_EQUAL); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				} else if (GETCHAR(1) == '<') { | 
					
						
							|  |  |  | 					if (GETCHAR(2) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_token(TK_OP_ASSIGN_SHIFT_LEFT); | 
					
						
							|  |  |  | 						INCPOS(1); | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						_make_token(TK_OP_SHIFT_LEFT); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else | 
					
						
							|  |  |  | 					_make_token(TK_OP_LESS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '>': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_GREATER_EQUAL); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				} else if (GETCHAR(1) == '>') { | 
					
						
							|  |  |  | 					if (GETCHAR(2) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_token(TK_OP_ASSIGN_SHIFT_RIGHT); | 
					
						
							|  |  |  | 						INCPOS(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						_make_token(TK_OP_SHIFT_RIGHT); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_GREATER); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '!': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_NOT_EQUAL); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_NOT); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			//case '"' //string - no strings in shader
 | 
					
						
							|  |  |  | 			//case '\'' //string - no strings in shader
 | 
					
						
							|  |  |  | 			case '{': | 
					
						
							|  |  |  | 				_make_token(TK_CURLY_BRACKET_OPEN); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case '}': | 
					
						
							|  |  |  | 				_make_token(TK_CURLY_BRACKET_CLOSE); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case '[': | 
					
						
							|  |  |  | 				_make_token(TK_BRACKET_OPEN); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case ']': | 
					
						
							|  |  |  | 				_make_token(TK_BRACKET_CLOSE); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case '(': | 
					
						
							|  |  |  | 				_make_token(TK_PARENTHESIS_OPEN); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case ')': | 
					
						
							|  |  |  | 				_make_token(TK_PARENTHESIS_CLOSE); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case ',': | 
					
						
							|  |  |  | 				_make_token(TK_COMMA); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case ';': | 
					
						
							|  |  |  | 				_make_token(TK_SEMICOLON); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case '?': | 
					
						
							|  |  |  | 				_make_token(TK_QUESTION_MARK); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case ':': | 
					
						
							|  |  |  | 				_make_token(TK_COLON); //for methods maybe but now useless.
 | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2017-01-08 02:04:53 -03:00
										 |  |  | 			case '$': | 
					
						
							|  |  |  | 				_make_token(TK_DOLLAR); //for the get_node() shortener
 | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			case '^': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_BIT_XOR); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_BIT_XOR); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '~': | 
					
						
							|  |  |  | 				_make_token(TK_OP_BIT_INVERT); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case '&': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '&') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					_make_token(TK_OP_AND); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				} else if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_BIT_AND); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_BIT_AND); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '|': { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '|') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					_make_token(TK_OP_OR); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				} else if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_BIT_OR); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_BIT_OR); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '*': { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_MUL); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_MUL); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '+': { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_ADD); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					/*
 | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 				}  else if (GETCHAR(1)=='+') { | 
					
						
							|  |  |  | 					_make_token(TK_OP_PLUS_PLUS); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				*/ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_ADD); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '-': { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_SUB); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2018-05-29 23:16:51 -03:00
										 |  |  | 				} else if (GETCHAR(1) == '>') { | 
					
						
							|  |  |  | 					_make_token(TK_FORWARD_ARROW); | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 					INCPOS(1); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_SUB); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '%': { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(1) == '=') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_token(TK_OP_ASSIGN_MOD); | 
					
						
							|  |  |  | 					INCPOS(1); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_token(TK_OP_MOD); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case '@': | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (CharType(GETCHAR(1)) != '"' && CharType(GETCHAR(1)) != '\'') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					_make_error("Unexpected '@'"); | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				INCPOS(1); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				is_node_path = true; | 
					
						
							| 
									
										
										
										
											2019-04-05 14:06:16 +02:00
										 |  |  | 				FALLTHROUGH; | 
					
						
							| 
									
										
										
										
											2014-10-26 10:33:22 +01:00
										 |  |  | 			case '\'': | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			case '"': { | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(0) == '\'') | 
					
						
							|  |  |  | 					string_mode = STRING_SINGLE_QUOTE; | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				int i = 1; | 
					
						
							|  |  |  | 				if (string_mode == STRING_DOUBLE_QUOTE && GETCHAR(i) == '"' && GETCHAR(i + 1) == '"') { | 
					
						
							|  |  |  | 					i += 2; | 
					
						
							|  |  |  | 					string_mode = STRING_MULTILINE; | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				String str; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				while (true) { | 
					
						
							|  |  |  | 					if (CharType(GETCHAR(i)) == 0) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						_make_error("Unterminated String"); | 
					
						
							|  |  |  | 						return; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (string_mode == STRING_DOUBLE_QUOTE && CharType(GETCHAR(i)) == '"') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (string_mode == STRING_SINGLE_QUOTE && CharType(GETCHAR(i)) == '\'') { | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (string_mode == STRING_MULTILINE && CharType(GETCHAR(i)) == '\"' && CharType(GETCHAR(i + 1)) == '\"' && CharType(GETCHAR(i + 2)) == '\"') { | 
					
						
							|  |  |  | 						i += 2; | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (string_mode != STRING_MULTILINE && CharType(GETCHAR(i)) == '\n') { | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 						_make_error("Unexpected EOL at String."); | 
					
						
							|  |  |  | 						return; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (CharType(GETCHAR(i)) == 0xFFFF) { | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 						//string ends here, next will be TK
 | 
					
						
							|  |  |  | 						i--; | 
					
						
							|  |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (CharType(GETCHAR(i)) == '\\') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						//escaped characters...
 | 
					
						
							|  |  |  | 						i++; | 
					
						
							|  |  |  | 						CharType next = GETCHAR(i); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						if (next == 0) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 							_make_error("Unterminated String"); | 
					
						
							|  |  |  | 							return; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						CharType res = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						switch (next) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							case 'a': res = 7; break; | 
					
						
							|  |  |  | 							case 'b': res = 8; break; | 
					
						
							|  |  |  | 							case 't': res = 9; break; | 
					
						
							|  |  |  | 							case 'n': res = 10; break; | 
					
						
							|  |  |  | 							case 'v': res = 11; break; | 
					
						
							|  |  |  | 							case 'f': res = 12; break; | 
					
						
							|  |  |  | 							case 'r': res = 13; break; | 
					
						
							|  |  |  | 							case '\'': res = '\''; break; | 
					
						
							|  |  |  | 							case '\"': res = '\"'; break; | 
					
						
							|  |  |  | 							case '\\': res = '\\'; break; | 
					
						
							|  |  |  | 							case '/': | 
					
						
							|  |  |  | 								res = '/'; | 
					
						
							|  |  |  | 								break; //wtf
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 							case 'u': { | 
					
						
							|  |  |  | 								//hexnumbarh - oct is deprecated
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 								i += 1; | 
					
						
							|  |  |  | 								for (int j = 0; j < 4; j++) { | 
					
						
							|  |  |  | 									CharType c = GETCHAR(i + j); | 
					
						
							|  |  |  | 									if (c == 0) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 										_make_error("Unterminated String"); | 
					
						
							|  |  |  | 										return; | 
					
						
							|  |  |  | 									} | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 11:58:34 +02:00
										 |  |  | 									CharType v = 0; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 									if (c >= '0' && c <= '9') { | 
					
						
							|  |  |  | 										v = c - '0'; | 
					
						
							|  |  |  | 									} else if (c >= 'a' && c <= 'f') { | 
					
						
							|  |  |  | 										v = c - 'a'; | 
					
						
							|  |  |  | 										v += 10; | 
					
						
							|  |  |  | 									} else if (c >= 'A' && c <= 'F') { | 
					
						
							|  |  |  | 										v = c - 'A'; | 
					
						
							|  |  |  | 										v += 10; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 									} else { | 
					
						
							| 
									
										
										
										
											2019-10-18 11:58:34 +02:00
										 |  |  | 										_make_error("Malformed hex constant in string"); | 
					
						
							|  |  |  | 										return; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 									} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 									res <<= 4; | 
					
						
							|  |  |  | 									res |= v; | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 								} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 								i += 3; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 							} break; | 
					
						
							|  |  |  | 							default: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 								_make_error("Invalid escape sequence"); | 
					
						
							|  |  |  | 								return; | 
					
						
							|  |  |  | 							} break; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						str += res; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						if (CharType(GETCHAR(i)) == '\n') { | 
					
						
							| 
									
										
										
										
											2015-08-04 20:17:13 -03:00
										 |  |  | 							line++; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							column = 1; | 
					
						
							| 
									
										
										
										
											2015-08-04 20:17:13 -03:00
										 |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						str += CharType(GETCHAR(i)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					i++; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				INCPOS(i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (is_node_path) { | 
					
						
							|  |  |  | 					_make_constant(NodePath(str)); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_make_constant(str); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2014-12-16 22:31:57 -03:00
										 |  |  | 			case 0xFFFF: { | 
					
						
							|  |  |  | 				_make_token(TK_CURSOR); | 
					
						
							|  |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			default: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (_is_number(GETCHAR(0)) || (GETCHAR(0) == '.' && _is_number(GETCHAR(1)))) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					// parse number
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					bool period_found = false; | 
					
						
							|  |  |  | 					bool exponent_found = false; | 
					
						
							|  |  |  | 					bool hexa_found = false; | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 					bool bin_found = false; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					bool sign_found = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					String str; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					int i = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					while (true) { | 
					
						
							|  |  |  | 						if (GETCHAR(i) == '.') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 							if (period_found || exponent_found) { | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 								_make_error("Invalid numeric constant at '.'"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 								return; | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 							} else if (bin_found) { | 
					
						
							|  |  |  | 								_make_error("Invalid binary constant at '.'"); | 
					
						
							|  |  |  | 								return; | 
					
						
							|  |  |  | 							} else if (hexa_found) { | 
					
						
							|  |  |  | 								_make_error("Invalid hexadecimal constant at '.'"); | 
					
						
							|  |  |  | 								return; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							period_found = true; | 
					
						
							|  |  |  | 						} else if (GETCHAR(i) == 'x') { | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 							if (hexa_found || bin_found || str.length() != 1 || !((i == 1 && str[0] == '0') || (i == 2 && str[1] == '0' && str[0] == '-'))) { | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 								_make_error("Invalid numeric constant at 'x'"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							hexa_found = true; | 
					
						
							| 
									
										
										
										
											2019-11-12 15:57:38 -05:00
										 |  |  | 						} else if (hexa_found && _is_hex(GETCHAR(i))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						} else if (!hexa_found && GETCHAR(i) == 'b') { | 
					
						
							|  |  |  | 							if (bin_found || str.length() != 1 || !((i == 1 && str[0] == '0') || (i == 2 && str[1] == '0' && str[0] == '-'))) { | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 								_make_error("Invalid numeric constant at 'b'"); | 
					
						
							|  |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							bin_found = true; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						} else if (!hexa_found && GETCHAR(i) == 'e') { | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 							if (exponent_found || bin_found) { | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 								_make_error("Invalid numeric constant at 'e'"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							exponent_found = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						} else if (_is_number(GETCHAR(i))) { | 
					
						
							|  |  |  | 							//all ok
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 						} else if (bin_found && _is_bin(GETCHAR(i))) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						} else if ((GETCHAR(i) == '-' || GETCHAR(i) == '+') && exponent_found) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 							if (sign_found) { | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 								_make_error("Invalid numeric constant at '-'"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							sign_found = true; | 
					
						
							| 
									
										
										
										
											2017-11-15 22:53:08 +02:00
										 |  |  | 						} else if (GETCHAR(i) == '_') { | 
					
						
							|  |  |  | 							i++; | 
					
						
							|  |  |  | 							continue; // Included for readability, shouldn't be a part of the string
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						} else | 
					
						
							|  |  |  | 							break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						str += CharType(GETCHAR(i)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						i++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					if (!(_is_number(str[str.length() - 1]) || (hexa_found && _is_hex(str[str.length() - 1])))) { | 
					
						
							|  |  |  | 						_make_error("Invalid numeric constant: " + str); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 22:53:08 +02:00
										 |  |  | 					INCPOS(i); | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 					if (hexa_found) { | 
					
						
							| 
									
										
										
										
											2017-01-08 20:58:39 -03:00
										 |  |  | 						int64_t val = str.hex_to_int64(); | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 						_make_constant(val); | 
					
						
							| 
									
										
										
										
											2019-04-25 13:43:48 +01:00
										 |  |  | 					} else if (bin_found) { | 
					
						
							|  |  |  | 						int64_t val = str.bin_to_int64(); | 
					
						
							|  |  |  | 						_make_constant(val); | 
					
						
							| 
									
										
										
										
											2016-06-18 13:18:31 +02:00
										 |  |  | 					} else if (period_found || exponent_found) { | 
					
						
							| 
									
										
										
										
											2017-01-08 20:58:39 -03:00
										 |  |  | 						double val = str.to_double(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_constant(val); | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2017-01-08 20:58:39 -03:00
										 |  |  | 						int64_t val = str.to_int64(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_constant(val); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (GETCHAR(0) == '.') { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					//parse period
 | 
					
						
							|  |  |  | 					_make_token(TK_PERIOD); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (_is_text_char(GETCHAR(0))) { | 
					
						
							|  |  |  | 					// parse identifier
 | 
					
						
							|  |  |  | 					String str; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					str += CharType(GETCHAR(0)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					int i = 1; | 
					
						
							|  |  |  | 					while (_is_text_char(GETCHAR(i))) { | 
					
						
							|  |  |  | 						str += CharType(GETCHAR(i)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						i++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					bool identifier = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					if (str == "null") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_constant(Variant()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (str == "true") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_constant(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					} else if (str == "false") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						_make_constant(false); | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 						bool found = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							int idx = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 							while (_type_list[idx].text) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 								if (str == _type_list[idx].text) { | 
					
						
							|  |  |  | 									_make_type(_type_list[idx].type); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 									found = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 									break; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								idx++; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (!found) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							//built in func?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 21:10:08 +01:00
										 |  |  | 							for (int j = 0; j < GDScriptFunctions::FUNC_MAX; j++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 21:10:08 +01:00
										 |  |  | 								if (str == GDScriptFunctions::get_func_name(GDScriptFunctions::Function(j))) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 21:10:08 +01:00
										 |  |  | 									_make_built_in_func(GDScriptFunctions::Function(j)); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 									found = true; | 
					
						
							| 
									
										
										
										
											2015-06-26 01:14:31 -03:00
										 |  |  | 									break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (!found) { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 							//keyword
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							int idx = 0; | 
					
						
							|  |  |  | 							found = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 							while (_keyword_list[idx].text) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 								if (str == _keyword_list[idx].text) { | 
					
						
							|  |  |  | 									_make_token(_keyword_list[idx].token); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 									found = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 									break; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								idx++; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (!found) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							identifier = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (identifier) { | 
					
						
							|  |  |  | 						_make_identifier(str); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					INCPOS(str.length()); | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				_make_error("Unknown character"); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		INCPOS(1); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::set_code(const String &p_code) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	code = p_code; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	len = p_code.length(); | 
					
						
							|  |  |  | 	if (len) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		_code = &code[0]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		_code = NULL; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	code_pos = 0; | 
					
						
							|  |  |  | 	line = 1; //it is stand-ar-ized that lines begin in 1 in code..
 | 
					
						
							|  |  |  | 	column = 1; //the same holds for columns
 | 
					
						
							|  |  |  | 	tk_rb_pos = 0; | 
					
						
							|  |  |  | 	error_flag = false; | 
					
						
							| 
									
										
										
										
											2018-07-01 13:17:40 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	ignore_warnings = false; | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	last_error = ""; | 
					
						
							|  |  |  | 	for (int i = 0; i < MAX_LOOKAHEAD + 1; i++) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_advance(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | GDScriptTokenizerText::Token GDScriptTokenizerText::get_token(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, TK_ERROR); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, TK_ERROR); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].type; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerText::get_token_line(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, -1); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, -1); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].line; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerText::get_token_column(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, -1); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, -1); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].col; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | const Variant &GDScriptTokenizerText::get_token_constant(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, tk_rb[0].constant); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, tk_rb[0].constant); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_CONSTANT, tk_rb[0].constant); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].constant; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-31 20:28:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | StringName GDScriptTokenizerText::get_token_identifier(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, StringName()); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, StringName()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_IDENTIFIER, StringName()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].identifier; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | GDScriptFunctions::Function GDScriptTokenizerText::get_token_built_in_func(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, GDScriptFunctions::FUNC_MAX); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, GDScriptFunctions::FUNC_MAX); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_BUILT_IN_FUNC, GDScriptFunctions::FUNC_MAX); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].func; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | Variant::Type GDScriptTokenizerText::get_token_type(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, Variant::NIL); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, Variant::NIL); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_BUILT_IN_TYPE, Variant::NIL); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].vtype; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerText::get_token_line_indent(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, 0); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, 0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_NEWLINE, 0); | 
					
						
							| 
									
										
										
										
											2019-10-13 22:48:18 +03:00
										 |  |  | 	return tk_rb[ofs].constant.operator Vector2().x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int GDScriptTokenizerText::get_token_line_tab_indent(int p_offset) const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, 0); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_NEWLINE, 0); | 
					
						
							|  |  |  | 	return tk_rb[ofs].constant.operator Vector2().y; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | String GDScriptTokenizerText::get_token_error(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(p_offset <= -MAX_LOOKAHEAD, String()); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_offset >= MAX_LOOKAHEAD, String()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int ofs = (TK_RB_SIZE + tk_rb_pos + p_offset - MAX_LOOKAHEAD - 1) % TK_RB_SIZE; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(tk_rb[ofs].type != TK_ERROR, String()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return tk_rb[ofs].constant; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerText::advance(int p_amount) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(p_amount <= 0); | 
					
						
							|  |  |  | 	for (int i = 0; i < p_amount; i++) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_advance(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 16:24:33 +02:00
										 |  |  | //////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-15 19:29:00 -03:00
										 |  |  | #define BYTECODE_VERSION 13
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | Error GDScriptTokenizerBuffer::set_code_buffer(const Vector<uint8_t> &p_buffer) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const uint8_t *buf = p_buffer.ptr(); | 
					
						
							|  |  |  | 	int total_len = p_buffer.size(); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(p_buffer.size() < 24 || p_buffer[0] != 'G' || p_buffer[1] != 'D' || p_buffer[2] != 'S' || p_buffer[3] != 'C', ERR_INVALID_DATA); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	int version = decode_uint32(&buf[4]); | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(version > BYTECODE_VERSION, ERR_INVALID_DATA, "Bytecode is too recent! Please use a newer engine version."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	int identifier_count = decode_uint32(&buf[8]); | 
					
						
							|  |  |  | 	int constant_count = decode_uint32(&buf[12]); | 
					
						
							|  |  |  | 	int line_count = decode_uint32(&buf[16]); | 
					
						
							|  |  |  | 	int token_count = decode_uint32(&buf[20]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-21 15:15:36 -04:00
										 |  |  | 	const uint8_t *b = &buf[24]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	total_len -= 24; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	identifiers.resize(identifier_count); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < identifier_count; i++) { | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		int len = decode_uint32(b); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ERR_FAIL_COND_V(len > total_len, ERR_INVALID_DATA); | 
					
						
							|  |  |  | 		b += 4; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		Vector<uint8_t> cs; | 
					
						
							|  |  |  | 		cs.resize(len); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int j = 0; j < len; j++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 			cs.write[j] = b[j] ^ 0xb6; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		cs.write[cs.size() - 1] = 0; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		String s; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		s.parse_utf8((const char *)cs.ptr()); | 
					
						
							|  |  |  | 		b += len; | 
					
						
							|  |  |  | 		total_len -= len + 4; | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		identifiers.write[i] = s; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	constants.resize(constant_count); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < constant_count; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		Variant v; | 
					
						
							|  |  |  | 		int len; | 
					
						
							| 
									
										
										
										
											2019-03-26 16:52:42 +01:00
										 |  |  | 		// An object cannot be constant, never decode objects
 | 
					
						
							|  |  |  | 		Error err = decode_variant(v, b, total_len, &len, false); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		if (err) | 
					
						
							|  |  |  | 			return err; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		b += len; | 
					
						
							|  |  |  | 		total_len -= len; | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		constants.write[i] = v; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND_V(line_count * 8 > total_len, ERR_INVALID_DATA); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < line_count; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		uint32_t token = decode_uint32(b); | 
					
						
							|  |  |  | 		b += 4; | 
					
						
							|  |  |  | 		uint32_t linecol = decode_uint32(b); | 
					
						
							|  |  |  | 		b += 4; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		lines.insert(token, linecol); | 
					
						
							|  |  |  | 		total_len -= 8; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tokens.resize(token_count); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < token_count; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ERR_FAIL_COND_V(total_len < 1, ERR_INVALID_DATA); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if ((*b) & TOKEN_BYTE_MASK) { //little endian always
 | 
					
						
							|  |  |  | 			ERR_FAIL_COND_V(total_len < 4, ERR_INVALID_DATA); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 			tokens.write[i] = decode_uint32(b) & ~TOKEN_BYTE_MASK; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			b += 4; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 			tokens.write[i] = *b; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			b += 1; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			total_len--; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	token = 0; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | Vector<uint8_t> GDScriptTokenizerBuffer::parse_code_string(const String &p_code) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector<uint8_t> buf; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<StringName, int> identifier_map; | 
					
						
							|  |  |  | 	HashMap<Variant, int, VariantHasher, VariantComparator> constant_map; | 
					
						
							|  |  |  | 	Map<uint32_t, int> line_map; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	Vector<uint32_t> token_array; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	GDScriptTokenizerText tt; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	tt.set_code(p_code); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int line = -1; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	while (true) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (tt.get_token_line() != line) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			line = tt.get_token_line(); | 
					
						
							|  |  |  | 			line_map[line] = token_array.size(); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		uint32_t token = tt.get_token(); | 
					
						
							|  |  |  | 		switch (tt.get_token()) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			case TK_IDENTIFIER: { | 
					
						
							|  |  |  | 				StringName id = tt.get_token_identifier(); | 
					
						
							|  |  |  | 				if (!identifier_map.has(id)) { | 
					
						
							|  |  |  | 					int idx = identifier_map.size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					identifier_map[id] = idx; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				token |= identifier_map[id] << TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			} break; | 
					
						
							|  |  |  | 			case TK_CONSTANT: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 15:08:25 +02:00
										 |  |  | 				const Variant &c = tt.get_token_constant(); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 				if (!constant_map.has(c)) { | 
					
						
							|  |  |  | 					int idx = constant_map.size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					constant_map[c] = idx; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				token |= constant_map[c] << TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			} break; | 
					
						
							|  |  |  | 			case TK_BUILT_IN_TYPE: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				token |= tt.get_token_type() << TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			} break; | 
					
						
							|  |  |  | 			case TK_BUILT_IN_FUNC: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				token |= tt.get_token_built_in_func() << TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			} break; | 
					
						
							|  |  |  | 			case TK_NEWLINE: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				token |= tt.get_token_line_indent() << TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			} break; | 
					
						
							|  |  |  | 			case TK_ERROR: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				ERR_FAIL_V(Vector<uint8_t>()); | 
					
						
							|  |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2019-04-09 17:08:36 +02:00
										 |  |  | 			default: { | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		token_array.push_back(token); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (tt.get_token() == TK_EOF) | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		tt.advance(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//reverse maps
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<int, StringName> rev_identifier_map; | 
					
						
							|  |  |  | 	for (Map<StringName, int>::Element *E = identifier_map.front(); E; E = E->next()) { | 
					
						
							|  |  |  | 		rev_identifier_map[E->get()] = E->key(); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<int, Variant> rev_constant_map; | 
					
						
							|  |  |  | 	const Variant *K = NULL; | 
					
						
							|  |  |  | 	while ((K = constant_map.next(K))) { | 
					
						
							|  |  |  | 		rev_constant_map[constant_map[*K]] = *K; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<int, uint32_t> rev_line_map; | 
					
						
							|  |  |  | 	for (Map<uint32_t, int>::Element *E = line_map.front(); E; E = E->next()) { | 
					
						
							|  |  |  | 		rev_line_map[E->get()] = E->key(); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//save header
 | 
					
						
							|  |  |  | 	buf.resize(24); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 	buf.write[0] = 'G'; | 
					
						
							|  |  |  | 	buf.write[1] = 'D'; | 
					
						
							|  |  |  | 	buf.write[2] = 'S'; | 
					
						
							|  |  |  | 	buf.write[3] = 'C'; | 
					
						
							|  |  |  | 	encode_uint32(BYTECODE_VERSION, &buf.write[4]); | 
					
						
							|  |  |  | 	encode_uint32(identifier_map.size(), &buf.write[8]); | 
					
						
							|  |  |  | 	encode_uint32(constant_map.size(), &buf.write[12]); | 
					
						
							|  |  |  | 	encode_uint32(line_map.size(), &buf.write[16]); | 
					
						
							|  |  |  | 	encode_uint32(token_array.size(), &buf.write[20]); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//save identifiers
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (Map<int, StringName>::Element *E = rev_identifier_map.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		CharString cs = String(E->get()).utf8(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		int len = cs.length() + 1; | 
					
						
							|  |  |  | 		int extra = 4 - (len % 4); | 
					
						
							|  |  |  | 		if (extra == 4) | 
					
						
							|  |  |  | 			extra = 0; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		uint8_t ibuf[4]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		encode_uint32(len + extra, ibuf); | 
					
						
							|  |  |  | 		for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			buf.push_back(ibuf[i]); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = 0; i < len; i++) { | 
					
						
							|  |  |  | 			buf.push_back(cs[i] ^ 0xb6); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = 0; i < extra; i++) { | 
					
						
							|  |  |  | 			buf.push_back(0 ^ 0xb6); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (Map<int, Variant>::Element *E = rev_constant_map.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		int len; | 
					
						
							| 
									
										
										
										
											2019-03-26 16:52:42 +01:00
										 |  |  | 		// Objects cannot be constant, never encode objects
 | 
					
						
							|  |  |  | 		Error err = encode_variant(E->get(), NULL, len, false); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 		ERR_FAIL_COND_V_MSG(err != OK, Vector<uint8_t>(), "Error when trying to encode Variant."); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		int pos = buf.size(); | 
					
						
							|  |  |  | 		buf.resize(pos + len); | 
					
						
							| 
									
										
										
										
											2019-03-26 16:52:42 +01:00
										 |  |  | 		encode_variant(E->get(), &buf.write[pos], len, false); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (Map<int, uint32_t>::Element *E = rev_line_map.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		uint8_t ibuf[8]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		encode_uint32(E->key(), &ibuf[0]); | 
					
						
							|  |  |  | 		encode_uint32(E->get(), &ibuf[4]); | 
					
						
							|  |  |  | 		for (int i = 0; i < 8; i++) | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			buf.push_back(ibuf[i]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < token_array.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		uint32_t token = token_array[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (token & ~TOKEN_MASK) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 			uint8_t buf4[4]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			encode_uint32(token_array[i] | TOKEN_BYTE_MASK, &buf4[0]); | 
					
						
							|  |  |  | 			for (int j = 0; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 				buf.push_back(buf4[j]); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			buf.push_back(token); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return buf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | GDScriptTokenizerBuffer::Token GDScriptTokenizerBuffer::get_token(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (offset < 0 || offset >= tokens.size()) | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		return TK_EOF; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	return GDScriptTokenizerBuffer::Token(tokens[offset] & TOKEN_MASK); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | StringName GDScriptTokenizerBuffer::get_token_identifier(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX_V(offset, tokens.size(), StringName()); | 
					
						
							|  |  |  | 	uint32_t identifier = tokens[offset] >> TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2019-02-21 20:57:39 +01:00
										 |  |  | 	ERR_FAIL_UNSIGNED_INDEX_V(identifier, (uint32_t)identifiers.size(), StringName()); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return identifiers[identifier]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | GDScriptFunctions::Function GDScriptTokenizerBuffer::get_token_built_in_func(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | 	ERR_FAIL_INDEX_V(offset, tokens.size(), GDScriptFunctions::FUNC_MAX); | 
					
						
							|  |  |  | 	return GDScriptFunctions::Function(tokens[offset] >> TOKEN_BITS); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | Variant::Type GDScriptTokenizerBuffer::get_token_type(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX_V(offset, tokens.size(), Variant::NIL); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return Variant::Type(tokens[offset] >> TOKEN_BITS); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerBuffer::get_token_line(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	int pos = lines.find_nearest(offset); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (pos < 0) | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (pos >= lines.size()) | 
					
						
							|  |  |  | 		pos = lines.size() - 1; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	uint32_t l = lines.getv(pos); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return l & TOKEN_LINE_MASK; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerBuffer::get_token_column(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	int pos = lines.find_nearest(offset); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (pos < 0) | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (pos >= lines.size()) | 
					
						
							|  |  |  | 		pos = lines.size() - 1; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	uint32_t l = lines.getv(pos); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return l >> TOKEN_LINE_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | int GDScriptTokenizerBuffer::get_token_line_indent(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX_V(offset, tokens.size(), 0); | 
					
						
							|  |  |  | 	return tokens[offset] >> TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | const Variant &GDScriptTokenizerBuffer::get_token_constant(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int offset = token + p_offset; | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX_V(offset, tokens.size(), nil); | 
					
						
							|  |  |  | 	uint32_t constant = tokens[offset] >> TOKEN_BITS; | 
					
						
							| 
									
										
										
										
											2019-02-21 20:57:39 +01:00
										 |  |  | 	ERR_FAIL_UNSIGNED_INDEX_V(constant, (uint32_t)constants.size(), nil); | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 	return constants[constant]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | String GDScriptTokenizerBuffer::get_token_error(int p_offset) const { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_V(String()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | void GDScriptTokenizerBuffer::advance(int p_amount) { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX(p_amount + token, tokens.size()); | 
					
						
							|  |  |  | 	token += p_amount; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-16 18:38:18 +01:00
										 |  |  | GDScriptTokenizerBuffer::GDScriptTokenizerBuffer() { | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	token = 0; | 
					
						
							| 
									
										
										
										
											2014-02-25 09:31:47 -03:00
										 |  |  | } |