Skip to content

Commit 6ab8611

Browse files
committed
work on templates
1 parent 516de54 commit 6ab8611

File tree

2 files changed

+50
-34
lines changed

2 files changed

+50
-34
lines changed

semantic/metac_semantic.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ typedef struct metac_sema_decl_state_t
7373
M(aggregate, UnionTypeTable, union) \
7474
M(typedef, TypedefTypeTable, typedef) \
7575
M(functiontype, FunctionTypeTable, functiontype) \
76-
M(tuple, TupleTypeTable, tuple)
76+
M(tuple, TupleTypeTable, tuple) \
77+
M(template, TemplateTypeTable, template)
7778

7879
#define FOREACH_ON_RESOLVE_FAIL(M) \
7980
M(OnResolveFail_Invalid) \

semantic/metac_type_semantic.c

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,24 @@ metac_type_index_t MetaCSemantic_TypeSemantic(metac_sema_state_t* self,
11191119
decl_type_struct_t* agg = (decl_type_struct_t*) type;
11201120
metac_type_aggregate_t tmpSemaAggMem = {(metac_decl_kind_t)0};
11211121
metac_type_aggregate_t* tmpSemaAgg = &tmpSemaAggMem;
1122+
metac_scope_t tmpTemplateScope = {0};
1123+
1124+
if (agg->ParameterCount != 0)
1125+
{
1126+
U32(tmpTemplateScope.ScopeFlags) |= scope_flag_temporary;
1127+
MetaCSemantic_PushTemporaryScope(self, &tmpTemplateScope);
1128+
for(decl_parameter_t* param = agg->Parameters;
1129+
METAC_NODE(param->Next) != emptyNode;
1130+
param = param->Next)
1131+
{
1132+
metac_expr_t placeHolder;
1133+
1134+
AllocNewSemaExpr(self, )
1135+
metac_node_t unsresolvedNode = (metac_node_t) 0x2;
1136+
MetaCScope_RegisterIdentifier(&tmpTemplateScope, param->Parameter->VarIdentifier, unresolvedNode);
1137+
}
1138+
xprintf("We have a template\n");
1139+
}
11221140

11231141
if (type->Kind == decl_type_struct)
11241142
typeKind = type_struct;
@@ -1268,46 +1286,43 @@ metac_type_index_t MetaCSemantic_TypeSemantic(metac_sema_state_t* self,
12681286
MetaCPrinter_Init(&debugPrinter, self->ParserIdentifierTable, self->ParserStringTable, &self->TempAlloc);
12691287
#endif
12701288
ARENA_ARRAY_ENSURE_SIZE(semaArguments, tInst->ArgumentCount);
1289+
// before calling semantic we need to mount the template instance scope.
1290+
metac_scope_t tmpScope = {(metac_decl_kind_t)0};
1291+
U32(tmpScope.ScopeFlags) |= scope_flag_temporary;
1292+
MetaCSemantic_PushTemporaryScope(self, &tmpScope);
12711293

1294+
for(metac_expr_t** ep = &args->Expr; METAC_NODE(args) != emptyNode; args = args->Next, ep = &args->Expr)
1295+
{
1296+
metac_expr_t* e = *ep;
1297+
ARENA_ARRAY_ADD(semaArguments, MetaCSemantic_doExprSemantic(self, e, 0));
1298+
}
12721299

1273-
for(metac_expr_t* e = args->Expr; METAC_NODE(args) != emptyNode; args = args->Next, e = args->Expr)
12741300
{
1275-
#if 0
1276-
MetaCPrinter_PrintExpr(&debugPrinter, e);
1277-
if (METAC_NODE(args->Next) != emptyNode)
1301+
metac_decl_t* symbol = NULL;
1302+
metac_expr_t* arguments = cast(metac_expr_t*) emptyNode;
1303+
uint32_t hash = crc32c_nozero(~0, &symbol->Hash, sizeof(symbol->Hash));
1304+
uint32_t nArguments = 0;
1305+
for(uint32_t argIdx = 0; argIdx < nArguments; argIdx++)
12781306
{
1279-
MetaCPrinter_RemoveZeroTerminator(&debugPrinter);
1280-
MetacPrinter_PrintStringLiteral(&debugPrinter, ", ");
1307+
hash = crc32c_nozero(hash, &arguments[argIdx].Hash, sizeof(arguments[argIdx].Hash));
12811308
}
1282-
#endif
1283-
ARENA_ARRAY_ADD(semaArguments, MetaCSemantic_doExprSemantic(self, e, 0));
1284-
}
1285-
int k = 12;
1286-
assert(!"I don't do template instances just yet");
1287-
1288-
1289-
1290-
/*
1291-
metac_type_header_t Header;
1292-
metac_type_index_t TypeIndex;
1293-
metac_decl_t* Symbol;
1294-
metac_expr_t* Arguments;
1295-
uint32_t ArgumentCount;
1296-
*/
1297-
uint32_t hash = ~0;
1298-
metac_decl_t* symbol = NULL;
1299-
metac_expr_t* arguments = cast(metac_expr_t*) emptyNode;
1300-
uint32_t nArguments = 0;
13011309
{
13021310
metac_type_header_t header = {decl_type_template_instance, 0, hash, 0};
1303-
metac_type_template_t key = {
1304-
header,
1305-
zeroIdx,
1306-
symbol,
1307-
arguments,
1308-
nArguments,
1309-
};
1310-
}
1311+
metac_type_template_t key = {
1312+
header,
1313+
zeroIdx,
1314+
symbol,
1315+
arguments,
1316+
nArguments,
1317+
};
1318+
result = MetaCTypeTable_GetOrEmptyTemplateType(&self->TemplateTypeTable, &key);
1319+
if (result.v == 0)
1320+
{
1321+
MetaCTypeTable_AddTemplateType(&self->TemplateTypeTable, &key);
1322+
}
1323+
}
1324+
1325+
}
13111326

13121327
}
13131328
else if (type->Kind == decl_type)

0 commit comments

Comments
 (0)