mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 18:16:04 +00:00
Add an assertion to ensure that the return type and types of parameters are canonical or a TypeParameter.
BUG= R=regis@google.com Review URL: https://codereview.chromium.org//1182673002.
This commit is contained in:
parent
58708e3ad1
commit
298a2f467f
|
@ -516,7 +516,7 @@ static void SetupForGenericSnapshotCreation() {
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
const int EXTRA_VM_ARGUMENTS = 1;
|
const int EXTRA_VM_ARGUMENTS = 2;
|
||||||
CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
|
CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
|
||||||
|
|
||||||
// Initialize the URL mapping array.
|
// Initialize the URL mapping array.
|
||||||
|
@ -536,7 +536,9 @@ int main(int argc, char** argv) {
|
||||||
DartUtils::SetOriginalWorkingDirectory();
|
DartUtils::SetOriginalWorkingDirectory();
|
||||||
|
|
||||||
vm_options.AddArgument("--load_deferred_eagerly");
|
vm_options.AddArgument("--load_deferred_eagerly");
|
||||||
|
// Workaround until issue 21620 is fixed.
|
||||||
|
// (https://github.com/dart-lang/sdk/issues/21620)
|
||||||
|
vm_options.AddArgument("--no-concurrent_sweep");
|
||||||
Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
|
Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
|
||||||
|
|
||||||
// Initialize the Dart VM.
|
// Initialize the Dart VM.
|
||||||
|
|
|
@ -2332,6 +2332,9 @@ void ClassFinalizer::FinalizeClass(const Class& cls) {
|
||||||
if (cls.is_finalized()) {
|
if (cls.is_finalized()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (FLAG_trace_class_finalization) {
|
||||||
|
OS::Print("Finalize %s\n", cls.ToCString());
|
||||||
|
}
|
||||||
if (cls.is_patch()) {
|
if (cls.is_patch()) {
|
||||||
// The fields and functions of a patch class are copied to the
|
// The fields and functions of a patch class are copied to the
|
||||||
// patched class after parsing. There is nothing to finalize.
|
// patched class after parsing. There is nothing to finalize.
|
||||||
|
@ -2340,9 +2343,6 @@ void ClassFinalizer::FinalizeClass(const Class& cls) {
|
||||||
cls.set_is_finalized();
|
cls.set_is_finalized();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (FLAG_trace_class_finalization) {
|
|
||||||
OS::Print("Finalize %s\n", cls.ToCString());
|
|
||||||
}
|
|
||||||
if (cls.IsMixinApplication()) {
|
if (cls.IsMixinApplication()) {
|
||||||
// Copy instance methods and fields from the mixin class.
|
// Copy instance methods and fields from the mixin class.
|
||||||
// This has to happen before the check whether the methods of
|
// This has to happen before the check whether the methods of
|
||||||
|
|
|
@ -344,6 +344,12 @@ RawError* Compiler::CompileClass(const Class& cls) {
|
||||||
ClassFinalizer::FinalizeClass(parse_class);
|
ClassFinalizer::FinalizeClass(parse_class);
|
||||||
parse_class.reset_is_marked_for_parsing();
|
parse_class.reset_is_marked_for_parsing();
|
||||||
}
|
}
|
||||||
|
for (intptr_t i = (patch_list.Length() - 1); i >=0 ; i--) {
|
||||||
|
parse_class ^= patch_list.At(i);
|
||||||
|
ASSERT(!parse_class.IsNull());
|
||||||
|
ClassFinalizer::FinalizeClass(parse_class);
|
||||||
|
parse_class.reset_is_marked_for_parsing();
|
||||||
|
}
|
||||||
|
|
||||||
return Error::null();
|
return Error::null();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -71,6 +71,46 @@ const char* CanonicalFunction(const char* func) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
// An object visitor which will iterate over all the function objects in the
|
||||||
|
// heap and check if the result type and parameter types are canonicalized
|
||||||
|
// or not. An assertion is raised if a type is not canonicalized.
|
||||||
|
class FunctionVisitor : public ObjectVisitor {
|
||||||
|
public:
|
||||||
|
explicit FunctionVisitor(Isolate* isolate) :
|
||||||
|
ObjectVisitor(isolate),
|
||||||
|
classHandle_(Class::Handle(isolate)),
|
||||||
|
funcHandle_(Function::Handle(isolate)),
|
||||||
|
typeHandle_(AbstractType::Handle(isolate)) {}
|
||||||
|
|
||||||
|
void VisitObject(RawObject* obj) {
|
||||||
|
if (obj->IsFunction()) {
|
||||||
|
funcHandle_ ^= obj;
|
||||||
|
classHandle_ ^= funcHandle_.Owner();
|
||||||
|
// Verify that the result type of a function is canonical or a
|
||||||
|
// TypeParameter.
|
||||||
|
typeHandle_ ^= funcHandle_.result_type();
|
||||||
|
ASSERT(typeHandle_.IsNull() ||
|
||||||
|
typeHandle_.IsTypeParameter() ||
|
||||||
|
typeHandle_.IsCanonical());
|
||||||
|
// Verify that the types in the function signature are all canonical or
|
||||||
|
// a TypeParameter.
|
||||||
|
const intptr_t num_parameters = funcHandle_.NumParameters();
|
||||||
|
for (intptr_t i = 0; i < num_parameters; i++) {
|
||||||
|
typeHandle_ = funcHandle_.ParameterTypeAt(i);
|
||||||
|
ASSERT(typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Class& classHandle_;
|
||||||
|
Function& funcHandle_;
|
||||||
|
AbstractType& typeHandle_;
|
||||||
|
};
|
||||||
|
#endif // #if defined(DEBUG).
|
||||||
|
|
||||||
|
|
||||||
static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) {
|
static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) {
|
||||||
if (obj.IsInstance()) {
|
if (obj.IsInstance()) {
|
||||||
const Library& core_lib = Library::Handle(Library::CoreLibrary());
|
const Library& core_lib = Library::Handle(Library::CoreLibrary());
|
||||||
|
@ -1463,6 +1503,12 @@ DART_EXPORT Dart_Handle Dart_CreateSnapshot(
|
||||||
if (::Dart_IsError(state)) {
|
if (::Dart_IsError(state)) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
isolate->heap()->CollectAllGarbage();
|
||||||
|
#if defined(DEBUG)
|
||||||
|
FunctionVisitor check_canonical(isolate);
|
||||||
|
isolate->heap()->VisitObjects(&check_canonical);
|
||||||
|
#endif // #if defined(DEBUG).
|
||||||
|
|
||||||
// Since this is only a snapshot the root library should not be set.
|
// Since this is only a snapshot the root library should not be set.
|
||||||
isolate->object_store()->set_root_library(Library::Handle(isolate));
|
isolate->object_store()->set_root_library(Library::Handle(isolate));
|
||||||
FullSnapshotWriter writer(vm_isolate_snapshot_buffer,
|
FullSnapshotWriter writer(vm_isolate_snapshot_buffer,
|
||||||
|
|
|
@ -393,6 +393,9 @@ class RawObject {
|
||||||
bool IsScript() {
|
bool IsScript() {
|
||||||
return ((GetClassId() == kScriptCid));
|
return ((GetClassId() == kScriptCid));
|
||||||
}
|
}
|
||||||
|
bool IsFunction() {
|
||||||
|
return ((GetClassId() == kFunctionCid));
|
||||||
|
}
|
||||||
|
|
||||||
intptr_t Size() const {
|
intptr_t Size() const {
|
||||||
uword tags = ptr()->tags_;
|
uword tags = ptr()->tags_;
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace dart {
|
||||||
|
|
||||||
DECLARE_FLAG(bool, enable_type_checks);
|
DECLARE_FLAG(bool, enable_type_checks);
|
||||||
DECLARE_FLAG(bool, load_deferred_eagerly);
|
DECLARE_FLAG(bool, load_deferred_eagerly);
|
||||||
|
DECLARE_FLAG(bool, concurrent_sweep);
|
||||||
|
|
||||||
// Check if serialized and deserialized objects are equal.
|
// Check if serialized and deserialized objects are equal.
|
||||||
static bool Equals(const Object& expected, const Object& actual) {
|
static bool Equals(const Object& expected, const Object& actual) {
|
||||||
|
@ -1235,7 +1236,10 @@ UNIT_TEST_CASE(ScriptSnapshot) {
|
||||||
|
|
||||||
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
||||||
FLAG_load_deferred_eagerly = true;
|
FLAG_load_deferred_eagerly = true;
|
||||||
|
// Workaround until issue 21620 is fixed.
|
||||||
|
// (https://github.com/dart-lang/sdk/issues/21620)
|
||||||
|
bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
|
||||||
|
FLAG_concurrent_sweep = false;
|
||||||
{
|
{
|
||||||
// Start an Isolate, and create a full snapshot of it.
|
// Start an Isolate, and create a full snapshot of it.
|
||||||
TestIsolateScope __test_isolate__;
|
TestIsolateScope __test_isolate__;
|
||||||
|
@ -1251,8 +1255,8 @@ UNIT_TEST_CASE(ScriptSnapshot) {
|
||||||
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
||||||
Dart_ExitScope();
|
Dart_ExitScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
|
FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
|
||||||
|
FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
|
||||||
|
|
||||||
// Test for Dart_CreateScriptSnapshot.
|
// Test for Dart_CreateScriptSnapshot.
|
||||||
{
|
{
|
||||||
|
@ -1379,6 +1383,8 @@ UNIT_TEST_CASE(ScriptSnapshot1) {
|
||||||
|
|
||||||
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
||||||
FLAG_load_deferred_eagerly = true;
|
FLAG_load_deferred_eagerly = true;
|
||||||
|
bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
|
||||||
|
FLAG_concurrent_sweep = false;
|
||||||
{
|
{
|
||||||
// Start an Isolate, and create a full snapshot of it.
|
// Start an Isolate, and create a full snapshot of it.
|
||||||
TestIsolateScope __test_isolate__;
|
TestIsolateScope __test_isolate__;
|
||||||
|
@ -1394,6 +1400,7 @@ UNIT_TEST_CASE(ScriptSnapshot1) {
|
||||||
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
||||||
Dart_ExitScope();
|
Dart_ExitScope();
|
||||||
}
|
}
|
||||||
|
FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
|
||||||
|
|
||||||
{
|
{
|
||||||
// Create an Isolate using the full snapshot, load a script and create
|
// Create an Isolate using the full snapshot, load a script and create
|
||||||
|
@ -1469,7 +1476,8 @@ UNIT_TEST_CASE(ScriptSnapshot2) {
|
||||||
FLAG_enable_type_checks = false;
|
FLAG_enable_type_checks = false;
|
||||||
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
|
||||||
FLAG_load_deferred_eagerly = true;
|
FLAG_load_deferred_eagerly = true;
|
||||||
|
bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
|
||||||
|
FLAG_concurrent_sweep = false;
|
||||||
{
|
{
|
||||||
// Start an Isolate, and create a full snapshot of it.
|
// Start an Isolate, and create a full snapshot of it.
|
||||||
TestIsolateScope __test_isolate__;
|
TestIsolateScope __test_isolate__;
|
||||||
|
@ -1485,6 +1493,7 @@ UNIT_TEST_CASE(ScriptSnapshot2) {
|
||||||
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
|
||||||
Dart_ExitScope();
|
Dart_ExitScope();
|
||||||
}
|
}
|
||||||
|
FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
|
||||||
|
|
||||||
{
|
{
|
||||||
// Create an Isolate using the full snapshot, load a script and create
|
// Create an Isolate using the full snapshot, load a script and create
|
||||||
|
|
Loading…
Reference in a new issue