Changeset 133103 in webkit
- Timestamp:
- Oct 31, 2012 5:59:41 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r133089 r133103 1 2012-10-31 Mark Lam <mark.lam@apple.com> 2 3 A JSC printf (support for %J+s and %b). 4 https://bugs.webkit.org/show_bug.cgi?id=100566. 5 6 Reviewed by Michael Saboff. 7 8 Added VMInspector::printf(), fprintf(), sprintf(), and snprintf(). 9 - %b prints ints as boolean TRUE (non-zero) or FALSE (zero). 10 - %Js prints a WTF::String* like a %s prints a char*. 11 Also works for 16bit WTF::Strings (prints wchar_t* using %S). 12 - '+' is a modifier meaning 'use verbose mode', and %J+s is an example 13 of its use. 14 15 * JavaScriptCore.xcodeproj/project.pbxproj: 16 * interpreter/VMInspector.cpp: 17 (FormatPrinter): 18 (JSC::FormatPrinter::~FormatPrinter): 19 (JSC::FormatPrinter::print): 20 (JSC::FormatPrinter::printArg): 21 (JSC::FormatPrinter::printWTFString): 22 (JSC::FileFormatPrinter::FileFormatPrinter): 23 (JSC::FileFormatPrinter::printArg): 24 (JSC::StringFormatPrinter::StringFormatPrinter): 25 (JSC::StringFormatPrinter::printArg): 26 (JSC::StringNFormatPrinter::StringNFormatPrinter): 27 (JSC::StringNFormatPrinter::printArg): 28 (JSC::VMInspector::fprintf): 29 (JSC::VMInspector::printf): 30 (JSC::VMInspector::sprintf): 31 (JSC::VMInspector::snprintf): 32 * interpreter/VMInspector.h: 33 (VMInspector): 34 1 35 2012-10-31 Mark Lam <mark.lam@apple.com> 2 36 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r132859 r133103 747 747 FE20CE9E15F04A9500DF3430 /* LLIntCLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = FE20CE9C15F04A9500DF3430 /* LLIntCLoop.h */; settings = {ATTRIBUTES = (Private, ); }; }; 748 748 FE4A331F15BD2E07006F54F3 /* VMInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */; }; 749 FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4A331E15BD2E07006F54F3 /* VMInspector.h */; };749 FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4A331E15BD2E07006F54F3 /* VMInspector.h */; settings = {ATTRIBUTES = (Private, ); }; }; 750 750 FED287B215EC9A5700DA8161 /* LLIntOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = FED287B115EC9A5700DA8161 /* LLIntOpcode.h */; settings = {ATTRIBUTES = (Private, ); }; }; 751 751 /* End PBXBuildFile section */ … … 2614 2614 C2EAD2FC14F0249800A4B159 /* CopiedAllocator.h in Headers */, 2615 2615 C2B916C214DA014E00CBAC86 /* MarkedAllocator.h in Headers */, 2616 FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */, 2616 2617 C2239D1816262BDD005AC5FD /* CopyVisitor.h in Headers */, 2617 2618 C2239D1916262BDD005AC5FD /* CopyVisitorInlineMethods.h in Headers */, … … 2983 2984 0F766D4415B2A3C0008F363E /* DFGRegisterSet.h in Headers */, 2984 2985 0F766D4615B3701F008F363E /* DFGScratchRegisterAllocator.h in Headers */, 2985 FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */,2986 2986 0F63943F15C75F19006A597C /* DFGStructureCheckHoistingPhase.h in Headers */, 2987 2987 0F63945515D07057006A597C /* ArrayProfile.h in Headers */, -
trunk/Source/JavaScriptCore/interpreter/VMInspector.cpp
r130726 r133103 29 29 #if ENABLE(VMINSPECTOR) 30 30 31 #include <stdio.h> 32 #include <wtf/ASCIICType.h> 33 #include <wtf/text/WTFString.h> 34 31 35 namespace JSC { 32 36 … … 106 110 } 107 111 112 113 //============================================================================ 114 // class FormatPrinter 115 // - implements functionality to support fprintf. 116 // 117 // The FormatPrinter classes do the real formatting and printing. 118 // By default, the superclass FormatPrinter will print to stdout (printf). 119 // Each of the subclass will implement the other ...printf() options. 120 // The subclasses are: 121 // 122 // FileFormatPrinter - fprintf 123 // StringFormatPrinter - sprintf 124 // StringNFormatPrinter - snprintf 125 126 class FormatPrinter { 127 public: 128 virtual ~FormatPrinter() { } 129 130 void print(const char* format, va_list args); 131 132 protected: 133 // Low level printers: 134 bool printArg(const char* format, ...); 135 virtual bool printArg(const char* format, va_list args); 136 137 // JS type specific printers: 138 void printWTFString(va_list args, bool verbose); 139 }; 140 141 142 // The public print() function is the real workhorse behind the printf 143 // family of functions. print() deciphers the % formatting, translate them 144 // to primitive formats, and dispatches to underlying printArg() functions 145 // to do the printing. 146 // 147 // The non-public internal printArg() function is virtual and is responsible 148 // for handling the variations between printf, fprintf, sprintf, and snprintf. 149 150 void FormatPrinter::print(const char* format, va_list args) 151 { 152 const char* p = format; 153 const char* errorStr; 154 155 // buffer is only used for 2 purposes: 156 // 1. To temporarily hold a copy of normal chars (not needing formatting) 157 // to be passed to printArg() and printed. 158 // 159 // The incoming format string may contain a string of normal chars much 160 // longer than 128, but we handle this by breaking them out to 128 chars 161 // fragments and printing each fragment before re-using the buffer to 162 // load up the next fragment. 163 // 164 // 2. To hold a single "%..." format to be passed to printArg() to process 165 // a single va_arg. 166 167 char buffer[129]; // 128 chars + null terminator. 168 char* end = &buffer[sizeof(buffer) - 1]; 169 const char* startOfFormatSpecifier = 0; 170 171 while (true) { 172 char c = *p++; 173 char* curr = buffer; 174 175 // Print leading normal chars: 176 while (c != '\0' && c != '%') { 177 *curr++ = c; 178 if (curr == end) { 179 // Out of buffer space. Flush the fragment, and start over. 180 *curr = '\0'; 181 bool success = printArg("%s", buffer); 182 if (!success) { 183 errorStr = buffer; 184 goto handleError; 185 } 186 curr = buffer; 187 } 188 c = *p++; 189 } 190 // If we have stuff in the buffer, flush the fragment: 191 if (curr != buffer) { 192 ASSERT(curr < end + 1); 193 *curr = '\0'; 194 bool success = printArg("%s", buffer); 195 if (!success) { 196 errorStr = buffer; 197 goto handleError; 198 } 199 } 200 201 // End if there are not more chars to print: 202 if (c == '\0') 203 break; 204 205 // If we get here, we've must have seen a '%': 206 startOfFormatSpecifier = p - 1; 207 ASSERT(*startOfFormatSpecifier == '%'); 208 c = *p++; 209 210 // Check for "%%" case: 211 if (c == '%') { 212 bool success = printArg("%c", '%'); 213 if (!success) { 214 errorStr = p - 2; 215 goto handleError; 216 } 217 continue; 218 } 219 220 // Check for JS (%J<x>) formatting extensions: 221 if (c == 'J') { 222 bool verbose = false; 223 224 c = *p++; 225 if (UNLIKELY(c == '\0')) { 226 errorStr = p - 2; // Rewind to % in "%J\0" 227 goto handleError; 228 } 229 230 if (c == '+') { 231 verbose = true; 232 c= *p++; 233 if (UNLIKELY(c == '\0')) { 234 errorStr = p - 3; // Rewind to % in "%J+\0" 235 goto handleError; 236 } 237 } 238 239 switch (c) { 240 // %Js - WTF::String* 241 case 's': { 242 printWTFString(args, verbose); 243 continue; 244 } 245 } // END switch. 246 247 // Check for non-JS extensions: 248 } else if (c == 'b') { 249 int value = va_arg(args, int); 250 printArg("%s", value ? "TRUE" : "FALSE"); 251 continue; 252 } 253 254 // If we didn't handle the format in one of the above cases, 255 // rewind p and let the standard formatting check handle it 256 // if possible: 257 p = startOfFormatSpecifier; 258 ASSERT(*p == '%'); 259 260 // Check for standard formatting: 261 // A format specifier always starts with a % and ends with some 262 // alphabet. We'll do the simple thing and scan until the next 263 // alphabet, or the end of string. 264 265 // In the following, we're going to use buffer as storage for a copy 266 // of a single format specifier. Hence, conceptually, we can think of 267 // 'buffer' as synonymous with 'argFormat' here: 268 269 #define ABORT_IF_FORMAT_TOO_LONG(curr) \ 270 do { \ 271 if (UNLIKELY(curr >= end)) \ 272 goto formatTooLong; \ 273 } while (false) 274 275 curr = buffer; 276 *curr++ = *p++; // Output the first % in the format specifier. 277 c = *p++; // Grab the next char in the format specifier. 278 279 // Checks for leading modifiers e.g. "%-d": 280 // 0, -, ' ', +, '\'' 281 if (c == '0' || c == '-' || c == ' ' || c == '+' || c == '\'' || c == '#') { 282 ABORT_IF_FORMAT_TOO_LONG(curr); 283 *curr++ = c; 284 c = *p++; 285 } 286 287 // Checks for decimal digit field width modifiers e.g. "%2f": 288 while (c >= '0' && c <= '9') { 289 ABORT_IF_FORMAT_TOO_LONG(curr); 290 *curr++ = c; 291 c = *p++; 292 } 293 294 // Checks for '.' e.g. "%2.f": 295 if (c == '.') { 296 ABORT_IF_FORMAT_TOO_LONG(curr); 297 *curr++ = c; 298 c = *p++; 299 300 // Checks for decimal digit precision modifiers e.g. "%.2f": 301 while (c >= '0' && c <= '9') { 302 ABORT_IF_FORMAT_TOO_LONG(curr); 303 *curr++ = c; 304 c = *p++; 305 } 306 } 307 308 // Checks for the modifier <m> where <m> can be: 309 // l, h, j, t, z 310 // e.g. "%ld" 311 if (c == 'l' || c == 'h' || c == 'j' || c == 't' || c == 'z' || c == 'L') { 312 ABORT_IF_FORMAT_TOO_LONG(curr); 313 *curr++ = c; 314 char prevChar = c; 315 c = *p++; 316 317 // Checks for the modifier ll or hh in %<x><m>: 318 if ((prevChar == 'l' || prevChar == 'h') && c == prevChar) { 319 ABORT_IF_FORMAT_TOO_LONG(curr); 320 *curr++ = c; 321 c = *p++; 322 } 323 } 324 325 // Checks for %<x> where <x> can be: 326 // d, i, n, o, u, x, X 327 // But hey, we're just going to do the simple thing and allow any 328 // alphabet. The user is expected to pass correct format specifiers. 329 // We won't do any format checking here. We'll just pass it on, and the 330 // underlying ...printf() implementation may do the needed checking 331 // at its discretion. 332 while (c != '\0' && !isASCIIAlpha(c)) { 333 ABORT_IF_FORMAT_TOO_LONG(curr); 334 *curr++ = c; 335 c = *p++; 336 } 337 338 ABORT_IF_FORMAT_TOO_LONG(curr); 339 *curr++ = c; 340 if (c == '\0') { 341 // Uh oh. Bad format. We should have gotten an alphabet instead. 342 // Print the supposed format as a string instead: 343 errorStr = buffer; 344 goto handleError; 345 } 346 347 // Otherwise, we have the alpha that terminates the format. 348 // Terminate the buffer (i.e. argFormat) string: 349 ASSERT(isASCIIAlpha(c)); 350 ABORT_IF_FORMAT_TOO_LONG(curr); 351 *curr = '\0'; 352 353 bool success = printArg(buffer, args); 354 if (!success) { 355 errorStr = buffer; 356 goto handleError; 357 } 358 } 359 #undef ABORT_IF_FORMAT_TOO_LONG 360 361 return; 362 363 formatTooLong: 364 // Print the error string: 365 ASSERT(!!startOfFormatSpecifier); 366 p = startOfFormatSpecifier; 367 ASSERT(p >= format); 368 printArg("ERROR @ Format too long at \"%s\"\n", p); 369 return; 370 371 handleError: 372 // We've got an error. Can't do any more work. Print an error message if 373 // possible and then just return. 374 375 // The errorStr may be pointing into the middle of buffer, or the original 376 // format string. Move the string to buffer for consistency, and also so 377 // that we can strip it of newlines below. 378 if (errorStr != buffer) { 379 size_t length = strlen(errorStr); 380 if (length > sizeof(buffer) - 1) 381 length = sizeof(buffer) - 1; 382 memmove(buffer, errorStr, length); 383 buffer[length] = '\0'; // Terminate the moved error string. 384 } 385 // Strip the newlines: 386 char* cp = buffer; 387 while (*cp) { 388 if (*cp == '\n' || *cp == '\r') 389 *cp = ' '; 390 cp++; 391 } 392 // Print the error string: 393 printArg("ERROR @ \"%s\"\n", buffer); 394 } 395 396 397 bool FormatPrinter::printArg(const char* format, ...) 398 { 399 va_list args; 400 va_start(args, format); 401 bool success = printArg(format, args); 402 va_end(args); 403 return success; 404 } 405 406 bool FormatPrinter::printArg(const char* format, va_list args) 407 { 408 int count = ::vprintf(format, args); 409 return (count >= 0); // Fail if less than 0 chars printed. 410 } 411 412 413 // %Js - WTF::String* 414 // verbose mode prints: WTF::String "<your string>" 415 void FormatPrinter::printWTFString(va_list args, bool verbose) 416 { 417 const String* str = va_arg(args, const String*); 418 419 // Print verbose header if appropriate: 420 if (verbose) 421 printArg("WTF::String \""); 422 423 // Print the string itself: 424 if (!str->isEmpty()) { 425 if (str->is8Bit()) { 426 const LChar* chars = str->characters8(); 427 printArg("%s", reinterpret_cast<const char*>(chars)); 428 } else { 429 const UChar* chars = str->characters16(); 430 printArg("%S", reinterpret_cast<const wchar_t*>(chars)); 431 } 432 } 433 434 // Print verbose footer if appropriate: 435 if (verbose) 436 printArg("\""); 437 } 438 439 440 //============================================================================ 441 // class FileFormatPrinter 442 // - implements functionality to support fprintf. 443 444 class FileFormatPrinter: public FormatPrinter { 445 public: 446 FileFormatPrinter(FILE*); 447 private: 448 virtual bool printArg(const char* format, va_list args); 449 450 FILE* m_file; 451 }; 452 453 FileFormatPrinter::FileFormatPrinter(FILE* file) 454 : m_file(file) 455 { 456 } 457 458 bool FileFormatPrinter::printArg(const char* format, va_list args) 459 { 460 int count = ::vfprintf(m_file, format, args); 461 return (count >= 0); // Fail if less than 0 chars printed. 462 } 463 464 465 //============================================================================ 466 // class StringFormatPrinter 467 // - implements functionality to support sprintf. 468 469 class StringFormatPrinter: public FormatPrinter { 470 public: 471 StringFormatPrinter(char* buffer); 472 private: 473 virtual bool printArg(const char* format, va_list args); 474 475 char* m_buffer; 476 }; 477 478 StringFormatPrinter::StringFormatPrinter(char* buffer) 479 : m_buffer(buffer) 480 { 481 } 482 483 bool StringFormatPrinter::printArg(const char* format, va_list args) 484 { 485 int count = ::vsprintf(m_buffer, format, args); 486 m_buffer += count; 487 return (count >= 0); // Fail if less than 0 chars printed. 488 } 489 490 491 //============================================================================ 492 // class StringNFormatPrinter 493 // - implements functionality to support snprintf. 494 495 class StringNFormatPrinter: public FormatPrinter { 496 public: 497 StringNFormatPrinter(char* buffer, size_t); 498 private: 499 virtual bool printArg(const char* format, va_list args); 500 501 char* m_buffer; 502 size_t m_size; 503 }; 504 505 506 StringNFormatPrinter::StringNFormatPrinter(char* buffer, size_t size) 507 : m_buffer(buffer) 508 , m_size(size) 509 { 510 } 511 512 bool StringNFormatPrinter::printArg(const char* format, va_list args) 513 { 514 if (m_size > 0) { 515 int count = ::vsnprintf(m_buffer, m_size, format, args); 516 517 // According to vsnprintf specs, ... 518 bool success = (count >= 0); 519 if (static_cast<size_t>(count) >= m_size) { 520 // If count > size, then we didn't have enough buffer space. 521 count = m_size; 522 } 523 524 // Adjust the buffer to what's left if appropriate: 525 if (success) { 526 m_buffer += count; 527 m_size -= count; 528 } 529 return success; 530 } 531 // No more room to print. Declare it a fail: 532 return false; 533 } 534 535 536 //============================================================================ 537 // VMInspector printf family of methods: 538 539 void VMInspector::fprintf(FILE* file, const char* format, ...) 540 { 541 va_list args; 542 va_start(args, format); 543 FileFormatPrinter(file).print(format, args); 544 va_end(args); 545 } 546 547 void VMInspector::printf(const char* format, ...) 548 { 549 va_list args; 550 va_start(args, format); 551 FormatPrinter().print(format, args); 552 va_end(args); 553 } 554 555 void VMInspector::sprintf(char* buffer, const char* format, ...) 556 { 557 va_list args; 558 va_start(args, format); 559 StringFormatPrinter(buffer).print(format, args); 560 va_end(args); 561 } 562 563 void VMInspector::snprintf(char* buffer, size_t size, const char* format, ...) 564 { 565 va_list args; 566 va_start(args, format); 567 StringNFormatPrinter(buffer, size).print(format, args); 568 va_end(args); 569 } 570 108 571 } // namespace JSC 109 572 -
trunk/Source/JavaScriptCore/interpreter/VMInspector.h
r126228 r133103 29 29 #define ENABLE_VMINSPECTOR 0 30 30 31 #if ENABLE(VMINSPECTOR)32 33 31 #include "CallFrame.h" 34 32 #include "JSValue.h" 33 #include <stdarg.h> 34 #include <stdio.h> 35 #include <wtf/text/WTFString.h> 35 36 36 37 namespace JSC { 38 39 #if ENABLE(VMINSPECTOR) 37 40 38 41 class VMInspector { … … 42 45 static JS_EXPORT_PRIVATE void dumpFrame(CallFrame*, const char* prefix = 0, const char* funcName = 0, const char* file = 0, int line = -1); 43 46 static JS_EXPORT_PRIVATE int countFrames(CallFrame*); 47 48 // Special family of ...printf() functions that support, in addition to the 49 // standard % formats (e.g. %d, %s, etc), the following extra JSC formatting 50 // options, %J<x>, where <x> consists of: 51 // 52 // + - verbose mode modifier. 53 // Used in combination with other options. Must come after the %J. 54 // s - WTF::String* 55 // 56 // Examples of usage: 57 // 58 // WTF::String str("My WTF String"); 59 // 60 // // Printing the string. Will print: 61 // // The wtf string says: "My WTF String" and is NOT EMPTY. 62 // 63 // VMInspector::printf("The wtf string says: \"%Js\" and is %s\n", 64 // &str, str.isEmpty()?"EMPTY":"NOT EMPTY"); 65 // 66 // // Printing the string with verbose mode. Will print: 67 // // <WTF::String "My WTF String"> 68 // 69 // VMInspector::printf("<%J+s>\n", &str); 70 // 71 // Also added some convenience non-JS formats: 72 // 73 // %b - boolean (va_args will look for an int). 74 // Prints TRUE if non-zero, else prints FALSE. 75 // 76 // Caution: the user is expected to pass the correctly matched arguments 77 // to pair with the corresponding % fomatting. 78 79 static JS_EXPORT_PRIVATE void fprintf(FILE*, const char* format, ...); 80 static JS_EXPORT_PRIVATE void printf(const char* format, ...); 81 static JS_EXPORT_PRIVATE void sprintf(char*, const char* format, ...); 82 static JS_EXPORT_PRIVATE void snprintf(char*, size_t, const char* format, ...); 44 83 }; 84 85 #endif // ENABLE(VMINSPECTOR) 45 86 46 87 } // namespace JSC 47 88 48 #endif // ENABLE(VMINSPECTOR)49 50 89 #endif // VMInspector.h -
trunk/Source/WebCore/ChangeLog
r133101 r133103 1 2012-10-30 Mark Lam <mark.lam@apple.com> 2 3 A JSC printf (support for %J+s and %b). 4 https://bugs.webkit.org/show_bug.cgi?id=100566. 5 6 Reviewed by Michael Saboff. 7 8 Added forwarding header for VMInspector.h. 9 10 No new tests needed for this. 11 12 * ForwardingHeaders/interpreter/VMInspector.h: Added. 13 1 14 2012-10-31 Chris Rogers <crogers@google.com> 2 15 -
trunk/Tools/ChangeLog
r133084 r133103 1 2012-10-30 Mark Lam <mark.lam@apple.com> 2 3 A JSC printf (support for %J+s and %b). 4 https://bugs.webkit.org/show_bug.cgi?id=100566. 5 6 Reviewed by Michael Saboff. 7 8 Added regression tests for VMInspector::fprintf() sprintf() and snprintf(). 9 10 * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: 11 * TestWebKitAPI/Tests/JavaScriptCore: Added. 12 * TestWebKitAPI/Tests/JavaScriptCore/VMInspector.cpp: Added. 13 1 14 2012-10-31 Thiago Marcos P. Santos <thiago.santos@intel.com> 2 15 -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r132859 r133103 184 184 F6FDDDD314241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6FDDDD214241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp */; }; 185 185 F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F6FDDDD514241C48004F1729 /* push-state.html */; }; 186 FE217ECD1640A54A0052988B /* VMInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE217ECC1640A54A0052988B /* VMInspector.cpp */; }; 186 187 /* End PBXBuildFile section */ 187 188 … … 439 440 F6FDDDD214241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrivateBrowsingPushStateNoHistoryCallback.cpp; sourceTree = "<group>"; }; 440 441 F6FDDDD514241C48004F1729 /* push-state.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "push-state.html"; sourceTree = "<group>"; }; 442 FE217ECC1640A54A0052988B /* VMInspector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMInspector.cpp; sourceTree = "<group>"; }; 441 443 /* End PBXFileReference section */ 442 444 … … 719 721 isa = PBXGroup; 720 722 children = ( 723 FE217ECB1640A54A0052988B /* JavaScriptCore */, 721 724 C08587F913FEC39B001EF4E5 /* TestWebKitAPI */, 722 725 C07E6CAD13FD67650038B22B /* mac */, … … 815 818 ); 816 819 path = mac; 820 sourceTree = "<group>"; 821 }; 822 FE217ECB1640A54A0052988B /* JavaScriptCore */ = { 823 isa = PBXGroup; 824 children = ( 825 FE217ECC1640A54A0052988B /* VMInspector.cpp */, 826 ); 827 path = JavaScriptCore; 817 828 sourceTree = "<group>"; 818 829 }; … … 1005 1016 4F4D2C0E1626FE2700320FE1 /* MemoryInstrumentationTest.cpp in Sources */, 1006 1017 378E64731632646D00B6C676 /* InjectedBundleFrameHitTest.cpp in Sources */, 1018 FE217ECD1640A54A0052988B /* VMInspector.cpp in Sources */, 1007 1019 ); 1008 1020 runOnlyForDeploymentPostprocessing = 0;
Note: See TracChangeset
for help on using the changeset viewer.