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

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

Issue 68813002: Fix VM not accepting static methods for Isolate.spawn. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated and extended tests. Created 7 years, 1 month 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) 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 "vm/isolate.h" 5 #include "vm/isolate.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 "platform/json.h" 9 #include "platform/json.h"
10 #include "lib/mirrors.h" 10 #include "lib/mirrors.h"
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 T* handle = reinterpret_cast<T*>(reusable_handles_.AllocateScopedHandle()); 989 T* handle = reinterpret_cast<T*>(reusable_handles_.AllocateScopedHandle());
990 T::initializeHandle(handle, T::null()); 990 T::initializeHandle(handle, T::null());
991 return handle; 991 return handle;
992 } 992 }
993 993
994 994
995 IsolateSpawnState::IsolateSpawnState(const Function& func) 995 IsolateSpawnState::IsolateSpawnState(const Function& func)
996 : isolate_(NULL), 996 : isolate_(NULL),
997 script_url_(NULL), 997 script_url_(NULL),
998 library_url_(NULL), 998 library_url_(NULL),
999 class_name_(NULL),
999 function_name_(NULL), 1000 function_name_(NULL),
1000 exception_callback_name_(NULL) { 1001 exception_callback_name_(NULL) {
1001 script_url_ = NULL; 1002 script_url_ = NULL;
1002 const Class& cls = Class::Handle(func.Owner()); 1003 const Class& cls = Class::Handle(func.Owner());
1003 ASSERT(cls.IsTopLevel());
1004 const Library& lib = Library::Handle(cls.library()); 1004 const Library& lib = Library::Handle(cls.library());
1005 const String& lib_url = String::Handle(lib.url()); 1005 const String& lib_url = String::Handle(lib.url());
1006 library_url_ = strdup(lib_url.ToCString()); 1006 library_url_ = strdup(lib_url.ToCString());
1007 1007
1008 const String& func_name = String::Handle(func.name()); 1008 const String& func_name = String::Handle(func.name());
1009 function_name_ = strdup(func_name.ToCString()); 1009 function_name_ = strdup(func_name.ToCString());
1010 if (!cls.IsTopLevel()) {
1011 const String& class_name = String::Handle(cls.Name());
1012 class_name_ = strdup(class_name.ToCString());
Ivan Posva 2013/11/12 07:19:49 Leak!
Lasse Reichstein Nielsen 2013/11/12 07:28:51 Beacuse I'm not freeing it somewhere else? (which
1013 }
1010 exception_callback_name_ = strdup("_unhandledExceptionCallback"); 1014 exception_callback_name_ = strdup("_unhandledExceptionCallback");
1011 } 1015 }
1012 1016
1013 1017
1014 IsolateSpawnState::IsolateSpawnState(const char* script_url) 1018 IsolateSpawnState::IsolateSpawnState(const char* script_url)
1015 : isolate_(NULL), 1019 : isolate_(NULL),
1016 library_url_(NULL), 1020 library_url_(NULL),
1017 function_name_(NULL), 1021 function_name_(NULL),
1018 exception_callback_name_(NULL) { 1022 exception_callback_name_(NULL) {
1019 script_url_ = strdup(script_url); 1023 script_url_ = strdup(script_url);
(...skipping 21 matching lines...) Expand all
1041 const String& msg = String::Handle(String::NewFormatted( 1045 const String& msg = String::Handle(String::NewFormatted(
1042 "Unable to find library '%s'.", library_url())); 1046 "Unable to find library '%s'.", library_url()));
1043 return LanguageError::New(msg); 1047 return LanguageError::New(msg);
1044 } 1048 }
1045 } else { 1049 } else {
1046 lib = isolate()->object_store()->root_library(); 1050 lib = isolate()->object_store()->root_library();
1047 } 1051 }
1048 ASSERT(!lib.IsNull()); 1052 ASSERT(!lib.IsNull());
1049 1053
1050 // Resolve the function. 1054 // Resolve the function.
1051 const String& func_name = 1055 const String& func_name = String::Handle(String::New(function_name()));
1052 String::Handle(String::New(function_name())); 1056
1053 const Function& func = Function::Handle(lib.LookupLocalFunction(func_name)); 1057 if (class_name() == NULL) {
1058 const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
1059 if (func.IsNull()) {
1060 const String& msg = String::Handle(String::NewFormatted(
1061 "Unable to resolve function '%s' in library '%s'.",
1062 function_name(), (library_url() ? library_url() : script_url())));
Ivan Posva 2013/11/12 07:19:49 ditto (see below).
Lasse Reichstein Nielsen 2013/11/12 07:28:51 Done.
1063 return LanguageError::New(msg);
1064 }
1065 return func.raw();
1066 }
1067
1068 const String& cls_name = String::Handle(String::New(class_name()));
1069 const Class& cls = Class::Handle(lib.LookupLocalClass(cls_name));
1070 if (cls.IsNull()) {
1071 const String& msg = String::Handle(String::NewFormatted(
1072 "Unable to resolve class '%s' in library '%s'.",
1073 class_name(), (library_url() ? library_url() : script_url())));
Ivan Posva 2013/11/12 07:19:49 I know this was already bad in the original code,
Lasse Reichstein Nielsen 2013/11/12 07:28:51 Done.
1074 return LanguageError::New(msg);
1075 }
1076 const Function& func =
1077 Function::Handle(cls.LookupStaticFunctionAllowPrivate(func_name));
1054 if (func.IsNull()) { 1078 if (func.IsNull()) {
1055 const String& msg = String::Handle(String::NewFormatted( 1079 const String& msg = String::Handle(String::NewFormatted(
1056 "Unable to resolve function '%s' in library '%s'.", 1080 "Unable to resolve static method '%s.%s' in library '%s'.",
1057 function_name(), (library_url() ? library_url() : script_url()))); 1081 class_name(), function_name(),
1082 (library_url() ? library_url() : script_url())));
Ivan Posva 2013/11/12 07:19:49 ditto
Lasse Reichstein Nielsen 2013/11/12 07:28:51 Done.
1058 return LanguageError::New(msg); 1083 return LanguageError::New(msg);
1059 } 1084 }
1060 return func.raw(); 1085 return func.raw();
1061 } 1086 }
1062 1087
1063 1088
1064 void IsolateSpawnState::Cleanup() { 1089 void IsolateSpawnState::Cleanup() {
1065 SwitchIsolateScope switch_scope(isolate()); 1090 SwitchIsolateScope switch_scope(isolate());
1066 Dart::ShutdownIsolate(); 1091 Dart::ShutdownIsolate();
1067 } 1092 }
1068 1093
1069 } // namespace dart 1094 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698