Commit 3c7505d6 authored by Kenton Varda's avatar Kenton Varda

Add some missing type checks in dynamic.c++.

parent 3f2876bb
...@@ -542,8 +542,7 @@ void DynamicStruct::Builder::set(StructSchema::Field field, const DynamicValue:: ...@@ -542,8 +542,7 @@ void DynamicStruct::Builder::set(StructSchema::Field field, const DynamicValue::
rawValue = enumSchema.getEnumerantByName(value.as<Text>()).getOrdinal(); rawValue = enumSchema.getEnumerantByName(value.as<Text>()).getOrdinal();
} else { } else {
DynamicEnum enumValue = value.as<DynamicEnum>(); DynamicEnum enumValue = value.as<DynamicEnum>();
KJ_REQUIRE(enumValue.getSchema() == enumSchema, KJ_REQUIRE(enumValue.getSchema() == enumSchema, "Value type mismatch.") {
"Type mismatch when using DynamicList::Builder::set().") {
return; return;
} }
rawValue = enumValue.getRaw(); rawValue = enumValue.getRaw();
...@@ -561,15 +560,25 @@ void DynamicStruct::Builder::set(StructSchema::Field field, const DynamicValue:: ...@@ -561,15 +560,25 @@ void DynamicStruct::Builder::set(StructSchema::Field field, const DynamicValue::
builder.setBlobField<Data>(slot.getOffset() * POINTERS, value.as<Data>()); builder.setBlobField<Data>(slot.getOffset() * POINTERS, value.as<Data>());
return; return;
case schema::Type::LIST: case schema::Type::LIST: {
// TODO(soon): Type check. ListSchema listType = ListSchema::of(type.getList().getElementType(), schema);
builder.setListField(slot.getOffset() * POINTERS, value.as<DynamicList>().reader); auto listValue = value.as<DynamicList>();
KJ_REQUIRE(listValue.getSchema() == listType, "Value type mismatch.") {
return; return;
}
builder.setListField(slot.getOffset() * POINTERS, listValue.reader);
return;
}
case schema::Type::STRUCT: case schema::Type::STRUCT: {
// TODO(soon): Type check. auto structType = schema.getDependency(type.getStruct().getTypeId()).asStruct();
builder.setStructField(slot.getOffset() * POINTERS, value.as<DynamicStruct>().reader); auto structValue = value.as<DynamicStruct>();
KJ_REQUIRE(structValue.getSchema() == structType, "Value type mismatch.") {
return;
}
builder.setStructField(slot.getOffset() * POINTERS, structValue.reader);
return; return;
}
case schema::Type::OBJECT: case schema::Type::OBJECT:
builder.setObjectField(slot.getOffset() * POINTERS, value.as<DynamicObject>().reader); builder.setObjectField(slot.getOffset() * POINTERS, value.as<DynamicObject>().reader);
...@@ -710,18 +719,20 @@ void DynamicStruct::Builder::adopt(StructSchema::Field field, Orphan<DynamicValu ...@@ -710,18 +719,20 @@ void DynamicStruct::Builder::adopt(StructSchema::Field field, Orphan<DynamicValu
break; break;
case schema::Type::LIST: { case schema::Type::LIST: {
ListSchema listType = ListSchema::of(type.getList().getElementType(), ListSchema listType = ListSchema::of(type.getList().getElementType(), schema);
field.getContainingStruct());
KJ_REQUIRE(orphan.getType() == DynamicValue::LIST && orphan.listSchema == listType, KJ_REQUIRE(orphan.getType() == DynamicValue::LIST && orphan.listSchema == listType,
"Value type mismatch."); "Value type mismatch.") {
return;
}
break; break;
} }
case schema::Type::STRUCT: { case schema::Type::STRUCT: {
auto structType = auto structType = schema.getDependency(type.getStruct().getTypeId()).asStruct();
field.getContainingStruct().getDependency(type.getStruct().getTypeId()).asStruct();
KJ_REQUIRE(orphan.getType() == DynamicValue::STRUCT && orphan.structSchema == structType, KJ_REQUIRE(orphan.getType() == DynamicValue::STRUCT && orphan.structSchema == structType,
"Value type mismatch."); "Value type mismatch.") {
return;
}
break; break;
} }
...@@ -729,7 +740,9 @@ void DynamicStruct::Builder::adopt(StructSchema::Field field, Orphan<DynamicValu ...@@ -729,7 +740,9 @@ void DynamicStruct::Builder::adopt(StructSchema::Field field, Orphan<DynamicValu
KJ_REQUIRE(orphan.getType() == DynamicValue::STRUCT || KJ_REQUIRE(orphan.getType() == DynamicValue::STRUCT ||
orphan.getType() == DynamicValue::LIST || orphan.getType() == DynamicValue::LIST ||
orphan.getType() == DynamicValue::OBJECT, orphan.getType() == DynamicValue::OBJECT,
"Value type mismatch."); "Value type mismatch.") {
return;
}
break; break;
case schema::Type::INTERFACE: case schema::Type::INTERFACE:
...@@ -1206,14 +1219,20 @@ void DynamicList::Builder::set(uint index, const DynamicValue::Reader& value) { ...@@ -1206,14 +1219,20 @@ void DynamicList::Builder::set(uint index, const DynamicValue::Reader& value) {
return; return;
case schema::Type::LIST: { case schema::Type::LIST: {
// TODO(soon): Type check. auto listValue = value.as<DynamicList>();
builder.setListElement(index * ELEMENTS, value.as<DynamicList>().reader); KJ_REQUIRE(listValue.getSchema() == schema.getListElementType(), "Value type mismatch.") {
return;
}
builder.setListElement(index * ELEMENTS, listValue.reader);
return; return;
} }
case schema::Type::STRUCT: { case schema::Type::STRUCT: {
// TODO(soon): Type check. auto structValue = value.as<DynamicStruct>();
builder.getStructElement(index * ELEMENTS).copyContentFrom(value.as<DynamicStruct>().reader); KJ_REQUIRE(structValue.getSchema() == schema.getStructElementType(), "Value type mismatch.") {
return;
}
builder.getStructElement(index * ELEMENTS).copyContentFrom(structValue.reader);
return; return;
} }
......
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