Commit 863afbe2 authored by Kenton Varda's avatar Kenton Varda

Merge branch

parents 70a7bcb7 a2b0c058
......@@ -119,60 +119,69 @@ struct WirePointer {
// -----------------------------------------------------------------
// Part of pointer that depends on the kind.
union {
uint32_t upper32Bits;
// Note: Originally StructRef, ListRef, and FarRef were unnamed types, but this somehow
// tickled a bug in GCC:
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58192
struct StructRef {
WireValue<WordCount16> dataSize;
WireValue<WirePointerCount16> ptrCount;
inline WordCount wordSize() const {
return dataSize.get() + ptrCount.get() * WORDS_PER_POINTER;
}
struct {
WireValue<WordCount16> dataSize;
WireValue<WirePointerCount16> ptrCount;
KJ_ALWAYS_INLINE(void set(WordCount ds, WirePointerCount rc)) {
dataSize.set(ds);
ptrCount.set(rc);
}
KJ_ALWAYS_INLINE(void set(StructSize size)) {
dataSize.set(size.data);
ptrCount.set(size.pointers);
}
};
inline WordCount wordSize() const {
return dataSize.get() + ptrCount.get() * WORDS_PER_POINTER;
}
struct ListRef {
WireValue<uint32_t> elementSizeAndCount;
KJ_ALWAYS_INLINE(void set(WordCount ds, WirePointerCount rc)) {
dataSize.set(ds);
ptrCount.set(rc);
}
KJ_ALWAYS_INLINE(void set(StructSize size)) {
dataSize.set(size.data);
ptrCount.set(size.pointers);
}
} structRef;
// Also covers capabilities.
KJ_ALWAYS_INLINE(FieldSize elementSize() const) {
return static_cast<FieldSize>(elementSizeAndCount.get() & 7);
}
KJ_ALWAYS_INLINE(ElementCount elementCount() const) {
return (elementSizeAndCount.get() >> 3) * ELEMENTS;
}
KJ_ALWAYS_INLINE(WordCount inlineCompositeWordCount() const) {
return elementCount() * (1 * WORDS / ELEMENTS);
}
struct {
WireValue<uint32_t> elementSizeAndCount;
KJ_ALWAYS_INLINE(void set(FieldSize es, ElementCount ec)) {
KJ_DREQUIRE(ec < (1 << 29) * ELEMENTS, "Lists are limited to 2**29 elements.");
elementSizeAndCount.set(((ec / ELEMENTS) << 3) | static_cast<int>(es));
}
KJ_ALWAYS_INLINE(FieldSize elementSize() const) {
return static_cast<FieldSize>(elementSizeAndCount.get() & 7);
}
KJ_ALWAYS_INLINE(ElementCount elementCount() const) {
return (elementSizeAndCount.get() >> 3) * ELEMENTS;
}
KJ_ALWAYS_INLINE(WordCount inlineCompositeWordCount() const) {
return elementCount() * (1 * WORDS / ELEMENTS);
}
KJ_ALWAYS_INLINE(void setInlineComposite(WordCount wc)) {
KJ_DREQUIRE(wc < (1 << 29) * WORDS, "Inline composite lists are limited to 2**29 words.");
elementSizeAndCount.set(((wc / WORDS) << 3) |
static_cast<int>(FieldSize::INLINE_COMPOSITE));
}
};
KJ_ALWAYS_INLINE(void set(FieldSize es, ElementCount ec)) {
KJ_DREQUIRE(ec < (1 << 29) * ELEMENTS, "Lists are limited to 2**29 elements.");
elementSizeAndCount.set(((ec / ELEMENTS) << 3) | static_cast<int>(es));
}
struct FarRef {
WireValue<SegmentId> segmentId;
KJ_ALWAYS_INLINE(void setInlineComposite(WordCount wc)) {
KJ_DREQUIRE(wc < (1 << 29) * WORDS, "Inline composite lists are limited to 2**29 words.");
elementSizeAndCount.set(((wc / WORDS) << 3) |
static_cast<int>(FieldSize::INLINE_COMPOSITE));
}
} listRef;
KJ_ALWAYS_INLINE(void set(SegmentId si)) {
segmentId.set(si);
}
};
struct {
WireValue<SegmentId> segmentId;
union {
uint32_t upper32Bits;
KJ_ALWAYS_INLINE(void set(SegmentId si)) {
segmentId.set(si);
}
} farRef;
StructRef structRef;
// Also covers capabilities.
ListRef listRef;
FarRef farRef;
};
KJ_ALWAYS_INLINE(bool isNull() const) {
......
---
layout: post
title: "Cap'n Proto v0.2.1: Minor bug fixes"
author: kentonv
---
Cap'n Proto was just bumped to v0.2.1. This release contains a couple bug fixes, including
a work-around for [a GCC bug](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58192). If you were
observing any odd memory corruption or crashes in 0.2.0 -- especially if you are compiling with
GCC with optimization enabled but without `-DNDEBUG` -- you should upgrade.
......@@ -94,9 +94,9 @@ Hopefully, Xcode 5.0 will be released soon with a newer Clang, making this extra
You may download and install the release version of Cap'n Proto like so:
<pre><code>curl -O <a href="http://capnproto.org/capnproto-c++-0.2.0.tar.gz">http://capnproto.org/capnproto-c++-0.2.0.tar.gz</a>
tar zxf capnproto-c++-0.2.0.tar.gz
cd capnproto-c++-0.2.0
<pre><code>curl -O <a href="http://capnproto.org/capnproto-c++-0.2.1.tar.gz">http://capnproto.org/capnproto-c++-0.2.1.tar.gz</a>
tar zxf capnproto-c++-0.2.1.tar.gz
cd capnproto-c++-0.2.1
./configure
make -j6 check
sudo make install</code></pre>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment