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

Side by Side Diff: vm/dart_api_impl_test.cc

Issue 10535180: Allow implicit 'close your eyes' of native methods. This will hopefully fix issue 3466. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 6 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) 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "platform/assert.h" 6 #include "platform/assert.h"
7 #include "platform/utils.h" 7 #include "platform/utils.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_api_state.h" 10 #include "vm/dart_api_state.h"
(...skipping 5154 matching lines...) Expand 10 before | Expand all | Expand 10 after
5165 } 5165 }
5166 } 5166 }
5167 5167
5168 // We should have received the expected number of interrupts. 5168 // We should have received the expected number of interrupts.
5169 EXPECT_EQ(kInterruptCount, interrupt_count); 5169 EXPECT_EQ(kInterruptCount, interrupt_count);
5170 5170
5171 // Give the spawned thread enough time to properly exit. 5171 // Give the spawned thread enough time to properly exit.
5172 Isolate::SetInterruptCallback(saved); 5172 Isolate::SetInterruptCallback(saved);
5173 } 5173 }
5174 5174
5175
5176 static int64_t GetValue(Dart_Handle arg) {
5177 EXPECT(!Dart_IsError(arg));
5178 EXPECT(Dart_IsInteger(arg));
5179 int64_t value;
5180 EXPECT_VALID(Dart_IntegerToInt64(arg, &value));
5181 return value;
5182 }
5183
5184 void NativeFoo1(Dart_NativeArguments args) {
5185 Dart_EnterScope();
5186 intptr_t i = Dart_GetNativeArgumentCount(args);
5187 EXPECT_EQ(1, i);
5188 Dart_Handle arg = Dart_GetNativeArgument(args, 0);
5189 EXPECT(!Dart_IsError(arg));
5190 Dart_SetReturnValue(args, Dart_NewInteger(1));
5191 Dart_ExitScope();
5192 }
5193
5194
5195 void NativeFoo2(Dart_NativeArguments args) {
5196 Dart_EnterScope();
5197 intptr_t i = Dart_GetNativeArgumentCount(args);
5198 EXPECT_EQ(2, i);
5199 Dart_Handle arg = Dart_GetNativeArgument(args, 1);
5200 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg)));
5201 Dart_ExitScope();
5202 }
5203
5204
5205 void NativeFoo3(Dart_NativeArguments args) {
5206 Dart_EnterScope();
5207 intptr_t i = Dart_GetNativeArgumentCount(args);
5208 EXPECT_EQ(3, i);
5209 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
5210 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
5211 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2)));
5212 Dart_ExitScope();
5213 }
5214
5215
5216 void NativeFoo4(Dart_NativeArguments args) {
5217 Dart_EnterScope();
5218 intptr_t i = Dart_GetNativeArgumentCount(args);
5219 EXPECT_EQ(4, i);
5220 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
5221 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
5222 Dart_Handle arg3 = Dart_GetNativeArgument(args, 3);
5223 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) +
5224 GetValue(arg2) +
5225 GetValue(arg3)));
5226 Dart_ExitScope();
5227 }
5228
5229
5230 static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name,
5231 int arg_count) {
5232 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
5233 if (!obj.IsString()) {
5234 return NULL;
5235 }
5236 const char* function_name = obj.ToCString();
5237 const char* kNativeFoo1 = "NativeFoo1";
5238 const char* kNativeFoo2 = "NativeFoo2";
5239 const char* kNativeFoo3 = "NativeFoo3";
5240 const char* kNativeFoo4 = "NativeFoo4";
5241 if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) {
5242 return &NativeFoo1;
5243 } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) {
5244 return &NativeFoo2;
5245 } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) {
5246 return &NativeFoo3;
5247 } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) {
5248 return &NativeFoo4;
5249 } else {
5250 UNREACHABLE();
5251 return NULL;
5252 }
5253 }
5254
5255
5256 TEST_CASE(NativeFunctionClosure) {
5257 const char* kScriptChars =
5258 "class Test {"
5259 " int foo1() native \"NativeFoo1\";\n"
5260 " int foo2(int i) native \"NativeFoo2\";\n"
regis 2012/06/15 17:13:34 Add a test for a static native.
siva 2012/06/16 00:25:43 Done.
5261 " int foo3([int k = 10000, int l = 1]) native \"NativeFoo3\";\n"
5262 " int foo4(int i,"
5263 " [int j = 10, int k = 1]) native \"NativeFoo4\";\n"
5264 " int bar1() { var func = foo1; return func(); }\n"
5265 " int bar2(int i) { var func = foo2; return func(i); }\n"
5266 " int bar30() { var func = foo3; return func(); }\n"
5267 " int bar31(int i) { var func = foo3; return func(i); }\n"
5268 " int bar32(int i, int j) { var func = foo3; return func(i, j); }\n"
5269 " int bar41(int i) {\n"
5270 " var func = foo4; return func(i); }\n"
5271 " int bar42(int i, int j) {\n"
5272 " var func = foo4; return func(i, j); }\n"
5273 " int bar43(int i, int j, int k) {\n"
5274 " var func = foo4; return func(i, j, k); }\n"
5275 "}\n"
5276 "int testMain() {\n"
5277 " Test obj = new Test();\n"
5278 " Expect.equals(1, obj.foo1());\n"
5279 " Expect.equals(1, obj.bar1());\n"
5280 "\n"
5281 " Expect.equals(10, obj.foo2(10));\n"
5282 " Expect.equals(10, obj.bar2(10));\n"
5283 "\n"
5284 " Expect.equals(10001, obj.foo3());\n"
5285 " Expect.equals(10001, obj.bar30());\n"
5286 " Expect.equals(2, obj.foo3(1));\n"
5287 " Expect.equals(2, obj.bar31(1));\n"
5288 " Expect.equals(4, obj.foo3(2, 2));\n"
5289 " Expect.equals(4, obj.bar32(2, 2));\n"
5290 "\n"
5291 " Expect.equals(12, obj.foo4(1));\n"
5292 " Expect.equals(12, obj.bar41(1));\n"
5293 " Expect.equals(3, obj.foo4(1, 1));\n"
5294 " Expect.equals(3, obj.bar42(1, 1));\n"
5295 " Expect.equals(6, obj.foo4(2, 2, 2));\n"
5296 " Expect.equals(6, obj.bar43(2, 2, 2));\n"
5297 "\n"
5298 " return 0;\n"
5299 "}\n";
5300
5301 Dart_Handle result;
5302
5303 // Load a test script.
5304 Dart_Handle url = Dart_NewString(TestCase::url());
5305 Dart_Handle source = Dart_NewString(kScriptChars);
5306 result = Dart_SetLibraryTagHandler(library_handler);
5307 EXPECT_VALID(result);
5308 Dart_Handle lib = Dart_LoadScript(url, source);
5309 EXPECT_VALID(lib);
5310 EXPECT(Dart_IsLibrary(lib));
5311 result = Dart_SetNativeResolver(lib, &MyNativeClosureResolver);
5312 EXPECT_VALID(result);
5313
5314 result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
5315 EXPECT_VALID(result);
5316 EXPECT(Dart_IsInteger(result));
5317 int64_t value = 0;
5318 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
5319 EXPECT_EQ(0, value);
5320 }
5321
5175 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 5322 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
5176 5323
5177 } // namespace dart 5324 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698