Skip to content

Commit 14e67cc

Browse files
Reviewed size handling (#763)
* fixed different size handlings * changed var size to expression * updated printf to use array origin to find enum * removed error message from ScvdDataType * fixed read size of MAC printf * Fixed Double escaping or unescaping * cleaned up call chains for getTargetSize * removed empty wrapper functions * fixed member array calculation, added tests for member and var array
1 parent ac52930 commit 14e67cc

87 files changed

Lines changed: 1525 additions & 388 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/views/component-viewer/model/scvd-data-type.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,15 @@ export class ScvdDataType extends ScvdNode {
7777
return size;
7878
}
7979

80+
public override async getTargetSize(): Promise<number | undefined> {
81+
return this._type?.getTargetSize();
82+
}
83+
8084
public override getIsPointer(): boolean {
8185
return this._type?.getIsPointer() ?? false;
8286
}
8387

84-
public override getVirtualSize(): number | undefined {
88+
public override async getVirtualSize(): Promise<number | undefined> {
8589
return this._type?.getVirtualSize();
8690
}
8791

@@ -105,7 +109,7 @@ export class ScvdDataType extends ScvdNode {
105109

106110

107111
export class ScvdScalarDataType extends ScvdNode {
108-
private _type: string | undefined;
112+
private _typeScalar: string | undefined;
109113
private _isPointer: boolean = false;
110114

111115
constructor(
@@ -122,7 +126,7 @@ export class ScvdScalarDataType extends ScvdNode {
122126
const typeStr = type.replace(/\*/g, '').trim();
123127
Object.keys(ScvdScalarDataTypeMap).forEach(element => {
124128
if (element === typeStr) {
125-
this._type = element;
129+
this._typeScalar = element;
126130
}
127131
});
128132
}
@@ -146,16 +150,20 @@ export class ScvdScalarDataType extends ScvdNode {
146150
return value ? value / 8 : undefined;
147151
}
148152

153+
public override async getTargetSize(): Promise<number | undefined> {
154+
return this.getTypeSize();
155+
}
156+
149157
public override getIsPointer(): boolean {
150158
return this.isPointer;
151159
}
152160

153-
public override getVirtualSize(): number | undefined {
161+
public override async getVirtualSize(): Promise<number | undefined> {
154162
return this.getTypeSize();
155163
}
156164

157165
public get type(): string | undefined {
158-
return this._type;
166+
return this._typeScalar;
159167
}
160168

161169

@@ -164,7 +172,7 @@ export class ScvdScalarDataType extends ScvdNode {
164172

165173
export class ScvdComplexDataType extends ScvdNode{
166174
private _typeName: string | undefined;
167-
private _type: ScvdTypedef | undefined;
175+
private _typeDef: ScvdTypedef | undefined;
168176
private _isPointer: boolean = false;
169177

170178
constructor(
@@ -195,19 +203,19 @@ export class ScvdComplexDataType extends ScvdNode{
195203
}
196204

197205
public override getTypeSize(): number | undefined {
198-
const sizeInBytes = this._type?.getTypeSize();
199-
if (sizeInBytes !== undefined) {
200-
return sizeInBytes;
201-
}
202-
return undefined;
206+
return this._typeDef?.getTypeSize();
207+
}
208+
209+
public override async getTargetSize(): Promise<number | undefined> {
210+
return this._typeDef?.getTargetSize();
203211
}
204212

205213
public override getIsPointer(): boolean {
206214
return this.isPointer;
207215
}
208216

209-
public override getVirtualSize(): number | undefined {
210-
return this._type?.getVirtualSize();
217+
public override async getVirtualSize(): Promise<number | undefined> {
218+
return this._typeDef?.getVirtualSize();
211219
}
212220

213221
public override resolveAndLink(resolveFunc: ResolveSymbolCb): boolean {
@@ -225,12 +233,12 @@ export class ScvdComplexDataType extends ScvdNode{
225233
console.error('Failed to resolve complex data type:', typeName);
226234
return false;
227235
}
228-
this._type = item;
236+
this._typeDef = item;
229237
return true;
230238
}
231239

232240
public override getMember(property: string): ScvdNode | undefined {
233-
return this._type?.getMember(property);
241+
return this._typeDef?.getMember(property);
234242
}
235243

236244

src/views/component-viewer/model/scvd-event-id.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,4 @@ export class ScvdEventId extends ScvdNode {
6767

6868
return super.configure();
6969
}
70-
71-
public override validate(prevResult: boolean): boolean {
72-
return super.validate(prevResult && true);
73-
}
74-
75-
76-
7770
}

src/views/component-viewer/model/scvd-list-out.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ export class ScvdListOut extends ScvdList {
6363
return super.readXml(xml);
6464
}
6565

66-
public verify(): boolean {
67-
return super.verify();
68-
}
69-
7066
public get item(): ScvdItem[] {
7167
return this._item;
7268
}

src/views/component-viewer/model/scvd-member.ts

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
// https://arm-software.github.io/CMSIS-View/main/elem_member.html
1818

19-
import { NumberType, NumberTypeInput } from './number-type';
2019
import { ScvdDataType } from './scvd-data-type';
2120
import { ScvdEnum } from './scvd-enum';
2221
import { ScvdExpression } from './scvd-expression';
@@ -29,7 +28,7 @@ import { getArrayFromJson, getStringFromJson } from './scvd-utils';
2928
export 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;

src/views/component-viewer/model/scvd-node.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,15 @@ export abstract class ScvdNode extends ScvdBase {
126126
return undefined;
127127
}
128128

129-
public getTargetSize(): number | undefined {
129+
public async getTargetSize(): Promise<number | undefined> {
130130
console.error(`GetTargetSize not implemented: item=${this.classname}: ${this.getDisplayLabel()}`);
131131
return undefined;
132132
}
133133
public getTypeSize(): number | undefined {
134134
console.error(`GetTypeSize not implemented: item=${this.classname}: ${this.getDisplayLabel()}`);
135135
return undefined;
136136
}
137-
public getVirtualSize(): number | undefined {
137+
public async getVirtualSize(): Promise<number | undefined> {
138138
console.error(`GetVirtualSize not implemented: item=${this.classname}: ${this.getDisplayLabel()}`);
139139
return undefined;
140140
}

src/views/component-viewer/model/scvd-print-expression.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,4 @@ export class ScvdPrintExpression extends ScvdExpression {
3434
public override get classname(): string {
3535
return 'ScvdPrintExpression';
3636
}
37-
38-
public override configure(): boolean {
39-
return super.configure();
40-
}
41-
42-
public override validate(prevResult: boolean): boolean {
43-
return super.validate(prevResult && true);
44-
}
45-
46-
public override async getGuiName(): Promise<string | undefined> {
47-
return super.getGuiName();
48-
}
49-
50-
public override async getGuiValue(): Promise<string | undefined> {
51-
return super.getGuiValue();
52-
}
5337
}

src/views/component-viewer/model/scvd-read.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,42 @@ export class ScvdRead extends ScvdNode {
126126
return this._size;
127127
}
128128

129-
public override getTargetSize(): number | undefined {
129+
public override getTypeSize(): number | undefined {
130130
return this.type?.getTypeSize();
131131
}
132132

133-
public override getVirtualSize(): number | undefined {
133+
public override async getTargetSize(): Promise<number | undefined> {
134+
if (this.getIsPointer()) {
135+
return 4;
136+
}
137+
const typeSize = this.getTypeSize();
138+
if (typeSize === undefined) {
139+
return undefined;
140+
}
141+
return typeSize;
142+
}
143+
144+
public override async getVirtualSize(): Promise<number | undefined> {
134145
return this.type?.getVirtualSize();
135146
}
136147
public override async getArraySize(): Promise<number | undefined> {
137148
const v = await this.size?.getValue();
138-
if (typeof v === 'bigint') {
139-
return Number(v);
149+
const numericValue = typeof v === 'bigint' ? Number(v)
150+
: (typeof v === 'number' ? v : undefined);
151+
if (numericValue === undefined) {
152+
return 1;
140153
}
141-
if (typeof v === 'number') {
142-
return v;
154+
if (!Number.isFinite(numericValue) || numericValue < 1 || numericValue > 65536) {
155+
console.error(this.getLineInfoStr(), `'${this.name ?? 'read'}': invalid size specified (1...65536)`);
156+
if (numericValue < 1) {
157+
return 1;
158+
}
159+
if (numericValue > 65536) {
160+
return 65536;
161+
}
162+
return 1;
143163
}
144-
return undefined;
164+
return numericValue;
145165
}
146166

147167
public override getIsPointer(): boolean {

src/views/component-viewer/model/scvd-readlist.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,19 +95,20 @@ export class ScvdReadList extends ScvdRead {
9595
return this._based;
9696
}
9797

98-
public override getTargetSize(): number | undefined {
99-
return this.type?.getTypeSize();
100-
}
101-
102-
public override getVirtualSize(): number | undefined {
103-
return this.type?.getVirtualSize();
98+
public override async getTargetSize(): Promise<number | undefined> {
99+
if (this.based === 1) {
100+
return 4;
101+
}
102+
const typeSize = this.type?.getTypeSize();
103+
if (typeSize !== undefined) {
104+
return typeSize;
105+
}
106+
return super.getTargetSize();
104107
}
105108

106109
// A readlist is considered a pointer if based="1"
107110
public override getIsPointer(): boolean {
108-
const based = this.based ? true : false;
109-
const typeIsPointer = this.type?.getIsPointer();
110-
return based || (typeIsPointer ?? false);
111+
return this.based === 1;
111112
}
112113

113114
public override resolveAndLink(resolveFunc: ResolveSymbolCb): boolean {

0 commit comments

Comments
 (0)