working on WireHelpers.zeroObject
This commit is contained in:
parent
18b03eae8a
commit
2902b6c753
2 changed files with 58 additions and 1 deletions
|
@ -63,4 +63,9 @@ public final class SegmentBuilder extends SegmentReader {
|
||||||
public final BuilderArena getArena() {
|
public final BuilderArena getArena() {
|
||||||
return (BuilderArena)this.arena;
|
return (BuilderArena)this.arena;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final boolean isWritable() {
|
||||||
|
// TODO support external non-writable segments
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,9 +166,54 @@ final class WireHelpers {
|
||||||
//# about to be overwritten making the target object no longer
|
//# about to be overwritten making the target object no longer
|
||||||
//# reachable.
|
//# reachable.
|
||||||
|
|
||||||
|
//# We shouldn't zero out external data linked into the message.
|
||||||
|
if (!segment.isWritable()) return;
|
||||||
|
|
||||||
|
long ref = segment.get(refOffset);
|
||||||
|
|
||||||
|
switch (WirePointer.kind(ref)) {
|
||||||
|
case WirePointer.STRUCT:
|
||||||
|
case WirePointer.LIST:
|
||||||
|
zeroObject(segment, ref, WirePointer.target(refOffset, ref));
|
||||||
|
break;
|
||||||
|
case WirePointer.FAR: {
|
||||||
|
segment = segment.getArena().getSegment(FarPointer.getSegmentId(ref));
|
||||||
|
if (!segment.isWritable()) { //# Don't zero external data.
|
||||||
// TODO
|
// TODO
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WirePointer.OTHER: {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void zeroObject(SegmentBuilder segment, long tag, int ptr) {
|
||||||
|
//# We shouldn't zero out external data linked into the message.
|
||||||
|
if (!segment.isWritable()) return;
|
||||||
|
|
||||||
|
switch (WirePointer.kind(tag)) {
|
||||||
|
case WirePointer.STRUCT: {
|
||||||
|
int pointerSection = ptr + StructPointer.dataSize(tag);
|
||||||
|
int count = StructPointer.ptrCount(tag);
|
||||||
|
for (int ii = 0; ii < count; ++ii) {
|
||||||
|
zeroObject(segment, pointerSection + ii);
|
||||||
|
}
|
||||||
|
memset(segment.buffer, ptr * Constants.BYTES_PER_WORD, (byte)0,
|
||||||
|
StructPointer.wordSize(tag) * Constants.BYTES_PER_WORD);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WirePointer.LIST: {
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WirePointer.FAR:
|
||||||
|
throw new Error("Unexpected FAR pointer.");
|
||||||
|
case WirePointer.OTHER:
|
||||||
|
throw new Error("Unexpected OTHER pointer.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static <T> T initStructPointer(StructBuilder.Factory<T> factory,
|
static <T> T initStructPointer(StructBuilder.Factory<T> factory,
|
||||||
int refOffset,
|
int refOffset,
|
||||||
|
@ -625,6 +670,13 @@ final class WireHelpers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void memset(ByteBuffer dstBuffer, int dstByteOffset, byte value, int length) {
|
||||||
|
// TODO we can probably do this faster
|
||||||
|
for (int ii = dstByteOffset; ii < dstByteOffset + length; ++ii) {
|
||||||
|
dstBuffer.put(ii, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void memcpy(ByteBuffer dstBuffer, int dstByteOffset, ByteBuffer srcBuffer, int srcByteOffset, int length) {
|
static void memcpy(ByteBuffer dstBuffer, int dstByteOffset, ByteBuffer srcBuffer, int srcByteOffset, int length) {
|
||||||
ByteBuffer dstDup = dstBuffer.duplicate();
|
ByteBuffer dstDup = dstBuffer.duplicate();
|
||||||
dstDup.position(dstByteOffset);
|
dstDup.position(dstByteOffset);
|
||||||
|
|
Loading…
Reference in a new issue