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 "bin/builtin.h" | 5 #include "bin/builtin.h" |
6 #include "include/dart_api.h" | 6 #include "include/dart_api.h" |
7 #include "include/dart_mirrors_api.h" | 7 #include "include/dart_mirrors_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/json.h" | 10 #include "platform/json.h" |
(...skipping 5278 matching lines...) Loading... |
5289 " var _f;\n" | 5289 " var _f;\n" |
5290 " callFunc(x, y) => x(y);\n" | 5290 " callFunc(x, y) => x(y);\n" |
5291 " external void method(var value);\n" | 5291 " external void method(var value);\n" |
5292 " get field => _field;\n" | 5292 " get field => _field;\n" |
5293 "}\n" | 5293 "}\n" |
5294 "class B {\n" | 5294 "class B {\n" |
5295 " var val;\n" | 5295 " var val;\n" |
5296 " external B.named(x);\n" | 5296 " external B.named(x);\n" |
5297 " external B(v);\n" | 5297 " external B(v);\n" |
5298 "}\n" | 5298 "}\n" |
| 5299 "class C {\n" |
| 5300 " external int method();\n" |
| 5301 "}\n" |
| 5302 "\n" |
5299 "external int unpatched();\n" | 5303 "external int unpatched();\n" |
5300 "external int topLevel(var value);\n" | 5304 "external int topLevel(var value);\n" |
| 5305 "external int topLevel2(var value);\n" |
5301 "external int get topLevelGetter;\n" | 5306 "external int get topLevelGetter;\n" |
5302 "external void set topLevelSetter(int value);\n"; | 5307 "external void set topLevelSetter(int value);\n"; |
5303 | 5308 |
5304 const char* kPatchChars = | 5309 const char* kPatchChars = |
5305 "patch class A {\n" | 5310 "patch class A {\n" |
5306 " var _g;\n" | 5311 " var _g;\n" |
5307 " A() : fvalue = 13;\n" | 5312 " A() : fvalue = 13;\n" |
5308 " get _field => _g;\n" | 5313 " get _field => _g;\n" |
5309 " /*patch*/ void method(var value) {\n" | 5314 " /*patch*/ void method(var value) {\n" |
5310 " int closeYourEyes(var eggs) { return eggs * -1; }\n" | 5315 " int closeYourEyes(var eggs) { return eggs * -1; }\n" |
5311 " value = callFunc(closeYourEyes, value);\n" | 5316 " value = callFunc(closeYourEyes, value);\n" |
5312 " _g = value * 5;\n" | 5317 " _g = value * 5;\n" |
5313 " }\n" | 5318 " }\n" |
5314 "}\n" | 5319 "}\n" |
5315 "patch class B {\n" | 5320 "patch class B {\n" |
5316 " B._internal(x) : val = x;\n" | 5321 " B._internal(x) : val = x;\n" |
5317 " /*patch*/ factory B.named(x) { return new B._internal(x); }\n" | 5322 " /*patch*/ factory B.named(x) { return new B._internal(x); }\n" |
5318 " /*patch*/ factory B(v) native \"const_B_factory\";\n" | 5323 " /*patch*/ factory B(v) native \"const_B_factory\";\n" |
5319 "}\n" | 5324 "}\n" |
5320 "var _topLevelValue = -1;\n" | 5325 "var _topLevelValue = -1;\n" |
5321 "patch int topLevel(var value) => value * value;\n" | 5326 "patch int topLevel(var value) => value * value;\n" |
5322 "patch int set topLevelSetter(value) { _topLevelValue = value; }\n" | 5327 "patch int set topLevelSetter(value) { _topLevelValue = value; }\n" |
5323 "patch int get topLevelGetter => 2 * _topLevelValue;\n" | 5328 "patch int get topLevelGetter => 2 * _topLevelValue;\n" |
5324 // Allow top level methods named patch. | 5329 // Allow top level methods named patch. |
5325 "patch(x) => x*3;\n"; | 5330 "patch(x) => x*3;\n" |
| 5331 ; // NOLINT |
| 5332 |
| 5333 const char* kPatchClassOnlyChars = |
| 5334 "patch class C {\n" |
| 5335 " /*patch*/ int method() {\n" |
| 5336 " return 42;\n" |
| 5337 " }\n" |
| 5338 "}\n" |
| 5339 ; // NOLINT |
| 5340 |
| 5341 const char* kPatchNoClassChars = |
| 5342 "patch topLevel2(x) => x * 2;\n"; |
5326 | 5343 |
5327 const char* kScriptChars = | 5344 const char* kScriptChars = |
5328 "import 'theLibrary';\n" | 5345 "import 'theLibrary';\n" |
5329 "e1() => unpatched();\n" | 5346 "e1() => unpatched();\n" |
5330 "m1() => topLevel(2);\n" | 5347 "m1() => topLevel(2);\n" |
5331 "m2() {\n" | 5348 "m2() {\n" |
5332 " topLevelSetter = 20;\n" | 5349 " topLevelSetter = 20;\n" |
5333 " return topLevelGetter;\n" | 5350 " return topLevelGetter;\n" |
5334 "}\n" | 5351 "}\n" |
5335 "m3() => patch(7);\n" | 5352 "m3() => patch(7);\n" |
(...skipping 13 matching lines...) Loading... |
5349 bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary); | 5366 bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary); |
5350 | 5367 |
5351 Dart_Handle result = Dart_SetLibraryTagHandler(library_handler); | 5368 Dart_Handle result = Dart_SetLibraryTagHandler(library_handler); |
5352 EXPECT_VALID(result); | 5369 EXPECT_VALID(result); |
5353 | 5370 |
5354 Dart_Handle url = NewString("theLibrary"); | 5371 Dart_Handle url = NewString("theLibrary"); |
5355 Dart_Handle source = NewString(kLibraryChars); | 5372 Dart_Handle source = NewString(kLibraryChars); |
5356 result = Dart_LoadLibrary(url, source); | 5373 result = Dart_LoadLibrary(url, source); |
5357 EXPECT_VALID(result); | 5374 EXPECT_VALID(result); |
5358 | 5375 |
5359 const String& patch_url = String::Handle(String::New("theLibrary patch")); | 5376 const char* patchNames[] = { "main library patch", |
5360 const String& patch_source = String::Handle(String::New(kPatchChars)); | 5377 "patch class only", |
5361 const Script& patch_script = Script::Handle(Script::New( | 5378 "patch no class" }; |
5362 patch_url, patch_source, RawScript::kPatchTag)); | 5379 const char* patches[] = { kPatchChars, |
| 5380 kPatchClassOnlyChars, |
| 5381 kPatchNoClassChars }; |
| 5382 const String& lib_url = String::Handle(String::New("theLibrary")); |
5363 | 5383 |
5364 const String& lib_url = String::Handle(String::New("theLibrary")); | |
5365 const Library& lib = Library::Handle(Library::LookupLibrary(lib_url)); | 5384 const Library& lib = Library::Handle(Library::LookupLibrary(lib_url)); |
5366 const Error& err = Error::Handle(lib.Patch(patch_script)); | 5385 |
5367 if (!err.IsNull()) { | 5386 for (int i = 0; i < 3; i++) { |
5368 OS::Print("Patching error: %s\n", err.ToErrorCString()); | 5387 const String& patch_url = String::Handle(String::New(patchNames[i])); |
5369 EXPECT(false); | 5388 const String& patch_source = String::Handle(String::New(patches[i])); |
| 5389 const Script& patch_script = Script::Handle(Script::New( |
| 5390 patch_url, patch_source, RawScript::kPatchTag)); |
| 5391 |
| 5392 const Error& err = Error::Handle(lib.Patch(patch_script)); |
| 5393 if (!err.IsNull()) { |
| 5394 OS::Print("Patching error: %s\n", err.ToErrorCString()); |
| 5395 EXPECT(false); |
| 5396 } |
5370 } | 5397 } |
5371 result = Dart_SetNativeResolver(result, &PatchNativeResolver); | 5398 result = Dart_SetNativeResolver(result, &PatchNativeResolver); |
5372 EXPECT_VALID(result); | 5399 EXPECT_VALID(result); |
5373 | 5400 |
5374 Dart_Handle script_url = NewString("theScript"); | 5401 Dart_Handle script_url = NewString("theScript"); |
5375 source = NewString(kScriptChars); | 5402 source = NewString(kScriptChars); |
5376 Dart_Handle test_script = Dart_LoadScript(script_url, source, 0, 0); | 5403 Dart_Handle test_script = Dart_LoadScript(script_url, source, 0, 0); |
5377 EXPECT_VALID(test_script); | 5404 EXPECT_VALID(test_script); |
5378 | 5405 |
5379 // Make sure that we can compile all of the patched code. | 5406 // Make sure that we can compile all of the patched code. |
(...skipping 34 matching lines...) Loading... |
5414 result = Dart_Invoke(test_script, NewString("m5"), 0, NULL); | 5441 result = Dart_Invoke(test_script, NewString("m5"), 0, NULL); |
5415 EXPECT_VALID(result); | 5442 EXPECT_VALID(result); |
5416 EXPECT(Dart_IsNull(result)); | 5443 EXPECT(Dart_IsNull(result)); |
5417 | 5444 |
5418 value = 0; | 5445 value = 0; |
5419 result = Dart_Invoke(test_script, NewString("m6"), 0, NULL); | 5446 result = Dart_Invoke(test_script, NewString("m6"), 0, NULL); |
5420 EXPECT_VALID(result); | 5447 EXPECT_VALID(result); |
5421 EXPECT(Dart_IsInteger(result)); | 5448 EXPECT(Dart_IsInteger(result)); |
5422 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); | 5449 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); |
5423 EXPECT_EQ(8, value); | 5450 EXPECT_EQ(8, value); |
| 5451 |
| 5452 // Make sure all source files show up in the patched library. |
| 5453 const Array& lib_scripts = Array::Handle(lib.LoadedScripts()); |
| 5454 EXPECT_EQ(4, lib_scripts.Length()); |
5424 } | 5455 } |
5425 | 5456 |
5426 | 5457 |
5427 static void MyNativeFunction1(Dart_NativeArguments args) { | 5458 static void MyNativeFunction1(Dart_NativeArguments args) { |
5428 Dart_EnterScope(); | 5459 Dart_EnterScope(); |
5429 Dart_SetReturnValue(args, Dart_NewInteger(654321)); | 5460 Dart_SetReturnValue(args, Dart_NewInteger(654321)); |
5430 Dart_ExitScope(); | 5461 Dart_ExitScope(); |
5431 } | 5462 } |
5432 | 5463 |
5433 | 5464 |
(...skipping 1852 matching lines...) Loading... |
7286 NewString("main"), | 7317 NewString("main"), |
7287 0, | 7318 0, |
7288 NULL); | 7319 NULL); |
7289 int64_t value = 0; | 7320 int64_t value = 0; |
7290 result = Dart_IntegerToInt64(result, &value); | 7321 result = Dart_IntegerToInt64(result, &value); |
7291 EXPECT_VALID(result); | 7322 EXPECT_VALID(result); |
7292 EXPECT_EQ(8, value); | 7323 EXPECT_EQ(8, value); |
7293 } | 7324 } |
7294 | 7325 |
7295 } // namespace dart | 7326 } // namespace dart |
OLD | NEW |