[NOT READY] Update release

This commit is contained in:
Zihan Chen
2019-01-10 06:30:52 -08:00
parent c6a61aece1
commit 5e063f0f98
32 changed files with 1118 additions and 1297 deletions
+135 -22
View File
@@ -573,12 +573,22 @@ namespace vl
{
namespace internal
{
struct WfDeserializationException
{
};
struct WfReaderContext
{
Dictionary<vint, ITypeDescriptor*> tdIndex;
Dictionary<vint, IMethodInfo*> miIndex;
Dictionary<vint, IPropertyInfo*> piIndex;
Dictionary<vint, IEventInfo*> eiIndex;
WfAssemblyLoadErrors& errors;
WfReaderContext(WfAssemblyLoadErrors& _errors)
:errors(_errors)
{
}
};
struct WfWriterContextPrepare
@@ -874,7 +884,10 @@ Serizliation (ITypeDescriptor)
WString id;
reader << id;
value = GetTypeDescriptor(id);
CHECK_ERROR(value, L"Failed to load type.");
if (!value)
{
reader.context->errors.unresolvedTypes.Add(id);
}
}
static void IO(WfWriter& writer, ITypeDescriptor*& value)
@@ -1004,19 +1017,28 @@ Serizliation (Metadata)
if (!group)
{
CHECK_ERROR(value, L"Failed to load method.");
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(...): *");
return;
}
vint methodFlag = -1;
reader << methodFlag;
CHECK_ERROR(0 <= methodFlag && methodFlag <= 3, L"Failed to load method.");
if (0 > methodFlag || methodFlag > 3)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(...): *");
return;
}
vint methodCount = group->GetMethodCount();
switch (methodFlag)
{
case 0:
{
CHECK_ERROR(methodCount == 1, L"Failed to load method.");
if (methodCount > 1)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(...): *; This is caused by a change to this class. When the current assembly was compiled, this imported method didn't have overloadings.");
return;
}
value = group->GetMethod(0);
}
break;
@@ -1024,15 +1046,39 @@ Serizliation (Metadata)
{
vint count = -1;
reader << count;
WString parameters;
for (vint i = 0; i < count; i++)
{
if (i == 0)
{
parameters = L"*";
}
else
{
parameters += L", *";
}
}
for (vint i = 0; i < methodCount; i++)
{
auto method = group->GetMethod(i);
if (method->GetParameterCount() == count)
{
CHECK_ERROR(!value, L"Failed to load method.");
if (value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(" + parameters + L"): *; This is caused by a change to this class. When the current assembly was compiled, this imported method didn't have overloadings with the same amount of parameters.");
return;
}
value = method;
}
}
if (!value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(" + parameters + L"): *; A qualified method doesn't exist.");
return;
}
}
break;
case 2:
@@ -1045,10 +1091,20 @@ Serizliation (Metadata)
auto method = group->GetMethod(i);
if (method->GetReturn()->GetTypeFriendlyName() == signature)
{
CHECK_ERROR(!value, L"Failed to load method.");
if (value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(...): " + signature + L"; This is caused by a change to this class. When the current assembly was compiled, this imported method didn't have overloadings with the same return type.");
return;
}
value = method;
}
}
if (!value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(...): " + signature + L"; A qualified method doesn't exist.");
return;
}
}
break;
case 3:
@@ -1063,6 +1119,19 @@ Serizliation (Metadata)
signatures.Add(type->GetTypeFriendlyName());
}
WString parameters;
for (vint i = 0; i < count; i++)
{
if (i == 0)
{
parameters = signatures[0];
}
else
{
parameters += L", " + signatures[i];
}
}
for (vint i = 0; i < methodCount; i++)
{
auto method = group->GetMethod(i);
@@ -1080,11 +1149,21 @@ Serizliation (Metadata)
if (found)
{
CHECK_ERROR(!value, L"Failed to load method.");
if (value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(" + parameters + L"): *; This is caused by a change to this class. When the current assembly was compiled, this imported method didn't have overloadings with the same parameter types.");
return;
}
value = method;
}
}
}
if (!value)
{
reader.context->errors.unresolvedMembers.Add(L"method: " + type->GetTypeName() + L"::" + name + L"(" + parameters + L"): *; A qualified method doesn't exist.");
return;
}
}
break;
}
@@ -1166,7 +1245,10 @@ Serizliation (Metadata)
reader << typeIndex << name;
auto type = reader.context->tdIndex[typeIndex];
value = type->GetPropertyByName(name, false);
CHECK_ERROR(value, L"Failed to load property.");
if (!value)
{
reader.context->errors.unresolvedMembers.Add(L"property: " + type->GetTypeName() + L"::" + name);
}
}
static void IO(WfWriter& writer, IPropertyInfo*& value)
@@ -1188,7 +1270,10 @@ Serizliation (Metadata)
reader << typeIndex << name;
auto type = reader.context->tdIndex[typeIndex];
value = type->GetEventByName(name, false);
CHECK_ERROR(value, L"Failed to load event.");
if (!value)
{
reader.context->errors.unresolvedMembers.Add(L"event: " + type->GetTypeName() + L"::" + name);
}
}
static void IO(WfWriter& writer, IEventInfo*& value)
@@ -1978,6 +2063,10 @@ Serialization (Assembly)
{
bool isFlags;
WString typeName;
if (GetTypeDescriptor(typeName))
{
reader.context->errors.duplicatedTypes.Add(typeName);
}
reader << isFlags << typeName;
type = MakePtr<WfEnum>(isFlags, typeName);
}
@@ -1994,6 +2083,10 @@ Serialization (Assembly)
{
WString typeName;
reader << typeName;
if (GetTypeDescriptor(typeName))
{
reader.context->errors.duplicatedTypes.Add(typeName);
}
type = MakePtr<TType>(typeName);
}
@@ -2045,9 +2138,9 @@ Serialization (Assembly)
//----------------------------------------------------
static void IOPrepare(WfReader& reader, WfAssembly& value)
static void IOPrepare(WfReader& reader, WfAssembly& value, WfAssemblyLoadErrors& errors)
{
reader.context = new WfReaderContext;
reader.context = new WfReaderContext(errors);
bool hasTypeImpl = false;
reader << hasTypeImpl;
if (hasTypeImpl)
@@ -2071,6 +2164,11 @@ Serialization (Assembly)
reader.context->tdIndex.Add(i, td);
}
if (errors.unresolvedTypes.Count() + errors.duplicatedTypes.Count() > 0)
{
throw WfDeserializationException();
}
if (hasTypeImpl)
{
Serialization<WfTypeImpl>::IO(reader, *value.typeImpl.Obj());
@@ -2095,9 +2193,14 @@ Serialization (Assembly)
reader << ei;
reader.context->eiIndex.Add(i, ei);
}
if (errors.unresolvedMembers.Count() > 0)
{
throw WfDeserializationException();
}
}
static void IOPrepare(WfWriter& writer, WfAssembly& value)
static void IOPrepare(WfWriter& writer, WfAssembly& value, WfAssemblyLoadErrors&)
{
writer.context = new WfWriterContext;
bool hasTypeImpl = value.typeImpl != nullptr;
@@ -2158,9 +2261,9 @@ Serialization (Assembly)
//----------------------------------------------------
template<typename TIO>
static void IO(TIO& io, WfAssembly& value)
static void IO(TIO& io, WfAssembly& value, WfAssemblyLoadErrors& errors)
{
IOPrepare(io, value);
IOPrepare(io, value, errors);
io << value.insBeforeCodegen
<< value.insAfterCodegen
<< value.variableNames
@@ -2206,23 +2309,33 @@ WfAssembly
{
}
WfAssembly::WfAssembly(stream::IStream& input)
{
stream::internal::WfReader reader(input);
stream::internal::Serialization<WfAssembly>::IO(reader, *this);
Initialize();
}
void WfAssembly::Initialize()
{
insBeforeCodegen->Initialize();
insAfterCodegen->Initialize();
}
Ptr<WfAssembly> WfAssembly::Deserialize(stream::IStream& input, WfAssemblyLoadErrors& errors)
{
try
{
auto assembly = MakePtr<WfAssembly>();
stream::internal::WfReader reader(input);
stream::internal::Serialization<WfAssembly>::IO(reader, *assembly.Obj(), errors);
assembly->Initialize();
return assembly;
}
catch (stream::internal::WfDeserializationException)
{
return {};
}
}
void WfAssembly::Serialize(stream::IStream& output)
{
WfAssemblyLoadErrors dummy;
stream::internal::WfWriter writer(output);
stream::internal::Serialization<WfAssembly>::IO(writer, *this);
stream::internal::Serialization<WfAssembly>::IO(writer, *this, dummy);
}
}
}