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

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

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: address review comments and sync Created 3 years, 7 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
« no previous file with comments | « runtime/vm/resolver.cc ('k') | runtime/vm/runtime_entry.cc » ('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 "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
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
OLDNEW
« no previous file with comments | « runtime/vm/resolver.cc ('k') | runtime/vm/runtime_entry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698