Revert "[kernel] Change dill representation of doubles"

This reverts commit 6e2536f585 as it
breaks flutter hot_reload test.

Bug: https://github.com/flutter/flutter/issues/17202
Change-Id: I36261a1aec5ec2196c3a02cc0da0dc0833337004
Reviewed-on: https://dart-review.googlesource.com/53460
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
This commit is contained in:
Alexander Aprelev 2018-05-02 20:25:58 +00:00 committed by commit-bot@chromium.org
parent 9a7e1f64a2
commit b298fc6d8f
8 changed files with 20 additions and 58 deletions

View file

@ -42,8 +42,6 @@ type UInt30 extends UInt {
type UInt32 = big endian 32-bit unsigned integer type UInt32 = big endian 32-bit unsigned integer
type Double = Double-precision floating-point number.
type List<T> { type List<T> {
UInt length; UInt length;
T[length] items; T[length] items;
@ -713,7 +711,7 @@ type BigIntLiteral extends Expression {
type DoubleLiteral extends Expression { type DoubleLiteral extends Expression {
Byte tag = 40; Byte tag = 40;
Double value; StringReference valueString;
} }
type TrueLiteral extends Expression { type TrueLiteral extends Expression {
@ -876,7 +874,7 @@ type IntConstant extends Constant {
type DoubleConstant extends Constant { type DoubleConstant extends Constant {
Byte tag = 3; Byte tag = 3;
Double value; StringReference value;
} }
type StringConstant extends Constant { type StringConstant extends Constant {

View file

@ -97,22 +97,6 @@ class BinaryBuilder {
readByte(); readByte();
} }
final Float64List _doubleBuffer = new Float64List(1);
Uint8List _doubleBufferUint8;
double readDouble() {
_doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
_doubleBufferUint8[0] = readByte();
_doubleBufferUint8[1] = readByte();
_doubleBufferUint8[2] = readByte();
_doubleBufferUint8[3] = readByte();
_doubleBufferUint8[4] = readByte();
_doubleBufferUint8[5] = readByte();
_doubleBufferUint8[6] = readByte();
_doubleBufferUint8[7] = readByte();
return _doubleBuffer[0];
}
List<int> readByteList() { List<int> readByteList() {
List<int> bytes = new Uint8List(readUInt()); List<int> bytes = new Uint8List(readUInt());
bytes.setRange(0, bytes.length, _bytes, _byteOffset); bytes.setRange(0, bytes.length, _bytes, _byteOffset);
@ -190,7 +174,7 @@ class BinaryBuilder {
case ConstantTag.IntConstant: case ConstantTag.IntConstant:
return new IntConstant((readExpression() as IntLiteral).value); return new IntConstant((readExpression() as IntLiteral).value);
case ConstantTag.DoubleConstant: case ConstantTag.DoubleConstant:
return new DoubleConstant(readDouble()); return new DoubleConstant(double.parse(readStringReference()));
case ConstantTag.StringConstant: case ConstantTag.StringConstant:
return new StringConstant(readStringReference()); return new StringConstant(readStringReference());
case ConstantTag.MapConstant: case ConstantTag.MapConstant:
@ -1351,7 +1335,7 @@ class BinaryBuilder {
case Tag.BigIntLiteral: case Tag.BigIntLiteral:
return new IntLiteral(int.parse(readStringReference())); return new IntLiteral(int.parse(readStringReference()));
case Tag.DoubleLiteral: case Tag.DoubleLiteral:
return new DoubleLiteral(readDouble()); return new DoubleLiteral(double.parse(readStringReference()));
case Tag.TrueLiteral: case Tag.TrueLiteral:
return new BoolLiteral(true); return new BoolLiteral(true);
case Tag.FalseLiteral: case Tag.FalseLiteral:

View file

@ -154,7 +154,7 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
writeInteger(constant.value); writeInteger(constant.value);
} else if (constant is DoubleConstant) { } else if (constant is DoubleConstant) {
writeByte(ConstantTag.DoubleConstant); writeByte(ConstantTag.DoubleConstant);
writeDouble(constant.value); writeStringReference('${constant.value}');
} else if (constant is StringConstant) { } else if (constant is StringConstant) {
writeByte(ConstantTag.StringConstant); writeByte(ConstantTag.StringConstant);
writeStringReference(constant.value); writeStringReference(constant.value);
@ -1246,12 +1246,13 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
@override @override
void visitDoubleLiteral(DoubleLiteral node) { void visitDoubleLiteral(DoubleLiteral node) {
writeByte(Tag.DoubleLiteral);
writeDouble(node.value); writeDouble(node.value);
} }
writeDouble(double value) { writeDouble(double value) {
_sink.addDouble(value); // TODO: Pick a better format for double literals.
writeByte(Tag.DoubleLiteral);
writeStringReference('$value');
} }
@override @override
@ -2204,20 +2205,8 @@ class BufferedSink {
int length = 0; int length = 0;
int flushedLength = 0; int flushedLength = 0;
Float64List _doubleBuffer = new Float64List(1);
Uint8List _doubleBufferUint8;
BufferedSink(this._sink); BufferedSink(this._sink);
void addDouble(double d) {
_doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
_doubleBuffer[0] = d;
addByte4(_doubleBufferUint8[0], _doubleBufferUint8[1],
_doubleBufferUint8[2], _doubleBufferUint8[3]);
addByte4(_doubleBufferUint8[4], _doubleBufferUint8[5],
_doubleBufferUint8[6], _doubleBufferUint8[7]);
}
void addByte(int byte) { void addByte(int byte) {
_buffer[length++] = byte; _buffer[length++] = byte;
if (length == SIZE) { if (length == SIZE) {

View file

@ -135,7 +135,7 @@ class Tag {
/// Internal version of kernel binary format. /// Internal version of kernel binary format.
/// Bump it when making incompatible changes in kernel binaries. /// Bump it when making incompatible changes in kernel binaries.
/// Keep in sync with runtime/vm/kernel_binary.h. /// Keep in sync with runtime/vm/kernel_binary.h.
static const int BinaryFormatVersion = 5; static const int BinaryFormatVersion = 4;
} }
abstract class ConstantTag { abstract class ConstantTag {

View file

@ -1548,7 +1548,7 @@ void StreamingScopeBuilder::VisitExpression() {
builder_->ReadUInt(); // read value. builder_->ReadUInt(); // read value.
return; return;
case kDoubleLiteral: case kDoubleLiteral:
builder_->ReadDouble(); // read value. builder_->SkipStringReference(); // read index into string table.
return; return;
case kTrueLiteral: case kTrueLiteral:
return; return;
@ -3542,7 +3542,8 @@ void StreamingConstantEvaluator::EvaluateIntLiteral(bool is_negative) {
} }
void StreamingConstantEvaluator::EvaluateDoubleLiteral() { void StreamingConstantEvaluator::EvaluateDoubleLiteral() {
result_ = Double::New(builder_->ReadDouble(), Heap::kOld); // read value. result_ = Double::New(H.DartString(builder_->ReadStringReference()),
Heap::kOld); // read string reference.
result_ = H.Canonicalize(result_); result_ = H.Canonicalize(result_);
} }
@ -6021,10 +6022,6 @@ uint32_t KernelReaderHelper::PeekUInt() {
return reader_.ReadUInt(); return reader_.ReadUInt();
} }
double KernelReaderHelper::ReadDouble() {
return reader_.ReadDouble();
}
uint32_t KernelReaderHelper::PeekListLength() { uint32_t KernelReaderHelper::PeekListLength() {
AlternativeReadingScope alt(&reader_); AlternativeReadingScope alt(&reader_);
return reader_.ReadListLength(); return reader_.ReadListLength();
@ -6492,7 +6489,7 @@ void KernelReaderHelper::SkipExpression() {
ReadUInt(); // read value. ReadUInt(); // read value.
return; return;
case kDoubleLiteral: case kDoubleLiteral:
ReadDouble(); // read value. SkipStringReference(); // read index into string table.
return; return;
case kTrueLiteral: case kTrueLiteral:
return; return;
@ -8985,7 +8982,8 @@ Fragment StreamingFlowGraphBuilder::BuildDoubleLiteral(
if (position != NULL) *position = TokenPosition::kNoSource; if (position != NULL) *position = TokenPosition::kNoSource;
Double& constant = Double::ZoneHandle( Double& constant = Double::ZoneHandle(
Z, Double::NewCanonical(ReadDouble())); // read double. Z, Double::NewCanonical(
H.DartString(ReadStringReference()))); // read string reference.
return Constant(constant); return Constant(constant);
} }
@ -10819,7 +10817,8 @@ const Array& ConstantHelper::ReadConstantTable() {
break; break;
} }
case kDoubleConstant: { case kDoubleConstant: {
temp_instance_ = Double::New(builder_.ReadDouble(), Heap::kOld); temp_instance_ = Double::New(
H.DartString(builder_.ReadStringReference()), Heap::kOld);
temp_instance_ = H.Canonicalize(temp_instance_); temp_instance_ = H.Canonicalize(temp_instance_);
break; break;
} }

View file

@ -1040,7 +1040,6 @@ class KernelReaderHelper {
uint32_t ReadUInt(); uint32_t ReadUInt();
uint32_t ReadUInt32(); uint32_t ReadUInt32();
uint32_t PeekUInt(); uint32_t PeekUInt();
double ReadDouble();
uint32_t PeekListLength(); uint32_t PeekListLength();
StringIndex ReadStringReference(); StringIndex ReadStringReference();
NameIndex ReadCanonicalNameReference(); NameIndex ReadCanonicalNameReference();

View file

@ -19,7 +19,7 @@ namespace kernel {
// Keep in sync with package:kernel/lib/binary/tag.dart. // Keep in sync with package:kernel/lib/binary/tag.dart.
static const uint32_t kMagicProgramFile = 0x90ABCDEFu; static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
static const uint32_t kBinaryFormatVersion = 5; static const uint32_t kBinaryFormatVersion = 4;
// Keep in sync with package:kernel/lib/binary/tag.dart // Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \ #define KERNEL_TAG_LIST(V) \
@ -213,14 +213,6 @@ class Reader : public ValueObject {
return value; return value;
} }
double ReadDouble() {
ASSERT((size_ >= 8) && (offset_ >= 0) && (offset_ <= size_ - 8));
double value = ReadUnaligned(
reinterpret_cast<const double*>(&this->buffer()[offset_]));
offset_ += 8;
return value;
}
uint32_t ReadUInt() { uint32_t ReadUInt() {
ASSERT((size_ >= 1) && (offset_ >= 0) && (offset_ <= size_ - 1)); ASSERT((size_ >= 1) && (offset_ >= 0) && (offset_ <= size_ - 1));

View file

@ -82,7 +82,8 @@ class SimpleExpressionConverter {
return true; return true;
case kDoubleLiteral: case kDoubleLiteral:
simple_value_ = &Double::ZoneHandle( simple_value_ = &Double::ZoneHandle(
Z, Double::New(builder_->ReadDouble(), Heap::kOld)); // read value. Z, Double::New(H.DartString(builder_->ReadStringReference()),
Heap::kOld)); // read string reference.
*simple_value_ = H.Canonicalize(*simple_value_); *simple_value_ = H.Canonicalize(*simple_value_);
return true; return true;
case kTrueLiteral: case kTrueLiteral: