working on WireHelpers.zeroObject

This commit is contained in:
David Renshaw 2014-11-04 21:53:34 -05:00
parent 18b03eae8a
commit 2902b6c753
2 changed files with 58 additions and 1 deletions

View file

@ -63,4 +63,9 @@ public final class SegmentBuilder extends SegmentReader {
public final BuilderArena getArena() {
return (BuilderArena)this.arena;
}
public final boolean isWritable() {
// TODO support external non-writable segments
return true;
}
}

View file

@ -166,9 +166,54 @@ final class WireHelpers {
//# about to be overwritten making the target object no longer
//# reachable.
// TODO
//# 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
}
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,
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) {
ByteBuffer dstDup = dstBuffer.duplicate();
dstDup.position(dstByteOffset);