OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
64 | 64 |
65 const char* CanonicalFunction(const char* func) { | 65 const char* CanonicalFunction(const char* func) { |
66 if (strncmp(func, "dart::", 6) == 0) { | 66 if (strncmp(func, "dart::", 6) == 0) { |
67 return func + 6; | 67 return func + 6; |
68 } else { | 68 } else { |
69 return func; | 69 return func; |
70 } | 70 } |
71 } | 71 } |
72 | 72 |
73 | 73 |
74 // An object visitor which will iterate over all the function objects in the | |
75 // heap and check if the result type and parameter types are canonicalized | |
76 // or not. If they are not canonicalized if prints the function name out. | |
regis
2015/06/11 23:53:39
if -> it
Actually, it does not print, it asserts,
siva
2015/06/12 00:23:14
Done.
| |
77 class FunctionVisitor : public ObjectVisitor { | |
78 public: | |
79 explicit FunctionVisitor(Isolate* isolate) : | |
80 ObjectVisitor(isolate), | |
81 classHandle_(Class::Handle(isolate)), | |
82 funcHandle_(Function::Handle(isolate)), | |
83 typeHandle_(AbstractType::Handle(isolate)) {} | |
84 | |
85 void VisitObject(RawObject* obj) { | |
86 if (obj->IsFunction()) { | |
87 funcHandle_ ^= obj; | |
88 classHandle_ ^= funcHandle_.Owner(); | |
89 // Verify that the result type of a function is canonical or a | |
90 // TypeParameter. | |
91 typeHandle_ ^= funcHandle_.result_type(); | |
92 ASSERT(typeHandle_.IsNull() || | |
93 typeHandle_.IsTypeParameter() || | |
94 typeHandle_.IsCanonical()); | |
95 // Verify that the types in the function signature are all canonical or | |
96 // a TypeParameter | |
regis
2015/06/11 23:53:39
period
siva
2015/06/12 00:23:14
Done.
| |
97 const intptr_t num_parameters = funcHandle_.NumParameters(); | |
98 for (intptr_t i = 0; i < num_parameters; i++) { | |
99 typeHandle_ = funcHandle_.ParameterTypeAt(i); | |
100 ASSERT(typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical()); | |
101 } | |
102 } | |
103 } | |
104 | |
105 private: | |
106 Class& classHandle_; | |
107 Function& funcHandle_; | |
108 AbstractType& typeHandle_; | |
109 }; | |
110 | |
111 | |
74 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) { | 112 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) { |
75 if (obj.IsInstance()) { | 113 if (obj.IsInstance()) { |
76 const Library& core_lib = Library::Handle(Library::CoreLibrary()); | 114 const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
77 const Class& list_class = | 115 const Class& list_class = |
78 Class::Handle(core_lib.LookupClass(Symbols::List())); | 116 Class::Handle(core_lib.LookupClass(Symbols::List())); |
79 ASSERT(!list_class.IsNull()); | 117 ASSERT(!list_class.IsNull()); |
80 const Instance& instance = Instance::Cast(obj); | 118 const Instance& instance = Instance::Cast(obj); |
81 const Class& obj_class = Class::Handle(isolate, obj.clazz()); | 119 const Class& obj_class = Class::Handle(isolate, obj.clazz()); |
82 Error& malformed_type_error = Error::Handle(isolate); | 120 Error& malformed_type_error = Error::Handle(isolate); |
83 if (obj_class.IsSubtypeOf(Object::null_type_arguments(), | 121 if (obj_class.IsSubtypeOf(Object::null_type_arguments(), |
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1456 RETURN_NULL_ERROR(isolate_snapshot_buffer); | 1494 RETURN_NULL_ERROR(isolate_snapshot_buffer); |
1457 } | 1495 } |
1458 if (isolate_snapshot_size == NULL) { | 1496 if (isolate_snapshot_size == NULL) { |
1459 RETURN_NULL_ERROR(isolate_snapshot_size); | 1497 RETURN_NULL_ERROR(isolate_snapshot_size); |
1460 } | 1498 } |
1461 // Finalize all classes if needed. | 1499 // Finalize all classes if needed. |
1462 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); | 1500 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); |
1463 if (::Dart_IsError(state)) { | 1501 if (::Dart_IsError(state)) { |
1464 return state; | 1502 return state; |
1465 } | 1503 } |
1504 isolate->heap()->CollectAllGarbage(); | |
1505 FunctionVisitor check_canonical(isolate); | |
1506 isolate->heap()->VisitObjects(&check_canonical); | |
regis
2015/06/11 23:53:39
The 2 lines above have no effect in release mode.
siva
2015/06/12 00:23:14
Yes I wrapped this under #if defined(DEBUG) ... #e
| |
1507 | |
1466 // Since this is only a snapshot the root library should not be set. | 1508 // Since this is only a snapshot the root library should not be set. |
1467 isolate->object_store()->set_root_library(Library::Handle(isolate)); | 1509 isolate->object_store()->set_root_library(Library::Handle(isolate)); |
1468 FullSnapshotWriter writer(vm_isolate_snapshot_buffer, | 1510 FullSnapshotWriter writer(vm_isolate_snapshot_buffer, |
1469 isolate_snapshot_buffer, | 1511 isolate_snapshot_buffer, |
1470 ApiReallocate); | 1512 ApiReallocate); |
1471 writer.WriteFullSnapshot(); | 1513 writer.WriteFullSnapshot(); |
1472 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 1514 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
1473 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 1515 *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
1474 return Api::Success(); | 1516 return Api::Success(); |
1475 } | 1517 } |
(...skipping 4130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5606 | 5648 |
5607 | 5649 |
5608 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( | 5650 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( |
5609 const char* name, | 5651 const char* name, |
5610 Dart_ServiceRequestCallback callback, | 5652 Dart_ServiceRequestCallback callback, |
5611 void* user_data) { | 5653 void* user_data) { |
5612 Service::RegisterRootEmbedderCallback(name, callback, user_data); | 5654 Service::RegisterRootEmbedderCallback(name, callback, user_data); |
5613 } | 5655 } |
5614 | 5656 |
5615 } // namespace dart | 5657 } // namespace dart |
OLD | NEW |