feat: introduced mangled modules for function names
This commit is contained in:
parent
d133a8a0f0
commit
42fbda9f01
|
@ -8,7 +8,8 @@ include "os"
|
||||||
fun main()
|
fun main()
|
||||||
|
|
||||||
# entrypoint function
|
# entrypoint function
|
||||||
|
#[nomangle,noreturn,entry]
|
||||||
fun _start() {
|
fun _start() {
|
||||||
main()
|
main()
|
||||||
_exit(0 as i32)
|
os::exit(0 as i32)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,4 +2,10 @@
|
||||||
include "types"
|
include "types"
|
||||||
|
|
||||||
# from unistd.h
|
# from unistd.h
|
||||||
|
#[nomangle,preserve,noreturn]
|
||||||
fun _exit(in i32: code)
|
fun _exit(in i32: code)
|
||||||
|
|
||||||
|
#[noreturn]
|
||||||
|
fun exit(in i32: code) {
|
||||||
|
os::_exit(code)
|
||||||
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ void AST_init() {
|
||||||
lookup_table[AST_Dereference] = "deref";
|
lookup_table[AST_Dereference] = "deref";
|
||||||
lookup_table[AST_Reference] = "ref";
|
lookup_table[AST_Reference] = "ref";
|
||||||
lookup_table[AST_Return] = "ret";
|
lookup_table[AST_Return] = "ret";
|
||||||
|
lookup_table[AST_ModuleRef] = "modref";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* AST_node_to_string(const struct AST_Node_t* node) {
|
const char* AST_node_to_string(const struct AST_Node_t* node) {
|
||||||
|
|
|
@ -85,6 +85,7 @@ enum AST_SyntaxElement_t {
|
||||||
AST_Include,
|
AST_Include,
|
||||||
AST_Char,
|
AST_Char,
|
||||||
AST_Return,
|
AST_Return,
|
||||||
|
AST_ModuleRef,
|
||||||
AST_ELEMENT_COUNT
|
AST_ELEMENT_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,7 @@ char* module_ref_to_str(ModuleRef* ref) {
|
||||||
|
|
||||||
if (n + 1 < ref->module_path->len) {
|
if (n + 1 < ref->module_path->len) {
|
||||||
g_string_append_unichar(string, ':');
|
g_string_append_unichar(string, ':');
|
||||||
|
g_string_append_unichar(string, ':');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
#include <mem/cache.h>
|
#include <mem/cache.h>
|
||||||
|
|
||||||
int yyLineNumber = 1;
|
int yyLineNumber = 1;
|
||||||
|
|
||||||
int yylex();
|
int yylex();
|
||||||
|
|
||||||
extern int yyerror(const char* s);
|
extern int yyerror(const char* s);
|
||||||
|
|
||||||
#define YY_USER_ACTION beginToken(yytext);
|
#define YY_USER_ACTION beginToken(yytext);
|
||||||
|
|
||||||
#define YY_INPUT(buf,result,max_size) {\
|
#define YY_INPUT(buf,result,max_size) {\
|
||||||
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#.* ;
|
#.* ;
|
||||||
|
|
||||||
|
"::" {return(ModSep);};
|
||||||
":" {DEBUG("\"%s\" tokenized with \':\'", yytext); return(':');};
|
":" {DEBUG("\"%s\" tokenized with \':\'", yytext); return(':');};
|
||||||
"=" {DEBUG("\"%s\" tokenized with \'=\'", yytext); return('=');};
|
"=" {DEBUG("\"%s\" tokenized with \'=\'", yytext); return('=');};
|
||||||
"+" {DEBUG("\"%s\" tokenized with \'+\'", yytext); return('+');};
|
"+" {DEBUG("\"%s\" tokenized with \'+\'", yytext); return('+');};
|
||||||
|
@ -57,7 +58,7 @@
|
||||||
"short" {DEBUG("\"%s\" tokenized with \'KeyShort\'", yytext); return(KeyShort);};
|
"short" {DEBUG("\"%s\" tokenized with \'KeyShort\'", yytext); return(KeyShort);};
|
||||||
"long" {DEBUG("\"%s\" tokenized with \'KeyLong\'", yytext); return(KeyLong);};
|
"long" {DEBUG("\"%s\" tokenized with \'KeyLong\'", yytext); return(KeyLong);};
|
||||||
"half" {DEBUG("\"%s\" tokenized with \'KeyHalf\'", yytext); return(KeyHalf);};
|
"half" {DEBUG("\"%s\" tokenized with \'KeyHalf\'", yytext); return(KeyHalf);};
|
||||||
"double" {DEBUG("\"%s\" tokenized with \'KeyDouble\'", yytext); return(KeyDouble);};
|
"double" {DEBUG("\"%s\" tokenized with \'KeyDouble\'", yytext); return(KeyDouble);};
|
||||||
"signed" {DEBUG("\"%s\" tokenized with \'KeySigned\'", yytext); return(KeySigned);};
|
"signed" {DEBUG("\"%s\" tokenized with \'KeySigned\'", yytext); return(KeySigned);};
|
||||||
"unsigned" {DEBUG("\"%s\" tokenized with \'KeyUnsigned\'", yytext); return(KeyUnsigned);};
|
"unsigned" {DEBUG("\"%s\" tokenized with \'KeyUnsigned\'", yytext); return(KeyUnsigned);};
|
||||||
"ref" {DEBUG("\"%s\" tokenized with \'KeyRef\'", yytext); return(KeyRef);};
|
"ref" {DEBUG("\"%s\" tokenized with \'KeyRef\'", yytext); return(KeyRef);};
|
||||||
|
@ -106,7 +107,7 @@
|
||||||
\"([^\"\n])*\" {
|
\"([^\"\n])*\" {
|
||||||
yytext = yytext +1;
|
yytext = yytext +1;
|
||||||
yytext[yyleng - 2] = 0;
|
yytext[yyleng - 2] = 0;
|
||||||
|
|
||||||
DEBUG("\"%s\" tokenized with \'ValStr\'", yytext);
|
DEBUG("\"%s\" tokenized with \'ValStr\'", yytext);
|
||||||
yylval.string = collapse_escape_sequences(yytext);
|
yylval.string = collapse_escape_sequences(yytext);
|
||||||
return(ValStr);
|
return(ValStr);
|
||||||
|
|
|
@ -2083,6 +2083,27 @@ Parameter get_param_from_func(Function* func, size_t index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* module_ref_to_string(AST_NODE_PTR node) {
|
||||||
|
switch (node->kind) {
|
||||||
|
case AST_Ident:
|
||||||
|
return mem_strdup(MemoryNamespaceSet, node->value);
|
||||||
|
case AST_ModuleRef:
|
||||||
|
|
||||||
|
char* submodule = module_ref_to_string(AST_get_last_node(node));
|
||||||
|
char* curmodule = module_ref_to_string(AST_get_node(node, 0));
|
||||||
|
|
||||||
|
char* composed = g_strjoin("::", curmodule, submodule, NULL);
|
||||||
|
char* cached_composed = mem_strdup(MemoryNamespaceSet, composed);
|
||||||
|
mem_free(composed);
|
||||||
|
mem_free(curmodule);
|
||||||
|
mem_free(submodule);
|
||||||
|
|
||||||
|
return cached_composed;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int createfuncall(FunctionCall* funcall, AST_NODE_PTR currentNode) {
|
int createfuncall(FunctionCall* funcall, AST_NODE_PTR currentNode) {
|
||||||
assert(currentNode != NULL);
|
assert(currentNode != NULL);
|
||||||
assert(currentNode->children->len == 2);
|
assert(currentNode->children->len == 2);
|
||||||
|
@ -2090,12 +2111,14 @@ int createfuncall(FunctionCall* funcall, AST_NODE_PTR currentNode) {
|
||||||
AST_NODE_PTR argsListNode = AST_get_node(currentNode, 1);
|
AST_NODE_PTR argsListNode = AST_get_node(currentNode, 1);
|
||||||
AST_NODE_PTR nameNode = AST_get_node(currentNode, 0);
|
AST_NODE_PTR nameNode = AST_get_node(currentNode, 0);
|
||||||
|
|
||||||
|
char* function_name = module_ref_to_string(nameNode);
|
||||||
|
|
||||||
Function* fun = NULL;
|
Function* fun = NULL;
|
||||||
if (nameNode->kind == AST_Ident) {
|
if (nameNode->kind == AST_ModuleRef || nameNode->kind == AST_Ident) {
|
||||||
int result = getFunction(nameNode->value, &fun);
|
int result = getFunction(function_name, &fun);
|
||||||
if (result == SEMANTIC_ERROR) {
|
if (result == SEMANTIC_ERROR) {
|
||||||
print_diagnostic(¤tNode->location, Error,
|
print_diagnostic(¤tNode->location, Error,
|
||||||
"Unknown function: `%s`", nameNode->value);
|
"Unknown function: `%s`", function_name);
|
||||||
return SEMANTIC_ERROR;
|
return SEMANTIC_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2107,10 +2130,8 @@ int createfuncall(FunctionCall* funcall, AST_NODE_PTR currentNode) {
|
||||||
// unique
|
// unique
|
||||||
const char* boxName =
|
const char* boxName =
|
||||||
AST_get_node(nameNode, (nameNode->children->len - 2))->value;
|
AST_get_node(nameNode, (nameNode->children->len - 2))->value;
|
||||||
const char* funName =
|
|
||||||
AST_get_node(nameNode, (nameNode->children->len - 1))->value;
|
|
||||||
|
|
||||||
const char* name = g_strjoin("", boxName, ".", funName, NULL);
|
const char* name = g_strjoin("", boxName, ".", function_name, NULL);
|
||||||
|
|
||||||
int result = getFunction(name, &fun);
|
int result = getFunction(name, &fun);
|
||||||
if (result) {
|
if (result) {
|
||||||
|
@ -2629,7 +2650,7 @@ int createFunction(Function* function, AST_NODE_PTR currentNode) {
|
||||||
|
|
||||||
// compose function name by appending parent modules
|
// compose function name by appending parent modules
|
||||||
char* modules = module_ref_to_str(currentNode->location.module_ref);
|
char* modules = module_ref_to_str(currentNode->location.module_ref);
|
||||||
char* composed_name = g_strjoin("", modules, ":", function->name, NULL);
|
char* composed_name = g_strjoin("", modules, "::", function->name, NULL);
|
||||||
g_free(modules);
|
g_free(modules);
|
||||||
function->name = composed_name;
|
function->name = composed_name;
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
%type <node_ptr> program
|
%type <node_ptr> program
|
||||||
%type <node_ptr> storage_expr
|
%type <node_ptr> storage_expr
|
||||||
%type <node_ptr> returnstmt
|
%type <node_ptr> returnstmt
|
||||||
|
%type <node_ptr> moduleref
|
||||||
|
|
||||||
|
|
||||||
%token KeyInt
|
%token KeyInt
|
||||||
|
@ -128,6 +129,7 @@
|
||||||
%token FunExtsupport
|
%token FunExtsupport
|
||||||
%token Invalid
|
%token Invalid
|
||||||
%token KeyReturn
|
%token KeyReturn
|
||||||
|
%token ModSep
|
||||||
|
|
||||||
/* Operator associativity */
|
/* Operator associativity */
|
||||||
/* Operators at lower line number have lower precedence */
|
/* Operators at lower line number have lower precedence */
|
||||||
|
@ -162,7 +164,11 @@ programbody: moduleimport {$$ = $1;}
|
||||||
| decl{$$ = $1;}
|
| decl{$$ = $1;}
|
||||||
| typedef{$$ = $1;};
|
| typedef{$$ = $1;};
|
||||||
|
|
||||||
|
moduleref: Ident {$$ = AST_new_node(new_loc(), AST_Ident, $1);}
|
||||||
|
| Ident ModSep moduleref {AST_NODE_PTR modref = AST_new_node(new_loc(), AST_ModuleRef, NULL);
|
||||||
|
AST_push_node(modref, AST_new_node(new_loc(), AST_Ident, $1));
|
||||||
|
AST_push_node(modref, $3);
|
||||||
|
$$ = modref;};
|
||||||
|
|
||||||
expr: ValFloat {$$ = AST_new_node(new_loc(), AST_Float, $1);}
|
expr: ValFloat {$$ = AST_new_node(new_loc(), AST_Float, $1);}
|
||||||
| ValInt {$$ = AST_new_node(new_loc(), AST_Int, $1);}
|
| ValInt {$$ = AST_new_node(new_loc(), AST_Int, $1);}
|
||||||
|
@ -352,9 +358,8 @@ reinterpretcast: expr KeyTo type %prec KeyTo { AST_NODE_PTR cast = AST_new_node(
|
||||||
DEBUG("Reinterpret-Cast"); };
|
DEBUG("Reinterpret-Cast"); };
|
||||||
|
|
||||||
|
|
||||||
funcall: Ident argumentlist {AST_NODE_PTR funcall = AST_new_node(new_loc(), AST_Call, NULL);
|
funcall: moduleref argumentlist {AST_NODE_PTR funcall = AST_new_node(new_loc(), AST_Call, NULL);
|
||||||
AST_NODE_PTR ident = AST_new_node(new_loc(), AST_Ident, $1);
|
AST_push_node(funcall, $1);
|
||||||
AST_push_node(funcall, ident);
|
|
||||||
AST_push_node(funcall, $2);
|
AST_push_node(funcall, $2);
|
||||||
$$ = funcall;
|
$$ = funcall;
|
||||||
DEBUG("Function call"); };
|
DEBUG("Function call"); };
|
||||||
|
|
Loading…
Reference in New Issue