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/dartutils.h" | 5 #include "bin/dartutils.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 | 9 |
10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 bool DartUtils::IsDartIOLibURL(const char* url_name) { | 167 bool DartUtils::IsDartIOLibURL(const char* url_name) { |
168 return (strcmp(url_name, kIOLibURL) == 0); | 168 return (strcmp(url_name, kIOLibURL) == 0); |
169 } | 169 } |
170 | 170 |
171 | 171 |
172 bool DartUtils::IsDartBuiltinLibURL(const char* url_name) { | 172 bool DartUtils::IsDartBuiltinLibURL(const char* url_name) { |
173 return (strcmp(url_name, kBuiltinLibURL) == 0); | 173 return (strcmp(url_name, kBuiltinLibURL) == 0); |
174 } | 174 } |
175 | 175 |
176 | 176 |
177 Dart_Handle DartUtils::CanonicalizeURL(CommandLineOptions* url_mapping, | |
178 Dart_Handle library, | |
179 const char* url_str) { | |
180 // Get the url of the including library. | |
181 Dart_Handle library_url = Dart_LibraryUrl(library); | |
182 if (Dart_IsError(library_url)) { | |
183 return Dart_NewApiError("accessing library url failed"); | |
184 } | |
185 if (!Dart_IsString(library_url)) { | |
186 return Dart_NewApiError("library url is not a string"); | |
187 } | |
188 const char* library_url_str = NULL; | |
189 Dart_Handle result = Dart_StringToCString(library_url, &library_url_str); | |
190 if (Dart_IsError(result)) { | |
191 return Dart_NewApiError("accessing library url characters failed"); | |
192 } | |
193 if (url_mapping != NULL) { | |
194 const char* mapped_library_url_str = MapLibraryUrl(url_mapping, | |
195 library_url_str); | |
196 if (mapped_library_url_str != NULL) { | |
197 library_url_str = mapped_library_url_str; | |
198 } | |
199 } | |
200 // Calculate the canonical path. | |
201 const char* canon_url_str = GetCanonicalPath(library_url_str, url_str); | |
202 Dart_Handle canon_url = NewString(canon_url_str); | |
203 free(const_cast<char*>(canon_url_str)); | |
204 | |
205 return canon_url; | |
206 } | |
207 | |
208 | |
209 void* DartUtils::OpenFile(const char* name, bool write) { | 177 void* DartUtils::OpenFile(const char* name, bool write) { |
210 File* file = File::Open(name, write ? File::kWriteTruncate : File::kRead); | 178 File* file = File::Open(name, write ? File::kWriteTruncate : File::kRead); |
211 return reinterpret_cast<void*>(file); | 179 return reinterpret_cast<void*>(file); |
212 } | 180 } |
213 | 181 |
214 | 182 |
215 void DartUtils::ReadFile(const uint8_t** data, | 183 void DartUtils::ReadFile(const uint8_t** data, |
216 intptr_t* len, | 184 intptr_t* len, |
217 void* stream) { | 185 void* stream) { |
218 ASSERT(data != NULL); | 186 ASSERT(data != NULL); |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 library); | 529 library); |
562 } else { | 530 } else { |
563 // Handle 'import' or 'part' requests for all other URIs. | 531 // Handle 'import' or 'part' requests for all other URIs. |
564 // Get the file path out of the url. | 532 // Get the file path out of the url. |
565 Dart_Handle file_path = DartUtils::FilePathFromUri(url, builtin_lib); | 533 Dart_Handle file_path = DartUtils::FilePathFromUri(url, builtin_lib); |
566 if (Dart_IsError(file_path)) { | 534 if (Dart_IsError(file_path)) { |
567 return file_path; | 535 return file_path; |
568 } | 536 } |
569 const char* final_path = NULL; | 537 const char* final_path = NULL; |
570 Dart_StringToCString(file_path, &final_path); | 538 Dart_StringToCString(file_path, &final_path); |
571 result = DartUtils::LoadSource(NULL, | 539 result = DartUtils::LoadSource(library, url, tag, final_path); |
572 library, | |
573 url, | |
574 tag, | |
575 final_path); | |
576 return result; | 540 return result; |
577 } | 541 } |
578 } | 542 } |
579 | 543 |
580 | 544 |
581 const uint8_t* DartUtils::SniffForMagicNumber(const uint8_t* text_buffer, | 545 const uint8_t* DartUtils::SniffForMagicNumber(const uint8_t* text_buffer, |
582 intptr_t* buffer_len, | 546 intptr_t* buffer_len, |
583 bool* is_snapshot) { | 547 bool* is_snapshot) { |
584 intptr_t len = sizeof(magic_number); | 548 intptr_t len = sizeof(magic_number); |
585 for (intptr_t i = 0; i < len; i++) { | 549 for (intptr_t i = 0; i < len; i++) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 returnValue = NewError("%s is not a valid UTF-8 script", script_uri); | 627 returnValue = NewError("%s is not a valid UTF-8 script", script_uri); |
664 } else { | 628 } else { |
665 returnValue = Dart_LoadScript(resolved_script_uri, source, 0, 0); | 629 returnValue = Dart_LoadScript(resolved_script_uri, source, 0, 0); |
666 } | 630 } |
667 } | 631 } |
668 free(const_cast<uint8_t *>(buffer)); | 632 free(const_cast<uint8_t *>(buffer)); |
669 return returnValue; | 633 return returnValue; |
670 } | 634 } |
671 | 635 |
672 | 636 |
673 Dart_Handle DartUtils::LoadSource(CommandLineOptions* url_mapping, | 637 Dart_Handle DartUtils::LoadSource(Dart_Handle library, |
674 Dart_Handle library, | |
675 Dart_Handle url, | 638 Dart_Handle url, |
676 Dart_LibraryTag tag, | 639 Dart_LibraryTag tag, |
677 const char* url_string) { | 640 const char* url_string) { |
678 bool is_http_scheme_url = DartUtils::IsHttpSchemeURL(url_string); | 641 bool is_http_scheme_url = DartUtils::IsHttpSchemeURL(url_string); |
679 if (url_mapping != NULL && IsDartSchemeURL(url_string)) { | |
680 const char* mapped_url_string = MapLibraryUrl(url_mapping, url_string); | |
681 if (mapped_url_string == NULL) { | |
682 return NewError("Do not know how to load %s", url_string); | |
683 } | |
684 // We have a URL mapping specified, just read the file that the | |
685 // URL mapping specifies and load it. | |
686 url_string = mapped_url_string; | |
687 } | |
688 Dart_Handle source; | 642 Dart_Handle source; |
689 if (is_http_scheme_url) { | 643 if (is_http_scheme_url) { |
690 // Read the file over http. | 644 // Read the file over http. |
691 source = DartUtils::ReadStringFromHttp(url_string); | 645 source = DartUtils::ReadStringFromHttp(url_string); |
692 } else { | 646 } else { |
693 // Read the file. | 647 // Read the file. |
694 source = DartUtils::ReadStringFromFile(url_string); | 648 source = DartUtils::ReadStringFromFile(url_string); |
695 } | 649 } |
696 if (Dart_IsError(source)) { | 650 if (Dart_IsError(source)) { |
697 return source; // source contains the error string. | 651 return source; // source contains the error string. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 return Dart_Invoke(builtin_lib, | 738 return Dart_Invoke(builtin_lib, |
785 NewString("_setPackageRoot"), | 739 NewString("_setPackageRoot"), |
786 kNumArgs, | 740 kNumArgs, |
787 dart_args); | 741 dart_args); |
788 } | 742 } |
789 } | 743 } |
790 return result; | 744 return result; |
791 } | 745 } |
792 | 746 |
793 | 747 |
794 const char* DartUtils::GetCanonicalPath(const char* reference_dir, | |
795 const char* filename) { | |
796 if (File::IsAbsolutePath(filename)) { | |
797 return strdup(filename); | |
798 } | |
799 | |
800 char* canonical_path = File::GetCanonicalPath(reference_dir); | |
801 if (canonical_path == NULL) { | |
802 canonical_path = strdup(reference_dir); | |
803 ASSERT(canonical_path != NULL); | |
804 } | |
805 ASSERT(File::PathSeparator() != NULL && strlen(File::PathSeparator()) == 1); | |
806 char* path_sep = strrchr(canonical_path, File::PathSeparator()[0]); | |
807 if (path_sep == NULL) { | |
808 // No separator found: Reference is a file in local directory. | |
809 free(canonical_path); | |
810 return strdup(filename); | |
811 } | |
812 *path_sep = '\0'; | |
813 intptr_t len = snprintf(NULL, 0, "%s%s%s", | |
814 canonical_path, File::PathSeparator(), filename); | |
815 char* absolute_filename = reinterpret_cast<char*>(malloc(len + 1)); | |
816 ASSERT(absolute_filename != NULL); | |
817 | |
818 snprintf(absolute_filename, len + 1, "%s%s%s", | |
819 canonical_path, File::PathSeparator(), filename); | |
820 free(canonical_path); | |
821 canonical_path = File::GetCanonicalPath(absolute_filename); | |
822 if (canonical_path == NULL) { | |
823 return absolute_filename; | |
824 } | |
825 free(absolute_filename); | |
826 return canonical_path; | |
827 } | |
828 | |
829 | |
830 bool DartUtils::PostNull(Dart_Port port_id) { | 748 bool DartUtils::PostNull(Dart_Port port_id) { |
831 // Post a message with just the null object. | 749 // Post a message with just the null object. |
832 return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject()); | 750 return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject()); |
833 } | 751 } |
834 | 752 |
835 | 753 |
836 bool DartUtils::PostInt32(Dart_Port port_id, int32_t value) { | 754 bool DartUtils::PostInt32(Dart_Port port_id, int32_t value) { |
837 // Post a message with the integer value. | 755 // Post a message with the integer value. |
838 int32_t min = 0xc0000000; // -1073741824 | 756 int32_t min = 0xc0000000; // -1073741824 |
839 int32_t max = 0x3fffffff; // 1073741823 | 757 int32_t max = 0x3fffffff; // 1073741823 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 new CObjectString(CObject::NewString(os_error->message())); | 1036 new CObjectString(CObject::NewString(os_error->message())); |
1119 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); | 1037 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); |
1120 result->SetAt(0, new CObjectInt32(CObject::NewInt32(kOSError))); | 1038 result->SetAt(0, new CObjectInt32(CObject::NewInt32(kOSError))); |
1121 result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error->code()))); | 1039 result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error->code()))); |
1122 result->SetAt(2, error_message); | 1040 result->SetAt(2, error_message); |
1123 return result; | 1041 return result; |
1124 } | 1042 } |
1125 | 1043 |
1126 } // namespace bin | 1044 } // namespace bin |
1127 } // namespace dart | 1045 } // namespace dart |
OLD | NEW |