|
@@ -37,77 +37,65 @@ class GDCompiler {
|
|
|
|
|
|
const GDParser *parser;
|
|
const GDParser *parser;
|
|
struct CodeGen {
|
|
struct CodeGen {
|
|
-
|
|
|
|
-
|
|
|
|
GDScript *script;
|
|
GDScript *script;
|
|
const GDParser::ClassNode *class_node;
|
|
const GDParser::ClassNode *class_node;
|
|
const GDParser::FunctionNode *function_node;
|
|
const GDParser::FunctionNode *function_node;
|
|
-
|
|
|
|
-
|
|
|
|
- bool debug_stack;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- List< Map<StringName,int> > stack_id_stack;
|
|
|
|
- Map<StringName,int> stack_identifiers;
|
|
|
|
-
|
|
|
|
- List<GDFunction::StackDebug> stack_debug;
|
|
|
|
- List< Map<StringName,int> > block_identifier_stack;
|
|
|
|
- Map<StringName,int> block_identifiers;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- void add_stack_identifier(const StringName& p_id,int p_stackpos) {
|
|
|
|
-
|
|
|
|
- stack_identifiers[p_id]=p_stackpos;
|
|
|
|
- if (debug_stack) {
|
|
|
|
-
|
|
|
|
- block_identifiers[p_id]=p_stackpos;
|
|
|
|
- GDFunction::StackDebug sd;
|
|
|
|
- sd.added=true;
|
|
|
|
- sd.line=current_line;
|
|
|
|
- sd.identifier=p_id;
|
|
|
|
- sd.pos=p_stackpos;
|
|
|
|
- stack_debug.push_back(sd);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- void push_stack_identifiers() {
|
|
|
|
-
|
|
|
|
- stack_id_stack.push_back( stack_identifiers );
|
|
|
|
- if (debug_stack) {
|
|
|
|
-
|
|
|
|
- block_identifier_stack.push_back(block_identifiers);
|
|
|
|
- block_identifiers.clear();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- void pop_stack_identifiers() {
|
|
|
|
-
|
|
|
|
- stack_identifiers = stack_id_stack.back()->get();
|
|
|
|
- stack_id_stack.pop_back();
|
|
|
|
-
|
|
|
|
- if (debug_stack) {
|
|
|
|
- for (Map<StringName,int>::Element *E=block_identifiers.front();E;E=E->next()) {
|
|
|
|
-
|
|
|
|
- GDFunction::StackDebug sd;
|
|
|
|
- sd.added=false;
|
|
|
|
- sd.identifier=E->key();
|
|
|
|
- sd.line=current_line;
|
|
|
|
- sd.pos=E->get();
|
|
|
|
- stack_debug.push_back(sd);
|
|
|
|
- }
|
|
|
|
- block_identifiers=block_identifier_stack.back()->get();
|
|
|
|
- block_identifier_stack.pop_back();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- // int get_identifier_pos(const StringName& p_dentifier) const;
|
|
|
|
|
|
+ bool debug_stack;
|
|
|
|
+
|
|
|
|
+ List< Map<StringName,int> > stack_id_stack;
|
|
|
|
+ Map<StringName,int> stack_identifiers;
|
|
|
|
+
|
|
|
|
+ List<GDFunction::StackDebug> stack_debug;
|
|
|
|
+ List< Map<StringName,int> > block_identifier_stack;
|
|
|
|
+ Map<StringName,int> block_identifiers;
|
|
|
|
+
|
|
|
|
+ void add_stack_identifier(const StringName& p_id,int p_stackpos) {
|
|
|
|
+ stack_identifiers[p_id]=p_stackpos;
|
|
|
|
+ if (debug_stack) {
|
|
|
|
+ block_identifiers[p_id]=p_stackpos;
|
|
|
|
+ GDFunction::StackDebug sd;
|
|
|
|
+ sd.added=true;
|
|
|
|
+ sd.line=current_line;
|
|
|
|
+ sd.identifier=p_id;
|
|
|
|
+ sd.pos=p_stackpos;
|
|
|
|
+ stack_debug.push_back(sd);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void push_stack_identifiers() {
|
|
|
|
+ stack_id_stack.push_back( stack_identifiers );
|
|
|
|
+ if (debug_stack) {
|
|
|
|
+
|
|
|
|
+ block_identifier_stack.push_back(block_identifiers);
|
|
|
|
+ block_identifiers.clear();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void pop_stack_identifiers() {
|
|
|
|
+ stack_identifiers = stack_id_stack.back()->get();
|
|
|
|
+ stack_id_stack.pop_back();
|
|
|
|
+
|
|
|
|
+ if (debug_stack) {
|
|
|
|
+ for (Map<StringName,int>::Element *E=block_identifiers.front();E;E=E->next()) {
|
|
|
|
+
|
|
|
|
+ GDFunction::StackDebug sd;
|
|
|
|
+ sd.added=false;
|
|
|
|
+ sd.identifier=E->key();
|
|
|
|
+ sd.line=current_line;
|
|
|
|
+ sd.pos=E->get();
|
|
|
|
+ stack_debug.push_back(sd);
|
|
|
|
+ }
|
|
|
|
+ block_identifiers=block_identifier_stack.back()->get();
|
|
|
|
+ block_identifier_stack.pop_back();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //int get_identifier_pos(const StringName& p_dentifier) const;
|
|
HashMap<Variant,int,VariantHasher> constant_map;
|
|
HashMap<Variant,int,VariantHasher> constant_map;
|
|
Map<StringName,int> name_map;
|
|
Map<StringName,int> name_map;
|
|
|
|
|
|
int get_name_map_pos(const StringName& p_identifier) {
|
|
int get_name_map_pos(const StringName& p_identifier) {
|
|
-
|
|
|
|
int ret;
|
|
int ret;
|
|
if (!name_map.has(p_identifier)) {
|
|
if (!name_map.has(p_identifier)) {
|
|
ret=name_map.size();
|
|
ret=name_map.size();
|
|
@@ -118,11 +106,7 @@ class GDCompiler {
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
int get_constant_pos(const Variant& p_constant) {
|
|
int get_constant_pos(const Variant& p_constant) {
|
|
-
|
|
|
|
-
|
|
|
|
if (constant_map.has(p_constant))
|
|
if (constant_map.has(p_constant))
|
|
return constant_map[p_constant];
|
|
return constant_map[p_constant];
|
|
int pos = constant_map.size();
|
|
int pos = constant_map.size();
|
|
@@ -134,7 +118,7 @@ class GDCompiler {
|
|
void alloc_stack(int p_level) { if (p_level >= stack_max) stack_max=p_level+1; }
|
|
void alloc_stack(int p_level) { if (p_level >= stack_max) stack_max=p_level+1; }
|
|
void alloc_call(int p_params) { if (p_params >= call_max) call_max=p_params; }
|
|
void alloc_call(int p_params) { if (p_params >= call_max) call_max=p_params; }
|
|
|
|
|
|
- int current_line;
|
|
|
|
|
|
+ int current_line;
|
|
int stack_max;
|
|
int stack_max;
|
|
int call_max;
|
|
int call_max;
|
|
};
|
|
};
|