Skip to content

Commit 912cc6b

Browse files
committed
Bugfixes during hiatus
Found while doing some metaprogramming for day 42 of handmade hero.
1 parent 3dd5482 commit 912cc6b

File tree

6 files changed

+82
-52
lines changed

6 files changed

+82
-52
lines changed

gencpp.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@
330330
<ClCompile Include="project\dependencies\strings.cpp" />
331331
<ClCompile Include="project\dependencies\string_ops.cpp" />
332332
<ClCompile Include="project\dependencies\timing.cpp" />
333+
<ClCompile Include="project\Example.cpp" />
333334
<ClCompile Include="project\gen.cpp" />
334335
<ClCompile Include="project\gen.dep.cpp" />
335336
<ClCompile Include="singleheader\singleheader.cpp" />

project/components/ast.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,10 @@ String AST::to_string()
11251125
if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export ))
11261126
result.append( "export " );
11271127

1128-
result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() );
1128+
if ( Params )
1129+
result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() );
1130+
else
1131+
result.append_fmt( "template<>\n%S", Declaration->to_string() );
11291132
}
11301133
break;
11311134

project/components/interface.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,21 +175,21 @@ void define_constants()
175175
#endif
176176
# undef def_constant_code_type
177177

178-
# pragma push_macro( "forceinline" )
179-
# pragma push_macro( "global" )
180-
# pragma push_macro( "internal" )
181-
# pragma push_macro( "local_persist" )
182-
# pragma push_macro( "neverinline" )
183-
# undef forceinline
184-
# undef global
185-
# undef internal
186-
# undef local_persist
187-
# undef neverinline
188178

189179
# define def_constant_spec( Type_, ... ) \
190180
spec_##Type_ = def_specifiers( num_args(__VA_ARGS__), __VA_ARGS__); \
191181
spec_##Type_.set_global();
192182

183+
# pragma push_macro("forceinline")
184+
# pragma push_macro("global")
185+
# pragma push_macro("internal")
186+
# pragma push_macro("local_persist")
187+
# pragma push_macro("neverinline")
188+
# undef forceinline
189+
# undef global
190+
# undef internal
191+
# undef local_persist
192+
# undef neverinline
193193
def_constant_spec( const, ESpecifier::Const );
194194
def_constant_spec( consteval, ESpecifier::Consteval );
195195
def_constant_spec( constexpr, ESpecifier::Constexpr );
@@ -218,11 +218,11 @@ void define_constants()
218218
spec_local_persist = def_specifiers( 1, ESpecifier::Local_Persist );
219219
spec_local_persist.set_global();
220220

221-
# pragma pop_macro( "forceinline" )
222-
# pragma pop_macro( "global" )
223-
# pragma pop_macro( "internal" )
224-
# pragma pop_macro( "local_persist" )
225-
# pragma pop_macro( "neverinline" )
221+
# pragma pop_macro("forceinline")
222+
# pragma pop_macro("global")
223+
# pragma pop_macro("internal")
224+
# pragma pop_macro("local_persist")
225+
# pragma pop_macro("neverinline")
226226

227227
# undef def_constant_spec
228228
}

project/components/interface.parsing.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,18 @@ namespace Parser
775775

776776
if (left)
777777
move_forward();
778+
779+
if ( current == '=' )
780+
{
781+
token.Length++;
782+
token.IsAssign = true;
783+
// token.Flags |= TokFlags::Assignment;
784+
// token.Type = TokType::Assign_Multiply;
785+
786+
if ( left )
787+
move_forward();
788+
}
789+
778790
goto FoundToken;
779791
}
780792
case ';':
@@ -973,7 +985,14 @@ namespace Parser
973985

974986
if ( left )
975987
{
976-
if ( current == '/' )
988+
if ( current == '=' )
989+
{
990+
// token.Type = TokeType::Assign_Divide;
991+
move_forward();
992+
token.Length++;
993+
token.IsAssign = true;
994+
}
995+
else if ( current == '/' )
977996
{
978997
token.Type = TokType::Comment;
979998
token.Length = 2;
@@ -2820,7 +2839,7 @@ CodeOperator parse_operator_after_ret_type(
28202839
if ( currtok.Text[1] == '=' )
28212840
op = Assign_Add;
28222841

2823-
if ( currtok.Text[1] == '+' )
2842+
else if ( currtok.Text[1] == '+' )
28242843
op = Increment;
28252844

28262845
else
@@ -2840,7 +2859,7 @@ CodeOperator parse_operator_after_ret_type(
28402859
break;
28412860
}
28422861

2843-
if ( currtok.Text[1] == '=' )
2862+
else if ( currtok.Text[1] == '=' )
28442863
op = Assign_Subtract;
28452864

28462865
else
@@ -3196,6 +3215,12 @@ CodeParam parse_params( bool use_template_capture )
31963215
Context.pop();
31973216
return { nullptr };
31983217
}
3218+
else if ( check ( TokType::Operator ) && currtok.Text[0] == '>' )
3219+
{
3220+
eat( TokType::Operator );
3221+
Context.pop();
3222+
return { nullptr };
3223+
}
31993224

32003225
CodeType type = { nullptr };
32013226
Code value = { nullptr };

project/components/interface.upfront.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,17 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy
3535
return OpValidateResult::Fail; \
3636
}
3737

38-
# define check_param_eq_ret() \
39-
if ( ! is_member_symbol && params_code->ValueType != ret_type ) \
40-
{ \
41-
log_failure("gen_def_operator: operator%s requires first parameter to equal return type\n" \
42-
"param types: %s\n" \
43-
"return type: %s", \
44-
to_str(op), \
45-
params_code.debug_str(), \
46-
ret_type.debug_str() \
47-
); \
48-
return OpValidateResult::Fail; \
38+
# define check_param_eq_ret() \
39+
if ( ! is_member_symbol && ! params_code->ValueType.is_equal( ret_type) ) \
40+
{ \
41+
log_failure("gen::def_operator: operator%s requires first parameter to equal return type\n" \
42+
"param types: %s\n" \
43+
"return type: %s", \
44+
to_str(op).Ptr, \
45+
params_code.debug_str(), \
46+
ret_type.debug_str() \
47+
); \
48+
return OpValidateResult::Fail; \
4949
}
5050
#pragma endregion Helper Macros
5151

@@ -947,6 +947,7 @@ CodeOperator def_operator( OperatorT op, StrC nspace
947947
result = (CodeOperator) make_code();
948948
result->Name = get_cached_string( { str_len(name), name } );
949949
result->ModuleFlags = mflags;
950+
result->Op = op;
950951

951952
if ( body )
952953
{

project/helpers/helper.hpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ CodeBody gen_ecode( char const* path )
3232

3333
CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { <entries> NumTypes };"));
3434

35-
#pragma push_macro( "local_persist" )
35+
#pragma push_macro("local_persist")
3636
#undef local_persist
3737
CodeFn to_str = parse_function( token_fmt( "entries", (StrC)to_str_entries, stringize(
3838
StrC to_str( Type type )
@@ -45,7 +45,7 @@ CodeBody gen_ecode( char const* path )
4545
return lookup[ type ];
4646
}
4747
)));
48-
#pragma pop_macro( "local_persist" )
48+
#pragma pop_macro("local_persist")
4949

5050
CodeNS nspace = def_namespace( name(ECode), def_namespace_body( args( enum_code, to_str ) ) );
5151
CodeUsing code_t = def_using( name(CodeT), def_type( name(ECode::Type) ) );
@@ -86,7 +86,7 @@ CodeBody gen_eoperator( char const* path )
8686
};
8787
)));
8888

89-
#pragma push_macro( "local_persist" )
89+
#pragma push_macro("local_persist")
9090
#undef local_persist
9191
CodeFn to_str = parse_function(token_fmt("entries", (StrC)to_str_entries, stringize(
9292
StrC to_str( Type op )
@@ -99,7 +99,7 @@ CodeBody gen_eoperator( char const* path )
9999
return lookup[ op ];
100100
}
101101
)));
102-
#pragma pop_macro( "local_persist" )
102+
#pragma pop_macro("local_persist")
103103

104104
CodeNS nspace = def_namespace( name(EOperator), def_namespace_body( args( enum_code, to_str ) ) );
105105

@@ -148,11 +148,11 @@ CodeBody gen_especifier( char const* path )
148148
}
149149
)));
150150

151-
#pragma push_macro( "local_persist" )
152-
#pragma push_macro( "do_once_start" )
153-
#pragma push_macro( "do_once_end" )
154-
#pragma push_macro( "forceinline" )
155-
#pragma push_macro( "neverinline" )
151+
#pragma push_macro("local_persist")
152+
#pragma push_macro("do_once_start")
153+
#pragma push_macro("do_once_end")
154+
#pragma push_macro("forceinline")
155+
#pragma push_macro("neverinline")
156156
#undef local_persist
157157
#undef do_once_start
158158
#undef do_once_end
@@ -197,11 +197,11 @@ CodeBody gen_especifier( char const* path )
197197
return Invalid;
198198
}
199199
)));
200-
#pragma pop_macro( "local_persist" )
201-
#pragma pop_macro( "do_once_start" )
202-
#pragma pop_macro( "do_once_end" )
203-
#pragma pop_macro( "forceinline" )
204-
#pragma pop_macro( "neverinline" )
200+
#pragma pop_macro("local_persist")
201+
#pragma pop_macro("do_once_start")
202+
#pragma pop_macro("do_once_end")
203+
#pragma pop_macro("forceinline")
204+
#pragma pop_macro("neverinline")
205205

206206
CodeNS nspace = def_namespace( name(ESpecifier), def_namespace_body( args( enum_code, is_trailing, to_str, to_type ) ) );
207207

@@ -260,10 +260,10 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
260260
attribute_define_entries.append( "\n");
261261
}
262262

263-
#pragma push_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" )
263+
#pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
264264
#undef GEN_DEFINE_ATTRIBUTE_TOKENS
265265
CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), attribute_define_entries );
266-
#pragma pop_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" )
266+
#pragma pop_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
267267

268268
CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, "attribute_toks", (StrC)attribute_entries, stringize(
269269
enum Type : u32
@@ -274,9 +274,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
274274
};
275275
)));
276276

277-
#pragma push_macro( "local_persist" )
278-
#pragma push_macro( "do_once_start" )
279-
#pragma push_macro( "do_once_end" )
277+
#pragma push_macro("local_persist")
278+
#pragma push_macro("do_once_start")
279+
#pragma push_macro("do_once_end")
280280
#undef local_persist
281281
#undef do_once_start
282282
#undef do_once_end
@@ -320,9 +320,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
320320
return Invalid;
321321
}
322322
)));
323-
#pragma pop_macro( "local_persist" )
324-
#pragma pop_macro( "do_once_start" )
325-
#pragma pop_macro( "do_once_end" )
323+
#pragma pop_macro("local_persist")
324+
#pragma pop_macro("do_once_start")
325+
#pragma pop_macro("do_once_end")
326326

327327
CodeNS nspace = def_namespace( name(ETokType), def_namespace_body( args( attribute_entires_def, enum_code, to_str, to_type ) ) );
328328
CodeUsing td_toktype = def_using( name(TokType), def_type( name(ETokType::Type) ) );

0 commit comments

Comments
 (0)