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 |