Browse Source

Added static annotation support to getter/setter.

Marco Bambini 8 years ago
parent
commit
0377e61d1e

+ 2 - 1
src/compiler/gravity_ast.c

@@ -572,7 +572,8 @@ static void free_function_decl (gvisitor_t *self, gnode_function_decl_t *node) {
 		gtype_array_each(node->uplist, {mem_free(val);}, gupvalue_t*);
 		gnode_array_free(node->uplist);
 	}
-    if (node->base.meta) gravity_hash_free(node->base.meta);
+    // free meta ONLY if node is not a getter/setter (for getter/setter meta is set to var)
+    if (node->base.meta && node->storage != TOK_KEY_VAR) gravity_hash_free(node->base.meta);
 	mem_free((gnode_t*)node);
 }
 

+ 5 - 3
src/compiler/gravity_parser.c

@@ -1190,7 +1190,7 @@ static void init_grammer_rules (void) {
 
 // MARK: - Declarations -
 
-static gnode_t *parse_getter_setter (gravity_parser_t *parser) {
+static gnode_t *parse_getter_setter (gravity_parser_t *parser, gravity_hash_t *meta) {
 	DEBUG_PARSER("parse_getter_setter");
 	DECLARE_LEXER;
 	
@@ -1230,7 +1230,9 @@ static gnode_t *parse_getter_setter (gravity_parser_t *parser) {
 		mem_free(identifier);
 		
         // create getter/setter func declaration
-        gnode_t *f = gnode_function_decl_create(token, NULL, 0, 0, params, NULL, NULL, LAST_DECLARATION());
+        gnode_t *f = gnode_function_decl_create(token, NULL, 0, 0, params, NULL, meta, LAST_DECLARATION());
+        // set storage to var so I can identify f as a special getter/setter function
+        ((gnode_function_decl_t *)f)->storage = TOK_KEY_VAR;
         
 		// parse compound statement
 		PUSH_DECLARATION(f);
@@ -1308,7 +1310,7 @@ loop:
 		expr = parse_expression(parser);
 	} else if (peek == TOK_OP_OPEN_CURLYBRACE) {
 		gravity_lexer_next(lexer); // consume TOK_OP_OPEN_CURLYBRACE
-		expr = parse_getter_setter(parser);
+		expr = parse_getter_setter(parser, meta);
 		parse_required(parser, TOK_OP_CLOSED_CURLYBRACE);
 	}
 	

+ 6 - 0
src/compiler/gravity_symboltable.c

@@ -166,3 +166,9 @@ void symboltable_dump (symboltable_t *table) {
 		gravity_hash_dump(h);
 	}
 }
+
+void *symboltable_hash_atindex (symboltable_t *table, size_t n) {
+    size_t count = scope_stack_size(table->stack);
+    if (count <= n) return NULL;
+    return (void *) scope_stack_get(table->stack, n);
+}

+ 2 - 0
src/compiler/gravity_symboltable.h

@@ -26,4 +26,6 @@ uint32_t		symboltable_local_index (symboltable_t *table);
 void			symboltable_free (symboltable_t *table);
 void			symboltable_dump (symboltable_t *table);
 
+void            *symboltable_hash_atindex (symboltable_t *table, size_t n);
+
 #endif