Skip to content

Commit b4f10fa

Browse files
committed
multi dimensional arrays WIP
1 parent 1037120 commit b4f10fa

1 file changed

Lines changed: 19 additions & 17 deletions

File tree

src/ps_visit_type.c

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -519,40 +519,40 @@ bool ps_visit_type_reference_subrange_max(ps_interpreter *interpreter, ps_interp
519519
}
520520

521521
bool ps_visit_type_reference_subrange_register_type_def(ps_interpreter *interpreter, ps_interpreter_mode mode,
522-
ps_value_type value_type, char *type_name,
523-
ps_symbol **type_symbol)
522+
const char *type_name, ps_symbol **type_symbol, ps_symbol *type,
523+
const ps_type_definition_subrange *subrange)
524524
{
525525
VISIT_BEGIN("TYPE_REFERENCE_SUBRANGE", "")
526526

527527
ps_type_definition *type_def = NULL;
528528
ps_identifier name = {0};
529529

530530
// Create type definition for subrange
531-
switch (value_type)
531+
switch (type->value->data.t->type)
532532
{
533533
case PS_TYPE_CHAR:
534-
type_def = ps_type_definition_create_subrange_char(c.min, c.max);
534+
type_def = ps_type_definition_create_subrange_char(subrange->c.min, subrange->c.max);
535535
if (type_name == NULL)
536536
snprintf(name, sizeof(name) - 1, "#SUBRANGE_C_%08X", ps_symbol_get_auto_num());
537537
else
538538
memcpy(name, type_name, PS_IDENTIFIER_SIZE);
539539
break;
540540
case PS_TYPE_INTEGER:
541-
type_def = ps_type_definition_create_subrange_integer(i.min, i.max);
541+
type_def = ps_type_definition_create_subrange_integer(subrange->i.min, subrange->i.max);
542542
if (type_name == NULL)
543543
snprintf(name, sizeof(name) - 1, "#SUBRANGE_I_%08X", ps_symbol_get_auto_num());
544544
else
545545
memcpy(name, type_name, PS_IDENTIFIER_SIZE);
546546
break;
547547
case PS_TYPE_UNSIGNED:
548-
type_def = ps_type_definition_create_subrange_unsigned(u.min, u.max);
548+
type_def = ps_type_definition_create_subrange_unsigned(subrange->u.min, subrange->u.max);
549549
if (type_name == NULL)
550550
snprintf(name, sizeof(name) - 1, "#SUBRANGE_U_%08X", ps_symbol_get_auto_num());
551551
else
552552
memcpy(name, type_name, PS_IDENTIFIER_SIZE);
553553
break;
554554
case PS_TYPE_ENUM:
555-
type_def = ps_type_definition_create_subrange_enum(min_value.type, e.min, e.max);
555+
type_def = ps_type_definition_create_subrange_enum(type, subrange->e.min, subrange->e.max);
556556
if (type_name == NULL)
557557
snprintf(name, sizeof(name) - 1, "#SUBRANGE_E_%08X", ps_symbol_get_auto_num());
558558
else
@@ -582,23 +582,24 @@ bool ps_visit_type_reference_subrange(ps_interpreter *interpreter, ps_interprete
582582
ps_value_type min_base = PS_TYPE_NONE;
583583
ps_value_type max_base = PS_TYPE_NONE;
584584

585-
// Parse min value of subrange as a constant expression
585+
// *** Parse min value of subrange as a constant expression
586586
if (!ps_visit_type_reference_subrange_min(interpreter, mode, &min_value, &min_base, &subrange))
587-
TRACE_ERROR("MIN2")
588-
// Parse '..'
587+
TRACE_ERROR("MIN")
588+
// *** Parse '..'
589589
EXPECT_TOKEN(PS_TOKEN_RANGE)
590590
READ_NEXT_TOKEN
591-
// Parse max value of subrange as a constant expression
591+
// *** Parse max value of subrange as a constant expression
592592
if (!ps_visit_type_reference_subrange_max(interpreter, mode, &tmp_value, &max_base, &subrange))
593-
TRACE_ERROR("MAX2")
593+
TRACE_ERROR("MAX")
594+
// *** Copy value to max with same type as min
594595
max_value.type = min_value.type;
595596
if (!ps_interpreter_copy_value(interpreter, &tmp_value, &max_value))
596597
{
597598
ps_interpreter_set_message(interpreter, "Min and max value of subrange type mismatch: %s %s",
598599
min_value.type->name, max_value.type->name);
599-
TRACE_ERROR("COPY")
600+
TRACE_ERROR("COPY_MAX")
600601
}
601-
// Check that subrange min is less than max
602+
// *** Check that subrange min is less than max
602603
if ((max_base == PS_TYPE_CHAR && subrange.c.max <= subrange.c.min) ||
603604
(max_base == PS_TYPE_INTEGER && subrange.i.max <= subrange.i.min) ||
604605
(max_base == PS_TYPE_UNSIGNED && subrange.u.max <= subrange.u.min))
@@ -612,9 +613,10 @@ bool ps_visit_type_reference_subrange(ps_interpreter *interpreter, ps_interprete
612613
}
613614
else
614615
RETURN_ERROR(PS_ERROR_UNEXPECTED_TYPE)
615-
// Register subrange
616-
if (!ps_visit_type_reference_subrange_register_type_def(interpreter, mode, min_base, type_name, type_symbol))
617-
TRACE_ERROR("TYPE_DEF")
616+
// *** Register subrange
617+
if (!ps_visit_type_reference_subrange_register_type_def(interpreter, mode, type_name, type_symbol, min_value.type,
618+
&subrange))
619+
TRACE_ERROR("TYPE_DEF_SUBRANGE")
618620

619621
VISIT_END("OK")
620622
}

0 commit comments

Comments
 (0)