Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit da702f2

Browse files
committed
[[ CleanupVM ]] Clean up the VM code to allow easier changes.
This patch: - removes the unused context variable implementation - refactors register fetch and stores to ensure they go through (Checked)Fetch/StoreFrom/ToRegisterInFrame - gets rid of variable shadowing warnings in various for loops - gets rid of integer conversion warnings from several functions
1 parent 423e267 commit da702f2

File tree

13 files changed

+352
-460
lines changed

13 files changed

+352
-460
lines changed

libscript/include/libscript/script.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ enum MCScriptDefinitionKind
272272
kMCScriptDefinitionKindEvent,
273273
kMCScriptDefinitionKindSyntax,
274274
kMCScriptDefinitionKindDefinitionGroup,
275-
kMCScriptDefinitionKindContextVariable,
276275

277276
kMCScriptDefinitionKind__Last,
278277
};
@@ -286,14 +285,6 @@ enum MCScriptHandlerTypeParameterMode
286285
kMCScriptHandlerTypeParameterMode__Last
287286
};
288287

289-
enum MCScriptHandlerScope
290-
{
291-
kMCScriptHandlerScopeNormal,
292-
kMCScriptHandlerScopeContext,
293-
294-
kMCScriptHandlerScope__Last,
295-
};
296-
297288
void MCScriptBeginModule(MCScriptModuleKind kind, MCNameRef name, MCScriptModuleBuilderRef& r_builder);
298289
bool MCScriptEndModule(MCScriptModuleBuilderRef builder, MCStreamRef stream);
299290

@@ -327,9 +318,8 @@ void MCScriptAddDefinitionToModule(MCScriptModuleBuilderRef builder, uindex_t& r
327318
void MCScriptAddTypeToModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t type, uindex_t index);
328319
void MCScriptAddConstantToModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t const_idx, uindex_t index);
329320
void MCScriptAddVariableToModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t type, uindex_t index);
330-
void MCScriptAddContextVariableToModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t type, uindex_t index, uindex_t def_index);
331321

332-
void MCScriptBeginHandlerInModule(MCScriptModuleBuilderRef builder, MCScriptHandlerScope scope, MCNameRef name, uindex_t signature, uindex_t index);
322+
void MCScriptBeginHandlerInModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t signature, uindex_t index);
333323
void MCScriptAddParameterToHandlerInModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t type, uindex_t& r_index);
334324
void MCScriptAddVariableToHandlerInModule(MCScriptModuleBuilderRef builder, MCNameRef name, uindex_t type, uindex_t& r_index);
335325
void MCScriptEndHandlerInModule(MCScriptModuleBuilderRef builder);

libscript/src/script-builder.cpp

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -438,29 +438,6 @@ void MCScriptAddVariableToModule(MCScriptModuleBuilderRef self, MCNameRef p_name
438438
t_definition -> type = p_type;
439439
}
440440

441-
void MCScriptAddContextVariableToModule(MCScriptModuleBuilderRef self, MCNameRef p_name, uindex_t p_type, uindex_t p_def_index, uindex_t p_index)
442-
{
443-
if (self == nil || !self -> valid)
444-
return;
445-
446-
if (p_index >= self -> module . definition_count ||
447-
self -> module . definitions[p_index] != nil ||
448-
!MCMemoryNew((MCScriptContextVariableDefinition*&)self -> module . definitions[p_index]))
449-
{
450-
self -> valid = false;
451-
return;
452-
}
453-
454-
__assign_definition_name(self, p_index, p_name);
455-
456-
MCScriptContextVariableDefinition *t_definition;
457-
t_definition = static_cast<MCScriptContextVariableDefinition *>(self -> module . definitions[p_index]);
458-
459-
t_definition -> kind = kMCScriptDefinitionKindContextVariable;
460-
t_definition -> type = p_type;
461-
t_definition -> default_value = p_def_index;
462-
}
463-
464441
void MCScriptAddForeignHandlerToModule(MCScriptModuleBuilderRef self, MCNameRef p_name, uindex_t p_signature, MCStringRef p_binding, uindex_t p_index)
465442
{
466443
if (self == nil || !self -> valid)
@@ -1201,7 +1178,7 @@ static void __emit_position(MCScriptModuleBuilderRef self, uindex_t p_address, u
12011178
self -> module . positions[t_pindex] . line = p_line;
12021179
}
12031180

1204-
void MCScriptBeginHandlerInModule(MCScriptModuleBuilderRef self, MCScriptHandlerScope p_scope, MCNameRef p_name, uindex_t p_type, uindex_t p_index)
1181+
void MCScriptBeginHandlerInModule(MCScriptModuleBuilderRef self, MCNameRef p_name, uindex_t p_type, uindex_t p_index)
12051182
{
12061183
if (self == nil || !self -> valid)
12071184
return;
@@ -1222,7 +1199,6 @@ void MCScriptBeginHandlerInModule(MCScriptModuleBuilderRef self, MCScriptHandler
12221199
t_definition -> kind = kMCScriptDefinitionKindHandler;
12231200
t_definition -> type = p_type;
12241201
t_definition -> start_address = self -> module . bytecode_count;
1225-
t_definition -> scope = p_scope;
12261202

12271203
self -> current_handler = p_index;
12281204
self -> current_param_count = 0;
@@ -1296,10 +1272,10 @@ void MCScriptEndHandlerInModule(MCScriptModuleBuilderRef self)
12961272

12971273
__emit_position(self, t_pos_address_offset + t_address, self -> instructions[i] . file, self -> instructions[i] . line);
12981274

1299-
__emit_bytecode_byte(self, t_op | (MCMin(t_arity, 15U) << 4));
1275+
__emit_bytecode_byte(self, (uint8_t)(t_op | (MCMin(t_arity, 15U) << 4)));
13001276

13011277
if (t_arity >= 15U)
1302-
__emit_bytecode_byte(self, t_arity - 15U);
1278+
__emit_bytecode_byte(self, uint8_t(t_arity - 15U));
13031279

13041280
for(uindex_t j = 0; j < t_arity; j++)
13051281
__emit_bytecode_uint(self, t_operands[j]);

libscript/src/script-instance.cpp

Lines changed: 321 additions & 239 deletions
Large diffs are not rendered by default.

libscript/src/script-module.cpp

Lines changed: 11 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -127,18 +127,12 @@ MC_PICKLE_BEGIN_RECORD(MCScriptVariableDefinition)
127127
MC_PICKLE_UINDEX(type)
128128
MC_PICKLE_END_RECORD()
129129

130-
MC_PICKLE_BEGIN_RECORD(MCScriptContextVariableDefinition)
131-
MC_PICKLE_UINDEX(type)
132-
MC_PICKLE_UINDEX(default_value)
133-
MC_PICKLE_END_RECORD()
134-
135130
MC_PICKLE_BEGIN_RECORD(MCScriptHandlerDefinition)
136131
MC_PICKLE_UINDEX(type)
137132
MC_PICKLE_ARRAY_OF_UINDEX(local_types, local_type_count)
138133
MC_PICKLE_ARRAY_OF_NAMEREF(local_names, local_name_count)
139134
MC_PICKLE_UINDEX(start_address)
140135
MC_PICKLE_UINDEX(finish_address)
141-
MC_PICKLE_INTENUM(MCScriptHandlerScope, scope)
142136
MC_PICKLE_END_RECORD()
143137

144138
MC_PICKLE_BEGIN_RECORD(MCScriptForeignHandlerDefinition)
@@ -175,7 +169,6 @@ MC_PICKLE_BEGIN_VARIANT(MCScriptDefinition, kind)
175169
MC_PICKLE_VARIANT_CASE(kMCScriptDefinitionKindEvent, MCScriptEventDefinition)
176170
MC_PICKLE_VARIANT_CASE(kMCScriptDefinitionKindSyntax, MCScriptSyntaxDefinition)
177171
MC_PICKLE_VARIANT_CASE(kMCScriptDefinitionKindDefinitionGroup, MCScriptDefinitionGroupDefinition)
178-
MC_PICKLE_VARIANT_CASE(kMCScriptDefinitionKindContextVariable, MCScriptContextVariableDefinition)
179172
MC_PICKLE_END_VARIANT()
180173

181174
MC_PICKLE_BEGIN_RECORD(MCScriptModule)
@@ -220,7 +213,6 @@ static MCStringRef __MCScriptDefinitionKindToString(MCScriptDefinitionKind p_kin
220213
case kMCScriptDefinitionKindEvent: return MCSTR("event");
221214
case kMCScriptDefinitionKindSyntax: return MCSTR("syntax");
222215
case kMCScriptDefinitionKindDefinitionGroup: return MCSTR("group");
223-
case kMCScriptDefinitionKindContextVariable: return MCSTR("context variable");
224216
default:
225217
return MCSTR("unknown");
226218
}
@@ -276,30 +268,6 @@ bool MCScriptValidateModule(MCScriptModuleRef self)
276268
t_variable = static_cast<MCScriptVariableDefinition *>(self -> definitions[i]);
277269
t_variable -> slot_index = self -> slot_count++;
278270
}
279-
else if (self -> definitions[i] -> kind == kMCScriptDefinitionKindContextVariable)
280-
{
281-
MCScriptContextVariableDefinition *t_variable;
282-
t_variable = static_cast<MCScriptContextVariableDefinition *>(self -> definitions[i]);
283-
284-
uindex_t t_index;
285-
t_index = UINDEX_MAX;
286-
for(uindex_t i = 0; i < s_context_slot_count; i++)
287-
if (s_context_slot_owners[i] == nil)
288-
{
289-
t_index = i;
290-
break;
291-
}
292-
293-
if (t_index == UINDEX_MAX)
294-
{
295-
if (!MCMemoryResizeArray(s_context_slot_count + 1, s_context_slot_owners, s_context_slot_count))
296-
return false; // oom
297-
298-
t_index = s_context_slot_count - 1;
299-
}
300-
301-
s_context_slot_owners[t_index] = self;
302-
}
303271
else if (self -> definitions[i] -> kind == kMCScriptDefinitionKindHandler)
304272
{
305273
MCScriptHandlerDefinition *t_handler;
@@ -373,16 +341,16 @@ bool MCScriptValidateModule(MCScriptModuleRef self)
373341
// check index operand is within definition range
374342
// check definition[index] is handler or definition group
375343
// check signature of defintion[index] conforms with invoke arity
376-
for(uindex_t i = 1; i < t_arity; i++)
377-
t_temporary_count = MCMax(t_temporary_count, t_operands[i] + 1);
344+
for(uindex_t j = 1; j < t_arity; j++)
345+
t_temporary_count = MCMax(t_temporary_count, t_operands[j] + 1);
378346
break;
379347
case kMCScriptBytecodeOpInvokeIndirect:
380348
// invoke *<src>, <result>, [ <arg_1>, ..., <arg_n> ]
381349
if (t_arity < 2)
382350
goto invalid_bytecode_error;
383351

384-
for(uindex_t i = 0; i < t_arity; i++)
385-
t_temporary_count = MCMax(t_temporary_count, t_operands[i] + 1);
352+
for(uindex_t j = 0; j < t_arity; j++)
353+
t_temporary_count = MCMax(t_temporary_count, t_operands[j] + 1);
386354
break;
387355
case kMCScriptBytecodeOpFetch:
388356
case kMCScriptBytecodeOpStore:
@@ -400,8 +368,8 @@ bool MCScriptValidateModule(MCScriptModuleRef self)
400368
if (t_arity < 1)
401369
goto invalid_bytecode_error;
402370

403-
for(uindex_t i = 0; i < t_arity; i++)
404-
t_temporary_count = MCMax(t_temporary_count, t_operands[i] + 1);
371+
for(uindex_t j = 0; j < t_arity; j++)
372+
t_temporary_count = MCMax(t_temporary_count, t_operands[j] + 1);
405373
break;
406374
case kMCScriptBytecodeOpAssignArray:
407375
// assignarray <dst>, [ <key_1>, <value_1>, ..., <key_n>, <value_n> ]
@@ -410,9 +378,9 @@ bool MCScriptValidateModule(MCScriptModuleRef self)
410378
if (t_arity % 2 != 1) // parameters must come in pairs
411379
goto invalid_bytecode_error;
412380

413-
for (uindex_t i = 0; i < t_arity; ++i)
381+
for (uindex_t j = 0; j < t_arity; ++j)
414382
{
415-
t_temporary_count = MCMax(t_temporary_count, t_operands[i] + 1);
383+
t_temporary_count = MCMax(t_temporary_count, t_operands[j] + 1);
416384
}
417385
break;
418386
}
@@ -790,11 +758,11 @@ bool MCScriptEnsureModuleIsUsable(MCScriptModuleRef self)
790758
t_type = static_cast<MCScriptRecordType *>(self -> types[i]);
791759

792760
MCAutoArray<MCRecordTypeFieldInfo> t_fields;
793-
for(uindex_t i = 0; i < t_type -> field_count; i++)
761+
for(uindex_t j = 0; j < t_type -> field_count; j++)
794762
{
795763
MCRecordTypeFieldInfo t_field;
796-
t_field . name = t_type -> fields[i] . name;
797-
t_field . type = self -> types[t_type -> fields[i] . type] -> typeinfo;
764+
t_field . name = t_type -> fields[j] . name;
765+
t_field . type = self -> types[t_type -> fields[j] . type] -> typeinfo;
798766
if (!t_fields . Push(t_field))
799767
goto error_cleanup; // oom
800768
}
@@ -1133,20 +1101,6 @@ MCNameRef MCScriptGetNameOfLocalVariableInModule(MCScriptModuleRef self, MCScrip
11331101
return t_handler -> local_names[p_index - t_type -> parameter_name_count];
11341102
}
11351103

1136-
MCNameRef MCScriptGetNameOfGlobalVariableInModule(MCScriptModuleRef self, uindex_t p_index)
1137-
{
1138-
if (self -> definition_name_count > 0)
1139-
return self -> definition_names[p_index];
1140-
return kMCEmptyName;
1141-
}
1142-
1143-
MCNameRef MCScriptGetNameOfContextVariableInModule(MCScriptModuleRef self, uindex_t p_index)
1144-
{
1145-
if (self -> definition_name_count > 0)
1146-
return self -> definition_names[p_index];
1147-
return kMCEmptyName;
1148-
}
1149-
11501104
////////////////////////////////////////////////////////////////////////////////
11511105

11521106
static int s_current_indent = 0;

libscript/src/script-object.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ MCTypeInfoRef kMCScriptNoMatchingHandlerErrorTypeInfo;
3737
MCTypeInfoRef kMCScriptCannotSetReadOnlyPropertyErrorTypeInfo;
3838
MCTypeInfoRef kMCScriptInvalidPropertyValueErrorTypeInfo;
3939
MCTypeInfoRef kMCScriptNotAHandlerValueErrorTypeInfo;
40-
MCTypeInfoRef kMCScriptCannotCallContextHandlerErrorTypeInfo;
4140
MCTypeInfoRef kMCScriptHandlerNotFoundErrorTypeInfo;
4241
MCTypeInfoRef kMCScriptPropertyNotFoundErrorTypeInfo;
4342

@@ -274,8 +273,6 @@ bool MCScriptInitialize(void)
274273
return false;
275274
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.NotAHandlerValueError"), MCNAME("runtime"), MCSTR("Value is not a handler"), kMCScriptNotAHandlerValueErrorTypeInfo))
276275
return false;
277-
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.CannotCallContextHandlerError"), MCNAME("runtime"), MCSTR("Cannot call context handler"), kMCScriptCannotCallContextHandlerErrorTypeInfo))
278-
return false;
279276
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.HandlerNotFoundError"), MCNAME("runtime"), MCSTR("No handler %{handler} in module %{module}"), kMCScriptHandlerNotFoundErrorTypeInfo))
280277
return false;
281278
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.PropertyNotFoundError"), MCNAME("runtime"), MCSTR("No property %{property} in module %{module}"), kMCScriptPropertyNotFoundErrorTypeInfo))

libscript/src/script-private.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ extern MCTypeInfoRef kMCScriptNoMatchingHandlerErrorTypeInfo;
4141
extern MCTypeInfoRef kMCScriptCannotSetReadOnlyPropertyErrorTypeInfo;
4242
extern MCTypeInfoRef kMCScriptInvalidPropertyValueErrorTypeInfo;
4343
extern MCTypeInfoRef kMCScriptNotAHandlerValueErrorTypeInfo;
44-
extern MCTypeInfoRef kMCScriptCannotCallContextHandlerErrorTypeInfo;
4544
extern MCTypeInfoRef kMCScriptPropertyNotFoundErrorTypeInfo;
4645
extern MCTypeInfoRef kMCScriptHandlerNotFoundErrorTypeInfo;
4746

@@ -256,15 +255,6 @@ struct MCScriptVariableDefinition: public MCScriptDefinition
256255
uindex_t slot_index;
257256
};
258257

259-
struct MCScriptContextVariableDefinition: public MCScriptDefinition
260-
{
261-
uindex_t type;
262-
uindex_t default_value;
263-
264-
// (computed) The index of the variable in the context slot table - not pickled
265-
uindex_t slot_index;
266-
};
267-
268258
struct MCScriptCommonHandlerDefinition: public MCScriptDefinition
269259
{
270260
uindex_t type;
@@ -281,8 +271,6 @@ struct MCScriptHandlerDefinition: public MCScriptCommonHandlerDefinition
281271
uindex_t start_address;
282272
uindex_t finish_address;
283273

284-
MCScriptHandlerScope scope;
285-
286274
// The number of slots required in a frame in order to execute this handler - computed.
287275
uindex_t slot_count;
288276
};
@@ -392,12 +380,6 @@ struct MCScriptModule: public MCScriptObject
392380
// (computed) The number of slots needed by an instance - not pickled
393381
uindex_t slot_count;
394382

395-
// (computed) The number of slots needed by this modules context - not pickled
396-
uindex_t context_slot_count;
397-
398-
// (computed) The index of this module's context info in a frame's context vector - not pickled
399-
uindex_t context_index;
400-
401383
// If this is a non-widget module, then it only has one instance - not pickled
402384
MCScriptInstanceRef shared_instance;
403385

@@ -421,7 +403,6 @@ MCNameRef MCScriptGetNameOfDefinitionInModule(MCScriptModuleRef module, MCScript
421403
MCNameRef MCScriptGetNameOfParameterInModule(MCScriptModuleRef module, MCScriptDefinition *definition, uindex_t index);
422404
MCNameRef MCScriptGetNameOfLocalVariableInModule(MCScriptModuleRef module, MCScriptDefinition *definition, uindex_t index);
423405
MCNameRef MCScriptGetNameOfGlobalVariableInModule(MCScriptModuleRef module, uindex_t index);
424-
MCNameRef MCScriptGetNameOfContextVariableInModule(MCScriptModuleRef module, uindex_t index);
425406

426407
////////////////////////////////////////////////////////////////////////////////
427408

toolchain/lc-compile/src/bind.g

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,8 @@
133133

134134
'rule' DeclareImportedDefinitions(variable(Position, _, Name, _)):
135135
DeclareId(Name)
136-
137-
'rule' DeclareImportedDefinitions(contextvariable(Position, _, Name, _, _)):
138-
DeclareId(Name)
139136

140-
'rule' DeclareImportedDefinitions(handler(Position, _, Name, _, _, _, _)):
137+
'rule' DeclareImportedDefinitions(handler(Position, _, Name, _, _, _)):
141138
DeclareId(Name)
142139

143140
'rule' DeclareImportedDefinitions(foreignhandler(Position, _, Name, _, _)):
@@ -197,10 +194,7 @@
197194
'rule' Declare(variable(Position, _, Name, _)):
198195
DeclareId(Name)
199196

200-
'rule' Declare(contextvariable(Position, _, Name, _, _)):
201-
DeclareId(Name)
202-
203-
'rule' Declare(handler(Position, _, Name, _, _, _, _)):
197+
'rule' Declare(handler(Position, _, Name, _, _, _)):
204198
DeclareId(Name)
205199

206200
'rule' Declare(foreignhandler(Position, _, Name, _, _)):
@@ -272,11 +266,8 @@
272266

273267
'rule' Define(ModuleId, variable(Position, Access, Name, Type)):
274268
DefineSymbolId(Name, ModuleId, Access, variable, Type)
275-
276-
'rule' Define(ModuleId, contextvariable(Position, Access, Name, Type, _)):
277-
DefineSymbolId(Name, ModuleId, Access, context, Type)
278269

279-
'rule' Define(ModuleId, handler(Position, Access, Name, _, Signature:signature(Parameters, _), _, _)):
270+
'rule' Define(ModuleId, handler(Position, Access, Name, Signature:signature(Parameters, _), _, _)):
280271
DefineSymbolId(Name, ModuleId, Access, handler, handler(Position, normal, Signature))
281272
DefineParameters(Name, Parameters)
282273

@@ -351,7 +342,7 @@
351342

352343
----------
353344

354-
'rule' Apply(DEFINITION'handler(_, _, Id, _, signature(Parameters, Type), _, Body)):
345+
'rule' Apply(DEFINITION'handler(_, _, Id, signature(Parameters, Type), _, Body)):
355346
-- The type of the handler is resolved in the current scope
356347
Apply(Type)
357348
@@ -736,10 +727,7 @@
736727
'rule' DumpBindings(DEFINITION'variable(_, _, Name, Type)):
737728
DumpId("variable", Name)
738729
DumpBindings(Type)
739-
'rule' DumpBindings(DEFINITION'contextvariable(_, _, Name, Type, _)):
740-
DumpId("variable", Name)
741-
DumpBindings(Type)
742-
'rule' DumpBindings(DEFINITION'handler(_, _, Name, _, Signature, Definitions, Body)):
730+
'rule' DumpBindings(DEFINITION'handler(_, _, Name, Signature, Definitions, Body)):
743731
DumpId("handler", Name)
744732
DumpBindings(Signature)
745733
DumpBindings(Definitions)

toolchain/lc-compile/src/check.g

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,14 +1613,6 @@
16131613
||
16141614
--Error_VariableMustHaveHighLevelType(Position)
16151615
|)
1616-
1617-
'rule' CheckDeclaredTypes(DEFINITION'contextvariable(Position, _, _, Type, _)):
1618-
-- Variable types must be high-level
1619-
(|
1620-
IsHighLevelType(Type)
1621-
||
1622-
--Error_VariableMustHaveHighLevelType(Position)
1623-
|)
16241616

16251617
'rule' CheckDeclaredTypes(DEFINITION'foreignhandler(Position, _, _, signature(Parameters, ReturnType), _)):
16261618
-- Foreign handlers must be fully typed.
@@ -1716,11 +1708,7 @@
17161708
'rule' CheckIdentifiers(DEFINITION'variable(_, _, Id, _)):
17171709
CheckIdIsSuitableForDefinition(Id)
17181710

1719-
'rule' CheckIdentifiers(DEFINITION'contextvariable(_, _, Id, Type, _)):
1720-
CheckIdIsSuitableForDefinition(Id)
1721-
CheckIdentifiers(Type)
1722-
1723-
'rule' CheckIdentifiers(DEFINITION'handler(_, _, Id, _, Signature, Definitions, Body)):
1711+
'rule' CheckIdentifiers(DEFINITION'handler(_, _, Id, Signature, Definitions, Body)):
17241712
CheckIdIsSuitableForDefinition(Id)
17251713
CheckIdentifiers(Signature)
17261714
CheckIdentifiers(Definitions)

0 commit comments

Comments
 (0)