| OLD | NEW |
| 1 // Copyright (c) 2014, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dartino 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 #include "src/vm/program.h" | 5 #include "src/vm/program.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include "src/shared/assert.h" | 10 #include "src/shared/assert.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 119 |
| 120 AddToProcessList(process); | 120 AddToProcessList(process); |
| 121 return process; | 121 return process; |
| 122 } | 122 } |
| 123 | 123 |
| 124 Process* Program::ProcessSpawnForMain(List<List<uint8>> arguments) { | 124 Process* Program::ProcessSpawnForMain(List<List<uint8>> arguments) { |
| 125 if (Flags::print_program_statistics) { | 125 if (Flags::print_program_statistics) { |
| 126 PrintStatistics(); | 126 PrintStatistics(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 VerifyObjectPlacements(); |
| 130 |
| 129 Process* process = SpawnProcess(NULL); | 131 Process* process = SpawnProcess(NULL); |
| 130 | 132 |
| 131 // TODO(erikcorry): This is not valid for multiple programs, where the | 133 // TODO(erikcorry): This is not valid for multiple programs, where the |
| 132 // process creation could fail. | 134 // process creation could fail. |
| 133 ASSERT(!process->AllocationFailed()); | 135 ASSERT(!process->AllocationFailed()); |
| 134 | 136 |
| 135 process->set_arguments(arguments); | 137 process->set_arguments(arguments); |
| 136 | 138 |
| 137 Stack* stack = process->stack(); | 139 Stack* stack = process->stack(); |
| 138 | 140 |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 | 347 |
| 346 void Program::FinishProgramGC() { | 348 void Program::FinishProgramGC() { |
| 347 // Uncook process | 349 // Uncook process |
| 348 UncookAndUnchainStacks(); | 350 UncookAndUnchainStacks(); |
| 349 | 351 |
| 350 FinishProgramGCVisitor visitor; | 352 FinishProgramGCVisitor visitor; |
| 351 VisitProcesses(&visitor); | 353 VisitProcesses(&visitor); |
| 352 | 354 |
| 353 if (debug_info_ != NULL) debug_info_->UpdateBreakpoints(); | 355 if (debug_info_ != NULL) debug_info_->UpdateBreakpoints(); |
| 354 | 356 |
| 357 VerifyObjectPlacements(); |
| 358 |
| 355 if (Flags::validate_heaps) ValidateHeapsAreConsistent(); | 359 if (Flags::validate_heaps) ValidateHeapsAreConsistent(); |
| 356 } | 360 } |
| 357 | 361 |
| 358 uword Program::OffsetOf(HeapObject* object) { | 362 uword Program::OffsetOf(HeapObject* object) { |
| 359 ASSERT(is_optimized()); | 363 ASSERT(is_optimized()); |
| 360 return heap()->space()->OffsetOf(object); | 364 return heap()->space()->OffsetOf(object); |
| 361 } | 365 } |
| 362 | 366 |
| 363 HeapObject *Program::ObjectAtOffset(uword offset) { | 367 HeapObject *Program::ObjectAtOffset(uword offset) { |
| 364 ASSERT(was_loaded_from_snapshot()); | 368 ASSERT(was_loaded_from_snapshot()); |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 // allocations, instead allocate new chunks. | 802 // allocations, instead allocate new chunks. |
| 799 NoAllocationFailureScope scope(heap_.space()); | 803 NoAllocationFailureScope scope(heap_.space()); |
| 800 | 804 |
| 801 // Create null as the first object other allocated objects can use | 805 // Create null as the first object other allocated objects can use |
| 802 // null_object for initial values. | 806 // null_object for initial values. |
| 803 InstanceFormat null_format = | 807 InstanceFormat null_format = |
| 804 InstanceFormat::instance_format(0, InstanceFormat::NULL_MARKER); | 808 InstanceFormat::instance_format(0, InstanceFormat::NULL_MARKER); |
| 805 null_object_ = | 809 null_object_ = |
| 806 reinterpret_cast<Instance*>(heap()->Allocate(null_format.fixed_size())); | 810 reinterpret_cast<Instance*>(heap()->Allocate(null_format.fixed_size())); |
| 807 | 811 |
| 812 InstanceFormat false_format = |
| 813 InstanceFormat::instance_format(0, InstanceFormat::FALSE_MARKER); |
| 814 uword false_address = |
| 815 HeapObject::cast(heap()->Allocate(false_format.fixed_size()))->address(); |
| 816 InstanceFormat true_format = |
| 817 InstanceFormat::instance_format(0, InstanceFormat::TRUE_MARKER); |
| 818 uword true_address = |
| 819 HeapObject::cast(heap()->Allocate(true_format.fixed_size()))->address(); |
| 820 |
| 808 meta_class_ = Class::cast(heap()->CreateMetaClass()); | 821 meta_class_ = Class::cast(heap()->CreateMetaClass()); |
| 809 | 822 |
| 810 { | 823 { |
| 811 InstanceFormat format = InstanceFormat::array_format(); | 824 InstanceFormat format = InstanceFormat::array_format(); |
| 812 array_class_ = | 825 array_class_ = |
| 813 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); | 826 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); |
| 814 } | 827 } |
| 815 | 828 |
| 816 empty_array_ = Array::cast(CreateArray(0)); | 829 empty_array_ = Array::cast(CreateArray(0)); |
| 817 | 830 |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 } | 997 } |
| 985 | 998 |
| 986 { // Create the bool class. | 999 { // Create the bool class. |
| 987 InstanceFormat format = InstanceFormat::instance_format(0); | 1000 InstanceFormat format = InstanceFormat::instance_format(0); |
| 988 bool_class_ = | 1001 bool_class_ = |
| 989 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); | 1002 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); |
| 990 bool_class_->set_super_class(object_class_); | 1003 bool_class_->set_super_class(object_class_); |
| 991 } | 1004 } |
| 992 | 1005 |
| 993 { // Create False class and the false object. | 1006 { // Create False class and the false object. |
| 994 InstanceFormat format = | 1007 Class* false_class = Class::cast( |
| 995 InstanceFormat::instance_format(0, InstanceFormat::FALSE_MARKER); | 1008 heap()->CreateClass(false_format, meta_class_, null_object_)); |
| 996 Class* false_class = | |
| 997 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); | |
| 998 false_class->set_super_class(bool_class_); | 1009 false_class->set_super_class(bool_class_); |
| 999 false_class->set_methods(empty_array_); | 1010 false_class->set_methods(empty_array_); |
| 1000 false_object_ = Instance::cast( | 1011 false_object_ = Instance::cast( |
| 1001 heap()->CreateInstance(false_class, null_object(), true)); | 1012 heap()->CreateBooleanObject(false_address, false_class, null_object())); |
| 1002 } | 1013 } |
| 1003 | 1014 |
| 1004 { // Create True class and the true object. | 1015 { // Create True class and the true object. |
| 1005 InstanceFormat format = | 1016 Class* true_class = Class::cast( |
| 1006 InstanceFormat::instance_format(0, InstanceFormat::TRUE_MARKER); | 1017 heap()->CreateClass(true_format, meta_class_, null_object_)); |
| 1007 Class* true_class = | |
| 1008 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); | |
| 1009 true_class->set_super_class(bool_class_); | 1018 true_class->set_super_class(bool_class_); |
| 1010 true_class->set_methods(empty_array_); | 1019 true_class->set_methods(empty_array_); |
| 1011 true_object_ = | 1020 true_object_ = Instance::cast( |
| 1012 Instance::cast(heap()->CreateInstance(true_class, null_object(), true)); | 1021 heap()->CreateBooleanObject(true_address, true_class, null_object())); |
| 1013 } | 1022 } |
| 1014 | 1023 |
| 1015 { // Create stack overflow error object. | 1024 { // Create stack overflow error object. |
| 1016 InstanceFormat format = InstanceFormat::instance_format(0); | 1025 InstanceFormat format = InstanceFormat::instance_format(0); |
| 1017 stack_overflow_error_class_ = | 1026 stack_overflow_error_class_ = |
| 1018 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); | 1027 Class::cast(heap()->CreateClass(format, meta_class_, null_object_)); |
| 1019 stack_overflow_error_ = Instance::cast(heap()->CreateInstance( | 1028 stack_overflow_error_ = Instance::cast(heap()->CreateInstance( |
| 1020 stack_overflow_error_class_, null_object(), true)); | 1029 stack_overflow_error_class_, null_object(), true)); |
| 1021 } | 1030 } |
| 1022 | 1031 |
| 1023 // Create the retry after gc failure object payload. | 1032 // Create the retry after gc failure object payload. |
| 1024 raw_retry_after_gc_ = OneByteString::cast( | 1033 raw_retry_after_gc_ = OneByteString::cast( |
| 1025 CreateStringFromAscii(StringFromCharZ("Retry after GC."))); | 1034 CreateStringFromAscii(StringFromCharZ("Retry after GC."))); |
| 1026 | 1035 |
| 1027 // Create the failure object payloads. These need to be kept in sync with the | 1036 // Create the failure object payloads. These need to be kept in sync with the |
| 1028 // constants in lib/system/system.dart. | 1037 // constants in lib/system/system.dart. |
| 1029 raw_wrong_argument_type_ = OneByteString::cast( | 1038 raw_wrong_argument_type_ = OneByteString::cast( |
| 1030 CreateStringFromAscii(StringFromCharZ("Wrong argument type."))); | 1039 CreateStringFromAscii(StringFromCharZ("Wrong argument type."))); |
| 1031 | 1040 |
| 1032 raw_index_out_of_bounds_ = OneByteString::cast( | 1041 raw_index_out_of_bounds_ = OneByteString::cast( |
| 1033 CreateStringFromAscii(StringFromCharZ("Index out of bounds."))); | 1042 CreateStringFromAscii(StringFromCharZ("Index out of bounds."))); |
| 1034 | 1043 |
| 1035 raw_illegal_state_ = OneByteString::cast( | 1044 raw_illegal_state_ = OneByteString::cast( |
| 1036 CreateStringFromAscii(StringFromCharZ("Illegal state."))); | 1045 CreateStringFromAscii(StringFromCharZ("Illegal state."))); |
| 1037 | 1046 |
| 1038 native_failure_result_ = null_object_; | 1047 native_failure_result_ = null_object_; |
| 1048 VerifyObjectPlacements(); |
| 1049 } |
| 1050 |
| 1051 void Program::VerifyObjectPlacements() { |
| 1052 uword n = reinterpret_cast<uword>(null_object_); |
| 1053 uword f = reinterpret_cast<uword>(false_object_); |
| 1054 uword t = reinterpret_cast<uword>(true_object_); |
| 1055 ASSERT(f - n == 2 * kWordSize); |
| 1056 ASSERT(t - f == 2 * kWordSize); |
| 1039 } | 1057 } |
| 1040 | 1058 |
| 1041 void Program::IterateRoots(PointerVisitor* visitor) { | 1059 void Program::IterateRoots(PointerVisitor* visitor) { |
| 1060 VerifyObjectPlacements(); |
| 1061 |
| 1042 IterateRootsIgnoringSession(visitor); | 1062 IterateRootsIgnoringSession(visitor); |
| 1043 if (debug_info_ != NULL) { | 1063 if (debug_info_ != NULL) { |
| 1044 debug_info_->VisitProgramPointers(visitor); | 1064 debug_info_->VisitProgramPointers(visitor); |
| 1045 } | 1065 } |
| 1046 if (session_ != NULL) { | 1066 if (session_ != NULL) { |
| 1047 session_->IteratePointers(visitor); | 1067 session_->IteratePointers(visitor); |
| 1048 } | 1068 } |
| 1049 } | 1069 } |
| 1050 | 1070 |
| 1051 void Program::IterateRootsIgnoringSession(PointerVisitor* visitor) { | 1071 void Program::IterateRootsIgnoringSession(PointerVisitor* visitor) { |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1322 if (reinterpret_cast<Type*>(address) == field_name##_) { \ | 1342 if (reinterpret_cast<Type*>(address) == field_name##_) { \ |
| 1323 fprintf(stderr, "0x%zx is " #field_name "\n", \ | 1343 fprintf(stderr, "0x%zx is " #field_name "\n", \ |
| 1324 static_cast<size_t>(address)); \ | 1344 static_cast<size_t>(address)); \ |
| 1325 } | 1345 } |
| 1326 ROOTS_DO(CHECK_FOR_ROOT) | 1346 ROOTS_DO(CHECK_FOR_ROOT) |
| 1327 #undef CHECK_FOR_ROOT | 1347 #undef CHECK_FOR_ROOT |
| 1328 } | 1348 } |
| 1329 #endif | 1349 #endif |
| 1330 | 1350 |
| 1331 } // namespace dartino | 1351 } // namespace dartino |
| OLD | NEW |