1616
1717// https://arm-software.github.io/CMSIS-View/main/elem_member.html
1818
19- import { NumberType , NumberTypeInput } from './number-type' ;
2019import { ScvdDataType } from './scvd-data-type' ;
2120import { ScvdEnum } from './scvd-enum' ;
2221import { ScvdExpression } from './scvd-expression' ;
@@ -29,7 +28,7 @@ import { getArrayFromJson, getStringFromJson } from './scvd-utils';
2928export class ScvdMember extends ScvdNode {
3029 private _type : ScvdDataType | undefined ;
3130 private _offset : ScvdExpression | undefined ;
32- private _size : number | undefined ;
31+ private _size : ScvdExpression | undefined ;
3332 private _enum : ScvdEnum [ ] = [ ] ;
3433
3534 constructor (
@@ -42,6 +41,11 @@ export class ScvdMember extends ScvdNode {
4241 return 'ScvdMember' ;
4342 }
4443
44+ public override configure ( ) : boolean {
45+ this . _size ?. configure ( ) ;
46+ return super . configure ( ) ;
47+ }
48+
4549 public override readXml ( xml : Json ) : boolean {
4650 if ( xml === undefined ) {
4751 return super . readXml ( xml ) ;
@@ -80,35 +84,56 @@ export class ScvdMember extends ScvdNode {
8084 }
8185 }
8286
83- public get size ( ) : number | undefined {
87+ public get size ( ) : ScvdExpression | undefined {
8488 return this . _size ;
8589 }
8690
87- public set size ( value : NumberTypeInput | undefined ) {
91+ public set size ( value : string | undefined ) {
8892 if ( value !== undefined ) {
89- this . _size = new NumberType ( value ) . value ;
93+ this . _size = new ScvdExpression ( this , value , 'size' ) ;
9094 }
9195 }
9296
97+ public override getIsPointer ( ) : boolean {
98+ return this . type ?. getIsPointer ( ) ?? false ;
99+ }
100+
93101 public override getTypeSize ( ) : number | undefined {
94102 return this . _type ?. getTypeSize ( ) ;
95103 }
96104
97- public override getVirtualSize ( ) : number | undefined {
105+ public override async getVirtualSize ( ) : Promise < number | undefined > {
98106 return this . getTargetSize ( ) ;
99107 }
100108
101- public override getIsPointer ( ) : boolean {
102- return this . type ?. getIsPointer ( ) ?? false ;
109+ public override async getArraySize ( ) : Promise < number | undefined > {
110+ const sizeExpr = this . size ;
111+ if ( sizeExpr === undefined ) {
112+ return 1 ;
113+ }
114+ const sizeValue = await sizeExpr . getValue ( ) ;
115+ const numericValue = typeof sizeValue === 'bigint' ? Number ( sizeValue )
116+ : ( typeof sizeValue === 'number' ? sizeValue : undefined ) ;
117+ if ( numericValue !== undefined && ! Number . isNaN ( numericValue ) ) {
118+ if ( ! Number . isFinite ( numericValue ) || numericValue < 1 || numericValue > 65536 ) {
119+ console . error ( this . getLineInfoStr ( ) , `'${ this . name ?? 'member' } ': invalid size specified` ) ;
120+ return 1 ;
121+ }
122+ return numericValue ;
123+ }
124+ console . error ( this . getLineInfoStr ( ) , `'${ this . name ?? 'member' } ': invalid size specified` ) ;
125+ return 1 ;
103126 }
104127
105- // if size is set, this is the size in byte to be read from target
106- public override getTargetSize ( ) : number | undefined {
107- const isPointer = this . getIsPointer ( ) ;
108- if ( isPointer ) {
109- return 4 ; // pointer size
128+ public override async getTargetSize ( ) : Promise < number | undefined > {
129+ if ( this . getIsPointer ( ) ) {
130+ return 4 ;
110131 }
111- return this . size ?? this . getTypeSize ( ) ;
132+ const typeSize = this . getTypeSize ( ) ;
133+ if ( typeSize === undefined ) {
134+ return undefined ;
135+ }
136+ return typeSize ;
112137 }
113138
114139 public addEnum ( ) : ScvdEnum {
@@ -141,6 +166,14 @@ export class ScvdMember extends ScvdNode {
141166 return undefined ;
142167 }
143168
169+ public override getElementRef ( ) : ScvdNode | undefined {
170+ const typeObj = this . _type ;
171+ if ( typeObj !== undefined ) {
172+ return typeObj ;
173+ }
174+ return undefined ;
175+ }
176+
144177 // member’s byte offset
145178 public override async getMemberOffset ( ) : Promise < number | undefined > {
146179 const offsetExpr = this . _offset ;
0 commit comments