From bf60e1a8f7054fbd3fba6b6a464856ccf24dcebc Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 20 Jul 2021 22:23:58 -0700 Subject: [PATCH] adding arena (p7) --- docs/metadesk_reference.mdesk | 1 + samples/node_errors/node_errors.c | 4 +- samples/old_style_custom_layer.c | 4 +- samples/output_parse/output_parse.c | 4 +- samples/parse_check.c | 4 +- .../static_site_generator.c | 4 +- samples/toy_language/toy_language.c | 4 +- source/md.c | 58 ++++++++++--------- source/md.h | 14 +++-- tests/sanity_tests.c | 2 +- 10 files changed, 55 insertions(+), 44 deletions(-) diff --git a/docs/metadesk_reference.mdesk b/docs/metadesk_reference.mdesk index 5fc4927..869494f 100644 --- a/docs/metadesk_reference.mdesk +++ b/docs/metadesk_reference.mdesk @@ -1222,6 +1222,7 @@ MD_MakeNodeError: @see(MD_Message) MD_MakeTokenError: { + arena: *MD_Arena, @doc("The entire string that is being parsed. The parser used a substring of this string to form @code 'token'.") parse_contents: MD_String8; @doc("The token associated with this message.") diff --git a/samples/node_errors/node_errors.c b/samples/node_errors/node_errors.c index f358406..f83a732 100644 --- a/samples/node_errors/node_errors.c +++ b/samples/node_errors/node_errors.c @@ -8,11 +8,11 @@ int main(int argument_count, char **arguments) MD_Arena *arena = MD_ArenaNew(1ull << 40); // NOTE(rjf): Parse all the files passed in via command line. - MD_Node *list = MD_MakeList(); + MD_Node *list = MD_MakeList(arena); for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; - MD_PushNewReference(list, root); + MD_PushNewReference(arena, list, root); } // NOTE(rjf): Print errors on every single node. diff --git a/samples/old_style_custom_layer.c b/samples/old_style_custom_layer.c index e3dce97..6dd91d8 100644 --- a/samples/old_style_custom_layer.c +++ b/samples/old_style_custom_layer.c @@ -26,11 +26,11 @@ int main(int argument_count, char **arguments) MD_Arena *arena = MD_ArenaNew(1ull << 40); // NOTE(rjf): Parse all the files passed in via command line. - MD_Node *list = MD_MakeList(); + MD_Node *list = MD_MakeList(arena); for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; - MD_PushNewReference(list, root); + MD_PushNewReference(arena, list, root); } // NOTE(rjf): Call "custom layer" back. diff --git a/samples/output_parse/output_parse.c b/samples/output_parse/output_parse.c index e49ba62..cfc2b03 100644 --- a/samples/output_parse/output_parse.c +++ b/samples/output_parse/output_parse.c @@ -67,11 +67,11 @@ int main(int argument_count, char **arguments) arena = MD_ArenaNew(1ull << 40); // NOTE(pmh): Parse all the files passed in via command line. - MD_Node *list = MD_MakeList(); + MD_Node *list = MD_MakeList(arena); for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; - MD_PushNewReference(list, root); + MD_PushNewReference(arena, list, root); } for(MD_EachNode(ref, list->first_child)) diff --git a/samples/parse_check.c b/samples/parse_check.c index 241b12f..b68de9f 100644 --- a/samples/parse_check.c +++ b/samples/parse_check.c @@ -5,11 +5,11 @@ int main(int argument_count, char **arguments) { MD_Arena *arena = MD_ArenaNew(1ull << 40); - MD_Node *list = MD_MakeList(); + MD_Node *list = MD_MakeList(arena); for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; - MD_PushNewReference(list, root); + MD_PushNewReference(arena, list, root); } for(MD_EachNodeRef(root, list->first_child)) diff --git a/samples/static_site_generator/static_site_generator.c b/samples/static_site_generator/static_site_generator.c index 6f37bf3..d136fba 100644 --- a/samples/static_site_generator/static_site_generator.c +++ b/samples/static_site_generator/static_site_generator.c @@ -66,7 +66,7 @@ int main(int argument_count, char **arguments) } //~ NOTE(rjf): Parse pages. - MD_Node *root_list = MD_MakeList(); + MD_Node *root_list = MD_MakeList(arena); { printf("Searching for site pages at \"%.*s\"...\n", MD_S8VArg(page_dir_path)); MD_FileInfo file_info = {0}; @@ -83,7 +83,7 @@ int main(int argument_count, char **arguments) MD_String8 path = MD_S8Fmt(arena, "%.*s/%.*s", MD_S8VArg(folder), MD_S8VArg(file_info.filename)); MD_Node *node = MD_ParseWholeFile(arena, path).node; - MD_PushNewReference(root_list, node); + MD_PushNewReference(arena, root_list, node); } } } diff --git a/samples/toy_language/toy_language.c b/samples/toy_language/toy_language.c index 85c2f46..2ef355f 100644 --- a/samples/toy_language/toy_language.c +++ b/samples/toy_language/toy_language.c @@ -189,11 +189,11 @@ int main(int argument_count, char **arguments) MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(arena, arg_list); //- rjf: parse all input files - MD_Node *file_list = MD_MakeList(); + MD_Node *file_list = MD_MakeList(arena); for(MD_String8Node *n = cmdln.inputs.first; n; n = n->next) { MD_ParseResult parse = MD_ParseWholeFile(arena, n->string); - MD_PushNewReference(file_list, parse.node); + MD_PushNewReference(arena, file_list, parse.node); } //- rjf: gather top-level symbol map diff --git a/source/md.c b/source/md.c index 5e6ebb1..510244a 100644 --- a/source/md.c +++ b/source/md.c @@ -1803,10 +1803,10 @@ MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds) return(result); } -MD_FUNCTION_IMPL MD_Message * -MD_MakeNodeError(MD_Node *node, MD_MessageKind kind, MD_String8 str) +MD_FUNCTION_IMPL MD_Message* +MD_MakeNodeError(MD_Arena *arena, MD_Node *node, MD_MessageKind kind, MD_String8 str) { - MD_Message *error = MD_PushArray(MD_Message, 1); //zero + MD_Message *error = MD_PushArrayZeroAr(arena, MD_Message, 1); error->node = node; error->kind = kind; error->string = str; @@ -1814,11 +1814,12 @@ MD_MakeNodeError(MD_Node *node, MD_MessageKind kind, MD_String8 str) } MD_FUNCTION_IMPL MD_Message * -MD_MakeTokenError(MD_String8 parse_contents, MD_Token token, MD_MessageKind kind, MD_String8 str) +MD_MakeTokenError(MD_Arena *arena, MD_String8 parse_contents, MD_Token token, + MD_MessageKind kind, MD_String8 str) { - MD_Node *err_node = MD_MakeNode(MD_NodeKind_ErrorMarker, MD_S8Lit(""), parse_contents, + MD_Node *err_node = MD_MakeNode(arena, MD_NodeKind_ErrorMarker, MD_S8Lit(""), parse_contents, token.raw_string.str - parse_contents.str); - return MD_MakeNodeError(err_node, kind, str); + return MD_MakeNodeError(arena, err_node, kind, str); } MD_FUNCTION_IMPL void @@ -2052,7 +2053,9 @@ MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *pare MD_NodeFlag_HasBraceLeft | MD_NodeFlag_HasBraceRight )) { - MD_Message *error = MD_MakeNodeError(child_parse.node, MD_MessageKind_Warning, MD_S8Lit("Unnamed set children of implicitly-delimited sets are not legal.")); + MD_String8 error_str = MD_S8Lit("Unnamed set children of implicitly-delimited sets are not legal."); + MD_Message *error = MD_MakeNodeError(arena, child_parse.node, MD_MessageKind_Warning, + error_str); MD_MessageListPush(&result.errors, error); } @@ -2095,7 +2098,8 @@ MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *pare { // NOTE(rjf): @error We didn't get a closer for the set MD_String8 error_str = MD_S8Fmt(arena, "Unbalanced \"%c\"", set_opener); - MD_Message *error = MD_MakeTokenError(string, initial_token, MD_MessageKind_CatastrophicError, error_str); + MD_Message *error = MD_MakeTokenError(arena, string, initial_token, + MD_MessageKind_CatastrophicError, error_str); MD_MessageListPush(&result.errors, error); } @@ -2103,7 +2107,7 @@ MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *pare if(close_with_separator && parsed_child_count == 0) { // NOTE(rjf): @error No empty implicitly-delimited sets - MD_Message *error = MD_MakeTokenError(string, initial_token, MD_MessageKind_Error, + MD_Message *error = MD_MakeTokenError(arena, string, initial_token, MD_MessageKind_Error, MD_S8Lit("Empty implicitly-delimited node list")); MD_MessageListPush(&result.errors, error); } @@ -2143,14 +2147,14 @@ _MD_ParseTagList(MD_Arena *arena, MD_String8 string, MD_u64 offset) // NOTE(rjf): @error Improper token for tag string MD_String8 error_str = MD_S8Fmt(arena, "\"%.*s\" is not a proper tag label", MD_S8VArg(name.raw_string)); - MD_Message *error = MD_MakeTokenError(string, name, MD_MessageKind_Error, error_str); + MD_Message *error = MD_MakeTokenError(arena, string, name, MD_MessageKind_Error, error_str); MD_MessageListPush(&result.errors, error); break; } off += name.raw_string.size; //- rjf: build tag - MD_Node *tag = MD_MakeNode(MD_NodeKind_Tag, name.string, name.raw_string, name_off); + MD_Node *tag = MD_MakeNode(arena, MD_NodeKind_Tag, name.string, name.raw_string, name_off); //- rjf: parse tag arguments MD_Token open_paren = MD_TokenFromString(MD_S8Skip(string, off)); @@ -2235,7 +2239,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) MD_u8 c = unnamed_set_opener.string.str[0]; if (c == '(' || c == '{' || c == '[') { - parsed_node = MD_MakeNode(MD_NodeKind_Main, MD_S8Lit(""), MD_S8Lit(""), + parsed_node = MD_MakeNode(arena, MD_NodeKind_Main, MD_S8Lit(""), MD_S8Lit(""), unnamed_set_opener.raw_string.str - string.str); children_parse = MD_ParseNodeSet(arena, string, off, parsed_node, MD_ParseSetRule_EndOnDelimiter); @@ -2246,7 +2250,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) { // NOTE(rjf): @error Unexpected set closing symbol MD_String8 error_str = MD_S8Fmt(arena, "Unbalanced \"%c\"", c); - MD_Message *error = MD_MakeTokenError(string, unnamed_set_opener, + MD_Message *error = MD_MakeTokenError(arena, string, unnamed_set_opener, MD_MessageKind_CatastrophicError, error_str); MD_MessageListPush(&result.errors, error); off += unnamed_set_opener.raw_string.size; @@ -2255,7 +2259,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) { // NOTE(rjf): @error Unexpected reserved symbol MD_String8 error_str = MD_S8Fmt(arena, "Unexpected reserved symbol \"%c\"", c); - MD_Message *error = MD_MakeTokenError(string, unnamed_set_opener, + MD_Message *error = MD_MakeTokenError(arena, string, unnamed_set_opener, MD_MessageKind_Error, error_str); MD_MessageListPush(&result.errors, error); off += unnamed_set_opener.raw_string.size; @@ -2270,7 +2274,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) if((label_name.kind & MD_TokenGroup_Label) != 0) { off += label_name.raw_string.size; - parsed_node = MD_MakeNode(MD_NodeKind_Main, label_name.string, label_name.raw_string, + parsed_node = MD_MakeNode(arena, MD_NodeKind_Main, label_name.string, label_name.raw_string, label_name.raw_string.str - string.str); parsed_node->flags |= label_name.node_flags; @@ -2315,7 +2319,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) // NOTE(rjf): @error Bad character MD_String8 error_str = MD_S8Fmt(arena, "Non-ASCII character \"%.*s\"", MD_S8VArg(byte_string)); - MD_Message *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_Message *error = MD_MakeTokenError(arena, string, bad_token, MD_MessageKind_Error, error_str); MD_MessageListPush(&result.errors, error); }break; @@ -2323,7 +2327,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) case MD_TokenKind_BrokenComment: { // NOTE(rjf): @error Broken Comments - MD_Message *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_Message *error = MD_MakeTokenError(arena, string, bad_token, MD_MessageKind_Error, MD_S8Lit("Unterminated comment")); MD_MessageListPush(&result.errors, error); }break; @@ -2331,7 +2335,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) case MD_TokenKind_BrokenStringLiteral: { // NOTE(rjf): @error Broken String Literals - MD_Message *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_Message *error = MD_MakeTokenError(arena, string, bad_token, MD_MessageKind_Error, MD_S8Lit("Unterminated string literal")); MD_MessageListPush(&result.errors, error); }break; @@ -2390,7 +2394,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) MD_FUNCTION_IMPL MD_ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents) { - MD_Node *root = MD_MakeNode(MD_NodeKind_File, filename, contents, 0); + MD_Node *root = MD_MakeNode(arena, MD_NodeKind_File, filename, contents, 0); MD_ParseResult result = MD_ParseNodeSet(arena, contents, 0, root, MD_ParseSetRule_Global); result.node = result.last_node = root; for(MD_Message *error = result.errors.first; error != 0; error = error->next) @@ -2412,7 +2416,7 @@ MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename) { // NOTE(rjf): @error File failing to load MD_String8 error_str = MD_S8Fmt(arena, "Could not read file \"%.*s\"", MD_S8VArg(filename)); - MD_Message *error = MD_MakeNodeError(parse.node, MD_MessageKind_CatastrophicError, + MD_Message *error = MD_MakeNodeError(arena, parse.node, MD_MessageKind_CatastrophicError, error_str); MD_MessageListPush(&parse.errors, error); } @@ -2467,9 +2471,10 @@ MD_FUNCTION_IMPL MD_Node * MD_NilNode(void) { return &_md_nil_node; } MD_FUNCTION_IMPL MD_Node * -MD_MakeNode(MD_NodeKind kind, MD_String8 string, MD_String8 raw_string, MD_u64 offset) +MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string, MD_String8 raw_string, + MD_u64 offset) { - MD_Node *node = MD_PushArray(MD_Node, 1); + MD_Node *node = MD_PushArrayZeroAr(arena, MD_Node, 1); node->kind = kind; node->string = string; node->raw_string = raw_string; @@ -2501,17 +2506,18 @@ MD_PushTag(MD_Node *node, MD_Node *tag) } MD_FUNCTION_IMPL MD_Node* -MD_MakeList(void) +MD_MakeList(MD_Arena *arena) { MD_String8 empty = {0}; - MD_Node *result = MD_MakeNode(MD_NodeKind_List, empty, empty, 0); + MD_Node *result = MD_MakeNode(arena, MD_NodeKind_List, empty, empty, 0); return(result); } MD_FUNCTION_IMPL MD_Node* -MD_PushNewReference(MD_Node *list, MD_Node *target) +MD_PushNewReference(MD_Arena *arena, MD_Node *list, MD_Node *target) { - MD_Node *n = MD_MakeNode(MD_NodeKind_Reference, target->string, target->raw_string, target->offset); + MD_Node *n = MD_MakeNode(arena, MD_NodeKind_Reference, target->string, target->raw_string, + target->offset); n->ref_target = target; MD_PushChild(list, n); return(n); diff --git a/source/md.h b/source/md.h index efd7e3c..3865956 100644 --- a/source/md.h +++ b/source/md.h @@ -830,8 +830,11 @@ MD_FUNCTION MD_MapSlot* MD_MapOverwrite(MD_Arena *arena, MD_Map *map, MD_MapKey MD_FUNCTION MD_b32 MD_TokenGroupContainsKind(MD_TokenGroups groups, MD_TokenKind kind); MD_FUNCTION MD_Token MD_TokenFromString(MD_String8 string); MD_FUNCTION MD_u64 MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds); -MD_FUNCTION MD_Message * MD_MakeNodeError(MD_Node *node, MD_MessageKind kind, MD_String8 str); -MD_FUNCTION MD_Message * MD_MakeTokenError(MD_String8 parse_contents, MD_Token token, MD_MessageKind kind, MD_String8 str); +MD_FUNCTION MD_Message * MD_MakeNodeError(MD_Arena *arena, MD_Node *node, + MD_MessageKind kind, MD_String8 str); +MD_FUNCTION MD_Message * MD_MakeTokenError(MD_Arena *arena, MD_String8 parse_contents, + MD_Token token, MD_MessageKind kind, + MD_String8 str); MD_FUNCTION void MD_MessageListPush(MD_MessageList *list, MD_Message *message); MD_FUNCTION void MD_MessageListConcat(MD_MessageList *list, MD_MessageList *to_push); MD_FUNCTION MD_ParseResult MD_ParseResultZero(void); @@ -849,12 +852,13 @@ MD_FUNCTION MD_CodeLoc MD_CodeLocFromNode(MD_Node *node); MD_FUNCTION MD_b32 MD_NodeIsNil(MD_Node *node); MD_FUNCTION MD_Node *MD_NilNode(void); -MD_FUNCTION MD_Node *MD_MakeNode(MD_NodeKind kind, MD_String8 string, MD_String8 raw_string, MD_u64 offset); +MD_FUNCTION MD_Node *MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string, + MD_String8 raw_string, MD_u64 offset); MD_FUNCTION void MD_PushChild(MD_Node *parent, MD_Node *new_child); MD_FUNCTION void MD_PushTag(MD_Node *node, MD_Node *tag); -MD_FUNCTION MD_Node *MD_MakeList(void); -MD_FUNCTION MD_Node *MD_PushNewReference(MD_Node *list, MD_Node *target); +MD_FUNCTION MD_Node *MD_MakeList(MD_Arena *arena); +MD_FUNCTION MD_Node *MD_PushNewReference(MD_Arena *arena, MD_Node *list, MD_Node *target); //~ Introspection Helpers diff --git a/tests/sanity_tests.c b/tests/sanity_tests.c index 3a552a0..4ce3a1e 100644 --- a/tests/sanity_tests.c +++ b/tests/sanity_tests.c @@ -67,7 +67,7 @@ EndTest(void) static MD_Node * MakeTestNode(MD_NodeKind kind, MD_String8 string) { - return MD_MakeNode(kind, string, string, 0); + return MD_MakeNode(arena, kind, string, string, 0); } static MD_C_Expr *