diff --git a/pervognsen/bitwise/bitwise/bitwise010_1.hmml b/pervognsen/bitwise/bitwise/bitwise010_1.hmml new file mode 100644 index 0000000..09e18bc --- /dev/null +++ b/pervognsen/bitwise/bitwise/bitwise010_1.hmml @@ -0,0 +1,70 @@ +[video member=pervognsen stream_platform=twitch project=bitwise title="C Code Generation" vod_platform=youtube id=X9YWYlp8iQg annotator=Miblo] +[0:08][Recap and set the stage for the day][:speech] +[1:30][C Code Generation][:"code generation" :language :speech] +[6:59][Valid types in Ion][:"code generation" :language :speech] +[10:02][Translating Ion to C, with a few words on the principle of "declaration follows use" and the quirks of C function declaration syntax[ref + author=ANSI + title="ISO/IEC 9899: Information technology – Programming languages – C" + url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf]][:"code generation" :language :speech] +[16:04][Translating Ion's (ptr int) and (ptr (ptr int))][:"code generation" :language :speech] +[19:58][Translating Ion's (array 10 (ptr int))][:"code generation" :language :speech] +[21:21][Translating Ion's (func int (int))][:"code generation" :language :speech] +[24:09][Q&A][:speech] +[24:39][Setup to translate Ion's type declarations to C][:"code generation"] +[25:57][Introduce gen_test() and type_to_cdecl() - handling void, char, int and float - and a strf()][:"code generation"] +[31:55][:Run it to see that strf() works as expected][:"code generation"] +[32:38][Add tests for strf() in common_test()][:"code generation"] +[33:41][:Run it to see that we pass all the tests][:"code generation"] +[33:45][Implement the TYPE_PTR and TYPE_ARRAY cases in type_to_cdecl()][:"code generation"] +[35:39][Create and :run tests for type_to_cdelc() in gen_test()][:"code generation" :programming] +[38:59][Implement the TYPE_FUNC case in type_to_cdelc()][:"code generation"] +[43:09][Add a test of the function :"code generation" of type_to_cdelc() in gen_test()] +[43:43][Step through gen_test() to see what it produces][:"code generation" :run] +[44:15][Remove parentheses from the void, char, int and float types in type_to_cdelc()][:"code generation"] +[44:42][:Run it to see that it looks reasonable, but for the extra space][:"code generation"] +[45:08][Stress test the function :"code generation" of type_to_cdelc() in gen_test()] +[45:56][:Run it to see that it looks vaguely right, and consider how we'll get rid of the extra parentheses][:"code generation"] +[46:30][Add function pointer tests in gen_test()][:"code generation"] +[47:21][:Run it to see that we're generating illegal C][:"code generation"] +[48:18][Fix the TYPE_PTR case in type_to_cdelc()][:"code generation"] +[48:36][:Run it to see that it looks right][:"code generation"] +[49:12][Add an array test in get_test()][:"code generation"] +[49:42][:Run it to see extra parentheses again][:"code generation"] +[50:22][Introduce opt_paren() to handle parenthesis generation for type_to_cdelc() to call][:"code generation"] +[54:50][:Run it to see that it looks right][:"code generation"] +[55:35][@pmttavara][Can't you just pass in some dummy name to workaround the missing name? Like (__arg\[10\])][:"code generation"] +[56:22][@twitchplaysp0ng][Does Ion support named function pointer parameters][:language] +[57:02][Rename opt_paren() to cdecl_paren() and clean up the space-generation in type_to_cdelc()][:"code generation"] +[58:00][:Run it to see that it's starting to look correct][:"code generation"] +[58:19][][:"code generation"][quote 4] +[58:49][Further thoughts on dummy names, noting that we'll be using this same code for casts][:"code generation" :speech] +[1:00:07][@elavid][@PMTTavara's idea works for me at least in GCC. We're specifically talking about the function pointer arguments. Example cast: (int (*)(int dummyname))0][:"code generation"] +[1:01:22][@0b0000000000000][Function that returns array of function pointers with pointer arguments][quote 5] +[1:01:29][Add a test of a function that returns (unfortunately unintentionally) a function in gen_test()][:"code generation"] +[1:02:38][:Run it to see that it looks wrong][:"code generation"] +[1:04:29][@rygorous][You can't return functions directly][:language] +[1:04:48][Construct a C-valid function declaration that returns an array of function pointers][:language] +[1:08:58][@twitchplaysp0ng][@pervognsen Change line 21][:"code generation"] +[1:09:10][Work through the handling of our torture test in the TYPE_FUNC case in type_to_cdelc()][:"code generation"] +[1:12:27][:Run it to find that it does work][:"code generation"] +[1:12:58][@0b0000000000000][You could also typedef any function pointer types to make it easier?][:"code generation"] +[1:13:19][Add our intended torture test of a function that returns an array of function pointers in gen_test()][:"code generation"] +[1:14:23][:Run it to see that we correctly generate our torture test case][:"code generation"] +[1:15:28][A few words on constructing C declarations in the knowledge of its inside-to-out parsing][:language :speech] +[1:17:03][@rygorous][No, that array is an argument. Or, wait, is it? I don't actually know what the args to type_func are][:"code generation" :language] +[1:17:17][Rename gen_test() to cdecl_test()][:"code generation"] +[1:17:46][@rygorous][No, MSVC says that a function returning an array is illegal][:language] +[1:18:07][Determine to enable type_to_cdecl() to handle structs and unions, introducing cdecl_name() to produce the type strings for our types][:"code generation"] +[1:21:19][Introduce gen_decl() and genf(), and determine to enable the resolver code to pass the resolve type through to the generator][:"code generation"] +[1:24:07][Mini :rant on MSVC's "Go to All" feature's regex-style interpretation of "."] +[1:24:32][Add a Type *type to the Expr struct for resolve_expected_expr() to fill out, and change the Decl struct to contain a Sym *sym rather than a Type *type for sym_global_decl() to set][:parsing] +[1:29:24][Q&A][:speech] +[1:29:44][@elavid][Oh, are we gonna have a K&R moment? You should add "void" if the num_params is 0][:language] +[1:30:06][Make type_to_cdecl() add "void" for functions that take no arguments][:"code generation"] +[1:30:42][:Run it to see that it correctly adds "void"][:"code generation"] +[1:31:23][@0b0000000000000][@pervognsen You need break statements on those cases] +[1:31:37][@0b0000000000000][@pervognsen You broke the switch statement that had returns] +[1:31:51][Fix resolve_expected_expr() to break out of the cases in its switch statement][:parsing] +[1:32:47][Stop the recording][:speech] +[/video] + diff --git a/pervognsen/bitwise/bitwise/bitwise010_2.hmml b/pervognsen/bitwise/bitwise/bitwise010_2.hmml new file mode 100644 index 0000000..bd135b9 --- /dev/null +++ b/pervognsen/bitwise/bitwise/bitwise010_2.hmml @@ -0,0 +1,3 @@ +[video member=pervognsen stream_platform=twitch project=bitwise title="C Code Generation" vod_platform=youtube id=C4H8UJDXfak annotator=Miblo] +[0:00][\[Entire stream, not annotated\]][:"code generation"] +[/video]