| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include <cmath> // For isnan. | 31 #include <cmath> // For isnan. |
| 32 #include "../include/v8-debug.h" | 32 #include "../include/v8-debug.h" |
| 33 #include "../include/v8-profiler.h" | 33 #include "../include/v8-profiler.h" |
| 34 #include "../include/v8-testing.h" | 34 #include "../include/v8-testing.h" |
| 35 #include "assert-scope.h" | 35 #include "assert-scope.h" |
| 36 #include "bootstrapper.h" | 36 #include "bootstrapper.h" |
| 37 #include "code-stubs.h" | 37 #include "code-stubs.h" |
| 38 #include "compiler.h" | 38 #include "compiler.h" |
| 39 #include "conversions-inl.h" | 39 #include "conversions-inl.h" |
| 40 #include "counters.h" | 40 #include "counters.h" |
| 41 #include "cpu-profiler.h" |
| 41 #include "debug.h" | 42 #include "debug.h" |
| 42 #include "deoptimizer.h" | 43 #include "deoptimizer.h" |
| 43 #include "execution.h" | 44 #include "execution.h" |
| 44 #include "global-handles.h" | 45 #include "global-handles.h" |
| 45 #include "heap-profiler.h" | 46 #include "heap-profiler.h" |
| 46 #include "heap-snapshot-generator-inl.h" | 47 #include "heap-snapshot-generator-inl.h" |
| 47 #include "messages.h" | 48 #include "messages.h" |
| 48 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 49 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 49 #include "natives.h" | 50 #include "natives.h" |
| 50 #endif | 51 #endif |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 | 291 |
| 291 static inline bool EmptyCheck(const char* location, v8::Handle<v8::Data> obj) { | 292 static inline bool EmptyCheck(const char* location, v8::Handle<v8::Data> obj) { |
| 292 return obj.IsEmpty() ? ReportEmptyHandle(location) : false; | 293 return obj.IsEmpty() ? ReportEmptyHandle(location) : false; |
| 293 } | 294 } |
| 294 | 295 |
| 295 | 296 |
| 296 static inline bool EmptyCheck(const char* location, const v8::Data* obj) { | 297 static inline bool EmptyCheck(const char* location, const v8::Data* obj) { |
| 297 return (obj == 0) ? ReportEmptyHandle(location) : false; | 298 return (obj == 0) ? ReportEmptyHandle(location) : false; |
| 298 } | 299 } |
| 299 | 300 |
| 301 |
| 300 // --- S t a t i c s --- | 302 // --- S t a t i c s --- |
| 301 | 303 |
| 302 | 304 |
| 303 static bool InitializeHelper() { | 305 static bool InitializeHelper(i::Isolate* isolate) { |
| 304 if (i::Snapshot::Initialize()) return true; | 306 // If the isolate has a function entry hook, it needs to re-build all its |
| 307 // code stubs with entry hooks embedded, so let's deserialize a snapshot. |
| 308 if (isolate == NULL || isolate->function_entry_hook() == NULL) { |
| 309 if (i::Snapshot::Initialize()) |
| 310 return true; |
| 311 } |
| 305 return i::V8::Initialize(NULL); | 312 return i::V8::Initialize(NULL); |
| 306 } | 313 } |
| 307 | 314 |
| 308 | 315 |
| 309 static inline bool EnsureInitializedForIsolate(i::Isolate* isolate, | 316 static inline bool EnsureInitializedForIsolate(i::Isolate* isolate, |
| 310 const char* location) { | 317 const char* location) { |
| 311 if (IsDeadCheck(isolate, location)) return false; | 318 if (IsDeadCheck(isolate, location)) return false; |
| 312 if (isolate != NULL) { | 319 if (isolate != NULL) { |
| 313 if (isolate->IsInitialized()) return true; | 320 if (isolate->IsInitialized()) return true; |
| 314 } | 321 } |
| 315 ASSERT(isolate == i::Isolate::Current()); | 322 ASSERT(isolate == i::Isolate::Current()); |
| 316 return ApiCheck(InitializeHelper(), location, "Error initializing V8"); | 323 return ApiCheck(InitializeHelper(isolate), location, "Error initializing V8"); |
| 317 } | 324 } |
| 318 | 325 |
| 326 |
| 319 // Some initializing API functions are called early and may be | 327 // Some initializing API functions are called early and may be |
| 320 // called on a thread different from static initializer thread. | 328 // called on a thread different from static initializer thread. |
| 321 // If Isolate API is used, Isolate::Enter() will initialize TLS so | 329 // If Isolate API is used, Isolate::Enter() will initialize TLS so |
| 322 // Isolate::Current() works. If it's a legacy case, then the thread | 330 // Isolate::Current() works. If it's a legacy case, then the thread |
| 323 // may not have TLS initialized yet. However, in initializing APIs it | 331 // may not have TLS initialized yet. However, in initializing APIs it |
| 324 // may be too early to call EnsureInitialized() - some pre-init | 332 // may be too early to call EnsureInitialized() - some pre-init |
| 325 // parameters still have to be configured. | 333 // parameters still have to be configured. |
| 326 static inline i::Isolate* EnterIsolateIfNeeded() { | 334 static inline i::Isolate* EnterIsolateIfNeeded() { |
| 327 i::Isolate* isolate = i::Isolate::UncheckedCurrent(); | 335 i::Isolate* isolate = i::Isolate::UncheckedCurrent(); |
| 328 if (isolate != NULL) | 336 if (isolate != NULL) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 return StartupData::kUncompressed; | 390 return StartupData::kUncompressed; |
| 383 #endif | 391 #endif |
| 384 } | 392 } |
| 385 | 393 |
| 386 | 394 |
| 387 enum CompressedStartupDataItems { | 395 enum CompressedStartupDataItems { |
| 388 kSnapshot = 0, | 396 kSnapshot = 0, |
| 389 kSnapshotContext, | 397 kSnapshotContext, |
| 390 kLibraries, | 398 kLibraries, |
| 391 kExperimentalLibraries, | 399 kExperimentalLibraries, |
| 400 #if defined(ENABLE_I18N_SUPPORT) |
| 401 kI18NExtension, |
| 402 #endif |
| 392 kCompressedStartupDataCount | 403 kCompressedStartupDataCount |
| 393 }; | 404 }; |
| 394 | 405 |
| 406 |
| 395 int V8::GetCompressedStartupDataCount() { | 407 int V8::GetCompressedStartupDataCount() { |
| 396 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 408 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 397 return kCompressedStartupDataCount; | 409 return kCompressedStartupDataCount; |
| 398 #else | 410 #else |
| 399 return 0; | 411 return 0; |
| 400 #endif | 412 #endif |
| 401 } | 413 } |
| 402 | 414 |
| 403 | 415 |
| 404 void V8::GetCompressedStartupData(StartupData* compressed_data) { | 416 void V8::GetCompressedStartupData(StartupData* compressed_data) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 421 compressed_data[kLibraries].raw_size = i::Natives::GetRawScriptsSize(); | 433 compressed_data[kLibraries].raw_size = i::Natives::GetRawScriptsSize(); |
| 422 | 434 |
| 423 i::Vector<const i::byte> exp_libraries_source = | 435 i::Vector<const i::byte> exp_libraries_source = |
| 424 i::ExperimentalNatives::GetScriptsSource(); | 436 i::ExperimentalNatives::GetScriptsSource(); |
| 425 compressed_data[kExperimentalLibraries].data = | 437 compressed_data[kExperimentalLibraries].data = |
| 426 reinterpret_cast<const char*>(exp_libraries_source.start()); | 438 reinterpret_cast<const char*>(exp_libraries_source.start()); |
| 427 compressed_data[kExperimentalLibraries].compressed_size = | 439 compressed_data[kExperimentalLibraries].compressed_size = |
| 428 exp_libraries_source.length(); | 440 exp_libraries_source.length(); |
| 429 compressed_data[kExperimentalLibraries].raw_size = | 441 compressed_data[kExperimentalLibraries].raw_size = |
| 430 i::ExperimentalNatives::GetRawScriptsSize(); | 442 i::ExperimentalNatives::GetRawScriptsSize(); |
| 443 |
| 444 #if defined(ENABLE_I18N_SUPPORT) |
| 445 i::Vector<const ii:byte> i18n_extension_source = |
| 446 i::I18NNatives::GetScriptsSource(); |
| 447 compressed_data[kI18NExtension].data = |
| 448 reinterpret_cast<const char*>(i18n_extension_source.start()); |
| 449 compressed_data[kI18NExtension].compressed_size = |
| 450 i18n_extension_source.length(); |
| 451 compressed_data[kI18NExtension].raw_size = |
| 452 i::I18NNatives::GetRawScriptsSize(); |
| 453 #endif |
| 431 #endif | 454 #endif |
| 432 } | 455 } |
| 433 | 456 |
| 434 | 457 |
| 435 void V8::SetDecompressedStartupData(StartupData* decompressed_data) { | 458 void V8::SetDecompressedStartupData(StartupData* decompressed_data) { |
| 436 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 459 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 437 ASSERT_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); | 460 ASSERT_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); |
| 438 i::Snapshot::set_raw_data( | 461 i::Snapshot::set_raw_data( |
| 439 reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); | 462 reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); |
| 440 | 463 |
| 441 ASSERT_EQ(i::Snapshot::context_raw_size(), | 464 ASSERT_EQ(i::Snapshot::context_raw_size(), |
| 442 decompressed_data[kSnapshotContext].raw_size); | 465 decompressed_data[kSnapshotContext].raw_size); |
| 443 i::Snapshot::set_context_raw_data( | 466 i::Snapshot::set_context_raw_data( |
| 444 reinterpret_cast<const i::byte*>( | 467 reinterpret_cast<const i::byte*>( |
| 445 decompressed_data[kSnapshotContext].data)); | 468 decompressed_data[kSnapshotContext].data)); |
| 446 | 469 |
| 447 ASSERT_EQ(i::Natives::GetRawScriptsSize(), | 470 ASSERT_EQ(i::Natives::GetRawScriptsSize(), |
| 448 decompressed_data[kLibraries].raw_size); | 471 decompressed_data[kLibraries].raw_size); |
| 449 i::Vector<const char> libraries_source( | 472 i::Vector<const char> libraries_source( |
| 450 decompressed_data[kLibraries].data, | 473 decompressed_data[kLibraries].data, |
| 451 decompressed_data[kLibraries].raw_size); | 474 decompressed_data[kLibraries].raw_size); |
| 452 i::Natives::SetRawScriptsSource(libraries_source); | 475 i::Natives::SetRawScriptsSource(libraries_source); |
| 453 | 476 |
| 454 ASSERT_EQ(i::ExperimentalNatives::GetRawScriptsSize(), | 477 ASSERT_EQ(i::ExperimentalNatives::GetRawScriptsSize(), |
| 455 decompressed_data[kExperimentalLibraries].raw_size); | 478 decompressed_data[kExperimentalLibraries].raw_size); |
| 456 i::Vector<const char> exp_libraries_source( | 479 i::Vector<const char> exp_libraries_source( |
| 457 decompressed_data[kExperimentalLibraries].data, | 480 decompressed_data[kExperimentalLibraries].data, |
| 458 decompressed_data[kExperimentalLibraries].raw_size); | 481 decompressed_data[kExperimentalLibraries].raw_size); |
| 459 i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); | 482 i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); |
| 483 |
| 484 #if defined(ENABLE_I18N_SUPPORT) |
| 485 ASSERT_EQ(i::I18NNatives::GetRawScriptsSize(), |
| 486 decompressed_data[kI18NExtension].raw_size); |
| 487 i::Vector<const char> i18n_extension_source( |
| 488 decompressed_data[kI18NExtension].data, |
| 489 decompressed_data[kI18NExtension].raw_size); |
| 490 i::I18NNatives::SetRawScriptsSource(i18n_extension_source); |
| 491 #endif |
| 460 #endif | 492 #endif |
| 461 } | 493 } |
| 462 | 494 |
| 463 | 495 |
| 464 void V8::SetFatalErrorHandler(FatalErrorCallback that) { | 496 void V8::SetFatalErrorHandler(FatalErrorCallback that) { |
| 465 i::Isolate* isolate = EnterIsolateIfNeeded(); | 497 i::Isolate* isolate = EnterIsolateIfNeeded(); |
| 466 isolate->set_exception_behavior(that); | 498 isolate->set_exception_behavior(that); |
| 467 } | 499 } |
| 468 | 500 |
| 469 | 501 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 | 666 |
| 635 void V8::ClearWeak(i::Object** obj) { | 667 void V8::ClearWeak(i::Object** obj) { |
| 636 i::GlobalHandles::ClearWeakness(obj); | 668 i::GlobalHandles::ClearWeakness(obj); |
| 637 } | 669 } |
| 638 | 670 |
| 639 | 671 |
| 640 void V8::DisposeGlobal(i::Object** obj) { | 672 void V8::DisposeGlobal(i::Object** obj) { |
| 641 i::GlobalHandles::Destroy(obj); | 673 i::GlobalHandles::Destroy(obj); |
| 642 } | 674 } |
| 643 | 675 |
| 676 |
| 644 // --- H a n d l e s --- | 677 // --- H a n d l e s --- |
| 645 | 678 |
| 646 | 679 |
| 647 HandleScope::HandleScope() { | 680 HandleScope::HandleScope() { |
| 648 Initialize(reinterpret_cast<Isolate*>(i::Isolate::Current())); | 681 Initialize(reinterpret_cast<Isolate*>(i::Isolate::Current())); |
| 649 } | 682 } |
| 650 | 683 |
| 651 | 684 |
| 652 HandleScope::HandleScope(Isolate* isolate) { | 685 HandleScope::HandleScope(Isolate* isolate) { |
| 653 Initialize(isolate); | 686 Initialize(isolate); |
| (...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2080 } | 2113 } |
| 2081 } | 2114 } |
| 2082 | 2115 |
| 2083 | 2116 |
| 2084 // --- E x c e p t i o n s --- | 2117 // --- E x c e p t i o n s --- |
| 2085 | 2118 |
| 2086 | 2119 |
| 2087 v8::TryCatch::TryCatch() | 2120 v8::TryCatch::TryCatch() |
| 2088 : isolate_(i::Isolate::Current()), | 2121 : isolate_(i::Isolate::Current()), |
| 2089 next_(isolate_->try_catch_handler_address()), | 2122 next_(isolate_->try_catch_handler_address()), |
| 2090 exception_(isolate_->heap()->the_hole_value()), | |
| 2091 message_(i::Smi::FromInt(0)), | |
| 2092 is_verbose_(false), | 2123 is_verbose_(false), |
| 2093 can_continue_(true), | 2124 can_continue_(true), |
| 2094 capture_message_(true), | 2125 capture_message_(true), |
| 2095 rethrow_(false), | 2126 rethrow_(false), |
| 2096 has_terminated_(false) { | 2127 has_terminated_(false) { |
| 2128 Reset(); |
| 2097 isolate_->RegisterTryCatchHandler(this); | 2129 isolate_->RegisterTryCatchHandler(this); |
| 2098 } | 2130 } |
| 2099 | 2131 |
| 2100 | 2132 |
| 2101 v8::TryCatch::~TryCatch() { | 2133 v8::TryCatch::~TryCatch() { |
| 2102 ASSERT(isolate_ == i::Isolate::Current()); | 2134 ASSERT(isolate_ == i::Isolate::Current()); |
| 2103 if (rethrow_) { | 2135 if (rethrow_) { |
| 2104 v8::HandleScope scope(reinterpret_cast<Isolate*>(isolate_)); | 2136 v8::HandleScope scope(reinterpret_cast<Isolate*>(isolate_)); |
| 2105 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(Exception()); | 2137 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(Exception()); |
| 2138 if (HasCaught() && capture_message_) { |
| 2139 // If an exception was caught and rethrow_ is indicated, the saved |
| 2140 // message, script, and location need to be restored to Isolate TLS |
| 2141 // for reuse. capture_message_ needs to be disabled so that DoThrow() |
| 2142 // does not create a new message. |
| 2143 isolate_->thread_local_top()->rethrowing_message_ = true; |
| 2144 isolate_->RestorePendingMessageFromTryCatch(this); |
| 2145 } |
| 2106 isolate_->UnregisterTryCatchHandler(this); | 2146 isolate_->UnregisterTryCatchHandler(this); |
| 2107 v8::ThrowException(exc); | 2147 v8::ThrowException(exc); |
| 2148 ASSERT(!isolate_->thread_local_top()->rethrowing_message_); |
| 2108 } else { | 2149 } else { |
| 2109 isolate_->UnregisterTryCatchHandler(this); | 2150 isolate_->UnregisterTryCatchHandler(this); |
| 2110 } | 2151 } |
| 2111 } | 2152 } |
| 2112 | 2153 |
| 2113 | 2154 |
| 2114 bool v8::TryCatch::HasCaught() const { | 2155 bool v8::TryCatch::HasCaught() const { |
| 2115 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); | 2156 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); |
| 2116 } | 2157 } |
| 2117 | 2158 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2158 if (value.is_null()) return v8::Local<Value>(); | 2199 if (value.is_null()) return v8::Local<Value>(); |
| 2159 return v8::Utils::ToLocal(scope.CloseAndEscape(value)); | 2200 return v8::Utils::ToLocal(scope.CloseAndEscape(value)); |
| 2160 } else { | 2201 } else { |
| 2161 return v8::Local<Value>(); | 2202 return v8::Local<Value>(); |
| 2162 } | 2203 } |
| 2163 } | 2204 } |
| 2164 | 2205 |
| 2165 | 2206 |
| 2166 v8::Local<v8::Message> v8::TryCatch::Message() const { | 2207 v8::Local<v8::Message> v8::TryCatch::Message() const { |
| 2167 ASSERT(isolate_ == i::Isolate::Current()); | 2208 ASSERT(isolate_ == i::Isolate::Current()); |
| 2168 if (HasCaught() && message_ != i::Smi::FromInt(0)) { | 2209 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); |
| 2169 i::Object* message = reinterpret_cast<i::Object*>(message_); | 2210 ASSERT(message->IsJSMessageObject() || message->IsTheHole()); |
| 2211 if (HasCaught() && !message->IsTheHole()) { |
| 2170 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); | 2212 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); |
| 2171 } else { | 2213 } else { |
| 2172 return v8::Local<v8::Message>(); | 2214 return v8::Local<v8::Message>(); |
| 2173 } | 2215 } |
| 2174 } | 2216 } |
| 2175 | 2217 |
| 2176 | 2218 |
| 2177 void v8::TryCatch::Reset() { | 2219 void v8::TryCatch::Reset() { |
| 2178 ASSERT(isolate_ == i::Isolate::Current()); | 2220 ASSERT(isolate_ == i::Isolate::Current()); |
| 2179 exception_ = isolate_->heap()->the_hole_value(); | 2221 i::Object* the_hole = isolate_->heap()->the_hole_value(); |
| 2180 message_ = i::Smi::FromInt(0); | 2222 exception_ = the_hole; |
| 2223 message_obj_ = the_hole; |
| 2224 message_script_ = the_hole; |
| 2225 message_start_pos_ = 0; |
| 2226 message_end_pos_ = 0; |
| 2181 } | 2227 } |
| 2182 | 2228 |
| 2183 | 2229 |
| 2184 void v8::TryCatch::SetVerbose(bool value) { | 2230 void v8::TryCatch::SetVerbose(bool value) { |
| 2185 is_verbose_ = value; | 2231 is_verbose_ = value; |
| 2186 } | 2232 } |
| 2187 | 2233 |
| 2188 | 2234 |
| 2189 void v8::TryCatch::SetCaptureMessage(bool value) { | 2235 void v8::TryCatch::SetCaptureMessage(bool value) { |
| 2190 capture_message_ = value; | 2236 capture_message_ = value; |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2909 LOG_API(isolate, "ToInteger"); | 2955 LOG_API(isolate, "ToInteger"); |
| 2910 ENTER_V8(isolate); | 2956 ENTER_V8(isolate); |
| 2911 EXCEPTION_PREAMBLE(isolate); | 2957 EXCEPTION_PREAMBLE(isolate); |
| 2912 num = i::Execution::ToInteger(obj, &has_pending_exception); | 2958 num = i::Execution::ToInteger(obj, &has_pending_exception); |
| 2913 EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); | 2959 EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); |
| 2914 } | 2960 } |
| 2915 return ToApiHandle<Integer>(num); | 2961 return ToApiHandle<Integer>(num); |
| 2916 } | 2962 } |
| 2917 | 2963 |
| 2918 | 2964 |
| 2919 #ifdef V8_ENABLE_CHECKS | 2965 void i::Internals::CheckInitializedImpl(v8::Isolate* external_isolate) { |
| 2920 void i::Internals::CheckInitialized(v8::Isolate* external_isolate) { | |
| 2921 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); | 2966 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); |
| 2922 ApiCheck(isolate != NULL && isolate->IsInitialized() && !i::V8::IsDead(), | 2967 ApiCheck(isolate != NULL && isolate->IsInitialized() && !i::V8::IsDead(), |
| 2923 "v8::internal::Internals::CheckInitialized()", | 2968 "v8::internal::Internals::CheckInitialized()", |
| 2924 "Isolate is not initialized or V8 has died"); | 2969 "Isolate is not initialized or V8 has died"); |
| 2925 } | 2970 } |
| 2926 #endif | |
| 2927 | 2971 |
| 2928 | 2972 |
| 2929 void External::CheckCast(v8::Value* that) { | 2973 void External::CheckCast(v8::Value* that) { |
| 2930 if (IsDeadCheck(i::Isolate::Current(), "v8::External::Cast()")) return; | 2974 if (IsDeadCheck(i::Isolate::Current(), "v8::External::Cast()")) return; |
| 2931 ApiCheck(Utils::OpenHandle(that)->IsExternal(), | 2975 ApiCheck(Utils::OpenHandle(that)->IsExternal(), |
| 2932 "v8::External::Cast()", | 2976 "v8::External::Cast()", |
| 2933 "Could not convert to external"); | 2977 "Could not convert to external"); |
| 2934 } | 2978 } |
| 2935 | 2979 |
| 2936 | 2980 |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3472 bool v8::Object::SetPrototype(Handle<Value> value) { | 3516 bool v8::Object::SetPrototype(Handle<Value> value) { |
| 3473 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3517 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3474 ON_BAILOUT(isolate, "v8::Object::SetPrototype()", return false); | 3518 ON_BAILOUT(isolate, "v8::Object::SetPrototype()", return false); |
| 3475 ENTER_V8(isolate); | 3519 ENTER_V8(isolate); |
| 3476 i::Handle<i::JSObject> self = Utils::OpenHandle(this); | 3520 i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
| 3477 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); | 3521 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); |
| 3478 // We do not allow exceptions thrown while setting the prototype | 3522 // We do not allow exceptions thrown while setting the prototype |
| 3479 // to propagate outside. | 3523 // to propagate outside. |
| 3480 TryCatch try_catch; | 3524 TryCatch try_catch; |
| 3481 EXCEPTION_PREAMBLE(isolate); | 3525 EXCEPTION_PREAMBLE(isolate); |
| 3482 i::Handle<i::Object> result = i::SetPrototype(self, value_obj); | 3526 i::Handle<i::Object> result = i::JSObject::SetPrototype(self, value_obj); |
| 3483 has_pending_exception = result.is_null(); | 3527 has_pending_exception = result.is_null(); |
| 3484 EXCEPTION_BAILOUT_CHECK(isolate, false); | 3528 EXCEPTION_BAILOUT_CHECK(isolate, false); |
| 3485 return true; | 3529 return true; |
| 3486 } | 3530 } |
| 3487 | 3531 |
| 3488 | 3532 |
| 3489 Local<Object> v8::Object::FindInstanceInPrototypeChain( | 3533 Local<Object> v8::Object::FindInstanceInPrototypeChain( |
| 3490 v8::Handle<FunctionTemplate> tmpl) { | 3534 v8::Handle<FunctionTemplate> tmpl) { |
| 3491 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3535 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3492 ON_BAILOUT(isolate, | 3536 ON_BAILOUT(isolate, |
| (...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4375 | 4419 |
| 4376 | 4420 |
| 4377 bool String::IsOneByte() const { | 4421 bool String::IsOneByte() const { |
| 4378 i::Handle<i::String> str = Utils::OpenHandle(this); | 4422 i::Handle<i::String> str = Utils::OpenHandle(this); |
| 4379 if (IsDeadCheck(str->GetIsolate(), "v8::String::IsOneByte()")) { | 4423 if (IsDeadCheck(str->GetIsolate(), "v8::String::IsOneByte()")) { |
| 4380 return false; | 4424 return false; |
| 4381 } | 4425 } |
| 4382 return str->HasOnlyOneByteChars(); | 4426 return str->HasOnlyOneByteChars(); |
| 4383 } | 4427 } |
| 4384 | 4428 |
| 4429 |
| 4385 // Helpers for ContainsOnlyOneByteHelper | 4430 // Helpers for ContainsOnlyOneByteHelper |
| 4386 template<size_t size> struct OneByteMask; | 4431 template<size_t size> struct OneByteMask; |
| 4387 template<> struct OneByteMask<4> { | 4432 template<> struct OneByteMask<4> { |
| 4388 static const uint32_t value = 0xFF00FF00; | 4433 static const uint32_t value = 0xFF00FF00; |
| 4389 }; | 4434 }; |
| 4390 template<> struct OneByteMask<8> { | 4435 template<> struct OneByteMask<8> { |
| 4391 static const uint64_t value = V8_2PART_UINT64_C(0xFF00FF00, FF00FF00); | 4436 static const uint64_t value = V8_2PART_UINT64_C(0xFF00FF00, FF00FF00); |
| 4392 }; | 4437 }; |
| 4393 static const uintptr_t kOneByteMask = OneByteMask<sizeof(uintptr_t)>::value; | 4438 static const uintptr_t kOneByteMask = OneByteMask<sizeof(uintptr_t)>::value; |
| 4394 static const uintptr_t kAlignmentMask = sizeof(uintptr_t) - 1; | 4439 static const uintptr_t kAlignmentMask = sizeof(uintptr_t) - 1; |
| 4395 static inline bool Unaligned(const uint16_t* chars) { | 4440 static inline bool Unaligned(const uint16_t* chars) { |
| 4396 return reinterpret_cast<const uintptr_t>(chars) & kAlignmentMask; | 4441 return reinterpret_cast<const uintptr_t>(chars) & kAlignmentMask; |
| 4397 } | 4442 } |
| 4443 |
| 4444 |
| 4398 static inline const uint16_t* Align(const uint16_t* chars) { | 4445 static inline const uint16_t* Align(const uint16_t* chars) { |
| 4399 return reinterpret_cast<uint16_t*>( | 4446 return reinterpret_cast<uint16_t*>( |
| 4400 reinterpret_cast<uintptr_t>(chars) & ~kAlignmentMask); | 4447 reinterpret_cast<uintptr_t>(chars) & ~kAlignmentMask); |
| 4401 } | 4448 } |
| 4402 | 4449 |
| 4403 class ContainsOnlyOneByteHelper { | 4450 class ContainsOnlyOneByteHelper { |
| 4404 public: | 4451 public: |
| 4405 ContainsOnlyOneByteHelper() : is_one_byte_(true) {} | 4452 ContainsOnlyOneByteHelper() : is_one_byte_(true) {} |
| 4406 bool Check(i::String* string) { | 4453 bool Check(i::String* string) { |
| 4407 i::ConsString* cons_string = i::String::VisitFlat(this, string, 0); | 4454 i::ConsString* cons_string = i::String::VisitFlat(this, string, 0); |
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5204 | 5251 |
| 5205 | 5252 |
| 5206 // --- E n v i r o n m e n t --- | 5253 // --- E n v i r o n m e n t --- |
| 5207 | 5254 |
| 5208 | 5255 |
| 5209 bool v8::V8::Initialize() { | 5256 bool v8::V8::Initialize() { |
| 5210 i::Isolate* isolate = i::Isolate::UncheckedCurrent(); | 5257 i::Isolate* isolate = i::Isolate::UncheckedCurrent(); |
| 5211 if (isolate != NULL && isolate->IsInitialized()) { | 5258 if (isolate != NULL && isolate->IsInitialized()) { |
| 5212 return true; | 5259 return true; |
| 5213 } | 5260 } |
| 5214 return InitializeHelper(); | 5261 return InitializeHelper(isolate); |
| 5215 } | 5262 } |
| 5216 | 5263 |
| 5217 | 5264 |
| 5218 void v8::V8::SetEntropySource(EntropySource source) { | 5265 void v8::V8::SetEntropySource(EntropySource source) { |
| 5219 i::V8::SetEntropySource(source); | 5266 i::V8::SetEntropySource(source); |
| 5220 } | 5267 } |
| 5221 | 5268 |
| 5222 | 5269 |
| 5223 void v8::V8::SetReturnAddressLocationResolver( | 5270 void v8::V8::SetReturnAddressLocationResolver( |
| 5224 ReturnAddressLocationResolver return_address_resolver) { | 5271 ReturnAddressLocationResolver return_address_resolver) { |
| 5225 i::V8::SetReturnAddressLocationResolver(return_address_resolver); | 5272 i::V8::SetReturnAddressLocationResolver(return_address_resolver); |
| 5226 } | 5273 } |
| 5227 | 5274 |
| 5228 | 5275 |
| 5229 bool v8::V8::SetFunctionEntryHook(FunctionEntryHook entry_hook) { | 5276 bool v8::V8::SetFunctionEntryHook(FunctionEntryHook entry_hook) { |
| 5230 return i::ProfileEntryHookStub::SetFunctionEntryHook(entry_hook); | 5277 return SetFunctionEntryHook(Isolate::GetCurrent(), entry_hook); |
| 5231 } | 5278 } |
| 5232 | 5279 |
| 5233 | 5280 |
| 5281 bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, |
| 5282 FunctionEntryHook entry_hook) { |
| 5283 ASSERT(ext_isolate != NULL); |
| 5284 ASSERT(entry_hook != NULL); |
| 5285 |
| 5286 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(ext_isolate); |
| 5287 |
| 5288 // The entry hook can only be set before the Isolate is initialized, as |
| 5289 // otherwise the Isolate's code stubs generated at initialization won't |
| 5290 // contain entry hooks. |
| 5291 if (isolate->IsInitialized()) |
| 5292 return false; |
| 5293 |
| 5294 // Setting an entry hook is a one-way operation, once set, it cannot be |
| 5295 // changed or unset. |
| 5296 if (isolate->function_entry_hook() != NULL) |
| 5297 return false; |
| 5298 |
| 5299 isolate->set_function_entry_hook(entry_hook); |
| 5300 return true; |
| 5301 } |
| 5302 |
| 5303 |
| 5234 void v8::V8::SetJitCodeEventHandler( | 5304 void v8::V8::SetJitCodeEventHandler( |
| 5235 JitCodeEventOptions options, JitCodeEventHandler event_handler) { | 5305 JitCodeEventOptions options, JitCodeEventHandler event_handler) { |
| 5236 i::Isolate* isolate = i::Isolate::Current(); | 5306 i::Isolate* isolate = i::Isolate::Current(); |
| 5237 // Ensure that logging is initialized for our isolate. | 5307 // Ensure that logging is initialized for our isolate. |
| 5238 isolate->InitializeLoggingAndCounters(); | 5308 isolate->InitializeLoggingAndCounters(); |
| 5239 isolate->logger()->SetCodeEventHandler(options, event_handler); | 5309 isolate->logger()->SetCodeEventHandler(options, event_handler); |
| 5240 } | 5310 } |
| 5241 | 5311 |
| 5242 void v8::V8::SetArrayBufferAllocator( | 5312 void v8::V8::SetArrayBufferAllocator( |
| 5243 ArrayBuffer::Allocator* allocator) { | 5313 ArrayBuffer::Allocator* allocator) { |
| (...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6211 has_pending_exception = result.is_null(); | 6281 has_pending_exception = result.is_null(); |
| 6212 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); | 6282 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); |
| 6213 return Utils::ToLocal(result); | 6283 return Utils::ToLocal(result); |
| 6214 } | 6284 } |
| 6215 | 6285 |
| 6216 | 6286 |
| 6217 bool v8::ArrayBuffer::IsExternal() const { | 6287 bool v8::ArrayBuffer::IsExternal() const { |
| 6218 return Utils::OpenHandle(this)->is_external(); | 6288 return Utils::OpenHandle(this)->is_external(); |
| 6219 } | 6289 } |
| 6220 | 6290 |
| 6291 |
| 6221 v8::ArrayBuffer::Contents v8::ArrayBuffer::Externalize() { | 6292 v8::ArrayBuffer::Contents v8::ArrayBuffer::Externalize() { |
| 6222 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); | 6293 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); |
| 6223 ApiCheck(!obj->is_external(), | 6294 ApiCheck(!obj->is_external(), |
| 6224 "v8::ArrayBuffer::Externalize", | 6295 "v8::ArrayBuffer::Externalize", |
| 6225 "ArrayBuffer already externalized"); | 6296 "ArrayBuffer already externalized"); |
| 6226 obj->set_is_external(true); | 6297 obj->set_is_external(true); |
| 6227 size_t byte_length = static_cast<size_t>(obj->byte_length()->Number()); | 6298 size_t byte_length = static_cast<size_t>(obj->byte_length()->Number()); |
| 6228 Contents contents; | 6299 Contents contents; |
| 6229 contents.data_ = obj->backing_store(); | 6300 contents.data_ = obj->backing_store(); |
| 6230 contents.byte_length_ = byte_length; | 6301 contents.byte_length_ = byte_length; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6511 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); | 6582 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); |
| 6512 return Utils::IntegerToLocal(result); | 6583 return Utils::IntegerToLocal(result); |
| 6513 } | 6584 } |
| 6514 | 6585 |
| 6515 | 6586 |
| 6516 #ifdef DEBUG | 6587 #ifdef DEBUG |
| 6517 v8::AssertNoGCScope::AssertNoGCScope(v8::Isolate* isolate) { | 6588 v8::AssertNoGCScope::AssertNoGCScope(v8::Isolate* isolate) { |
| 6518 disallow_heap_allocation_ = new i::DisallowHeapAllocation(); | 6589 disallow_heap_allocation_ = new i::DisallowHeapAllocation(); |
| 6519 } | 6590 } |
| 6520 | 6591 |
| 6592 |
| 6521 v8::AssertNoGCScope::~AssertNoGCScope() { | 6593 v8::AssertNoGCScope::~AssertNoGCScope() { |
| 6522 delete static_cast<i::DisallowHeapAllocation*>(disallow_heap_allocation_); | 6594 delete static_cast<i::DisallowHeapAllocation*>(disallow_heap_allocation_); |
| 6523 } | 6595 } |
| 6524 #endif | 6596 #endif |
| 6525 | 6597 |
| 6526 | 6598 |
| 6527 void V8::IgnoreOutOfMemoryException() { | 6599 void V8::IgnoreOutOfMemoryException() { |
| 6528 EnterIsolateIfNeeded()->set_ignore_out_of_memory(true); | 6600 EnterIsolateIfNeeded()->set_ignore_out_of_memory(true); |
| 6529 } | 6601 } |
| 6530 | 6602 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6574 options); | 6646 options); |
| 6575 } | 6647 } |
| 6576 | 6648 |
| 6577 | 6649 |
| 6578 void V8::SetCounterFunction(CounterLookupCallback callback) { | 6650 void V8::SetCounterFunction(CounterLookupCallback callback) { |
| 6579 i::Isolate* isolate = EnterIsolateIfNeeded(); | 6651 i::Isolate* isolate = EnterIsolateIfNeeded(); |
| 6580 if (IsDeadCheck(isolate, "v8::V8::SetCounterFunction()")) return; | 6652 if (IsDeadCheck(isolate, "v8::V8::SetCounterFunction()")) return; |
| 6581 isolate->stats_table()->SetCounterFunction(callback); | 6653 isolate->stats_table()->SetCounterFunction(callback); |
| 6582 } | 6654 } |
| 6583 | 6655 |
| 6656 |
| 6584 void V8::SetCreateHistogramFunction(CreateHistogramCallback callback) { | 6657 void V8::SetCreateHistogramFunction(CreateHistogramCallback callback) { |
| 6585 i::Isolate* isolate = EnterIsolateIfNeeded(); | 6658 i::Isolate* isolate = EnterIsolateIfNeeded(); |
| 6586 if (IsDeadCheck(isolate, "v8::V8::SetCreateHistogramFunction()")) return; | 6659 if (IsDeadCheck(isolate, "v8::V8::SetCreateHistogramFunction()")) return; |
| 6587 isolate->stats_table()->SetCreateHistogramFunction(callback); | 6660 isolate->stats_table()->SetCreateHistogramFunction(callback); |
| 6588 isolate->InitializeLoggingAndCounters(); | 6661 isolate->InitializeLoggingAndCounters(); |
| 6589 isolate->counters()->ResetHistograms(); | 6662 isolate->counters()->ResetHistograms(); |
| 6590 } | 6663 } |
| 6591 | 6664 |
| 6665 |
| 6592 void V8::SetAddHistogramSampleFunction(AddHistogramSampleCallback callback) { | 6666 void V8::SetAddHistogramSampleFunction(AddHistogramSampleCallback callback) { |
| 6593 i::Isolate* isolate = EnterIsolateIfNeeded(); | 6667 i::Isolate* isolate = EnterIsolateIfNeeded(); |
| 6594 if (IsDeadCheck(isolate, "v8::V8::SetAddHistogramSampleFunction()")) return; | 6668 if (IsDeadCheck(isolate, "v8::V8::SetAddHistogramSampleFunction()")) return; |
| 6595 isolate->stats_table()-> | 6669 isolate->stats_table()-> |
| 6596 SetAddHistogramSampleFunction(callback); | 6670 SetAddHistogramSampleFunction(callback); |
| 6597 } | 6671 } |
| 6598 | 6672 |
| 6599 void V8::SetFailedAccessCheckCallbackFunction( | 6673 void V8::SetFailedAccessCheckCallbackFunction( |
| 6600 FailedAccessCheckCallback callback) { | 6674 FailedAccessCheckCallback callback) { |
| 6601 i::Isolate* isolate = i::Isolate::Current(); | 6675 i::Isolate* isolate = i::Isolate::Current(); |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6929 length_ = str->Length(); | 7003 length_ = str->Length(); |
| 6930 str_ = i::NewArray<uint16_t>(length_ + 1); | 7004 str_ = i::NewArray<uint16_t>(length_ + 1); |
| 6931 str->Write(str_); | 7005 str->Write(str_); |
| 6932 } | 7006 } |
| 6933 | 7007 |
| 6934 | 7008 |
| 6935 String::Value::~Value() { | 7009 String::Value::~Value() { |
| 6936 i::DeleteArray(str_); | 7010 i::DeleteArray(str_); |
| 6937 } | 7011 } |
| 6938 | 7012 |
| 7013 |
| 6939 Local<Value> Exception::RangeError(v8::Handle<v8::String> raw_message) { | 7014 Local<Value> Exception::RangeError(v8::Handle<v8::String> raw_message) { |
| 6940 i::Isolate* isolate = i::Isolate::Current(); | 7015 i::Isolate* isolate = i::Isolate::Current(); |
| 6941 LOG_API(isolate, "RangeError"); | 7016 LOG_API(isolate, "RangeError"); |
| 6942 ON_BAILOUT(isolate, "v8::Exception::RangeError()", return Local<Value>()); | 7017 ON_BAILOUT(isolate, "v8::Exception::RangeError()", return Local<Value>()); |
| 6943 ENTER_V8(isolate); | 7018 ENTER_V8(isolate); |
| 6944 i::Object* error; | 7019 i::Object* error; |
| 6945 { | 7020 { |
| 6946 i::HandleScope scope(isolate); | 7021 i::HandleScope scope(isolate); |
| 6947 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); | 7022 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); |
| 6948 i::Handle<i::Object> result = isolate->factory()->NewRangeError(message); | 7023 i::Handle<i::Object> result = isolate->factory()->NewRangeError(message); |
| 6949 error = *result; | 7024 error = *result; |
| 6950 } | 7025 } |
| 6951 i::Handle<i::Object> result(error, isolate); | 7026 i::Handle<i::Object> result(error, isolate); |
| 6952 return Utils::ToLocal(result); | 7027 return Utils::ToLocal(result); |
| 6953 } | 7028 } |
| 6954 | 7029 |
| 7030 |
| 6955 Local<Value> Exception::ReferenceError(v8::Handle<v8::String> raw_message) { | 7031 Local<Value> Exception::ReferenceError(v8::Handle<v8::String> raw_message) { |
| 6956 i::Isolate* isolate = i::Isolate::Current(); | 7032 i::Isolate* isolate = i::Isolate::Current(); |
| 6957 LOG_API(isolate, "ReferenceError"); | 7033 LOG_API(isolate, "ReferenceError"); |
| 6958 ON_BAILOUT(isolate, "v8::Exception::ReferenceError()", return Local<Value>()); | 7034 ON_BAILOUT(isolate, "v8::Exception::ReferenceError()", return Local<Value>()); |
| 6959 ENTER_V8(isolate); | 7035 ENTER_V8(isolate); |
| 6960 i::Object* error; | 7036 i::Object* error; |
| 6961 { | 7037 { |
| 6962 i::HandleScope scope(isolate); | 7038 i::HandleScope scope(isolate); |
| 6963 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); | 7039 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); |
| 6964 i::Handle<i::Object> result = | 7040 i::Handle<i::Object> result = |
| 6965 isolate->factory()->NewReferenceError(message); | 7041 isolate->factory()->NewReferenceError(message); |
| 6966 error = *result; | 7042 error = *result; |
| 6967 } | 7043 } |
| 6968 i::Handle<i::Object> result(error, isolate); | 7044 i::Handle<i::Object> result(error, isolate); |
| 6969 return Utils::ToLocal(result); | 7045 return Utils::ToLocal(result); |
| 6970 } | 7046 } |
| 6971 | 7047 |
| 7048 |
| 6972 Local<Value> Exception::SyntaxError(v8::Handle<v8::String> raw_message) { | 7049 Local<Value> Exception::SyntaxError(v8::Handle<v8::String> raw_message) { |
| 6973 i::Isolate* isolate = i::Isolate::Current(); | 7050 i::Isolate* isolate = i::Isolate::Current(); |
| 6974 LOG_API(isolate, "SyntaxError"); | 7051 LOG_API(isolate, "SyntaxError"); |
| 6975 ON_BAILOUT(isolate, "v8::Exception::SyntaxError()", return Local<Value>()); | 7052 ON_BAILOUT(isolate, "v8::Exception::SyntaxError()", return Local<Value>()); |
| 6976 ENTER_V8(isolate); | 7053 ENTER_V8(isolate); |
| 6977 i::Object* error; | 7054 i::Object* error; |
| 6978 { | 7055 { |
| 6979 i::HandleScope scope(isolate); | 7056 i::HandleScope scope(isolate); |
| 6980 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); | 7057 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); |
| 6981 i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(message); | 7058 i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(message); |
| 6982 error = *result; | 7059 error = *result; |
| 6983 } | 7060 } |
| 6984 i::Handle<i::Object> result(error, isolate); | 7061 i::Handle<i::Object> result(error, isolate); |
| 6985 return Utils::ToLocal(result); | 7062 return Utils::ToLocal(result); |
| 6986 } | 7063 } |
| 6987 | 7064 |
| 7065 |
| 6988 Local<Value> Exception::TypeError(v8::Handle<v8::String> raw_message) { | 7066 Local<Value> Exception::TypeError(v8::Handle<v8::String> raw_message) { |
| 6989 i::Isolate* isolate = i::Isolate::Current(); | 7067 i::Isolate* isolate = i::Isolate::Current(); |
| 6990 LOG_API(isolate, "TypeError"); | 7068 LOG_API(isolate, "TypeError"); |
| 6991 ON_BAILOUT(isolate, "v8::Exception::TypeError()", return Local<Value>()); | 7069 ON_BAILOUT(isolate, "v8::Exception::TypeError()", return Local<Value>()); |
| 6992 ENTER_V8(isolate); | 7070 ENTER_V8(isolate); |
| 6993 i::Object* error; | 7071 i::Object* error; |
| 6994 { | 7072 { |
| 6995 i::HandleScope scope(isolate); | 7073 i::HandleScope scope(isolate); |
| 6996 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); | 7074 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); |
| 6997 i::Handle<i::Object> result = isolate->factory()->NewTypeError(message); | 7075 i::Handle<i::Object> result = isolate->factory()->NewTypeError(message); |
| 6998 error = *result; | 7076 error = *result; |
| 6999 } | 7077 } |
| 7000 i::Handle<i::Object> result(error, isolate); | 7078 i::Handle<i::Object> result(error, isolate); |
| 7001 return Utils::ToLocal(result); | 7079 return Utils::ToLocal(result); |
| 7002 } | 7080 } |
| 7003 | 7081 |
| 7082 |
| 7004 Local<Value> Exception::Error(v8::Handle<v8::String> raw_message) { | 7083 Local<Value> Exception::Error(v8::Handle<v8::String> raw_message) { |
| 7005 i::Isolate* isolate = i::Isolate::Current(); | 7084 i::Isolate* isolate = i::Isolate::Current(); |
| 7006 LOG_API(isolate, "Error"); | 7085 LOG_API(isolate, "Error"); |
| 7007 ON_BAILOUT(isolate, "v8::Exception::Error()", return Local<Value>()); | 7086 ON_BAILOUT(isolate, "v8::Exception::Error()", return Local<Value>()); |
| 7008 ENTER_V8(isolate); | 7087 ENTER_V8(isolate); |
| 7009 i::Object* error; | 7088 i::Object* error; |
| 7010 { | 7089 { |
| 7011 i::HandleScope scope(isolate); | 7090 i::HandleScope scope(isolate); |
| 7012 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); | 7091 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); |
| 7013 i::Handle<i::Object> result = isolate->factory()->NewError(message); | 7092 i::Handle<i::Object> result = isolate->factory()->NewError(message); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7280 return ToApiHandle<String>( | 7359 return ToApiHandle<String>( |
| 7281 isolate->factory()->InternalizeUtf8String(entry->name())); | 7360 isolate->factory()->InternalizeUtf8String(entry->name())); |
| 7282 } else { | 7361 } else { |
| 7283 return ToApiHandle<String>(isolate->factory()->NewConsString( | 7362 return ToApiHandle<String>(isolate->factory()->NewConsString( |
| 7284 isolate->factory()->InternalizeUtf8String(entry->name_prefix()), | 7363 isolate->factory()->InternalizeUtf8String(entry->name_prefix()), |
| 7285 isolate->factory()->InternalizeUtf8String(entry->name()))); | 7364 isolate->factory()->InternalizeUtf8String(entry->name()))); |
| 7286 } | 7365 } |
| 7287 } | 7366 } |
| 7288 | 7367 |
| 7289 | 7368 |
| 7369 int CpuProfileNode::GetScriptId() const { |
| 7370 i::Isolate* isolate = i::Isolate::Current(); |
| 7371 IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptId"); |
| 7372 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
| 7373 const i::CodeEntry* entry = node->entry(); |
| 7374 return entry->script_id(); |
| 7375 } |
| 7376 |
| 7377 |
| 7290 Handle<String> CpuProfileNode::GetScriptResourceName() const { | 7378 Handle<String> CpuProfileNode::GetScriptResourceName() const { |
| 7291 i::Isolate* isolate = i::Isolate::Current(); | 7379 i::Isolate* isolate = i::Isolate::Current(); |
| 7292 IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptResourceName"); | 7380 IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptResourceName"); |
| 7293 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 7381 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
| 7294 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( | 7382 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( |
| 7295 node->entry()->resource_name())); | 7383 node->entry()->resource_name())); |
| 7296 } | 7384 } |
| 7297 | 7385 |
| 7298 | 7386 |
| 7299 int CpuProfileNode::GetLineNumber() const { | 7387 int CpuProfileNode::GetLineNumber() const { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7358 return reinterpret_cast<const CpuProfileNode*>(child); | 7446 return reinterpret_cast<const CpuProfileNode*>(child); |
| 7359 } | 7447 } |
| 7360 | 7448 |
| 7361 | 7449 |
| 7362 void CpuProfile::Delete() { | 7450 void CpuProfile::Delete() { |
| 7363 i::Isolate* isolate = i::Isolate::Current(); | 7451 i::Isolate* isolate = i::Isolate::Current(); |
| 7364 IsDeadCheck(isolate, "v8::CpuProfile::Delete"); | 7452 IsDeadCheck(isolate, "v8::CpuProfile::Delete"); |
| 7365 i::CpuProfiler* profiler = isolate->cpu_profiler(); | 7453 i::CpuProfiler* profiler = isolate->cpu_profiler(); |
| 7366 ASSERT(profiler != NULL); | 7454 ASSERT(profiler != NULL); |
| 7367 profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); | 7455 profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); |
| 7368 if (profiler->GetProfilesCount() == 0 && !profiler->HasDetachedProfiles()) { | 7456 if (profiler->GetProfilesCount() == 0) { |
| 7369 // If this was the last profile, clean up all accessory data as well. | 7457 // If this was the last profile, clean up all accessory data as well. |
| 7370 profiler->DeleteAllProfiles(); | 7458 profiler->DeleteAllProfiles(); |
| 7371 } | 7459 } |
| 7372 } | 7460 } |
| 7373 | 7461 |
| 7374 | 7462 |
| 7375 unsigned CpuProfile::GetUid() const { | 7463 unsigned CpuProfile::GetUid() const { |
| 7376 i::Isolate* isolate = i::Isolate::Current(); | 7464 i::Isolate* isolate = i::Isolate::Current(); |
| 7377 IsDeadCheck(isolate, "v8::CpuProfile::GetUid"); | 7465 IsDeadCheck(isolate, "v8::CpuProfile::GetUid"); |
| 7378 return reinterpret_cast<const i::CpuProfile*>(this)->uid(); | 7466 return reinterpret_cast<const i::CpuProfile*>(this)->uid(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 7405 int CpuProfile::GetSamplesCount() const { | 7493 int CpuProfile::GetSamplesCount() const { |
| 7406 return reinterpret_cast<const i::CpuProfile*>(this)->samples_count(); | 7494 return reinterpret_cast<const i::CpuProfile*>(this)->samples_count(); |
| 7407 } | 7495 } |
| 7408 | 7496 |
| 7409 | 7497 |
| 7410 int CpuProfiler::GetProfileCount() { | 7498 int CpuProfiler::GetProfileCount() { |
| 7411 return reinterpret_cast<i::CpuProfiler*>(this)->GetProfilesCount(); | 7499 return reinterpret_cast<i::CpuProfiler*>(this)->GetProfilesCount(); |
| 7412 } | 7500 } |
| 7413 | 7501 |
| 7414 | 7502 |
| 7415 const CpuProfile* CpuProfiler::GetCpuProfile(int index, | |
| 7416 Handle<Value> security_token) { | |
| 7417 return reinterpret_cast<const CpuProfile*>( | |
| 7418 reinterpret_cast<i::CpuProfiler*>(this)->GetProfile( | |
| 7419 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | |
| 7420 index)); | |
| 7421 } | |
| 7422 | |
| 7423 | |
| 7424 const CpuProfile* CpuProfiler::GetCpuProfile(int index) { | 7503 const CpuProfile* CpuProfiler::GetCpuProfile(int index) { |
| 7425 return reinterpret_cast<const CpuProfile*>( | 7504 return reinterpret_cast<const CpuProfile*>( |
| 7426 reinterpret_cast<i::CpuProfiler*>(this)->GetProfile(NULL, index)); | 7505 reinterpret_cast<i::CpuProfiler*>(this)->GetProfile(index)); |
| 7427 } | 7506 } |
| 7428 | 7507 |
| 7429 | 7508 |
| 7430 const CpuProfile* CpuProfiler::FindCpuProfile(unsigned uid, | |
| 7431 Handle<Value> security_token) { | |
| 7432 return reinterpret_cast<const CpuProfile*>( | |
| 7433 reinterpret_cast<i::CpuProfiler*>(this)->FindProfile( | |
| 7434 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | |
| 7435 uid)); | |
| 7436 } | |
| 7437 | |
| 7438 | |
| 7439 void CpuProfiler::StartCpuProfiling(Handle<String> title, bool record_samples) { | 7509 void CpuProfiler::StartCpuProfiling(Handle<String> title, bool record_samples) { |
| 7440 reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling( | 7510 reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling( |
| 7441 *Utils::OpenHandle(*title), record_samples); | 7511 *Utils::OpenHandle(*title), record_samples); |
| 7442 } | 7512 } |
| 7443 | 7513 |
| 7444 | 7514 |
| 7445 const CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title, | |
| 7446 Handle<Value> security_token) { | |
| 7447 return reinterpret_cast<const CpuProfile*>( | |
| 7448 reinterpret_cast<i::CpuProfiler*>(this)->StopProfiling( | |
| 7449 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | |
| 7450 *Utils::OpenHandle(*title))); | |
| 7451 } | |
| 7452 | |
| 7453 | |
| 7454 const CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title) { | 7515 const CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title) { |
| 7455 return reinterpret_cast<const CpuProfile*>( | 7516 return reinterpret_cast<const CpuProfile*>( |
| 7456 reinterpret_cast<i::CpuProfiler*>(this)->StopProfiling( | 7517 reinterpret_cast<i::CpuProfiler*>(this)->StopProfiling( |
| 7457 NULL, | |
| 7458 *Utils::OpenHandle(*title))); | 7518 *Utils::OpenHandle(*title))); |
| 7459 } | 7519 } |
| 7460 | 7520 |
| 7461 | 7521 |
| 7462 void CpuProfiler::DeleteAllCpuProfiles() { | 7522 void CpuProfiler::DeleteAllCpuProfiles() { |
| 7463 reinterpret_cast<i::CpuProfiler*>(this)->DeleteAllProfiles(); | 7523 reinterpret_cast<i::CpuProfiler*>(this)->DeleteAllProfiles(); |
| 7464 } | 7524 } |
| 7465 | 7525 |
| 7466 | 7526 |
| 7467 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { | 7527 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7666 return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotsCount(); | 7726 return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotsCount(); |
| 7667 } | 7727 } |
| 7668 | 7728 |
| 7669 | 7729 |
| 7670 const HeapSnapshot* HeapProfiler::GetHeapSnapshot(int index) { | 7730 const HeapSnapshot* HeapProfiler::GetHeapSnapshot(int index) { |
| 7671 return reinterpret_cast<const HeapSnapshot*>( | 7731 return reinterpret_cast<const HeapSnapshot*>( |
| 7672 reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshot(index)); | 7732 reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshot(index)); |
| 7673 } | 7733 } |
| 7674 | 7734 |
| 7675 | 7735 |
| 7676 const HeapSnapshot* HeapProfiler::FindHeapSnapshot(unsigned uid) { | |
| 7677 return reinterpret_cast<const HeapSnapshot*>( | |
| 7678 reinterpret_cast<i::HeapProfiler*>(this)->FindSnapshot(uid)); | |
| 7679 } | |
| 7680 | |
| 7681 | |
| 7682 SnapshotObjectId HeapProfiler::GetObjectId(Handle<Value> value) { | 7736 SnapshotObjectId HeapProfiler::GetObjectId(Handle<Value> value) { |
| 7683 i::Handle<i::Object> obj = Utils::OpenHandle(*value); | 7737 i::Handle<i::Object> obj = Utils::OpenHandle(*value); |
| 7684 return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotObjectId(obj); | 7738 return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotObjectId(obj); |
| 7685 } | 7739 } |
| 7686 | 7740 |
| 7687 | 7741 |
| 7688 const HeapSnapshot* HeapProfiler::TakeHeapSnapshot( | 7742 const HeapSnapshot* HeapProfiler::TakeHeapSnapshot( |
| 7689 Handle<String> title, | 7743 Handle<String> title, |
| 7690 ActivityControl* control, | 7744 ActivityControl* control, |
| 7691 ObjectNameResolver* resolver) { | 7745 ObjectNameResolver* resolver) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7735 | 7789 |
| 7736 | 7790 |
| 7737 v8::Testing::StressType internal::Testing::stress_type_ = | 7791 v8::Testing::StressType internal::Testing::stress_type_ = |
| 7738 v8::Testing::kStressTypeOpt; | 7792 v8::Testing::kStressTypeOpt; |
| 7739 | 7793 |
| 7740 | 7794 |
| 7741 void Testing::SetStressRunType(Testing::StressType type) { | 7795 void Testing::SetStressRunType(Testing::StressType type) { |
| 7742 internal::Testing::set_stress_type(type); | 7796 internal::Testing::set_stress_type(type); |
| 7743 } | 7797 } |
| 7744 | 7798 |
| 7799 |
| 7745 int Testing::GetStressRuns() { | 7800 int Testing::GetStressRuns() { |
| 7746 if (internal::FLAG_stress_runs != 0) return internal::FLAG_stress_runs; | 7801 if (internal::FLAG_stress_runs != 0) return internal::FLAG_stress_runs; |
| 7747 #ifdef DEBUG | 7802 #ifdef DEBUG |
| 7748 // In debug mode the code runs much slower so stressing will only make two | 7803 // In debug mode the code runs much slower so stressing will only make two |
| 7749 // runs. | 7804 // runs. |
| 7750 return 2; | 7805 return 2; |
| 7751 #else | 7806 #else |
| 7752 return 5; | 7807 return 5; |
| 7753 #endif | 7808 #endif |
| 7754 } | 7809 } |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7991 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 8046 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
| 7992 Address callback_address = | 8047 Address callback_address = |
| 7993 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8048 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 7994 VMState<EXTERNAL> state(isolate); | 8049 VMState<EXTERNAL> state(isolate); |
| 7995 ExternalCallbackScope call_scope(isolate, callback_address); | 8050 ExternalCallbackScope call_scope(isolate, callback_address); |
| 7996 return callback(info); | 8051 return callback(info); |
| 7997 } | 8052 } |
| 7998 | 8053 |
| 7999 | 8054 |
| 8000 } } // namespace v8::internal | 8055 } } // namespace v8::internal |
| OLD | NEW |