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

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

Issue 9420038: Heartbeat implementation of dart:mirrors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 10 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
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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/code_generator.h" 5 #include "vm/code_generator.h"
6 6
7 #include "vm/code_index_table.h" 7 #include "vm/code_index_table.h"
8 #include "vm/code_patcher.h" 8 #include "vm/code_patcher.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart_api_impl.h" 10 #include "vm/dart_api_impl.h"
11 #include "vm/dart_entry.h" 11 #include "vm/dart_entry.h"
12 #include "vm/debugger.h" 12 #include "vm/debugger.h"
13 #include "vm/exceptions.h" 13 #include "vm/exceptions.h"
14 #include "vm/ic_data.h" 14 #include "vm/ic_data.h"
15 #include "vm/object_store.h" 15 #include "vm/object_store.h"
16 #include "vm/message.h"
16 #include "vm/resolver.h" 17 #include "vm/resolver.h"
17 #include "vm/runtime_entry.h" 18 #include "vm/runtime_entry.h"
18 #include "vm/stack_frame.h" 19 #include "vm/stack_frame.h"
19 #include "vm/verifier.h" 20 #include "vm/verifier.h"
20 21
21 namespace dart { 22 namespace dart {
22 23
23 DEFINE_FLAG(bool, inline_cache, true, "enable inline caches"); 24 DEFINE_FLAG(bool, inline_cache, true, "enable inline caches");
24 DEFINE_FLAG(bool, trace_deopt, false, "Trace deoptimization"); 25 DEFINE_FLAG(bool, trace_deopt, false, "Trace deoptimization");
25 DEFINE_FLAG(bool, trace_ic, false, "trace IC handling"); 26 DEFINE_FLAG(bool, trace_ic, false, "trace IC handling");
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 870
870 871
871 DEFINE_RUNTIME_ENTRY(ClosureArgumentMismatch, 0) { 872 DEFINE_RUNTIME_ENTRY(ClosureArgumentMismatch, 0) {
872 ASSERT(arguments.Count() == 873 ASSERT(arguments.Count() ==
873 kClosureArgumentMismatchRuntimeEntry.argument_count()); 874 kClosureArgumentMismatchRuntimeEntry.argument_count());
874 GrowableArray<const Object*> args; 875 GrowableArray<const Object*> args;
875 Exceptions::ThrowByType(Exceptions::kClosureArgumentMismatch, args); 876 Exceptions::ThrowByType(Exceptions::kClosureArgumentMismatch, args);
876 } 877 }
877 878
878 879
880 static RawInstance* DeserializeMessage(void* data) {
881 // Create a snapshot object using the buffer.
882 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data);
883 ASSERT(snapshot->IsMessageSnapshot());
884
885 // Read object back from the snapshot.
886 SnapshotReader reader(snapshot, Isolate::Current());
887 Instance& instance = Instance::Handle();
888 instance ^= reader.ReadObject();
siva 2012/02/18 01:25:55 Ditto comment about any object being send in these
889 return instance.raw();
890 }
siva 2012/02/18 01:25:55 This function is there in dart_api_impl.cc as well
turnidge 2012/03/07 20:00:14 Agreed. As the next part of the ThreadPool stuff
891
892
893
879 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) { 894 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
880 ASSERT(arguments.Count() == 895 ASSERT(arguments.Count() ==
881 kStackOverflowRuntimeEntry.argument_count()); 896 kStackOverflowRuntimeEntry.argument_count());
882 uword stack_pos = reinterpret_cast<uword>(&arguments); 897 uword stack_pos = reinterpret_cast<uword>(&arguments);
883 898
884 // If an interrupt happens at the same time as a stack overflow, we 899 // If an interrupt happens at the same time as a stack overflow, we
885 // process the stack overflow first. 900 // process the stack overflow first.
886 if (stack_pos < isolate->saved_stack_limit()) { 901 if (stack_pos < isolate->saved_stack_limit()) {
887 // Use the preallocated stack overflow exception to avoid calling 902 // Use the preallocated stack overflow exception to avoid calling
888 // into dart code. 903 // into dart code.
889 const Instance& exception = 904 const Instance& exception =
890 Instance::Handle(isolate->object_store()->stack_overflow()); 905 Instance::Handle(isolate->object_store()->stack_overflow());
891 Exceptions::Throw(exception); 906 Exceptions::Throw(exception);
892 UNREACHABLE(); 907 UNREACHABLE();
893 } 908 }
894 909
895 uword interrupt_bits = isolate->GetAndClearInterrupts(); 910 uword interrupt_bits = isolate->GetAndClearInterrupts();
896 if (interrupt_bits & Isolate::kMessageInterrupt) { 911 if (interrupt_bits & Isolate::kMessageInterrupt) {
897 // UNIMPLEMENTED(); 912 while (true) {
913 Message* message =
914 isolate->message_handler()->queue()->DequeueNoWaitWithPriority(
915 Message::kOOBPriority);
siva 2012/02/18 01:25:55 Can one do a DNS style attack here just bombarding
turnidge 2012/03/07 20:00:14 You can only send OOB messages when you can alread
916 if (message == NULL) {
917 // No more OOB messages to handle.
918 break;
919 }
920 const Instance& msg =
921 Instance::Handle(DeserializeMessage(message->data()));
922 // For now the only OOB messages are Mirrors messages.
923 const Object& result = Object::Handle(
924 DartLibraryCalls::HandleMirrorsMessage(
925 message->dest_port(), message->reply_port(), msg));
926 delete message;
927 if (result.IsError()) {
928 // TODO(turnidge): Propagating the error is probably wrong here.
929 Exceptions::PropagateError(result);
930 }
931 ASSERT(result.IsNull());
932 }
898 } 933 }
899 if (interrupt_bits & Isolate::kApiInterrupt) { 934 if (interrupt_bits & Isolate::kApiInterrupt) {
900 Dart_IsolateInterruptCallback callback = isolate->InterruptCallback(); 935 Dart_IsolateInterruptCallback callback = isolate->InterruptCallback();
901 if (callback) { 936 if (callback) {
902 if ((*callback)()) { 937 if ((*callback)()) {
903 return; 938 return;
904 } else { 939 } else {
905 // TODO(turnidge): Unwind the stack. 940 // TODO(turnidge): Unwind the stack.
906 UNIMPLEMENTED(); 941 UNIMPLEMENTED();
907 } 942 }
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 } 1160 }
1126 } 1161 }
1127 } 1162 }
1128 // The cache is null terminated, therefore the loop above should never 1163 // The cache is null terminated, therefore the loop above should never
1129 // terminate by itself. 1164 // terminate by itself.
1130 UNREACHABLE(); 1165 UNREACHABLE();
1131 return Code::null(); 1166 return Code::null();
1132 } 1167 }
1133 1168
1134 } // namespace dart 1169 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698