| OLD | NEW |
| 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/assembler.h" | 6 #include "vm/assembler.h" |
| 7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
| 8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/object.h" | 10 #include "vm/object.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 const String& library_name = String::Handle(String::New(test_library_name)); | 82 const String& library_name = String::Handle(String::New(test_library_name)); |
| 83 const Library& library = | 83 const Library& library = |
| 84 Library::Handle(Library::LookupLibrary(thread, library_name)); | 84 Library::Handle(Library::LookupLibrary(thread, library_name)); |
| 85 const String& class_name = String::Handle(String::New(test_class_name)); | 85 const String& class_name = String::Handle(String::New(test_class_name)); |
| 86 const String& static_function_name = | 86 const String& static_function_name = |
| 87 String::Handle(String::New(test_static_function_name)); | 87 String::Handle(String::New(test_static_function_name)); |
| 88 | 88 |
| 89 // Now try to resolve and invoke the static function in this class. | 89 // Now try to resolve and invoke the static function in this class. |
| 90 { | 90 { |
| 91 const int kTypeArgsLen = 0; |
| 91 const int kNumArguments = 2; | 92 const int kNumArguments = 2; |
| 92 const Function& function = Function::Handle( | 93 const Function& function = Function::Handle(Resolver::ResolveStatic( |
| 93 Resolver::ResolveStatic(library, class_name, static_function_name, | 94 library, class_name, static_function_name, kTypeArgsLen, kNumArguments, |
| 94 kNumArguments, Object::empty_array())); | 95 Object::empty_array())); |
| 95 EXPECT(!function.IsNull()); // No ambiguity error expected. | 96 EXPECT(!function.IsNull()); // No ambiguity error expected. |
| 96 const Array& args = Array::Handle(Array::New(kNumArguments)); | 97 const Array& args = Array::Handle(Array::New(kNumArguments)); |
| 97 const String& arg0 = String::Handle(String::New("junk")); | 98 const String& arg0 = String::Handle(String::New("junk")); |
| 98 args.SetAt(0, arg0); | 99 args.SetAt(0, arg0); |
| 99 const Smi& arg1 = Smi::Handle(Smi::New(kTestValue)); | 100 const Smi& arg1 = Smi::Handle(Smi::New(kTestValue)); |
| 100 args.SetAt(1, arg1); | 101 args.SetAt(1, arg1); |
| 101 const Smi& retval = Smi::Handle( | 102 const Smi& retval = Smi::Handle( |
| 102 reinterpret_cast<RawSmi*>(DartEntry::InvokeFunction(function, args))); | 103 reinterpret_cast<RawSmi*>(DartEntry::InvokeFunction(function, args))); |
| 103 EXPECT_EQ(kTestValue, retval.Value()); | 104 EXPECT_EQ(kTestValue, retval.Value()); |
| 104 } | 105 } |
| 105 | 106 |
| 106 // Now try to resolve a static function with invalid argument count. | 107 // Now try to resolve a static function with invalid argument count. |
| 107 { | 108 { |
| 109 const int kTypeArgsLen = 0; |
| 108 const int kNumArguments = 1; | 110 const int kNumArguments = 1; |
| 109 const Function& bad_function = Function::Handle( | 111 const Function& bad_function = Function::Handle(Resolver::ResolveStatic( |
| 110 Resolver::ResolveStatic(library, class_name, static_function_name, | 112 library, class_name, static_function_name, kTypeArgsLen, kNumArguments, |
| 111 kNumArguments, Object::empty_array())); | 113 Object::empty_array())); |
| 112 EXPECT(bad_function.IsNull()); // No ambiguity error expected. | 114 EXPECT(bad_function.IsNull()); // No ambiguity error expected. |
| 113 } | 115 } |
| 114 | 116 |
| 115 // Hierarchy walking. | 117 // Hierarchy walking. |
| 116 { | 118 { |
| 117 const String& super_static_function_name = | 119 const String& super_static_function_name = |
| 118 String::Handle(String::New("statCall")); | 120 String::Handle(String::New("statCall")); |
| 119 const String& super_class_name = String::Handle(String::New("Base")); | 121 const String& super_class_name = String::Handle(String::New("Base")); |
| 122 const int kTypeArgsLen = 0; |
| 120 const int kNumArguments = 0; | 123 const int kNumArguments = 0; |
| 121 const Function& super_function = Function::Handle(Resolver::ResolveStatic( | 124 const Function& super_function = Function::Handle(Resolver::ResolveStatic( |
| 122 library, super_class_name, super_static_function_name, kNumArguments, | 125 library, super_class_name, super_static_function_name, kTypeArgsLen, |
| 123 Object::empty_array())); | 126 kNumArguments, Object::empty_array())); |
| 124 EXPECT(!super_function.IsNull()); // No ambiguity error expected. | 127 EXPECT(!super_function.IsNull()); // No ambiguity error expected. |
| 125 } | 128 } |
| 126 } | 129 } |
| 127 | 130 |
| 128 | 131 |
| 129 TEST_CASE(DartDynamicResolve) { | 132 TEST_CASE(DartDynamicResolve) { |
| 130 const char* test_library_name = "ResolverApp"; | 133 const char* test_library_name = "ResolverApp"; |
| 131 const char* test_class_name = "A"; | 134 const char* test_class_name = "A"; |
| 132 const char* test_function_name = "foo"; | 135 const char* test_function_name = "foo"; |
| 133 const int kTestValue = 42; | 136 const int kTestValue = 42; |
| 134 | 137 |
| 135 // Setup a function which can be invoked. | 138 // Setup a function which can be invoked. |
| 136 SetupInstanceFunction(test_library_name, test_class_name, test_function_name); | 139 SetupInstanceFunction(test_library_name, test_class_name, test_function_name); |
| 137 | 140 |
| 138 // Now create an instance object of the class and try to | 141 // Now create an instance object of the class and try to |
| 139 // resolve a function in it. | 142 // resolve a function in it. |
| 140 const String& lib_name = String::Handle(String::New(test_library_name)); | 143 const String& lib_name = String::Handle(String::New(test_library_name)); |
| 141 const Library& lib = | 144 const Library& lib = |
| 142 Library::Handle(Library::LookupLibrary(thread, lib_name)); | 145 Library::Handle(Library::LookupLibrary(thread, lib_name)); |
| 143 ASSERT(!lib.IsNull()); | 146 ASSERT(!lib.IsNull()); |
| 144 const Class& cls = Class::Handle( | 147 const Class& cls = Class::Handle( |
| 145 lib.LookupClass(String::Handle(Symbols::New(thread, test_class_name)))); | 148 lib.LookupClass(String::Handle(Symbols::New(thread, test_class_name)))); |
| 146 EXPECT(!cls.IsNull()); // No ambiguity error expected. | 149 EXPECT(!cls.IsNull()); // No ambiguity error expected. |
| 147 | 150 |
| 148 Instance& receiver = Instance::Handle(Instance::New(cls)); | 151 Instance& receiver = Instance::Handle(Instance::New(cls)); |
| 149 const String& function_name = String::Handle(String::New(test_function_name)); | 152 const String& function_name = String::Handle(String::New(test_function_name)); |
| 150 | 153 |
| 151 // Now try to resolve and invoke the instance function in this class. | 154 // Now try to resolve and invoke the instance function in this class. |
| 152 { | 155 { |
| 156 const int kTypeArgsLen = 0; |
| 153 const int kNumArguments = 3; | 157 const int kNumArguments = 3; |
| 154 ArgumentsDescriptor args_desc( | 158 ArgumentsDescriptor args_desc( |
| 155 Array::Handle(ArgumentsDescriptor::New(kNumArguments))); | 159 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
| 156 const Function& function = Function::Handle( | 160 const Function& function = Function::Handle( |
| 157 Resolver::ResolveDynamic(receiver, function_name, args_desc)); | 161 Resolver::ResolveDynamic(receiver, function_name, args_desc)); |
| 158 EXPECT(!function.IsNull()); | 162 EXPECT(!function.IsNull()); |
| 159 const Array& args = Array::Handle(Array::New(kNumArguments)); | 163 const Array& args = Array::Handle(Array::New(kNumArguments)); |
| 160 args.SetAt(0, receiver); | 164 args.SetAt(0, receiver); |
| 161 const String& arg0 = String::Handle(String::New("junk")); | 165 const String& arg0 = String::Handle(String::New("junk")); |
| 162 args.SetAt(1, arg0); | 166 args.SetAt(1, arg0); |
| 163 const Smi& arg1 = Smi::Handle(Smi::New(kTestValue)); | 167 const Smi& arg1 = Smi::Handle(Smi::New(kTestValue)); |
| 164 args.SetAt(2, arg1); | 168 args.SetAt(2, arg1); |
| 165 const Smi& retval = Smi::Handle( | 169 const Smi& retval = Smi::Handle( |
| 166 reinterpret_cast<RawSmi*>(DartEntry::InvokeFunction(function, args))); | 170 reinterpret_cast<RawSmi*>(DartEntry::InvokeFunction(function, args))); |
| 167 EXPECT_EQ(kTestValue, retval.Value()); | 171 EXPECT_EQ(kTestValue, retval.Value()); |
| 168 } | 172 } |
| 169 | 173 |
| 170 // Now try to resolve an instance function with invalid argument count. | 174 // Now try to resolve an instance function with invalid argument count. |
| 171 { | 175 { |
| 176 const int kTypeArgsLen = 0; |
| 172 const int kNumArguments = 1; | 177 const int kNumArguments = 1; |
| 173 ArgumentsDescriptor args_desc( | 178 ArgumentsDescriptor args_desc( |
| 174 Array::Handle(ArgumentsDescriptor::New(kNumArguments))); | 179 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
| 175 const Function& bad_function = Function::Handle( | 180 const Function& bad_function = Function::Handle( |
| 176 Resolver::ResolveDynamic(receiver, function_name, args_desc)); | 181 Resolver::ResolveDynamic(receiver, function_name, args_desc)); |
| 177 EXPECT(bad_function.IsNull()); | 182 EXPECT(bad_function.IsNull()); |
| 178 } | 183 } |
| 179 | 184 |
| 180 // Hierarchy walking. | 185 // Hierarchy walking. |
| 181 { | 186 { |
| 187 const int kTypeArgsLen = 0; |
| 182 const int kNumArguments = 1; | 188 const int kNumArguments = 1; |
| 183 ArgumentsDescriptor args_desc( | 189 ArgumentsDescriptor args_desc( |
| 184 Array::Handle(ArgumentsDescriptor::New(kNumArguments))); | 190 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
| 185 const String& super_function_name = String::Handle(String::New("dynCall")); | 191 const String& super_function_name = String::Handle(String::New("dynCall")); |
| 186 const Function& super_function = Function::Handle( | 192 const Function& super_function = Function::Handle( |
| 187 Resolver::ResolveDynamic(receiver, super_function_name, args_desc)); | 193 Resolver::ResolveDynamic(receiver, super_function_name, args_desc)); |
| 188 EXPECT(!super_function.IsNull()); | 194 EXPECT(!super_function.IsNull()); |
| 189 } | 195 } |
| 190 } | 196 } |
| 191 | 197 |
| 192 } // namespace dart | 198 } // namespace dart |
| OLD | NEW |