Index: src/serialize.cc |
diff --git a/src/serialize.cc b/src/serialize.cc |
index 62b200581b466c6d44a7ec3b3472aa0f47ba2f46..da39ff0e5673108b52d922b0f2f081aef40077f7 100644 |
--- a/src/serialize.cc |
+++ b/src/serialize.cc |
@@ -2569,6 +2569,7 @@ SerializedCodeData::SerializedCodeData(const List<byte>& payload, |
AllocateData(size); |
// Set header values. |
+ SetHeaderValue(kMagicNumberOffset, kMagicNumber); |
SetHeaderValue(kVersionHashOffset, Version::Hash()); |
SetHeaderValue(kSourceHashOffset, SourceHash(cs.source())); |
SetHeaderValue(kCpuFeaturesOffset, |
@@ -2599,14 +2600,24 @@ SerializedCodeData::SerializedCodeData(const List<byte>& payload, |
} |
-bool SerializedCodeData::IsSane(String* source) const { |
- return GetHeaderValue(kVersionHashOffset) == Version::Hash() && |
- GetHeaderValue(kSourceHashOffset) == SourceHash(source) && |
- GetHeaderValue(kCpuFeaturesOffset) == |
- static_cast<uint32_t>(CpuFeatures::SupportedFeatures()) && |
- GetHeaderValue(kFlagHashOffset) == FlagList::Hash() && |
- Checksum(Payload()).Check(GetHeaderValue(kChecksum1Offset), |
- GetHeaderValue(kChecksum2Offset)); |
+SerializedCodeData::SanityCheckResult SerializedCodeData::SanityCheck( |
+ String* source) const { |
+ uint32_t magic_number = GetHeaderValue(kMagicNumberOffset); |
+ uint32_t version_hash = GetHeaderValue(kVersionHashOffset); |
+ uint32_t source_hash = GetHeaderValue(kSourceHashOffset); |
+ uint32_t cpu_features = GetHeaderValue(kCpuFeaturesOffset); |
+ uint32_t flags_hash = GetHeaderValue(kFlagHashOffset); |
+ uint32_t c1 = GetHeaderValue(kChecksum1Offset); |
+ uint32_t c2 = GetHeaderValue(kChecksum2Offset); |
+ if (magic_number != kMagicNumber) return MAGIC_NUMBER_MISMATCH; |
+ if (version_hash != Version::Hash()) return VERSION_MISMATCH; |
+ if (source_hash != SourceHash(source)) return SOURCE_MISMATCH; |
+ if (cpu_features != static_cast<uint32_t>(CpuFeatures::SupportedFeatures())) { |
+ return CPU_FEATURES_MISMATCH; |
+ } |
+ if (flags_hash != FlagList::Hash()) return FLAGS_MISMATCH; |
+ if (!Checksum(Payload()).Check(c1, c2)) return CHECKSUM_MISMATCH; |
+ return CHECK_SUCCESS; |
} |
@@ -2662,8 +2673,10 @@ SerializedCodeData* SerializedCodeData::FromCachedData(ScriptData* cached_data, |
String* source) { |
DisallowHeapAllocation no_gc; |
SerializedCodeData* scd = new SerializedCodeData(cached_data); |
- if (scd->IsSane(source)) return scd; |
+ SanityCheckResult r = scd->SanityCheck(source); |
+ if (r == CHECK_SUCCESS) return scd; |
cached_data->Reject(); |
+ source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); |
vogelheim
2015/02/16 12:01:36
Just curious: Why count only the failures, and not
|
delete scd; |
return NULL; |
} |