122 private final MemorySegment segment;
123 private final List<MemorySegment> slices = new ArrayList<>();
124 private final MemorySegment regSaveArea;
125
126 SysVVaList(MemorySegment segment) {
127 this.segment = segment;
128 regSaveArea = regSaveArea();
129 slices.add(regSaveArea);
130 }
131
132 private static MemoryAddress emptyListAddress() {
133 long ptr = U.allocateMemory(LAYOUT.byteSize());
134 MemorySegment ms = NativeMemorySegmentImpl.makeNativeSegmentUnchecked(
135 MemoryAddress.ofLong(ptr), LAYOUT.byteSize(), null, () -> U.freeMemory(ptr), null);
136 cleaner.register(SysVVaList.class, ms::close);
137 MemoryAddress base = ms.baseAddress();
138 VH_gp_offset.set(base, MAX_GP_OFFSET);
139 VH_fp_offset.set(base, MAX_FP_OFFSET);
140 VH_overflow_arg_area.set(base, MemoryAddress.NULL);
141 VH_reg_save_area.set(base, MemoryAddress.NULL);
142 MemorySegment unconfined = NativeMemorySegmentImpl.makeNativeSegmentUnchecked(
143 base, ms.byteSize(), null, null, null).withAccessModes(0);
144 return unconfined.baseAddress();
145 }
146
147 public static CSupport.VaList empty() {
148 return EMPTY;
149 }
150
151 private int currentGPOffset() {
152 return (int) VH_gp_offset.get(segment.baseAddress());
153 }
154
155 private void currentGPOffset(int i) {
156 VH_gp_offset.set(segment.baseAddress(), i);
157 }
158
159 private int currentFPOffset() {
160 return (int) VH_fp_offset.get(segment.baseAddress());
161 }
162
163 private void currentFPOffset(int i) {
164 VH_fp_offset.set(segment.baseAddress(), i);
|
122 private final MemorySegment segment;
123 private final List<MemorySegment> slices = new ArrayList<>();
124 private final MemorySegment regSaveArea;
125
126 SysVVaList(MemorySegment segment) {
127 this.segment = segment;
128 regSaveArea = regSaveArea();
129 slices.add(regSaveArea);
130 }
131
132 private static MemoryAddress emptyListAddress() {
133 long ptr = U.allocateMemory(LAYOUT.byteSize());
134 MemorySegment ms = NativeMemorySegmentImpl.makeNativeSegmentUnchecked(
135 MemoryAddress.ofLong(ptr), LAYOUT.byteSize(), null, () -> U.freeMemory(ptr), null);
136 cleaner.register(SysVVaList.class, ms::close);
137 MemoryAddress base = ms.baseAddress();
138 VH_gp_offset.set(base, MAX_GP_OFFSET);
139 VH_fp_offset.set(base, MAX_FP_OFFSET);
140 VH_overflow_arg_area.set(base, MemoryAddress.NULL);
141 VH_reg_save_area.set(base, MemoryAddress.NULL);
142 return ms.withAccessModes(0).baseAddress();
143 }
144
145 public static CSupport.VaList empty() {
146 return EMPTY;
147 }
148
149 private int currentGPOffset() {
150 return (int) VH_gp_offset.get(segment.baseAddress());
151 }
152
153 private void currentGPOffset(int i) {
154 VH_gp_offset.set(segment.baseAddress(), i);
155 }
156
157 private int currentFPOffset() {
158 return (int) VH_fp_offset.get(segment.baseAddress());
159 }
160
161 private void currentFPOffset(int i) {
162 VH_fp_offset.set(segment.baseAddress(), i);
|