Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: runtime/vm/object.cc

Issue 243973002: - Add a minimal implementation of Capability. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 str = lib.PrivateName(public_class_name); 884 str = lib.PrivateName(public_class_name);
885 cls.set_name(str); 885 cls.set_name(str);
886 lib.AddClass(cls); 886 lib.AddClass(cls);
887 } 887 }
888 888
889 889
890 RawError* Object::Init(Isolate* isolate) { 890 RawError* Object::Init(Isolate* isolate) {
891 TIMERSCOPE(isolate, time_bootstrap); 891 TIMERSCOPE(isolate, time_bootstrap);
892 ObjectStore* object_store = isolate->object_store(); 892 ObjectStore* object_store = isolate->object_store();
893 893
894 Class& cls = Class::Handle(); 894 Class& cls = Class::Handle(isolate);
895 Type& type = Type::Handle(); 895 Type& type = Type::Handle(isolate);
896 Array& array = Array::Handle(); 896 Array& array = Array::Handle(isolate);
897 Library& lib = Library::Handle(); 897 Library& lib = Library::Handle(isolate);
898 898
899 // All RawArray fields will be initialized to an empty array, therefore 899 // All RawArray fields will be initialized to an empty array, therefore
900 // initialize array class first. 900 // initialize array class first.
901 cls = Class::New<Array>(); 901 cls = Class::New<Array>();
902 object_store->set_array_class(cls); 902 object_store->set_array_class(cls);
903 903
904 // Array and ImmutableArray are the only VM classes that are parameterized. 904 // Array and ImmutableArray are the only VM classes that are parameterized.
905 // Since they are pre-finalized, CalculateFieldOffsets() is not called, so we 905 // Since they are pre-finalized, CalculateFieldOffsets() is not called, so we
906 // need to set the offset of their type_arguments_ field, which is explicitly 906 // need to set the offset of their type_arguments_ field, which is explicitly
907 // declared in RawArray. 907 // declared in RawArray.
908 cls.set_type_arguments_field_offset(Array::type_arguments_offset()); 908 cls.set_type_arguments_field_offset(Array::type_arguments_offset());
909 cls.set_num_type_arguments(1); 909 cls.set_num_type_arguments(1);
910 cls.set_num_own_type_arguments(1); 910 cls.set_num_own_type_arguments(1);
911 911
912 // Set up the growable object array class (Has to be done after the array 912 // Set up the growable object array class (Has to be done after the array
913 // class is setup as one of its field is an array object). 913 // class is setup as one of its field is an array object).
914 cls = Class::New<GrowableObjectArray>(); 914 cls = Class::New<GrowableObjectArray>();
915 object_store->set_growable_object_array_class(cls); 915 object_store->set_growable_object_array_class(cls);
916 cls.set_type_arguments_field_offset( 916 cls.set_type_arguments_field_offset(
917 GrowableObjectArray::type_arguments_offset()); 917 GrowableObjectArray::type_arguments_offset());
918 cls.set_num_type_arguments(1); 918 cls.set_num_type_arguments(1);
919 cls.set_num_own_type_arguments(1); 919 cls.set_num_own_type_arguments(1);
920 920
921 // canonical_type_arguments_ are Smi terminated. 921 // canonical_type_arguments_ are Smi terminated.
922 // Last element contains the count of used slots. 922 // Last element contains the count of used slots.
923 const intptr_t kInitialCanonicalTypeArgumentsSize = 4; 923 const intptr_t kInitialCanonicalTypeArgumentsSize = 4;
924 array = Array::New(kInitialCanonicalTypeArgumentsSize + 1); 924 array = Array::New(kInitialCanonicalTypeArgumentsSize + 1);
925 array.SetAt(kInitialCanonicalTypeArgumentsSize, Smi::Handle(Smi::New(0))); 925 array.SetAt(kInitialCanonicalTypeArgumentsSize,
926 Smi::Handle(isolate, Smi::New(0)));
926 object_store->set_canonical_type_arguments(array); 927 object_store->set_canonical_type_arguments(array);
927 928
928 // Setup type class early in the process. 929 // Setup type class early in the process.
929 cls = Class::New<Type>(); 930 cls = Class::New<Type>();
930 object_store->set_type_class(cls); 931 object_store->set_type_class(cls);
931 932
932 cls = Class::New<TypeRef>(); 933 cls = Class::New<TypeRef>();
933 object_store->set_type_ref_class(cls); 934 object_store->set_type_ref_class(cls);
934 935
935 cls = Class::New<TypeParameter>(); 936 cls = Class::New<TypeParameter>();
(...skipping 13 matching lines...) Expand all
949 object_store->set_one_byte_string_class(cls); 950 object_store->set_one_byte_string_class(cls);
950 951
951 // Pre-allocate the TwoByteString class needed by the symbol table. 952 // Pre-allocate the TwoByteString class needed by the symbol table.
952 cls = Class::NewStringClass(kTwoByteStringCid); 953 cls = Class::NewStringClass(kTwoByteStringCid);
953 object_store->set_two_byte_string_class(cls); 954 object_store->set_two_byte_string_class(cls);
954 955
955 // Setup the symbol table for the symbols created in the isolate. 956 // Setup the symbol table for the symbols created in the isolate.
956 Symbols::SetupSymbolTable(isolate); 957 Symbols::SetupSymbolTable(isolate);
957 958
958 // Set up the libraries array before initializing the core library. 959 // Set up the libraries array before initializing the core library.
959 const GrowableObjectArray& libraries = 960 const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
960 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); 961 isolate, GrowableObjectArray::New(Heap::kOld));
961 object_store->set_libraries(libraries); 962 object_store->set_libraries(libraries);
962 963
963 // Pre-register the core library. 964 // Pre-register the core library.
964 Library::InitCoreLibrary(isolate); 965 Library::InitCoreLibrary(isolate);
965 966
966 // Basic infrastructure has been setup, initialize the class dictionary. 967 // Basic infrastructure has been setup, initialize the class dictionary.
967 Library& core_lib = Library::Handle(Library::CoreLibrary()); 968 const Library& core_lib = Library::Handle(isolate, Library::CoreLibrary());
968 ASSERT(!core_lib.IsNull()); 969 ASSERT(!core_lib.IsNull());
969 970
970 const GrowableObjectArray& pending_classes = 971 const GrowableObjectArray& pending_classes =
971 GrowableObjectArray::Handle(GrowableObjectArray::New()); 972 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
972 object_store->set_pending_classes(pending_classes); 973 object_store->set_pending_classes(pending_classes);
973 974
974 Context& context = Context::Handle(Context::New(0, Heap::kOld)); 975 Context& context = Context::Handle(isolate, Context::New(0, Heap::kOld));
975 object_store->set_empty_context(context); 976 object_store->set_empty_context(context);
976 977
977 // Now that the symbol table is initialized and that the core dictionary as 978 // Now that the symbol table is initialized and that the core dictionary as
978 // well as the core implementation dictionary have been setup, preallocate 979 // well as the core implementation dictionary have been setup, preallocate
979 // remaining classes and register them by name in the dictionaries. 980 // remaining classes and register them by name in the dictionaries.
980 String& name = String::Handle(); 981 String& name = String::Handle(isolate);
981 cls = object_store->array_class(); // Was allocated above. 982 cls = object_store->array_class(); // Was allocated above.
982 RegisterPrivateClass(cls, Symbols::_List(), core_lib); 983 RegisterPrivateClass(cls, Symbols::_List(), core_lib);
983 pending_classes.Add(cls); 984 pending_classes.Add(cls);
984 // We cannot use NewNonParameterizedType(cls), because Array is parameterized. 985 // We cannot use NewNonParameterizedType(cls), because Array is parameterized.
985 type ^= Type::New(Object::Handle(cls.raw()), 986 type ^= Type::New(Object::Handle(isolate, cls.raw()),
986 TypeArguments::Handle(), 987 TypeArguments::Handle(isolate),
987 Scanner::kNoSourcePos); 988 Scanner::kNoSourcePos);
988 type.SetIsFinalized(); 989 type.SetIsFinalized();
989 type ^= type.Canonicalize(); 990 type ^= type.Canonicalize();
990 object_store->set_array_type(type); 991 object_store->set_array_type(type);
991 992
992 cls = object_store->growable_object_array_class(); // Was allocated above. 993 cls = object_store->growable_object_array_class(); // Was allocated above.
993 RegisterPrivateClass(cls, Symbols::_GrowableList(), core_lib); 994 RegisterPrivateClass(cls, Symbols::_GrowableList(), core_lib);
994 pending_classes.Add(cls); 995 pending_classes.Add(cls);
995 996
996 cls = Class::New<Array>(kImmutableArrayCid); 997 cls = Class::New<Array>(kImmutableArrayCid);
(...skipping 17 matching lines...) Expand all
1014 cls = Class::NewStringClass(kExternalOneByteStringCid); 1015 cls = Class::NewStringClass(kExternalOneByteStringCid);
1015 object_store->set_external_one_byte_string_class(cls); 1016 object_store->set_external_one_byte_string_class(cls);
1016 RegisterPrivateClass(cls, Symbols::ExternalOneByteString(), core_lib); 1017 RegisterPrivateClass(cls, Symbols::ExternalOneByteString(), core_lib);
1017 pending_classes.Add(cls); 1018 pending_classes.Add(cls);
1018 1019
1019 cls = Class::NewStringClass(kExternalTwoByteStringCid); 1020 cls = Class::NewStringClass(kExternalTwoByteStringCid);
1020 object_store->set_external_two_byte_string_class(cls); 1021 object_store->set_external_two_byte_string_class(cls);
1021 RegisterPrivateClass(cls, Symbols::ExternalTwoByteString(), core_lib); 1022 RegisterPrivateClass(cls, Symbols::ExternalTwoByteString(), core_lib);
1022 pending_classes.Add(cls); 1023 pending_classes.Add(cls);
1023 1024
1025 // Pre-register the isolate library so the native class implementations
1026 // can be hooked up before compiling it.
1027 Library& isolate_lib =
1028 Library::Handle(isolate, Library::LookupLibrary(Symbols::DartIsolate()));
1029 if (isolate_lib.IsNull()) {
1030 isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true);
1031 isolate_lib.Register();
1032 isolate->object_store()->set_bootstrap_library(ObjectStore::kIsolate,
1033 isolate_lib);
1034 }
1035 ASSERT(!isolate_lib.IsNull());
1036 ASSERT(isolate_lib.raw() == Library::IsolateLibrary());
1037
1038 cls = Class::New<Capability>();
1039 RegisterPrivateClass(cls, Symbols::_CapabilityImpl(), isolate_lib);
1040 pending_classes.Add(cls);
1041
1042 cls = Class::New<ReceivePort>();
1043 RegisterPrivateClass(cls, Symbols::_RawReceivePortImpl(), isolate_lib);
1044 pending_classes.Add(cls);
1045
1046 cls = Class::New<SendPort>();
1047 RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib);
1048 pending_classes.Add(cls);
1049
1024 cls = Class::New<Stacktrace>(); 1050 cls = Class::New<Stacktrace>();
1025 object_store->set_stacktrace_class(cls); 1051 object_store->set_stacktrace_class(cls);
1026 RegisterClass(cls, Symbols::StackTrace(), core_lib); 1052 RegisterClass(cls, Symbols::StackTrace(), core_lib);
1027 pending_classes.Add(cls); 1053 pending_classes.Add(cls);
1028 // Super type set below, after Object is allocated. 1054 // Super type set below, after Object is allocated.
1029 1055
1030 cls = Class::New<JSRegExp>(); 1056 cls = Class::New<JSRegExp>();
1031 object_store->set_jsregexp_class(cls); 1057 object_store->set_jsregexp_class(cls);
1032 RegisterPrivateClass(cls, Symbols::JSSyntaxRegExp(), core_lib); 1058 RegisterPrivateClass(cls, Symbols::JSSyntaxRegExp(), core_lib);
1033 pending_classes.Add(cls); 1059 pending_classes.Add(cls);
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 1462
1437 cls = Class::NewStringClass(kExternalTwoByteStringCid); 1463 cls = Class::NewStringClass(kExternalTwoByteStringCid);
1438 object_store->set_external_two_byte_string_class(cls); 1464 object_store->set_external_two_byte_string_class(cls);
1439 1465
1440 cls = Class::New<Bool>(); 1466 cls = Class::New<Bool>();
1441 object_store->set_bool_class(cls); 1467 object_store->set_bool_class(cls);
1442 1468
1443 cls = Class::New<Instance>(kNullCid); 1469 cls = Class::New<Instance>(kNullCid);
1444 object_store->set_null_class(cls); 1470 object_store->set_null_class(cls);
1445 1471
1472 cls = Class::New<Capability>();
1473 cls = Class::New<ReceivePort>();
1474 cls = Class::New<SendPort>();
1475
1446 cls = Class::New<Stacktrace>(); 1476 cls = Class::New<Stacktrace>();
1447 object_store->set_stacktrace_class(cls); 1477 object_store->set_stacktrace_class(cls);
1448 1478
1449 cls = Class::New<JSRegExp>(); 1479 cls = Class::New<JSRegExp>();
1450 object_store->set_jsregexp_class(cls); 1480 object_store->set_jsregexp_class(cls);
1451 1481
1452 // Some classes are not stored in the object store. Yet we still need to 1482 // Some classes are not stored in the object store. Yet we still need to
1453 // create their Class object so that they get put into the class_table 1483 // create their Class object so that they get put into the class_table
1454 // (as a side effect of Class::New()). 1484 // (as a side effect of Class::New()).
1455 cls = Class::New<Number>(); 1485 cls = Class::New<Number>();
(...skipping 13238 matching lines...) Expand 10 before | Expand all | Expand 10 after
14694 } 14724 }
14695 14725
14696 14726
14697 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) { 14727 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) {
14698 if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) { 14728 if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
14699 return Smi::New(value); 14729 return Smi::New(value);
14700 } 14730 }
14701 if (!silent && 14731 if (!silent &&
14702 FLAG_throw_on_javascript_int_overflow && 14732 FLAG_throw_on_javascript_int_overflow &&
14703 !IsJavascriptInt(value)) { 14733 !IsJavascriptInt(value)) {
14704 const Integer &i = Integer::Handle(Mint::New(value)); 14734 const Integer& i = Integer::Handle(Mint::New(value));
14705 ThrowJavascriptIntegerOverflow(i); 14735 ThrowJavascriptIntegerOverflow(i);
14706 } 14736 }
14707 return Mint::New(value, space); 14737 return Mint::New(value, space);
14708 } 14738 }
14709 14739
14710 14740
14711 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) { 14741 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
14712 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { 14742 if (value > static_cast<uint64_t>(Mint::kMaxValue)) {
14713 if (FLAG_throw_on_javascript_int_overflow) { 14743 if (FLAG_throw_on_javascript_int_overflow) {
14714 const Integer &i = 14744 const Integer &i =
(...skipping 3142 matching lines...) Expand 10 before | Expand all | Expand 10 after
17857 return "ExternalTypedData"; 17887 return "ExternalTypedData";
17858 } 17888 }
17859 17889
17860 17890
17861 void ExternalTypedData::PrintToJSONStream(JSONStream* stream, 17891 void ExternalTypedData::PrintToJSONStream(JSONStream* stream,
17862 bool ref) const { 17892 bool ref) const {
17863 Instance::PrintToJSONStream(stream, ref); 17893 Instance::PrintToJSONStream(stream, ref);
17864 } 17894 }
17865 17895
17866 17896
17897 RawCapability* Capability::New(uint64_t id, Heap::Space space) {
17898 Capability& result = Capability::Handle();
17899 {
17900 RawObject* raw = Object::Allocate(Capability::kClassId,
17901 Capability::InstanceSize(),
17902 space);
17903 NoGCScope no_gc;
17904 result ^= raw;
17905 }
17906 result.raw_ptr()->id_ = id;
17907 return result.raw();
17908 }
17909
17910
17911 const char* Capability::ToCString() const {
17912 return "Capability";
17913 }
17914
17915
17916 void Capability::PrintToJSONStream(JSONStream* stream, bool ref) const {
17917 Instance::PrintToJSONStream(stream, ref);
17918 }
17919
17920
17921 RawReceivePort* ReceivePort::New(Dart_Port id, Heap::Space space) {
17922 Isolate* isolate = Isolate::Current();
17923 const SendPort& send_port = SendPort::Handle(isolate, SendPort::New(id));
17924
17925 ReceivePort& result = ReceivePort::Handle(isolate);
17926 {
17927 RawObject* raw = Object::Allocate(ReceivePort::kClassId,
17928 ReceivePort::InstanceSize(),
17929 space);
17930 NoGCScope no_gc;
17931 result ^= raw;
17932 }
17933 result.raw_ptr()->send_port_ = send_port.raw();
17934 PortMap::SetLive(id);
17935 return result.raw();
17936 }
17937
17938
17939 const char* ReceivePort::ToCString() const {
17940 return "ReceivePort";
17941 }
17942
17943
17944 void ReceivePort::PrintToJSONStream(JSONStream* stream, bool ref) const {
17945 Instance::PrintToJSONStream(stream, ref);
17946 }
17947
17948
17949 RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) {
17950 SendPort& result = SendPort::Handle();
17951 {
17952 RawObject* raw = Object::Allocate(SendPort::kClassId,
17953 SendPort::InstanceSize(),
17954 space);
17955 NoGCScope no_gc;
17956 result ^= raw;
17957 }
17958 result.raw_ptr()->id_ = id;
17959 return result.raw();
17960 }
17961
17962
17963 const char* SendPort::ToCString() const {
17964 return "SendPort";
17965 }
17966
17967
17968 void SendPort::PrintToJSONStream(JSONStream* stream, bool ref) const {
17969 Instance::PrintToJSONStream(stream, ref);
17970 }
17971
17867 17972
17868 const char* Closure::ToCString(const Instance& closure) { 17973 const char* Closure::ToCString(const Instance& closure) {
17869 const Function& fun = Function::Handle(Closure::function(closure)); 17974 const Function& fun = Function::Handle(Closure::function(closure));
17870 const bool is_implicit_closure = fun.IsImplicitClosureFunction(); 17975 const bool is_implicit_closure = fun.IsImplicitClosureFunction();
17871 const char* fun_sig = String::Handle(fun.UserVisibleSignature()).ToCString(); 17976 const char* fun_sig = String::Handle(fun.UserVisibleSignature()).ToCString();
17872 const char* from = is_implicit_closure ? " from " : ""; 17977 const char* from = is_implicit_closure ? " from " : "";
17873 const char* fun_desc = is_implicit_closure ? fun.ToCString() : ""; 17978 const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
17874 const char* format = "Closure: %s%s%s"; 17979 const char* format = "Closure: %s%s%s";
17875 intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1; 17980 intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1;
17876 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 17981 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
18464 return tag_label.ToCString(); 18569 return tag_label.ToCString();
18465 } 18570 }
18466 18571
18467 18572
18468 void UserTag::PrintToJSONStream(JSONStream* stream, bool ref) const { 18573 void UserTag::PrintToJSONStream(JSONStream* stream, bool ref) const {
18469 Instance::PrintToJSONStream(stream, ref); 18574 Instance::PrintToJSONStream(stream, ref);
18470 } 18575 }
18471 18576
18472 18577
18473 } // namespace dart 18578 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698