@@ -93,8 +93,10 @@ public class StructsProcessor extends AbstractProcessor {
93
93
private static final String STRUCTS_CLASS = "Structs" ;
94
94
95
95
// Methods
96
- private static final String GET_INFO = "getInfo " ;
96
+ private static final String GET_STRUCT_SIZE = "getStructSize " ;
97
97
private static final String GET_OFFSET = "getOffset" ;
98
+ private static final String GET_START_BIT = "getStartBit" ;
99
+ private static final String GET_END_BIT = "getEndBit" ;
98
100
private static final String GET = "get" ;
99
101
private static final String PUT = "put" ;
100
102
private static final String GET_UNCACHED = "getUncached" ;
@@ -229,7 +231,7 @@ private String processStruct(String strName, List<?> memberNamesList, List<?> ty
229
231
nativeTypes .add (NativeType .valueOf (type .getSimpleName ().toString ()));
230
232
}
231
233
232
- String className = ProcessorUtils . removeUnderscores (strName ); // Replace '_j' with 'J'
234
+ String className = removeUnderscores (strName ); // Replace '_j' with 'J'
233
235
// Generate code
234
236
String source = generateStruct (strName , members , nativeTypes , length , className );
235
237
// Commit and write to files.
@@ -266,13 +268,12 @@ private static String generateStruct(String strName, List<String> members, List<
266
268
.withSuperClass (STRUCT_STORAGE_CLASS + "<" + className + "." + wrapperName + ">" );
267
269
268
270
// Generate the fields:
269
- // - One to store the struct size
270
271
// - One per member to store their offsets
271
- generateFields (struct , members );
272
+ generateFields (struct , members , typesList , length );
272
273
273
274
// Generate the constructor.
274
275
// Use passed MemberOffsetGetter.
275
- generateConstructor (struct , strName , members , className );
276
+ generateConstructor (struct , strName , members , typesList , length , className );
276
277
277
278
// Generate the wrapper structure that will access the native struct java-like.
278
279
// It simply wraps a byte buffer around the pointer, and uses offsets in parent class to
@@ -285,20 +286,32 @@ private static String generateStruct(String strName, List<String> members, List<
285
286
return structFile .build ();
286
287
}
287
288
288
- private static void generateFields (ClassBuilder struct , List <String > members ) {
289
- for (String member : members ) {
289
+ private static void generateFields (ClassBuilder struct , List <String > members , List <NativeType > typesList , int length ) {
290
+ for (int i = 0 ; i < length ; i ++) {
291
+ String member = members .get (i );
292
+ NativeType type = typesList .get (i );
290
293
struct .withField (new FieldBuilder ("int" , member ).withQualifiers (new ModifierBuilder ().asFinal ()));
294
+ if (type == NativeType .BITFIELD_INT ) {
295
+ struct .withField (new FieldBuilder ("byte" , member + "StartBit" ).withQualifiers (new ModifierBuilder ().asFinal ()));
296
+ struct .withField (new FieldBuilder ("byte" , member + "EndBit" ).withQualifiers (new ModifierBuilder ().asFinal ()));
297
+ }
291
298
}
292
299
}
293
300
294
- private static void generateConstructor (ClassBuilder struct , String strName , List <String > members , String className ) {
301
+ private static void generateConstructor (ClassBuilder struct , String strName , List <String > members , List < NativeType > typesList , int length , String className ) {
295
302
MethodBuilder constructor = new MethodBuilder (className ) //
296
303
.withParams (argument (MEMBER_OFFSET_GETTER_CLASS , MEMBER_OFFSET_GETTER_ARG )) //
297
304
.asConstructor ();
298
305
299
- constructor .addBodyLine ("super(" , call (MEMBER_OFFSET_GETTER_ARG , GET_INFO , new String []{stringify (strName )}), ");" );
300
- for (String member : members ) {
306
+ constructor .addBodyLine ("super(" , call (MEMBER_OFFSET_GETTER_ARG , GET_STRUCT_SIZE , new String []{stringify (strName )}), ");" );
307
+ for (int i = 0 ; i < length ; i ++) {
308
+ String member = members .get (i );
309
+ NativeType type = typesList .get (i );
301
310
constructor .addBodyLine (assignment (member , "(int) " + call (MEMBER_OFFSET_GETTER_ARG , GET_OFFSET , new String []{stringify (strName ), stringify (member )})));
311
+ if (type == NativeType .BITFIELD_INT ) {
312
+ constructor .addBodyLine (assignment (member + "StartBit" , "(byte) " + call (MEMBER_OFFSET_GETTER_ARG , GET_START_BIT , new String []{stringify (strName ), stringify (member )})));
313
+ constructor .addBodyLine (assignment (member + "EndBit" , "(byte) " + call (MEMBER_OFFSET_GETTER_ARG , GET_END_BIT , new String []{stringify (strName ), stringify (member )})));
314
+ }
302
315
}
303
316
304
317
struct .withMethod (constructor );
@@ -325,12 +338,17 @@ private static void generateWrapper(ClassBuilder struct, List<String> members, L
325
338
326
339
MethodBuilder getter = new MethodBuilder (methodName ) //
327
340
.withModifiers (new ModifierBuilder ().asPublic ()) //
328
- .withReturnType (argType ) //
329
- .addBodyLine ("return " , call (null , GET + callSuffix , new String []{member }), ';' );
341
+ .withReturnType (argType );
330
342
MethodBuilder setter = new MethodBuilder (methodName ) //
331
343
.withModifiers (new ModifierBuilder ().asPublic ()) //
332
- .withParams (argument (argType , VALUE )) //
333
- .addBodyLine (call (null , PUT + callSuffix , new String []{member , VALUE }), ';' );
344
+ .withParams (argument (argType , VALUE ));
345
+ if (type == NativeType .BITFIELD_INT ) {
346
+ getter .addBodyLine ("return " , call (null , GET + callSuffix , new String []{member , member + "StartBit" , member + "EndBit" }), ';' );
347
+ setter .addBodyLine (call (null , PUT + callSuffix , new String []{member , member + "StartBit" , member + "EndBit" , VALUE }), ';' );
348
+ } else {
349
+ getter .addBodyLine ("return " , call (null , GET + callSuffix , new String []{member }), ';' );
350
+ setter .addBodyLine (call (null , PUT + callSuffix , new String []{member , VALUE }), ';' );
351
+ }
334
352
wrapper .withMethod (getter );
335
353
wrapper .withMethod (setter );
336
354
}
@@ -399,57 +417,37 @@ private static void generateOptionalMemberInfo(MethodBuilder constructor, List<S
399
417
}
400
418
401
419
private static String nativeTypeToMethodSuffix (NativeType type ) {
402
- switch (type ) {
403
- case BOOLEAN :
404
- return "Boolean" ;
405
- case BYTE :
406
- return "Byte" ;
407
- case CHAR :
408
- return "Char" ;
409
- case SHORT :
410
- return "Short" ;
411
- case INT :
412
- return "Int" ;
413
- case LONG :
414
- return "Long" ;
415
- case FLOAT :
416
- return "Float" ;
417
- case DOUBLE :
418
- return "Double" ;
419
- case OBJECT :
420
- return "Object" ;
421
- case POINTER :
422
- return "Pointer" ;
423
- default :
424
- return "" ;
425
- }
420
+ return switch (type ) {
421
+ case VOID -> "" ;
422
+ case BOOLEAN -> "Boolean" ;
423
+ case BYTE -> "Byte" ;
424
+ case CHAR -> "Char" ;
425
+ case SHORT -> "Short" ;
426
+ case INT -> "Int" ;
427
+ case LONG -> "Long" ;
428
+ case FLOAT -> "Float" ;
429
+ case DOUBLE -> "Double" ;
430
+ case OBJECT -> "Object" ;
431
+ case POINTER -> "Pointer" ;
432
+ case BITFIELD_INT -> "BitFieldInt" ;
433
+ };
426
434
}
427
435
428
436
private static String nativeTypeToArgType (NativeType type ) {
429
- switch (type ) {
430
- case BOOLEAN :
431
- return "boolean" ;
432
- case BYTE :
433
- return "byte" ;
434
- case CHAR :
435
- return "char" ;
436
- case SHORT :
437
- return "short" ;
438
- case INT :
439
- return "int" ;
440
- case LONG :
441
- return "long" ;
442
- case FLOAT :
443
- return "float" ;
444
- case DOUBLE :
445
- return "double" ;
446
- case OBJECT :
447
- return "StaticObject" ;
448
- case POINTER :
449
- return "TruffleObject" ;
450
- default :
451
- return "" ;
452
- }
437
+ return switch (type ) {
438
+ case VOID -> "" ;
439
+ case BOOLEAN -> "boolean" ;
440
+ case BYTE -> "byte" ;
441
+ case CHAR -> "char" ;
442
+ case SHORT -> "short" ;
443
+ case INT -> "int" ;
444
+ case LONG -> "long" ;
445
+ case FLOAT -> "float" ;
446
+ case DOUBLE -> "double" ;
447
+ case OBJECT -> "StaticObject" ;
448
+ case POINTER -> "TruffleObject" ;
449
+ case BITFIELD_INT -> "int" ;
450
+ };
453
451
}
454
452
455
453
}
0 commit comments