mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 01:13:30 +00:00
Update term size code for RTTI changes introduced with subtypes.
runtime/mercury_term_size.c:
Use MR_index_or_search_ptag_layout to search du type layouts by
primary tag and MR_index_or_search_sectag_functor to search
sectag_alternatives by secondary tag, as required for subtypes.
Delete cases for MR_TYPECTOR_REP_RESERVED_ADDR*
which have since been deleted.
MR_SECTAG_REMOTE_WORD was previously renamed to
MR_SECTAG_REMOTE_FULL_WORD.
(Note that even with these changes, MR_RECORD_TERM_SIZES
is not in a working state.)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// vim: ts=4 sw=4 expandtab ft=c
|
||||
|
||||
// Copyright (C) 2003-2005, 2007, 2009, 2011 The University of Melbourne.
|
||||
// Copyright (C) 2014, 2016-2018 The Mercury team.
|
||||
// Copyright (C) 2014, 2016-2018, 2021 The Mercury team.
|
||||
// This file is distributed under the terms specified in COPYING.LIB.
|
||||
|
||||
// mercury_term_size.c
|
||||
@@ -9,6 +9,7 @@
|
||||
// This module defines a function for measuring the sizes of terms.
|
||||
|
||||
#include "mercury_imp.h"
|
||||
#include "mercury_deconstruct_macros.h"
|
||||
#include "mercury_runtime_util.h" // For MR_STRERROR_BUF_SIZE.
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
@@ -33,8 +34,8 @@ MR_Unsigned
|
||||
MR_term_size(MR_TypeInfo type_info, MR_Word term)
|
||||
{
|
||||
MR_TypeCtorInfo type_ctor_info;
|
||||
MR_DuTypeLayout du_type_layout;
|
||||
const MR_DuPtagLayout *ptag_layout;
|
||||
const MR_DuFunctorDesc *functor_desc;
|
||||
int ptag;
|
||||
int sectag;
|
||||
int arity;
|
||||
@@ -48,17 +49,10 @@ try_again:
|
||||
}
|
||||
|
||||
switch (MR_type_ctor_rep(type_ctor_info)) {
|
||||
case MR_TYPECTOR_REP_RESERVED_ADDR:
|
||||
case MR_TYPECTOR_REP_RESERVED_ADDR_USEREQ:
|
||||
// XXX The code to handle these cases hasn't been written yet.
|
||||
MR_fatal_error("MR_term_size: RESERVED_ADDR");
|
||||
|
||||
case MR_TYPECTOR_REP_DU:
|
||||
case MR_TYPECTOR_REP_DU_USEREQ:
|
||||
// XXX SUBTYPE cannot index MR_layout_du for subtypes
|
||||
du_type_layout = MR_type_ctor_layout(type_ctor_info).MR_layout_du;
|
||||
ptag = MR_tag(term);
|
||||
ptag_layout = &du_type_layout[ptag];
|
||||
MR_index_or_search_ptag_layout(ptag, ptag_layout);
|
||||
|
||||
switch (ptag_layout->MR_sectag_locn) {
|
||||
case MR_SECTAG_NONE:
|
||||
@@ -99,16 +93,14 @@ try_again:
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
case MR_SECTAG_REMOTE_WORD: // fall-through
|
||||
case MR_SECTAG_REMOTE_FULL_WORD: // fall-through
|
||||
case MR_SECTAG_REMOTE_BITS:
|
||||
#ifdef MR_DEBUG_TERM_SIZES
|
||||
sectag = MR_field(MR_mktag(ptag), term, 0);
|
||||
|
||||
// XXX SUBTYPE cannot index MR_sectag_alternatives
|
||||
// for subtypes
|
||||
if (ptag_layout->MR_sectag_alternatives[sectag]->
|
||||
MR_du_functor_orig_arity <= 0)
|
||||
{
|
||||
MR_index_or_search_sectag_functor(ptag_layout,
|
||||
sectag, functor_desc);
|
||||
if (functor_desc->MR_du_functor_orig_arity <= 0) {
|
||||
MR_fatal_error("MR_term_size: zero arity ptag remote");
|
||||
}
|
||||
|
||||
@@ -120,8 +112,7 @@ try_again:
|
||||
type_ctor_info->MR_type_ctor_module_name,
|
||||
type_ctor_info->MR_type_ctor_name,
|
||||
type_ctor_info->MR_type_ctor_arity,
|
||||
ptag_layout->MR_sectag_alternatives[sectag]->
|
||||
MR_du_functor_name);
|
||||
functor_desc->MR_du_functor_name);
|
||||
}
|
||||
#endif
|
||||
return MR_field(MR_mktag(ptag), term, -1);
|
||||
|
||||
Reference in New Issue
Block a user