1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/api.h" 6eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org 7659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include <string.h> // For memcpy, strlen. 86a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org#ifdef V8_USE_ADDRESS_SANITIZER 96a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org#include <sanitizer/asan_interface.h> 106a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org#endif // V8_USE_ADDRESS_SANITIZER 11fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org#include <cmath> // For isnan. 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-debug.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-profiler.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-testing.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assert-scope.h" 16b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#include "src/background-parsing-task.h" 175de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 185de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/time.h" 195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/utils/random-number-generator.h" 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/code-stubs.h" 22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compiler.h" 23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/conversions-inl.h" 24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/counters.h" 25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/cpu-profiler.h" 26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 27196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h" 28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/execution.h" 29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/global-handles.h" 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-profiler.h" 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-snapshot-generator-inl.h" 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/icu_util.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/json-parser.h" 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/messages.h" 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/natives.h" 36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/parser.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/profile-generator-inl.h" 38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/property.h" 394b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/property-details.h" 409bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#include "src/prototype.h" 41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h" 42196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime-profiler.h" 43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scanner-character-streams.h" 44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/simulator.h" 45196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/snapshot.h" 46196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/unicode-inl.h" 47196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8threads.h" 48196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/version.h" 49196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/vm-state-inl.h" 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#define ENTER_V8(isolate) \ 55e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((isolate)->IsInitialized()); \ 56ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::VMState<i::OTHER> __state__((isolate)) 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace v8 { 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define ON_BAILOUT(isolate, location, code) \ 61ae16103bc671a8693911bc99b5fd619e2c772e33machenbach@chromium.org if (IsExecutionTerminatingCheck(isolate)) { \ 629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org code; \ 639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org UNREACHABLE(); \ 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#define EXCEPTION_PREAMBLE(isolate) \ 687979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org (isolate)->handle_scope_implementer()->IncrementCallDepth(); \ 69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!(isolate)->external_caught_exception()); \ 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool has_pending_exception = false 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org#define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \ 7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen do { \ 75ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScopeImplementer* handle_scope_implementer = \ 767979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org (isolate)->handle_scope_implementer(); \ 77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org handle_scope_implementer->DecrementCallDepth(); \ 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (has_pending_exception) { \ 79ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ 807979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org (isolate)->OptionalRescheduleException(call_depth_is_zero); \ 81fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org do_callback \ 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return value; \ 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } \ 84fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org do_callback \ 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } while (false) 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org#define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \ 89fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_GENERIC( \ 90865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org isolate, value, isolate->FireCallCompletedCallback();) 91fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 92fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 93fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org#define EXCEPTION_BAILOUT_CHECK(isolate, value) \ 94fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;) 95fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 96fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- E x c e p t i o n B e h a v i o r --- 9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comvoid i::FatalProcessOutOfMemory(const char* location) { 1014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com i::V8::FatalProcessOutOfMemory(location, false); 1024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 1034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// When V8 cannot allocated memory FatalProcessOutOfMemory is called. 10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The default fatal error handler is called and execution is stopped. 107c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgvoid i::V8::FatalProcessOutOfMemory(const char* location, bool take_snapshot) { 108ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org i::HeapStats heap_stats; 109ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int start_marker; 110ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.start_marker = &start_marker; 111ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int new_space_size; 112ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.new_space_size = &new_space_size; 113ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int new_space_capacity; 114ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.new_space_capacity = &new_space_capacity; 115f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t old_pointer_space_size; 116ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.old_pointer_space_size = &old_pointer_space_size; 117f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t old_pointer_space_capacity; 118ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.old_pointer_space_capacity = &old_pointer_space_capacity; 119f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t old_data_space_size; 120ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.old_data_space_size = &old_data_space_size; 121f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t old_data_space_capacity; 122ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.old_data_space_capacity = &old_data_space_capacity; 123f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t code_space_size; 124ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.code_space_size = &code_space_size; 125f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t code_space_capacity; 126ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.code_space_capacity = &code_space_capacity; 127f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t map_space_size; 128ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.map_space_size = &map_space_size; 129f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t map_space_capacity; 130ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.map_space_capacity = &map_space_capacity; 131f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t cell_space_size; 132ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.cell_space_size = &cell_space_size; 133f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t cell_space_capacity; 134ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.cell_space_capacity = &cell_space_capacity; 13541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org intptr_t property_cell_space_size; 13641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap_stats.property_cell_space_size = &property_cell_space_size; 13741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org intptr_t property_cell_space_capacity; 13841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap_stats.property_cell_space_capacity = &property_cell_space_capacity; 139f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t lo_space_size; 140ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.lo_space_size = &lo_space_size; 141ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int global_handle_count; 142ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.global_handle_count = &global_handle_count; 143ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int weak_global_handle_count; 144ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.weak_global_handle_count = &weak_global_handle_count; 145ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int pending_global_handle_count; 146ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.pending_global_handle_count = &pending_global_handle_count; 147ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int near_death_global_handle_count; 148ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.near_death_global_handle_count = &near_death_global_handle_count; 149e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org int free_global_handle_count; 150e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org heap_stats.free_global_handle_count = &free_global_handle_count; 151f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t memory_allocator_size; 152c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org heap_stats.memory_allocator_size = &memory_allocator_size; 153f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t memory_allocator_capacity; 154c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org heap_stats.memory_allocator_capacity = &memory_allocator_capacity; 155c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int objects_per_type[LAST_TYPE + 1] = {0}; 156c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org heap_stats.objects_per_type = objects_per_type; 157c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int size_per_type[LAST_TYPE + 1] = {0}; 158c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org heap_stats.size_per_type = size_per_type; 159ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int os_error; 160ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org heap_stats.os_error = &os_error; 161ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org int end_marker; 162ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org heap_stats.end_marker = &end_marker; 1637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 1649768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org if (isolate->heap()->HasBeenSetUp()) { 1659768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org // BUG(1718): Don't use the take_snapshot since we don't support 1669768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org // HeapIterator here without doing a special GC. 1679768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org isolate->heap()->RecordStats(&heap_stats, false); 1689768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org } 1694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(false, location, "Allocation failed - process out of memory"); 1704ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org // If the fatal error handler returns, we stop execution. 171e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org FATAL("API fatal error handler returned after process out of memory"); 17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgvoid Utils::ReportApiFailure(const char* location, const char* message) { 176e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Isolate* isolate = i::Isolate::Current(); 177e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org FatalErrorCallback callback = isolate->exception_behavior(); 178e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org if (callback == NULL) { 1795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError("\n#\n# Fatal error in %s\n# %s\n#\n\n", location, 1805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org message); 1815de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Abort(); 182e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org } else { 183e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org callback(location, message); 184e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org } 185e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org isolate->SignalFatalError(); 18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool V8::IsDead() { 190e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Isolate* isolate = i::Isolate::Current(); 191e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org return isolate->IsDead(); 19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgstatic inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { 1967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org if (!isolate->IsInitialized()) return false; 1977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org if (isolate->has_scheduled_exception()) { 1987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return isolate->scheduled_exception() == 1997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org isolate->heap()->termination_exception(); 2007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org } 2017979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return false; 2027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 2037979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 2047979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 205e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgStartupDataDecompressor::StartupDataDecompressor() 206e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org : raw_data(i::NewArray<char*>(V8::GetCompressedStartupDataCount())) { 207e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) { 208e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org raw_data[i] = NULL; 209e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 210e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org} 211e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 212e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 213e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgStartupDataDecompressor::~StartupDataDecompressor() { 214e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) { 215e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::DeleteArray(raw_data[i]); 216e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 217e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::DeleteArray(raw_data); 218e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org} 219e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 220e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 221e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgint StartupDataDecompressor::Decompress() { 222e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org int compressed_data_count = V8::GetCompressedStartupDataCount(); 223e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org StartupData* compressed_data = 224e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::NewArray<StartupData>(compressed_data_count); 225e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org V8::GetCompressedStartupData(compressed_data); 226e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (int i = 0; i < compressed_data_count; ++i) { 227e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org char* decompressed = raw_data[i] = 228e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::NewArray<char>(compressed_data[i].raw_size); 229e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org if (compressed_data[i].compressed_size != 0) { 230e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org int result = DecompressData(decompressed, 231e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org &compressed_data[i].raw_size, 232e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[i].data, 233e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[i].compressed_size); 234e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org if (result != 0) return result; 235e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } else { 236e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(0, compressed_data[i].raw_size); 237e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 238e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[i].data = decompressed; 239e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 240e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org V8::SetDecompressedStartupData(compressed_data); 241f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org i::DeleteArray(compressed_data); 242e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org return 0; 243e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org} 244e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 245e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgStartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() { 2478e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 2488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return StartupData::kBZip2; 2498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#else 2508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return StartupData::kUncompressed; 2518e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#endif 2528e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 2538e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2548e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgenum CompressedStartupDataItems { 2568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org kSnapshot = 0, 2578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org kSnapshotContext, 258e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org kLibraries, 259e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org kExperimentalLibraries, 2608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org kCompressedStartupDataCount 2618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}; 2628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 263e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgint V8::GetCompressedStartupDataCount() { 2658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 2668e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return kCompressedStartupDataCount; 2678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#else 2688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return 0; 2698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#endif 2708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 2718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2728e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid V8::GetCompressedStartupData(StartupData* compressed_data) { 2748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 2758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshot].data = 2768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org reinterpret_cast<const char*>(i::Snapshot::data()); 2778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshot].compressed_size = i::Snapshot::size(); 2788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshot].raw_size = i::Snapshot::raw_size(); 2798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 2808e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshotContext].data = 2818e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org reinterpret_cast<const char*>(i::Snapshot::context_data()); 2828e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshotContext].compressed_size = 2838e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org i::Snapshot::context_size(); 2848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org compressed_data[kSnapshotContext].raw_size = i::Snapshot::context_raw_size(); 285e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 286e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Vector<const i::byte> libraries_source = i::Natives::GetScriptsSource(); 287e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kLibraries].data = 288e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org reinterpret_cast<const char*>(libraries_source.start()); 289e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kLibraries].compressed_size = libraries_source.length(); 290e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kLibraries].raw_size = i::Natives::GetRawScriptsSize(); 291e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 292e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Vector<const i::byte> exp_libraries_source = 293e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::ExperimentalNatives::GetScriptsSource(); 294e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kExperimentalLibraries].data = 295e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org reinterpret_cast<const char*>(exp_libraries_source.start()); 296e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kExperimentalLibraries].compressed_size = 297e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org exp_libraries_source.length(); 298e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org compressed_data[kExperimentalLibraries].raw_size = 299e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::ExperimentalNatives::GetRawScriptsSize(); 3008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#endif 3018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid V8::SetDecompressedStartupData(StartupData* decompressed_data) { 3058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); 3078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org i::Snapshot::set_raw_data( 3088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); 3098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(i::Snapshot::context_raw_size(), 3118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org decompressed_data[kSnapshotContext].raw_size); 3128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org i::Snapshot::set_context_raw_data( 3138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org reinterpret_cast<const i::byte*>( 3148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org decompressed_data[kSnapshotContext].data)); 315e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 316e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(i::Natives::GetRawScriptsSize(), 317e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kLibraries].raw_size); 318e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Vector<const char> libraries_source( 319e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kLibraries].data, 320e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kLibraries].raw_size); 321e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Natives::SetRawScriptsSource(libraries_source); 322e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(i::ExperimentalNatives::GetRawScriptsSize(), 324e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kExperimentalLibraries].raw_size); 325e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Vector<const char> exp_libraries_source( 326e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kExperimentalLibraries].data, 327e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org decompressed_data[kExperimentalLibraries].raw_size); 328e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); 3298e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#endif 3308e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 3318e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 3328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 333975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgvoid V8::SetNativesDataBlob(StartupData* natives_blob) { 334975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef V8_USE_EXTERNAL_STARTUP_DATA 335975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org i::SetNativesFromFile(natives_blob); 336975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#else 337975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org CHECK(false); 338975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif 339975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org} 340975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 341975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 342975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgvoid V8::SetSnapshotDataBlob(StartupData* snapshot_blob) { 343975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef V8_USE_EXTERNAL_STARTUP_DATA 344975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org i::SetSnapshotFromFile(snapshot_blob); 345975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#else 346975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org CHECK(false); 347975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif 348975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org} 349975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 350975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 351ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid V8::SetFatalErrorHandler(FatalErrorCallback that) { 3526b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org i::Isolate* isolate = i::Isolate::Current(); 353ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->set_exception_behavior(that); 354ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 355ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 356ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 357fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgvoid V8::SetAllowCodeGenerationFromStringsCallback( 358fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org AllowCodeGenerationFromStringsCallback callback) { 3596b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org i::Isolate* isolate = i::Isolate::Current(); 360fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org isolate->set_allow_code_gen_callback(callback); 361fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org} 362fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 363fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid V8::SetFlagsFromString(const char* str, int length) { 36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FlagList::SetFlagsFromString(str, length); 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid V8::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags) { 3709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com i::FlagList::SetFlagsFromCommandLine(argc, argv, remove_flags); 3719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegisteredExtension* RegisteredExtension::first_extension_ = NULL; 37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegisteredExtension::RegisteredExtension(Extension* extension) 37827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org : extension_(extension) { } 37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid RegisteredExtension::Register(RegisteredExtension* that) { 382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org that->next_ = first_extension_; 383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org first_extension_ = that; 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3871456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid RegisteredExtension::UnregisterAll() { 3881456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org RegisteredExtension* re = first_extension_; 3891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org while (re != NULL) { 3901456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org RegisteredExtension* next = re->next(); 3911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org delete re; 3921456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org re = next; 3931456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 394fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org first_extension_ = NULL; 3951456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 3961456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3971456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid RegisterExtension(Extension* that) { 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RegisteredExtension* extension = new RegisteredExtension(that); 40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RegisteredExtension::Register(extension); 40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExtension::Extension(const char* name, 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* source, 40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int dep_count, 407c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const char** deps, 408c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int source_length) 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen : name_(name), 410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com source_length_(source_length >= 0 ? 411bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com source_length : 412355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org (source ? static_cast<int>(strlen(source)) : 0)), 413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com source_(source, source_length_), 41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen dep_count_(dep_count), 41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen deps_(deps), 416412fa510dce700c25e3ff85ee85dd32dd6cb6b87danno@chromium.org auto_enable_(false) { 417412fa510dce700c25e3ff85ee85dd32dd6cb6b87danno@chromium.org CHECK(source != NULL || source_length_ == 0); 418412fa510dce700c25e3ff85ee85dd32dd6cb6b87danno@chromium.org} 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenResourceConstraints::ResourceConstraints() 4223c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org : max_semi_space_size_(0), 4234ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org max_old_space_size_(0), 4244ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org max_executable_size_(0), 4254ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org stack_limit_(NULL), 4265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org max_available_threads_(0), 4275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org code_range_size_(0) { } 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4299af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgvoid ResourceConstraints::ConfigureDefaults(uint64_t physical_memory, 4305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org uint64_t virtual_memory_limit, 4319af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org uint32_t number_of_processors) { 432feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#if V8_OS_ANDROID 433feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org // Android has higher physical memory requirements before raising the maximum 434feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org // heap size limits since it has no swap space. 435feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t low_limit = 512ul * i::MB; 436feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t medium_limit = 1ul * i::GB; 437feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t high_limit = 2ul * i::GB; 438feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#else 439feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t low_limit = 512ul * i::MB; 440feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t medium_limit = 768ul * i::MB; 441feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org const uint64_t high_limit = 1ul * i::GB; 442feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#endif 443feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org 444feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org if (physical_memory <= low_limit) { 4453c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org set_max_semi_space_size(i::Heap::kMaxSemiSpaceSizeLowMemoryDevice); 4468496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_old_space_size(i::Heap::kMaxOldSpaceSizeLowMemoryDevice); 4478496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_executable_size(i::Heap::kMaxExecutableSizeLowMemoryDevice); 448feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org } else if (physical_memory <= medium_limit) { 4493c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org set_max_semi_space_size(i::Heap::kMaxSemiSpaceSizeMediumMemoryDevice); 4508496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_old_space_size(i::Heap::kMaxOldSpaceSizeMediumMemoryDevice); 4518496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_executable_size(i::Heap::kMaxExecutableSizeMediumMemoryDevice); 452feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org } else if (physical_memory <= high_limit) { 4533c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org set_max_semi_space_size(i::Heap::kMaxSemiSpaceSizeHighMemoryDevice); 4548496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_old_space_size(i::Heap::kMaxOldSpaceSizeHighMemoryDevice); 4558496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_executable_size(i::Heap::kMaxExecutableSizeHighMemoryDevice); 456feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org } else { 4573c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org set_max_semi_space_size(i::Heap::kMaxSemiSpaceSizeHugeMemoryDevice); 4588496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_old_space_size(i::Heap::kMaxOldSpaceSizeHugeMemoryDevice); 4598496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org set_max_executable_size(i::Heap::kMaxExecutableSizeHugeMemoryDevice); 460feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org } 4619af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 4629af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org set_max_available_threads(i::Max(i::Min(number_of_processors, 4u), 1u)); 4635b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 46470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (virtual_memory_limit > 0 && i::kRequiresCodeRange) { 4655b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org // Reserve no more than 1/8 of the memory for the code range, but at most 46670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org // kMaximalCodeRangeSize. 4675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org set_code_range_size( 46870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org i::Min(i::kMaximalCodeRangeSize / i::MB, 46970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org static_cast<size_t>((virtual_memory_limit >> 3) / i::MB))); 4705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 4719af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org} 4729af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 4739af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 474a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid SetResourceConstraints(i::Isolate* isolate, 475a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org const ResourceConstraints& constraints) { 476a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int semi_space_size = constraints.max_semi_space_size(); 477a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int old_space_size = constraints.max_old_space_size(); 478a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int max_executable_size = constraints.max_executable_size(); 479a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org size_t code_range_size = constraints.code_range_size(); 4803c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org if (semi_space_size != 0 || old_space_size != 0 || 4813c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org max_executable_size != 0 || code_range_size != 0) { 482a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org isolate->heap()->ConfigureHeap(semi_space_size, old_space_size, 483a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org max_executable_size, code_range_size); 484a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 485a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (constraints.stack_limit() != NULL) { 486a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org uintptr_t limit = reinterpret_cast<uintptr_t>(constraints.stack_limit()); 487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stack_guard()->SetStackLimit(limit); 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4899af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 490a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org isolate->set_max_available_threads(constraints.max_available_threads()); 49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 494d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgi::Object** V8::GlobalizeReference(i::Isolate* isolate, i::Object** obj) { 495ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Persistent::New"); 496d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org i::Handle<i::Object> result = isolate->global_handles()->Create(*obj); 497b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org#ifdef DEBUG 498ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org (*obj)->ObjectVerify(); 499b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org#endif // DEBUG 50018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return result.location(); 50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 504639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgi::Object** V8::CopyPersistent(i::Object** obj) { 505639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org i::Handle<i::Object> result = i::GlobalHandles::CopyGlobal(obj); 506639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org#ifdef DEBUG 507ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org (*obj)->ObjectVerify(); 508639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org#endif // DEBUG 509639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org return result.location(); 510639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org} 511639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 512639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 513b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgvoid V8::MakeWeak(i::Object** object, 514d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org void* parameters, 5154f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org WeakCallback weak_callback) { 5164f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::GlobalHandles::MakeWeak(object, parameters, weak_callback); 51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 520381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgvoid* V8::ClearWeak(i::Object** obj) { 521381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return i::GlobalHandles::ClearWeakness(obj); 52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 525a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgvoid V8::DisposeGlobal(i::Object** obj) { 526a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org i::GlobalHandles::Destroy(obj); 527e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 528e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 529e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid V8::Eternalize(Isolate* v8_isolate, Value* value, int* index) { 5311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 5321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Object* object = *Utils::OpenHandle(value); 5331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org isolate->eternal_handles()->Create(isolate, object, index); 534594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 535594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 536594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 5371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgLocal<Value> V8::GetEternal(Isolate* v8_isolate, int index) { 5381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 5391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return Utils::ToLocal(isolate->eternal_handles()->Get(index)); 540594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 541594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 542594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- H a n d l e s --- 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5462bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgHandleScope::HandleScope(Isolate* isolate) { 5472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Initialize(isolate); 5482bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 5492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 5502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 5512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid HandleScope::Initialize(Isolate* isolate) { 5522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 553e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org // We do not want to check the correct usage of the Locker class all over the 554e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org // place, so we do it only here: Without a HandleScope, an embedder can do 555e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org // almost nothing, so it is enough to check in this central place. 556e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org Utils::ApiCheck(!v8::Locker::IsActive() || 557e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org internal_isolate->thread_manager()->IsLockedByCurrentThread(), 558e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org "HandleScope::HandleScope", 559e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org "Entering the V8 API without proper locking in place"); 56026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org i::HandleScopeData* current = internal_isolate->handle_scope_data(); 5612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org isolate_ = internal_isolate; 562ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org prev_next_ = current->next; 563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org prev_limit_ = current->limit; 564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org current->level++; 565ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 568ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgHandleScope::~HandleScope() { 5694f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::HandleScope::CloseScope(isolate_, prev_next_, prev_limit_); 570303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org} 571303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 572303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 5734610c28af9f4355485f8115a725f320b80632804machenbach@chromium.orgint HandleScope::NumberOfHandles(Isolate* isolate) { 5744610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org return i::HandleScope::NumberOfHandles( 5754610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org reinterpret_cast<i::Isolate*>(isolate)); 576ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 579cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgi::Object** HandleScope::CreateHandle(i::Isolate* isolate, i::Object* value) { 580cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return i::HandleScope::CreateHandle(isolate, value); 581cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org} 582cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 583cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 584cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgi::Object** HandleScope::CreateHandle(i::HeapObject* heap_object, 585cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org i::Object* value) { 586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(heap_object->IsHeapObject()); 587cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return i::HandleScope::CreateHandle(heap_object->GetIsolate(), value); 588ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 591cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgEscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) { 592cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 593cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value()); 594cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org Initialize(v8_isolate); 59532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org} 59632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 59732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 598cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgi::Object** EscapableHandleScope::Escape(i::Object** escape_value) { 59926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org i::Heap* heap = reinterpret_cast<i::Isolate*>(GetIsolate())->heap(); 60026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org Utils::ApiCheck(*escape_slot_ == heap->the_hole_value(), 6014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "EscapeableHandleScope::Escape", 6024ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Escape value set twice"); 603cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (escape_value == NULL) { 60426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org *escape_slot_ = heap->undefined_value(); 605cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return NULL; 606cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 607cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org *escape_slot_ = *escape_value; 608cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return escape_slot_; 60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Context::Enter() { 613e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Handle<i::Context> env = Utils::OpenHandle(this); 614e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Isolate* isolate = env->GetIsolate(); 6157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 616e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org i::HandleScopeImplementer* impl = isolate->handle_scope_implementer(); 617e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org impl->EnterContext(env); 618e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org impl->SaveContext(isolate->context()); 619ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->set_context(*env); 62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Context::Exit() { 624e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org i::Handle<i::Context> env = Utils::OpenHandle(this); 625e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org i::Isolate* isolate = env->GetIsolate(); 626528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ENTER_V8(isolate); 6274ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::HandleScopeImplementer* impl = isolate->handle_scope_implementer(); 628e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org if (!Utils::ApiCheck(impl->LastEnteredContextWas(env), 6294ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Context::Exit()", 6304ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Cannot exit non-entered context")) { 63144510671e908d0efc639513d81efcd81e7f14240kasper.lund return; 63244510671e908d0efc639513d81efcd81e7f14240kasper.lund } 633e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org impl->LeaveContext(); 6344ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->set_context(impl->RestoreContext()); 63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 638eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgstatic void* DecodeSmiToAligned(i::Object* value, const char* location) { 6394ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(value->IsSmi(), location, "Not a Smi"); 640eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return reinterpret_cast<void*>(value); 641e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 642e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 643e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 6440c977e0a2d2b41ccc3d5b6ccc12a0dda226b64admstarzinger@chromium.orgstatic i::Smi* EncodeAlignedAsSmi(void* value, const char* location) { 6450c977e0a2d2b41ccc3d5b6ccc12a0dda226b64admstarzinger@chromium.org i::Smi* smi = reinterpret_cast<i::Smi*>(value); 6464ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(smi->IsSmi(), location, "Pointer is not aligned"); 647eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return smi; 648eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 649eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 650eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 651eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgstatic i::Handle<i::FixedArray> EmbedderDataFor(Context* context, 652eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org int index, 653eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org bool can_grow, 654eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location) { 655eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::Context> env = Utils::OpenHandle(context); 656ae16103bc671a8693911bc99b5fd619e2c772e33machenbach@chromium.org bool ok = 6574ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(env->IsNativeContext(), 6584ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org location, 6594ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Not a native context") && 6604ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(index >= 0, location, "Negative index"); 661eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!ok) return i::Handle<i::FixedArray>(); 662eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::FixedArray> data(env->embedder_data()); 663eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (index < data->length()) return data; 6644ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(can_grow, location, "Index too large")) { 665eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return i::Handle<i::FixedArray>(); 666fc2a4f46ef23bff79ae0056b02a52a2e8ac5f339svenpanne@chromium.org } 667eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org int new_size = i::Max(index, data->length() << 1) + 1; 6683484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org data = i::FixedArray::CopySize(data, new_size); 669eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org env->set_embedder_data(*data); 670eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return data; 671eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 672eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 673eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 674eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgv8::Local<v8::Value> Context::SlowGetEmbedderData(int index) { 675eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Context::GetEmbedderData()"; 676eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, false, location); 677eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (data.is_null()) return Local<Value>(); 678eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::Object> result(data->get(index), data->GetIsolate()); 6799085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return Utils::ToLocal(result); 6809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 6819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 6829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 683eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid Context::SetEmbedderData(int index, v8::Handle<Value> value) { 684eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Context::SetEmbedderData()"; 685eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); 686eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (data.is_null()) return; 687eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::Object> val = Utils::OpenHandle(*value); 688eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org data->set(index, *val); 689e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(*Utils::OpenHandle(*value), 690eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org *Utils::OpenHandle(*GetEmbedderData(index))); 691eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 692eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 693eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 694eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* Context::SlowGetAlignedPointerFromEmbedderData(int index) { 695eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Context::GetAlignedPointerFromEmbedderData()"; 696eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, false, location); 697eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (data.is_null()) return NULL; 698eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return DecodeSmiToAligned(data->get(index), location); 699eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 700eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 701eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 702eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid Context::SetAlignedPointerInEmbedderData(int index, void* value) { 703eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Context::SetAlignedPointerInEmbedderData()"; 704eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); 705eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org data->set(index, EncodeAlignedAsSmi(value, location)); 706e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(value, GetAlignedPointerFromEmbedderData(index)); 707eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 708eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 709eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- N e a n d e r --- 71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A constructor cannot easily return an error value, therefore it is necessary 71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to check for a dead VM with ON_BAILOUT before constructing any Neander 71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// objects. To remind you about this there is no HandleScope in the 71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NeanderObject constructor. When you add one to the site calling the 71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// constructor you should check that you ensured the VM was not dead first. 7184610c28af9f4355485f8115a725f320b80632804machenbach@chromium.orgNeanderObject::NeanderObject(v8::internal::Isolate* isolate, int size) { 7197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 7207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org value_ = isolate->factory()->NewNeanderObject(); 7217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::FixedArray> elements = isolate->factory()->NewFixedArray(size); 72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value_->set_elements(*elements); 72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint NeanderObject::size() { 72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::FixedArray::cast(value_->elements())->length(); 72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7314610c28af9f4355485f8115a725f320b80632804machenbach@chromium.orgNeanderArray::NeanderArray(v8::internal::Isolate* isolate) : obj_(isolate, 2) { 73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj_.set(0, i::Smi::FromInt(0)); 73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint NeanderArray::length() { 73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(obj_.get(0))->value(); 73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseni::Object* NeanderArray::get(int offset) { 742e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= offset); 743e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset < length()); 74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return obj_.get(offset + 1); 74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This method cannot easily return an error value, therefore it is necessary 74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to check for a dead VM with ON_BAILOUT before calling it. To remind you 75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// about this there is no HandleScope in this method. When you add one to the 75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// site calling this method you should check that you ensured the VM was not 75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// dead first. 75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid NeanderArray::add(i::Handle<i::Object> value) { 75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int length = this->length(); 75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int size = obj_.size(); 75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (length == size - 1) { 757d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org i::Factory* factory = i::Isolate::Current()->factory(); 758d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org i::Handle<i::FixedArray> new_elms = factory->NewFixedArray(2 * size); 75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < length; i++) 76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen new_elms->set(i + 1, get(i)); 76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj_.value()->set_elements(*new_elms); 76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj_.set(length + 1, *value); 76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj_.set(0, i::Smi::FromInt(length + 1)); 76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid NeanderArray::set(int index, i::Object* value) { 76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (index < 0 || index >= this->length()) return; 77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj_.set(index + 1, value); 77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- T e m p l a t e --- 77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void InitializeTemplate(i::Handle<i::TemplateInfo> that, int type) { 77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen that->set_tag(i::Smi::FromInt(type)); 77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void TemplateSet(i::Isolate* isolate, 7831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Template* templ, 7841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int length, 7851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Handle<v8::Data>* data) { 7861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Handle<i::Object> list(Utils::OpenHandle(templ)->property_list(), isolate); 7871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (list->IsUndefined()) { 7884610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org list = NeanderArray(isolate).value(); 7891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org Utils::OpenHandle(templ)->set_property_list(*list); 7901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 7911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org NeanderArray array(list); 7920f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org array.add(isolate->factory()->NewNumberFromInt(length)); 7931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org for (int i = 0; i < length; i++) { 7941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Handle<i::Object> value = data[i].IsEmpty() ? 7951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Handle<i::Object>(isolate->factory()->undefined_value()) : 7961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org Utils::OpenHandle(*data[i]); 7971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org array.add(value); 7981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 7991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 8001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 8011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 802e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgvoid Template::Set(v8::Handle<Name> name, 8031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Handle<Data> value, 80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::PropertyAttribute attribute) { 805ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 8067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 807ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 8081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org const int kSize = 3; 8090f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 8101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Handle<v8::Data> data[kSize] = { 8114ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org name, 8124ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org value, 8134ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Integer::New(v8_isolate, attribute)}; 8141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org TemplateSet(isolate, this, kSize, data); 8151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 8161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 8171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 8181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid Template::SetAccessorProperty( 819e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Local<v8::Name> name, 8201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Local<FunctionTemplate> getter, 8211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Local<FunctionTemplate> setter, 8221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::PropertyAttribute attribute, 8231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::AccessControl access_control) { 824975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // TODO(verwaest): Remove |access_control|. 825e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(v8::DEFAULT, access_control); 8261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 8271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ENTER_V8(isolate); 828e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!name.IsEmpty()); 829e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!getter.IsEmpty() || !setter.IsEmpty()); 8301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org i::HandleScope scope(isolate); 8311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org const int kSize = 5; 8320f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 8331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org v8::Handle<v8::Data> data[kSize] = { 8344ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org name, 8354ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org getter, 8364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org setter, 837975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org v8::Integer::New(v8_isolate, attribute)}; 8381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org TemplateSet(isolate, this, kSize, data); 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- F u n c t i o n T e m p l a t e --- 84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void InitializeFunctionTemplate( 8444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::Handle<i::FunctionTemplateInfo> info) { 84543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen info->set_tag(i::Smi::FromInt(Consts::FUNCTION_TEMPLATE)); 84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen info->set_flag(0); 84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { 8519cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); 8529cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org ENTER_V8(i_isolate); 85309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(), 8549cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org i_isolate); 85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (result->IsUndefined()) { 8569cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(i_isolate); 8579cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org result = Utils::OpenHandle(*ObjectTemplate::New(isolate)); 85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Utils::OpenHandle(this)->set_prototype_template(*result); 85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 860f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<ObjectTemplate>(result); 86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid FunctionTemplate::Inherit(v8::Handle<FunctionTemplate> value) { 8657979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 8667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Utils::OpenHandle(this)->set_parent_template(*Utils::OpenHandle(*value)); 86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 871639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgstatic Local<FunctionTemplate> FunctionTemplateNew( 872639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org i::Isolate* isolate, 873662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org FunctionCallback callback, 874bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<Value> data, 875bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<Signature> signature, 876639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org int length, 877639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org bool do_not_cache) { 87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_obj = 879ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE); 88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> obj = 88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo>::cast(struct_obj); 88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InitializeFunctionTemplate(obj); 883639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org obj->set_do_not_cache(do_not_cache); 884639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org int next_serial_number = 0; 885639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (!do_not_cache) { 886639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org next_serial_number = isolate->next_serial_number() + 1; 887639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org isolate->set_next_serial_number(next_serial_number); 888639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 889ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org obj->set_serial_number(i::Smi::FromInt(next_serial_number)); 890a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (callback != 0) { 891cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 892cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 893cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 894662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::ToLocal(obj)->SetCallHandler(callback, data); 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 896a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org obj->set_length(length); 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_undetectable(false); 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_needs_access_check(false); 89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!signature.IsEmpty()) 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_signature(*Utils::OpenHandle(*signature)); 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 904639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgLocal<FunctionTemplate> FunctionTemplate::New( 90537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org Isolate* isolate, 906639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org FunctionCallback callback, 907639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org v8::Handle<Value> data, 908639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org v8::Handle<Signature> signature, 909639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org int length) { 91037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 91137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "FunctionTemplate::New"); 91237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 913639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org return FunctionTemplateNew( 91437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate, callback, data, signature, length, false); 915639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org} 916639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<Signature> Signature::New(Isolate* isolate, 91937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org Handle<FunctionTemplate> receiver, int argc, 92037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org Handle<FunctionTemplate> argv[]) { 92137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 92237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "Signature::New"); 92337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_obj = 92537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->factory()->NewStruct(i::SIGNATURE_INFO_TYPE); 92643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::SignatureInfo> obj = 92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::SignatureInfo>::cast(struct_obj); 92843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!receiver.IsEmpty()) obj->set_receiver(*Utils::OpenHandle(*receiver)); 92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (argc > 0) { 93037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Handle<i::FixedArray> args = i_isolate->factory()->NewFixedArray(argc); 93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < argc; i++) { 93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!argv[i].IsEmpty()) 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen args->set(i, *Utils::OpenHandle(*argv[i])); 93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_args(*args); 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<AccessorSignature> AccessorSignature::New( 9424ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Isolate* isolate, 9434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Handle<FunctionTemplate> receiver) { 94437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver)); 94537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org} 94637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 94737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 948750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgtemplate<typename Operation> 949750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic Local<Operation> NewDescriptor( 950750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 951750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const i::DeclaredAccessorDescriptorData& data, 952f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org Data* previous_descriptor) { 953750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 954750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::DeclaredAccessorDescriptor> previous = 955750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::DeclaredAccessorDescriptor>(); 956750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (previous_descriptor != NULL) { 957750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org previous = Utils::OpenHandle( 9584ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org static_cast<DeclaredAccessorDescriptor*>(previous_descriptor)); 959750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 960750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::DeclaredAccessorDescriptor> descriptor = 961750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptor::Create(internal_isolate, data, previous); 962f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return Utils::Convert<i::DeclaredAccessorDescriptor, Operation>(descriptor); 963750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 964750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 965750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 966750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<RawOperationDescriptor> 9674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgObjectOperationDescriptor::NewInternalFieldDereference( 968750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 969750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int internal_field) { 970750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 971750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorObjectDereference; 972750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.object_dereference_descriptor.internal_field = internal_field; 973750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<RawOperationDescriptor>(isolate, data, NULL); 974750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 975750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 976750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 977750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<RawOperationDescriptor> RawOperationDescriptor::NewRawShift( 978750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 979750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int16_t byte_offset) { 980750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 981750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorPointerShift; 982750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.pointer_shift_descriptor.byte_offset = byte_offset; 983750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<RawOperationDescriptor>(isolate, data, this); 984750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 985750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 986750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 987750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewHandleDereference( 988750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate) { 989750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 990750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorReturnObject; 991750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this); 992750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 993750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 994750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 995750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<RawOperationDescriptor> RawOperationDescriptor::NewRawDereference( 996750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate) { 997750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 998750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorPointerDereference; 999750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<RawOperationDescriptor>(isolate, data, this); 1000750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1001750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1002750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1003750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewPointerCompare( 1004750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1005750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void* compare_value) { 1006750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 1007750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorPointerCompare; 1008750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.pointer_compare_descriptor.compare_value = compare_value; 1009750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this); 1010750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1011750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1012750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1013750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewPrimitiveValue( 1014750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1015750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DeclaredAccessorDescriptorDataType data_type, 1016750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t bool_offset) { 1017750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 1018750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorPrimitiveValue; 1019750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.primitive_value_descriptor.data_type = data_type; 1020750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.primitive_value_descriptor.bool_offset = bool_offset; 1021750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this); 1022750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1023750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1024750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1025750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgtemplate<typename T> 1026750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic Local<DeclaredAccessorDescriptor> NewBitmaskCompare( 1027750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1028750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org T bitmask, 1029750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org T compare_value, 1030750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org RawOperationDescriptor* operation) { 1031750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::DeclaredAccessorDescriptorData data; 1032750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.type = i::kDescriptorBitmaskCompare; 1033750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.bitmask_compare_descriptor.bitmask = bitmask; 1034750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.bitmask_compare_descriptor.compare_value = compare_value; 1035750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org data.bitmask_compare_descriptor.size = sizeof(T); 1036750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, operation); 1037750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1038750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1039750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1040750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare8( 1041750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1042750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t bitmask, 1043750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t compare_value) { 1044750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewBitmaskCompare(isolate, bitmask, compare_value, this); 1045750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1046750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1047750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1048750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare16( 1049750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1050750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint16_t bitmask, 1051750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint16_t compare_value) { 1052750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewBitmaskCompare(isolate, bitmask, compare_value, this); 1053750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1054750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1055750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1056750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLocal<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare32( 1057750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 1058750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint32_t bitmask, 1059750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint32_t compare_value) { 1060750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return NewBitmaskCompare(isolate, bitmask, compare_value, this); 1061750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1062750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1063750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<TypeSwitch> TypeSwitch::New(Handle<FunctionTemplate> type) { 106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<FunctionTemplate> types[1] = { type }; 106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TypeSwitch::New(1, types); 106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<TypeSwitch> TypeSwitch::New(int argc, Handle<FunctionTemplate> types[]) { 1071ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 1072ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "TypeSwitch::New"); 10737979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Handle<i::FixedArray> vector = isolate->factory()->NewFixedArray(argc); 107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < argc; i++) 107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen vector->set(i, *Utils::OpenHandle(*types[i])); 107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_obj = 1078ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->factory()->NewStruct(i::TYPE_SWITCH_INFO_TYPE); 107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::TypeSwitchInfo> obj = 108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::TypeSwitchInfo>::cast(struct_obj); 108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_types(*vector); 108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint TypeSwitch::match(v8::Handle<Value> value) { 1087ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 1088ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "TypeSwitch::match"); 1089d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org USE(isolate); 109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(*value); 109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::TypeSwitchInfo> info = Utils::OpenHandle(this); 109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FixedArray* types = i::FixedArray::cast(info->types()); 109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < types->length(); i++) { 10949af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (i::FunctionTemplateInfo::cast(types->get(i))->IsTemplateFor(*obj)) 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i + 1; 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 0; 109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org#define SET_FIELD_WRAPPED(obj, setter, cdata) do { \ 11024ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::Handle<i::Object> foreign = FromCData(obj->GetIsolate(), cdata); \ 11034ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org (obj)->setter(*foreign); \ 11044a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org } while (false) 11054a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 11064a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 1107662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid FunctionTemplate::SetCallHandler(FunctionCallback callback, 1108662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<Value> data) { 1109662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 11107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1111ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_obj = 1113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE); 111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::CallHandlerInfo> obj = 111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::CallHandlerInfo>::cast(struct_obj); 11164a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org SET_FIELD_WRAPPED(obj, set_callback, callback); 1117cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1118cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1119cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_data(*Utils::OpenHandle(*data)); 1121662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::OpenHandle(this)->set_call_code(*obj); 112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1125750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic i::Handle<i::AccessorInfo> SetAccessorInfoProperties( 1126750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::AccessorInfo> obj, 1127e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Name> name, 1128750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org v8::AccessControl settings, 1129750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org v8::PropertyAttribute attributes, 1130750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org v8::Handle<AccessorSignature> signature) { 113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_name(*Utils::OpenHandle(*name)); 113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (settings & ALL_CAN_READ) obj->set_all_can_read(true); 113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (settings & ALL_CAN_WRITE) obj->set_all_can_write(true); 113443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_property_attributes(static_cast<PropertyAttributes>(attributes)); 11357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org if (!signature.IsEmpty()) { 11367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org obj->set_expected_receiver_type(*Utils::OpenHandle(*signature)); 11377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } 11389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org return obj; 11399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} 11409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 11419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 1142bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename Getter, typename Setter> 1143750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic i::Handle<i::AccessorInfo> MakeAccessorInfo( 1144e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Name> name, 11454ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Getter getter, 11464ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Setter setter, 11474ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Handle<Value> data, 11484ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::AccessControl settings, 11494ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::PropertyAttribute attributes, 11504ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Handle<AccessorSignature> signature) { 1151750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate(); 1152750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::ExecutableAccessorInfo> obj = 1153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org isolate->factory()->NewExecutableAccessorInfo(); 1154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org SET_FIELD_WRAPPED(obj, set_getter, getter); 1155750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org SET_FIELD_WRAPPED(obj, set_setter, setter); 1156cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1157cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1158cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 1159750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org obj->set_data(*Utils::OpenHandle(*data)); 1160750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return SetAccessorInfoProperties(obj, name, settings, attributes, signature); 1161750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1163750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic i::Handle<i::AccessorInfo> MakeAccessorInfo( 1165e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Name> name, 11664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Handle<v8::DeclaredAccessorDescriptor> descriptor, 11674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org void* setter_ignored, 11684ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org void* data_ignored, 11694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::AccessControl settings, 11704ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::PropertyAttribute attributes, 11714ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Handle<AccessorSignature> signature) { 1172750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate(); 1173750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (descriptor.IsEmpty()) return i::Handle<i::DeclaredAccessorInfo>(); 1174750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::DeclaredAccessorInfo> obj = 1175750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org isolate->factory()->NewDeclaredAccessorInfo(); 1176750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org obj->set_descriptor(*Utils::OpenHandle(*descriptor)); 1177750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return SetAccessorInfoProperties(obj, name, settings, attributes, signature); 117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<ObjectTemplate> FunctionTemplate::InstanceTemplate() { 11821845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); 11831845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!Utils::ApiCheck(!handle.is_null(), 11844ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::FunctionTemplate::InstanceTemplate()", 11854ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Reading from empty handle")) { 118643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Local<ObjectTemplate>(); 11874ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 11881845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Isolate* isolate = handle->GetIsolate(); 11897979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1190f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (handle->instance_template()->IsUndefined()) { 119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Local<ObjectTemplate> templ = 119237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ObjectTemplate::New(isolate, ToApiHandle<FunctionTemplate>(handle)); 1193f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org handle->set_instance_template(*Utils::OpenHandle(*templ)); 119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1195f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org i::Handle<i::ObjectTemplateInfo> result( 1196f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org i::ObjectTemplateInfo::cast(handle->instance_template())); 119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1201a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgvoid FunctionTemplate::SetLength(int length) { 1202a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1203a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ENTER_V8(isolate); 1204a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Utils::OpenHandle(this)->set_length(length); 1205a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 1206a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 1207a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 1208212ac23f8231d169b4aa6737d762099993020826kasper.lundvoid FunctionTemplate::SetClassName(Handle<String> name) { 12097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 12107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1211212ac23f8231d169b4aa6737d762099993020826kasper.lund Utils::OpenHandle(this)->set_class_name(*Utils::OpenHandle(*name)); 1212212ac23f8231d169b4aa6737d762099993020826kasper.lund} 1213212ac23f8231d169b4aa6737d762099993020826kasper.lund 1214212ac23f8231d169b4aa6737d762099993020826kasper.lund 1215212ac23f8231d169b4aa6737d762099993020826kasper.lundvoid FunctionTemplate::SetHiddenPrototype(bool value) { 12167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 12177979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1218212ac23f8231d169b4aa6737d762099993020826kasper.lund Utils::OpenHandle(this)->set_hidden_prototype(value); 1219212ac23f8231d169b4aa6737d762099993020826kasper.lund} 1220212ac23f8231d169b4aa6737d762099993020826kasper.lund 1221212ac23f8231d169b4aa6737d762099993020826kasper.lund 12222c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.orgvoid FunctionTemplate::ReadOnlyPrototype() { 122304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 122404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org ENTER_V8(isolate); 12252c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org Utils::OpenHandle(this)->set_read_only_prototype(true); 122604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 122704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 1228212ac23f8231d169b4aa6737d762099993020826kasper.lund 1229662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid FunctionTemplate::RemovePrototype() { 1230662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 12317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1232662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::OpenHandle(this)->set_remove_prototype(true); 1233212ac23f8231d169b4aa6737d762099993020826kasper.lund} 1234212ac23f8231d169b4aa6737d762099993020826kasper.lund 1235212ac23f8231d169b4aa6737d762099993020826kasper.lund 123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- O b j e c t T e m p l a t e --- 123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<ObjectTemplate> ObjectTemplate::New(Isolate* isolate) { 124037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return New(reinterpret_cast<i::Isolate*>(isolate), Local<FunctionTemplate>()); 124137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org} 124237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 124337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<ObjectTemplate> ObjectTemplate::New() { 124537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return New(i::Isolate::Current(), Local<FunctionTemplate>()); 124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<ObjectTemplate> ObjectTemplate::New( 12504ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::Isolate* isolate, 12514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Handle<FunctionTemplate> constructor) { 1252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "ObjectTemplate::New"); 12537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_obj = 12557979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org isolate->factory()->NewStruct(i::OBJECT_TEMPLATE_INFO_TYPE); 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::ObjectTemplateInfo> obj = 125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::ObjectTemplateInfo>::cast(struct_obj); 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InitializeTemplate(obj, Consts::OBJECT_TEMPLATE); 125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!constructor.IsEmpty()) 126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_constructor(*Utils::OpenHandle(*constructor)); 1261212ac23f8231d169b4aa6737d762099993020826kasper.lund obj->set_internal_field_count(i::Smi::FromInt(0)); 126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Ensure that the object template has a constructor. If no 126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// constructor is available we create one. 12683d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic i::Handle<i::FunctionTemplateInfo> EnsureConstructor( 12694f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::Isolate* isolate, 12703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ObjectTemplate* object_template) { 12713d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Object* obj = Utils::OpenHandle(object_template)->constructor(); 12723d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org if (!obj ->IsUndefined()) { 12733d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); 12744f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return i::Handle<i::FunctionTemplateInfo>(info, isolate); 127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 12764f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org Local<FunctionTemplate> templ = 12774f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); 12783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); 12793d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org constructor->set_instance_template(*Utils::OpenHandle(object_template)); 12803d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Utils::OpenHandle(object_template)->set_constructor(*constructor); 12813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return constructor; 128243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 128343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 128443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12853d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic inline void AddPropertyToTemplate( 12863d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Handle<i::TemplateInfo> info, 1287750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::Handle<i::AccessorInfo> obj) { 12884610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org i::Isolate* isolate = info->GetIsolate(); 12894610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org i::Handle<i::Object> list(info->property_accessors(), isolate); 1290750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (list->IsUndefined()) { 12914610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org list = NeanderArray(isolate).value(); 12923d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org info->set_property_accessors(*list); 1293750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 1294750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org NeanderArray array(list); 1295750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org array.add(obj); 1296750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1297750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1298750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 12993d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic inline i::Handle<i::TemplateInfo> GetTemplateInfo( 13004f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::Isolate* isolate, 13013d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Template* template_obj) { 13023d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return Utils::OpenHandle(template_obj); 13033d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org} 13043d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13053d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13063d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org// TODO(dcarney): remove this with ObjectTemplate::SetAccessor 13073d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic inline i::Handle<i::TemplateInfo> GetTemplateInfo( 13084f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::Isolate* isolate, 13093d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ObjectTemplate* object_template) { 13104f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, object_template); 13113d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return Utils::OpenHandle(object_template); 13123d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org} 13133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13143d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 1315e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgtemplate<typename Getter, typename Setter, typename Data, typename Template> 13163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic bool TemplateSetAccessor( 13173d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Template* template_obj, 1318e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Local<Name> name, 1319bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Getter getter, 1320bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Setter setter, 1321bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Data data, 1322bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessControl settings, 1323bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org PropertyAttribute attribute, 13243d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::Local<AccessorSignature> signature) { 13253d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Isolate* isolate = Utils::OpenHandle(template_obj)->GetIsolate(); 1326bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org ENTER_V8(isolate); 1327bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::HandleScope scope(isolate); 1328bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::Handle<i::AccessorInfo> obj = MakeAccessorInfo( 1329bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org name, getter, setter, data, settings, attribute, signature); 1330bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org if (obj.is_null()) return false; 13314f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::Handle<i::TemplateInfo> info = GetTemplateInfo(isolate, template_obj); 13323d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AddPropertyToTemplate(info, obj); 1333bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org return true; 1334bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org} 1335bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1336bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 13373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgbool Template::SetDeclaredAccessor( 1338e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org Local<Name> name, 13393d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Local<DeclaredAccessorDescriptor> descriptor, 13403d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PropertyAttribute attribute, 13413d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Local<AccessorSignature> signature, 13423d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AccessControl settings) { 13433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org void* null = NULL; 13443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return TemplateSetAccessor( 13453d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org this, name, descriptor, null, null, settings, attribute, signature); 13463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org} 13473d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13483d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13493d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgvoid Template::SetNativeDataProperty(v8::Local<String> name, 13503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AccessorGetterCallback getter, 13513d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AccessorSetterCallback setter, 13523d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::Handle<Value> data, 13533d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PropertyAttribute attribute, 13543d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::Local<AccessorSignature> signature, 13553d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AccessControl settings) { 13563d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org TemplateSetAccessor( 13573d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org this, name, getter, setter, data, settings, attribute, signature); 13583d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org} 13593d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 13603d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 1361e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgvoid Template::SetNativeDataProperty(v8::Local<Name> name, 1362e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameGetterCallback getter, 1363e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameSetterCallback setter, 1364e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Value> data, 1365e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org PropertyAttribute attribute, 1366e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Local<AccessorSignature> signature, 1367e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessControl settings) { 1368e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org TemplateSetAccessor( 1369e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org this, name, getter, setter, data, settings, attribute, signature); 1370e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 1371e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 1372e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ObjectTemplate::SetAccessor(v8::Handle<String> name, 1374bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessorGetterCallback getter, 1375bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessorSetterCallback setter, 1376bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<Value> data, 1377750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org AccessControl settings, 1378750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org PropertyAttribute attribute, 1379bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<AccessorSignature> signature) { 13803d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org TemplateSetAccessor( 1381bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org this, name, getter, setter, data, settings, attribute, signature); 138243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 138343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 138443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1385e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgvoid ObjectTemplate::SetAccessor(v8::Handle<Name> name, 1386e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameGetterCallback getter, 1387e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameSetterCallback setter, 1388e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Value> data, 1389e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessControl settings, 1390e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org PropertyAttribute attribute, 1391e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<AccessorSignature> signature) { 1392e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org TemplateSetAccessor( 1393e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org this, name, getter, setter, data, settings, attribute, signature); 1394e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 1395e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 1396e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 1397662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid ObjectTemplate::SetNamedPropertyHandler( 1398662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org NamedPropertyGetterCallback getter, 1399662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org NamedPropertySetterCallback setter, 1400662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org NamedPropertyQueryCallback query, 1401662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org NamedPropertyDeleterCallback remover, 1402662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org NamedPropertyEnumeratorCallback enumerator, 1403bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Handle<Value> data) { 1404662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 14057979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 14067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::HandleScope scope(isolate); 14074f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 1408bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast( 1409662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::OpenHandle(this)->constructor()); 141043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> cons(constructor); 1411662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::Struct> struct_obj = 1412662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE); 1413662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::InterceptorInfo> obj = 1414662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::InterceptorInfo>::cast(struct_obj); 1415bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1416662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); 1417662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); 1418662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); 1419662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); 1420662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); 1421bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1422cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1423cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1424cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 1425662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org obj->set_data(*Utils::OpenHandle(*data)); 1426662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org cons->set_named_property_handler(*obj); 142743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 142843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 143043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ObjectTemplate::MarkAsUndetectable() { 14317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 14327979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 14344f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FunctionTemplateInfo* constructor = 143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor()); 143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> cons(constructor); 143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cons->set_undetectable(true); 143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ObjectTemplate::SetAccessCheckCallbacks( 14434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org NamedSecurityCallback named_callback, 14444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedSecurityCallback indexed_callback, 14454ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Handle<Value> data, 14464ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org bool turned_on_by_default) { 14477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 14487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 14504f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 145243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Struct> struct_info = 1453ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); 145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::AccessCheckInfo> info = 145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::AccessCheckInfo>::cast(struct_info); 14564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 14574a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org SET_FIELD_WRAPPED(info, set_named_callback, named_callback); 14584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org SET_FIELD_WRAPPED(info, set_indexed_callback, indexed_callback); 14594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 1460cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1461cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1462cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 146343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen info->set_data(*Utils::OpenHandle(*data)); 146443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FunctionTemplateInfo* constructor = 146643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor()); 146743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> cons(constructor); 146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cons->set_access_check_info(*info); 14695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org cons->set_needs_access_check(turned_on_by_default); 147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1473662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid ObjectTemplate::SetIndexedPropertyHandler( 14744ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedPropertyGetterCallback getter, 14754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedPropertySetterCallback setter, 14764ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedPropertyQueryCallback query, 14774ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedPropertyDeleterCallback remover, 14784ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org IndexedPropertyEnumeratorCallback enumerator, 14794ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Handle<Value> data) { 1480662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 14817979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 14834f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 1484bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast( 1485662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::OpenHandle(this)->constructor()); 148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> cons(constructor); 1487662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::Struct> struct_obj = 1488662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE); 1489662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::InterceptorInfo> obj = 1490662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::InterceptorInfo>::cast(struct_obj); 1491bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1492662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); 1493662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); 1494662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); 1495662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); 1496662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); 1497bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1498cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1499cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1500cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 1501662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org obj->set_data(*Utils::OpenHandle(*data)); 1502662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org cons->set_indexed_property_handler(*obj); 1503bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org} 1504bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1505bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 1506662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, 1507662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Handle<Value> data) { 1508662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 15097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 1510ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 15114f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 1512bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast( 1513662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org Utils::OpenHandle(this)->constructor()); 151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::FunctionTemplateInfo> cons(constructor); 1515662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::Struct> struct_obj = 1516662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE); 1517662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::CallHandlerInfo> obj = 1518662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org i::Handle<i::CallHandlerInfo>::cast(struct_obj); 1519662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org SET_FIELD_WRAPPED(obj, set_callback, callback); 1520cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (data.IsEmpty()) { 1521cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1522cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 1523662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org obj->set_data(*Utils::OpenHandle(*data)); 1524662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org cons->set_instance_call_handler(*obj); 152543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 152743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1528212ac23f8231d169b4aa6737d762099993020826kasper.lundint ObjectTemplate::InternalFieldCount() { 1529212ac23f8231d169b4aa6737d762099993020826kasper.lund return i::Smi::cast(Utils::OpenHandle(this)->internal_field_count())->value(); 153043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1533212ac23f8231d169b4aa6737d762099993020826kasper.lundvoid ObjectTemplate::SetInternalFieldCount(int value) { 15347979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 15354ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(i::Smi::IsValid(value), 15364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::ObjectTemplate::SetInternalFieldCount()", 15374ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Invalid internal field count")) { 153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 15407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 15419258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (value > 0) { 15429258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // The internal field count is set by the constructor function's 15439258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // construct code, so we ensure that there is a constructor 15449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // function to do the setting. 15454f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EnsureConstructor(isolate, this); 15469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 1547212ac23f8231d169b4aa6737d762099993020826kasper.lund Utils::OpenHandle(this)->set_internal_field_count(i::Smi::FromInt(value)); 154843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 154943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 155043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15516b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org// --- S c r i p t s --- 155243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 155343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15546b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org// Internally, UnboundScript is a SharedFunctionInfo, and Script is a 15556b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org// JSFunction. 15566b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 155769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.orgScriptCompiler::CachedData::CachedData(const uint8_t* data_, int length_, 155869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org BufferPolicy buffer_policy_) 155969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org : data(data_), length(length_), buffer_policy(buffer_policy_) {} 156069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org 156169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org 156269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.orgScriptCompiler::CachedData::~CachedData() { 156369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org if (buffer_policy == BufferOwned) { 156469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org delete[] data; 156569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 156669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org} 156769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org 156869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org 1569b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgScriptCompiler::StreamedSource::StreamedSource(ExternalSourceStream* stream, 1570b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Encoding encoding) 1571b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org : impl_(new i::StreamedSource(stream, encoding)) {} 1572b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1573b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1574b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgScriptCompiler::StreamedSource::~StreamedSource() { delete impl_; } 1575b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1576b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1577b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgconst ScriptCompiler::CachedData* 1578b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgScriptCompiler::StreamedSource::GetCachedData() const { 1579b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return impl_->cached_data.get(); 1580b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 1581b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1582b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 15836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<Script> UnboundScript::BindToCurrentContext() { 15846b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::HeapObject> obj = 15856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); 15866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::SharedFunctionInfo> 15876b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org function_info(i::SharedFunctionInfo::cast(*obj), obj->GetIsolate()); 15886b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::JSFunction> function = 15896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org obj->GetIsolate()->factory()->NewFunctionFromSharedFunctionInfo( 15906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org function_info, obj->GetIsolate()->global_context()); 15916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return ToApiHandle<Script>(function); 1592911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1593911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1594911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 15956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgint UnboundScript::GetId() { 15966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::HeapObject> obj = 15976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); 15986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Isolate* isolate = obj->GetIsolate(); 15996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ON_BAILOUT(isolate, "v8::UnboundScript::GetId()", return -1); 16006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org LOG_API(isolate, "v8::UnboundScript::GetId"); 16016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org { 16026b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::HandleScope scope(isolate); 16036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::SharedFunctionInfo> function_info( 16046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::SharedFunctionInfo::cast(*obj)); 16056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::Script> script(i::Script::cast(function_info->script())); 16066b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return script->id()->value(); 16076b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1608911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1609911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1610911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 16116b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgint UnboundScript::GetLineNumber(int code_pos) { 161279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Handle<i::SharedFunctionInfo> obj = 161379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Handle<i::SharedFunctionInfo>::cast(Utils::OpenHandle(this)); 16146b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Isolate* isolate = obj->GetIsolate(); 16156b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ON_BAILOUT(isolate, "v8::UnboundScript::GetLineNumber()", return -1); 16166b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org LOG_API(isolate, "UnboundScript::GetLineNumber"); 161779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org if (obj->script()->IsScript()) { 161879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Handle<i::Script> script(i::Script::cast(obj->script())); 16199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return i::Script::GetLineNumber(script, code_pos); 16206b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } else { 16216b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return -1; 16226b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 162343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 162443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16266b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgHandle<Value> UnboundScript::GetScriptName() { 162779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Handle<i::SharedFunctionInfo> obj = 162879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Handle<i::SharedFunctionInfo>::cast(Utils::OpenHandle(this)); 16296b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Isolate* isolate = obj->GetIsolate(); 16306b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ON_BAILOUT(isolate, "v8::UnboundScript::GetName()", 16316b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return Handle<String>()); 16326b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org LOG_API(isolate, "UnboundScript::GetName"); 163379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org if (obj->script()->IsScript()) { 163479d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org i::Object* name = i::Script::cast(obj->script())->name(); 16356b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return Utils::ToLocal(i::Handle<i::Object>(name, isolate)); 16366b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } else { 16376b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return Handle<String>(); 16386b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1639cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager} 1640cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 1641cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 1642d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgHandle<Value> UnboundScript::GetSourceURL() { 1643d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::SharedFunctionInfo> obj = 1644d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::SharedFunctionInfo>::cast(Utils::OpenHandle(this)); 1645d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Isolate* isolate = obj->GetIsolate(); 1646d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org ON_BAILOUT(isolate, "v8::UnboundScript::GetSourceURL()", 1647d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Handle<String>()); 1648d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org LOG_API(isolate, "UnboundScript::GetSourceURL"); 1649d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (obj->script()->IsScript()) { 1650d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Object* url = i::Script::cast(obj->script())->source_url(); 1651d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Utils::ToLocal(i::Handle<i::Object>(url, isolate)); 1652d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } else { 1653d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Handle<String>(); 1654d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 1655d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 1656d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 1657d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 1658d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgHandle<Value> UnboundScript::GetSourceMappingURL() { 1659d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::SharedFunctionInfo> obj = 1660d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::SharedFunctionInfo>::cast(Utils::OpenHandle(this)); 1661d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Isolate* isolate = obj->GetIsolate(); 1662d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org ON_BAILOUT(isolate, "v8::UnboundScript::GetSourceMappingURL()", 1663d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Handle<String>()); 1664d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org LOG_API(isolate, "UnboundScript::GetSourceMappingURL"); 1665d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (obj->script()->IsScript()) { 1666d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Object* url = i::Script::cast(obj->script())->source_mapping_url(); 1667d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Utils::ToLocal(i::Handle<i::Object>(url, isolate)); 1668d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } else { 1669d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Handle<String>(); 1670d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 1671d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 1672d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 1673d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 167443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<Value> Script::Run() { 16751845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this, true); 16766b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // If execution is terminating, Compile(..)->Run() requires this 16776b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // check. 16781845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (obj.is_null()) return Local<Value>(); 16791845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Isolate* isolate = i::Handle<i::HeapObject>::cast(obj)->GetIsolate(); 1680ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Script::Run()", return Local<Value>()); 1681ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Script::Run"); 16827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 16834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 16842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::HandleScope scope(isolate); 16852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj); 16862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 168758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org i::Handle<i::Object> receiver(isolate->global_proxy(), isolate); 16882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 16892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 16902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, fun, receiver, 0, NULL).ToHandle(&result); 16912ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); 16922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return Utils::ToLocal(scope.CloseAndEscape(result)); 169343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 169443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<UnboundScript> Script::GetUnboundScript() { 16976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 16986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return ToApiHandle<UnboundScript>( 16996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared())); 17005d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 17015d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 17025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 17036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<UnboundScript> ScriptCompiler::CompileUnbound( 17046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Isolate* v8_isolate, 170569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org Source* source, 17066b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org CompileOptions options) { 170774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 170874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org ON_BAILOUT(isolate, "v8::ScriptCompiler::CompileUnbound()", 170974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org return Local<UnboundScript>()); 17104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 17114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Support the old API for a transition period: 17124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // - kProduceToCache -> kProduceParserCache 17134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // - kNoCompileOptions + cached_data != NULL -> kConsumeParserCache 17144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (options == kProduceDataToCache) { 17154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org options = kProduceParserCache; 17164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (options == kNoCompileOptions && source->cached_data) { 17174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org options = kConsumeParserCache; 17184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 17194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 17204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::ScriptData* script_data = NULL; 17214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (options == kConsumeParserCache || options == kConsumeCodeCache) { 1722e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(source->cached_data); 172370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org // ScriptData takes care of pointer-aligning the data. 172470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org script_data = new i::ScriptData(source->cached_data->data, 172570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org source->cached_data->length); 172669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 172769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org 172869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); 17296b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org LOG_API(isolate, "ScriptCompiler::CompileUnbound"); 17306b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ENTER_V8(isolate); 17316b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::SharedFunctionInfo* raw_result = NULL; 17326b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org { i::HandleScope scope(isolate); 17336b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::Object> name_obj; 17346b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int line_offset = 0; 17356b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int column_offset = 0; 17366b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org bool is_shared_cross_origin = false; 173769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org if (!source->resource_name.IsEmpty()) { 173869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org name_obj = Utils::OpenHandle(*(source->resource_name)); 17396b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 174069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org if (!source->resource_line_offset.IsEmpty()) { 174169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org line_offset = static_cast<int>(source->resource_line_offset->Value()); 17426b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 174369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org if (!source->resource_column_offset.IsEmpty()) { 17446b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org column_offset = 174569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org static_cast<int>(source->resource_column_offset->Value()); 17466b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 174769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org if (!source->resource_is_shared_cross_origin.IsEmpty()) { 17486b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 17496b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org is_shared_cross_origin = 175069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org source->resource_is_shared_cross_origin == v8::True(v8_isolate); 17516b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 17526b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 175370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org i::Handle<i::SharedFunctionInfo> result = i::Compiler::CompileScript( 175470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org str, name_obj, line_offset, column_offset, is_shared_cross_origin, 17554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org isolate->global_context(), NULL, &script_data, options, 175670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org i::NOT_NATIVES_CODE); 17576b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org has_pending_exception = result.is_null(); 17584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (has_pending_exception && script_data != NULL) { 17597e6132b924829c353864933f29124419916db550machenbach@chromium.org // This case won't happen during normal operation; we have compiled 17607e6132b924829c353864933f29124419916db550machenbach@chromium.org // successfully and produced cached data, and but the second compilation 17617e6132b924829c353864933f29124419916db550machenbach@chromium.org // of the same source code fails. 176270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org delete script_data; 176370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org script_data = NULL; 17647e6132b924829c353864933f29124419916db550machenbach@chromium.org } 17656b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>()); 17666b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org raw_result = *result; 17674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 17684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if ((options == kProduceParserCache || options == kProduceCodeCache) && 17694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org script_data != NULL) { 17704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // script_data now contains the data that was generated. source will 177169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org // take the ownership. 177269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org source->cached_data = new CachedData( 177370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org script_data->data(), script_data->length(), CachedData::BufferOwned); 177470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org script_data->ReleaseDataOwnership(); 177569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 177670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org delete script_data; 17771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); 17796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return ToApiHandle<UnboundScript>(result); 17801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 17811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<Script> ScriptCompiler::Compile( 17846b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Isolate* v8_isolate, 178569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org Source* source, 17866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org CompileOptions options) { 17876b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 1788fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org ON_BAILOUT(isolate, "v8::ScriptCompiler::Compile()", return Local<Script>()); 17896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org LOG_API(isolate, "ScriptCompiler::CompiletBound()"); 17906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ENTER_V8(isolate); 1791fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org Local<UnboundScript> generic = CompileUnbound(v8_isolate, source, options); 17926b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (generic.IsEmpty()) return Local<Script>(); 17936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return generic->BindToCurrentContext(); 1794e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1795e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1796e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1797b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreamingScript( 1798b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Isolate* v8_isolate, StreamedSource* source, CompileOptions options) { 1799b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 1800b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!isolate->global_context().is_null() && 1801b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org !isolate->global_context()->IsNativeContext()) { 1802b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // The context chain is non-trivial, and constructing the corresponding 1803b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // non-trivial Scope chain outside the V8 heap is not implemented. Don't 1804b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // stream the script. This will only occur if Harmony scoping is enabled and 1805b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // a previous script has introduced "let" or "const" variables. TODO(marja): 1806b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Implement externalizing ScopeInfos and constructing non-trivial Scope 1807b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // chains independent of the V8 heap so that we can stream also in this 1808b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // case. 1809b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return NULL; 1810b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1811b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return new i::BackgroundParsingTask(source->impl(), options, 1812b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::FLAG_stack_size, isolate); 1813b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 1814b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1815b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1816b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgLocal<Script> ScriptCompiler::Compile(Isolate* v8_isolate, 1817b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org StreamedSource* v8_source, 1818b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Handle<String> full_source_string, 1819b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org const ScriptOrigin& origin) { 1820b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 1821b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::StreamedSource* source = v8_source->impl(); 1822b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org ON_BAILOUT(isolate, "v8::ScriptCompiler::Compile()", return Local<Script>()); 1823b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org LOG_API(isolate, "ScriptCompiler::Compile()"); 1824b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org ENTER_V8(isolate); 1825b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::SharedFunctionInfo* raw_result = NULL; 1826b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1827b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org { 1828b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::HandleScope scope(isolate); 1829b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Handle<i::String> str = Utils::OpenHandle(*(full_source_string)); 1830b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Handle<i::Script> script = isolate->factory()->NewScript(str); 1831b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!origin.ResourceName().IsEmpty()) { 1832b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org script->set_name(*Utils::OpenHandle(*(origin.ResourceName()))); 1833b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1834b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!origin.ResourceLineOffset().IsEmpty()) { 1835b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org script->set_line_offset(i::Smi::FromInt( 1836b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org static_cast<int>(origin.ResourceLineOffset()->Value()))); 1837b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1838b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!origin.ResourceColumnOffset().IsEmpty()) { 1839b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org script->set_column_offset(i::Smi::FromInt( 1840b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org static_cast<int>(origin.ResourceColumnOffset()->Value()))); 1841b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1842b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!origin.ResourceIsSharedCrossOrigin().IsEmpty()) { 1843b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org script->set_is_shared_cross_origin(origin.ResourceIsSharedCrossOrigin() == 1844b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org v8::True(v8_isolate)); 1845b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1846b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source->info->set_script(script); 1847b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source->info->SetContext(isolate->global_context()); 1848b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1849b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 1850b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1851b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Do the parsing tasks which need to be done on the main thread. This will 1852b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // also handle parse errors. 1853b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source->parser->Internalize(); 1854b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1855b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Handle<i::SharedFunctionInfo> result = 1856b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Handle<i::SharedFunctionInfo>::null(); 1857b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (source->info->function() != NULL) { 1858b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Parsing has succeeded. 1859b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org result = 1860b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Compiler::CompileStreamedScript(source->info.get(), str->length()); 1861b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1862b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org has_pending_exception = result.is_null(); 1863b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (has_pending_exception) isolate->ReportPendingMessages(); 1864b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Script>()); 1865b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1866b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org raw_result = *result; 1867b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // The Handle<Script> will go out of scope soon; make sure CompilationInfo 1868b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // doesn't point to it. 1869b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source->info->set_script(i::Handle<i::Script>()); 1870b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } // HandleScope goes out of scope. 1871b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); 1872b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Local<UnboundScript> generic = ToApiHandle<UnboundScript>(result); 1873b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (generic.IsEmpty()) { 1874b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return Local<Script>(); 1875b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1876b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return generic->BindToCurrentContext(); 1877b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 1878b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1879b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 18806b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<Script> Script::Compile(v8::Handle<String> source, 18812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org v8::ScriptOrigin* origin) { 18826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org i::Handle<i::String> str = Utils::OpenHandle(*source); 18836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (origin) { 18842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ScriptCompiler::Source script_source(source, *origin); 18856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return ScriptCompiler::Compile( 18866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org reinterpret_cast<v8::Isolate*>(str->GetIsolate()), 188769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org &script_source); 1888e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 18892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ScriptCompiler::Source script_source(source); 18906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return ScriptCompiler::Compile( 18916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org reinterpret_cast<v8::Isolate*>(str->GetIsolate()), 189269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org &script_source); 18936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 18946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 18956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 18966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgLocal<Script> Script::Compile(v8::Handle<String> source, 18976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org v8::Handle<String> file_name) { 18986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ScriptOrigin origin(file_name); 18996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return Compile(source, &origin); 1900e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- E x c e p t i o n s --- 190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 190543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenv8::TryCatch::TryCatch() 1907e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org : isolate_(i::Isolate::Current()), 19086a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org next_(isolate_->try_catch_handler()), 19099258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org is_verbose_(false), 191068e7ab710223f912b896d46d1823ae6eb18bfd40ager@chromium.org can_continue_(true), 19113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org capture_message_(true), 191232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org rethrow_(false), 191332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org has_terminated_(false) { 19148640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org ResetInternal(); 19156a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org // Special handling for simulators which have a separate JS stack. 1916d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org js_stack_comparable_address_ = 1917d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( 1918e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v8::internal::GetCurrentStackPosition())); 1919e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->RegisterTryCatchHandler(this); 192043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 192143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenv8::TryCatch::~TryCatch() { 1924e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate_ == i::Isolate::Current()); 1925b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com if (rethrow_) { 1926cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); 1927cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::HandleScope scope(isolate); 1928cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); 192993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org if (HasCaught() && capture_message_) { 193093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org // If an exception was caught and rethrow_ is indicated, the saved 193193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org // message, script, and location need to be restored to Isolate TLS 193293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org // for reuse. capture_message_ needs to be disabled so that DoThrow() 193393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org // does not create a new message. 193493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org isolate_->thread_local_top()->rethrowing_message_ = true; 193593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org isolate_->RestorePendingMessageFromTryCatch(this); 193693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org } 1937e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->UnregisterTryCatchHandler(this); 19386a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org v8::internal::SimulatorStack::UnregisterCTryCatch(); 1939cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); 1940e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!isolate_->thread_local_top()->rethrowing_message_); 1941b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com } else { 1942474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (HasCaught() && isolate_->has_scheduled_exception()) { 1943474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // If an exception was caught but is still scheduled because no API call 1944474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // promoted it, then it is canceled to prevent it from being propagated. 1945474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // Note that this will not cancel termination exceptions. 1946474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org isolate_->CancelScheduledExceptionFromTryCatch(this); 1947474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 1948e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->UnregisterTryCatchHandler(this); 19496a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org v8::internal::SimulatorStack::UnregisterCTryCatch(); 1950b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com } 195143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 195243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgbool v8::TryCatch::HasCaught() const { 195543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); 195643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 195743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1959c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.orgbool v8::TryCatch::CanContinue() const { 1960c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org return can_continue_; 1961c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org} 1962c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org 1963c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org 196432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool v8::TryCatch::HasTerminated() const { 196532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return has_terminated_; 196632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 196732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 196832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 1969b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.comv8::Handle<v8::Value> v8::TryCatch::ReThrow() { 1970b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com if (!HasCaught()) return v8::Local<v8::Value>(); 1971b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com rethrow_ = true; 1972cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate_)); 1973b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com} 1974b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com 1975b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com 19765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgv8::Local<Value> v8::TryCatch::Exception() const { 1977e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate_ == i::Isolate::Current()); 197843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (HasCaught()) { 197943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check for out of memory exception. 198043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Object* exception = reinterpret_cast<i::Object*>(exception_); 1981e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org return v8::Utils::ToLocal(i::Handle<i::Object>(exception, isolate_)); 198243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 198343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return v8::Local<Value>(); 198443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 198543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 198643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 198743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1988911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgv8::Local<Value> v8::TryCatch::StackTrace() const { 1989e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate_ == i::Isolate::Current()); 1990911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (HasCaught()) { 1991911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org i::Object* raw_obj = reinterpret_cast<i::Object*>(exception_); 1992911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (!raw_obj->IsJSObject()) return v8::Local<Value>(); 1993e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::HandleScope scope(isolate_); 1994e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_); 19954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org i::Handle<i::String> name = isolate_->factory()->stack_string(); 1996eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate_); 1997eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name); 1998eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 1999eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate_, v8::Local<Value>()); 2000eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org if (!maybe.value) return v8::Local<Value>(); 20012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> value; 20022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (!i::Object::GetProperty(obj, name).ToHandle(&value)) { 20032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return v8::Local<Value>(); 20042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2005ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org return v8::Utils::ToLocal(scope.CloseAndEscape(value)); 2006911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 2007911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return v8::Local<Value>(); 2008911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 2009911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 2010911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 2011911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 20125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgv8::Local<v8::Message> v8::TryCatch::Message() const { 2013e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate_ == i::Isolate::Current()); 201493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org i::Object* message = reinterpret_cast<i::Object*>(message_obj_); 2015e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(message->IsJSMessageObject() || message->IsTheHole()); 201693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org if (HasCaught() && !message->IsTheHole()) { 2017e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); 20189258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } else { 20199258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return v8::Local<v8::Message>(); 20209258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 20219258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 20229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 20239258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 202443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid v8::TryCatch::Reset() { 2025e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate_ == i::Isolate::Current()); 20268640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org if (!rethrow_ && HasCaught() && isolate_->has_scheduled_exception()) { 20278640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org // If an exception was caught but is still scheduled because no API call 20288640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org // promoted it, then it is canceled to prevent it from being propagated. 20298640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org // Note that this will not cancel termination exceptions. 20308640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org isolate_->CancelScheduledExceptionFromTryCatch(this); 20318640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org } 20328640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org ResetInternal(); 20338640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org} 20348640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org 20358640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org 20368640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgvoid v8::TryCatch::ResetInternal() { 203793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org i::Object* the_hole = isolate_->heap()->the_hole_value(); 203893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org exception_ = the_hole; 203993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org message_obj_ = the_hole; 204093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org message_script_ = the_hole; 204193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org message_start_pos_ = 0; 204293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org message_end_pos_ = 0; 204343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 204443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 204543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 204643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid v8::TryCatch::SetVerbose(bool value) { 204743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen is_verbose_ = value; 204843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 204943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20519258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgvoid v8::TryCatch::SetCaptureMessage(bool value) { 20529258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org capture_message_ = value; 20539258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 20549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 20559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 205643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- M e s s a g e --- 205743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 205843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20593291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<String> Message::Get() const { 20607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 2061ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Message::Get()", return Local<String>()); 20627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2063ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 206443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 206509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::String> raw_result = i::MessageHandler::GetMessage(isolate, obj); 206643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Local<String> result = Utils::ToLocal(raw_result); 2067ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return scope.Escape(result); 206843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 206943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 207043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20714b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.orgScriptOrigin Message::GetScriptOrigin() const { 20727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 207331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject> message = 207431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject>::cast(Utils::OpenHandle(this)); 20754b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::Object> script_wraper = 20764b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::Object>(message->script(), isolate); 20774b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::JSValue> script_value = 20784b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::JSValue>::cast(script_wraper); 20794b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::Script> script(i::Script::cast(script_value->value())); 20804b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Handle<i::Object> scriptName(i::Script::GetNameOrSourceURL(script)); 20814b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org v8::Isolate* v8_isolate = 20824b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org reinterpret_cast<v8::Isolate*>(script->GetIsolate()); 20834b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org v8::ScriptOrigin origin( 20844b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org Utils::ToLocal(scriptName), 20854b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org v8::Integer::New(v8_isolate, script->line_offset()->value()), 2086f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org v8::Integer::New(v8_isolate, script->column_offset()->value()), 2087f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org Handle<Boolean>(), 2088f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org v8::Integer::New(v8_isolate, script->id()->value())); 20894b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org return origin; 20904b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org} 20914b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org 20924b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org 20934b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.orgv8::Handle<Value> Message::GetScriptResourceName() const { 20944b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org return GetScriptOrigin().ResourceName(); 209543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 209643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 209743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20986a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.orgv8::Handle<v8::StackTrace> Message::GetStackTrace() const { 20997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 21007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2101ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 210231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject> message = 210331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject>::cast(Utils::OpenHandle(this)); 210409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::Object> stackFramesObj(message->stack_frames(), isolate); 21056a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org if (!stackFramesObj->IsJSArray()) return v8::Handle<v8::StackTrace>(); 21066a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org i::Handle<i::JSArray> stackTrace = 21076a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org i::Handle<i::JSArray>::cast(stackFramesObj); 2108ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return scope.Escape(Utils::StackTraceToLocal(stackTrace)); 21096a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org} 21106a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 21116a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 21122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction( 21132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org const char* name, 21142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> recv, 21152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org int argc, 21162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> argv[]) { 2117ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 21185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org i::Handle<i::Object> object_fun = 21192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Object::GetProperty( 21209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org isolate, isolate->js_builtins_object(), name).ToHandleChecked(); 21215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(object_fun); 21222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return i::Execution::Call(isolate, fun, recv, argc, argv); 212343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 212443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 212543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction( 21272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org const char* name, 21282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> data) { 2129a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org i::Handle<i::Object> argv[] = { data }; 213043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return CallV8HeapFunction(name, 2131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate::Current()->js_builtins_object(), 2132fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), 21332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org argv); 213443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 213543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 213643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint Message::GetLineNumber() const { 21387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 2139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Message::GetLineNumber()", return kNoLineNumberInfo); 21407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 214231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 21437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 21442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 21452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 21462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org "GetLineNumber", Utils::OpenHandle(this)).ToHandle(&result); 21477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 214843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<int>(result->Number()); 214943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 215043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 215143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint Message::GetStartPosition() const { 21537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 21547979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2155ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 215631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject> message = 215731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject>::cast(Utils::OpenHandle(this)); 215831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org return message->start_position(); 21599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 21609258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint Message::GetEndPosition() const { 21637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 21647979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 216631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject> message = 216731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject>::cast(Utils::OpenHandle(this)); 216831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org return message->end_position(); 21699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 21709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint Message::GetStartColumn() const { 21737979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 21747c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org ON_BAILOUT(isolate, "v8::Message::GetStartColumn()", return kNoColumnInfo); 21757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2176ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 21779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 21787979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 21792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> start_col_obj; 21802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 21812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org "GetPositionInLine", data_obj).ToHandle(&start_col_obj); 21827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 21839258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return static_cast<int>(start_col_obj->Number()); 21849258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 21859258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21869258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 21873291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint Message::GetEndColumn() const { 21887979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 21897c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org ON_BAILOUT(isolate, "v8::Message::GetEndColumn()", return kNoColumnInfo); 21907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2191ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 21929258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 21937979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 21942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> start_col_obj; 21952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 21962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org "GetPositionInLine", data_obj).ToHandle(&start_col_obj); 21977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 219831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject> message = 219931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org i::Handle<i::JSMessageObject>::cast(data_obj); 220031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int start = message->start_position(); 220131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int end = message->end_position(); 22029258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return static_cast<int>(start_col_obj->Number()) + (end - start); 22039258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 22049258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 22059258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 2206d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgbool Message::IsSharedCrossOrigin() const { 2207d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 2208d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ENTER_V8(isolate); 2209d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::HandleScope scope(isolate); 2210d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::Handle<i::JSMessageObject> message = 2211d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::Handle<i::JSMessageObject>::cast(Utils::OpenHandle(this)); 2212d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::Handle<i::JSValue> script = 2213d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org i::Handle<i::JSValue>::cast(i::Handle<i::Object>(message->script(), 2214d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org isolate)); 2215d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return i::Script::cast(script->value())->is_shared_cross_origin(); 2216d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 2217d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 2218d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 22193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<String> Message::GetSourceLine() const { 22207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 2221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Message::GetSourceLine()", return Local<String>()); 22227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2223ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 22247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 22252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 22262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 22272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org "GetSourceLine", Utils::OpenHandle(this)).ToHandle(&result); 22287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::String>()); 22299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (result->IsString()) { 2230ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return scope.Escape(Utils::ToLocal(i::Handle<i::String>::cast(result))); 22319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } else { 22329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return Local<String>(); 22339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 223443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 223543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 223643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 223737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgvoid Message::PrintCurrentStackTrace(Isolate* isolate, FILE* out) { 223837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 223937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 224037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->PrintCurrentStackTrace(out); 224137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org} 224237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 224337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 2244720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org// --- S t a c k T r a c e --- 2245720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2246720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgLocal<StackFrame> StackTrace::GetFrame(uint32_t index) const { 22477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 22487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2249ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 2250720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org i::Handle<i::JSArray> self = Utils::OpenHandle(this); 22517010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org i::Handle<i::Object> obj = 22522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Object::GetElement(isolate, self, index).ToHandleChecked(); 22537010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org i::Handle<i::JSObject> jsobj = i::Handle<i::JSObject>::cast(obj); 22547010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return scope.Escape(Utils::StackFrameToLocal(jsobj)); 2255720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2256720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2257720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2258720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgint StackTrace::GetFrameCount() const { 22597979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 22607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2261720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org return i::Smi::cast(Utils::OpenHandle(this)->length())->value(); 2262720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2263720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2264720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2265720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgLocal<Array> StackTrace::AsArray() { 22667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 22677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2268720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org return Utils::ToLocal(Utils::OpenHandle(this)); 2269720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2270720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2271720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 227237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<StackTrace> StackTrace::CurrentStackTrace( 227337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org Isolate* isolate, 227437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org int frame_limit, 2275720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org StackTraceOptions options) { 227637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 227737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 227854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // TODO(dcarney): remove when ScriptDebugServer is fixed. 227954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org options = static_cast<StackTraceOptions>( 228054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org static_cast<int>(options) | kExposeFramesAcrossSecurityOrigins); 22816a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org i::Handle<i::JSArray> stackTrace = 228237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->CaptureCurrentStackTrace(frame_limit, options); 22836a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org return Utils::StackTraceToLocal(stackTrace); 2284720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2285720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2286720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2287720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org// --- S t a c k F r a m e --- 2288720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2289d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgstatic int getIntProperty(const StackFrame* f, const char* propertyName, 2290d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org int defaultValue) { 2291d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(f)->GetIsolate(); 22927979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2293ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 2294d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(f); 2295d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::Object> obj = 2296d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Object::GetProperty(isolate, self, propertyName).ToHandleChecked(); 2297d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return obj->IsSmi() ? i::Smi::cast(*obj)->value() : defaultValue; 2298d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org} 2299d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 2300d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 2301d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgint StackFrame::GetLineNumber() const { 2302d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getIntProperty(this, "lineNumber", Message::kNoLineNumberInfo); 2303720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2304720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2305720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2306720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgint StackFrame::GetColumn() const { 2307d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getIntProperty(this, "column", Message::kNoColumnInfo); 2308720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2309720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2310720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 23118fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.orgint StackFrame::GetScriptId() const { 2312d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getIntProperty(this, "scriptId", Message::kNoScriptIdInfo); 23138fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org} 23148fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 23158fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 2316d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgstatic Local<String> getStringProperty(const StackFrame* f, 2317d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org const char* propertyName) { 2318d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(f)->GetIsolate(); 23197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2320ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 2321d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(f); 2322d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::Object> obj = 2323d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Object::GetProperty(isolate, self, propertyName).ToHandleChecked(); 2324d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return obj->IsString() 2325d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org ? scope.Escape(Local<String>::Cast(Utils::ToLocal(obj))) 2326d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org : Local<String>(); 2327d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org} 2328d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 2329d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 2330d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgLocal<String> StackFrame::GetScriptName() const { 2331d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getStringProperty(this, "scriptName"); 2332720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2333720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2334720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2335b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgLocal<String> StackFrame::GetScriptNameOrSourceURL() const { 2336d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getStringProperty(this, "scriptNameOrSourceURL"); 2337b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 2338b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 2339b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 2340720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgLocal<String> StackFrame::GetFunctionName() const { 2341d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getStringProperty(this, "functionName"); 2342720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2343720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2344720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2345d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgstatic bool getBoolProperty(const StackFrame* f, const char* propertyName) { 2346d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(f)->GetIsolate(); 23477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 2348ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 2349d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(f); 2350d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Handle<i::Object> obj = 2351d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org i::Object::GetProperty(isolate, self, propertyName).ToHandleChecked(); 2352d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return obj->IsTrue(); 2353720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2354720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2355d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgbool StackFrame::IsEval() const { return getBoolProperty(this, "isEval"); } 2356d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 2357720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2358720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgbool StackFrame::IsConstructor() const { 2359d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return getBoolProperty(this, "isConstructor"); 2360720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2361720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2362720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2363594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// --- J S O N --- 2364594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2365594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLocal<Value> JSON::Parse(Local<String> json_string) { 2366e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Handle<i::String> string = Utils::OpenHandle(*json_string); 2367e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = string->GetIsolate(); 2368594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ENTER_V8(isolate); 2369594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::HandleScope scope(isolate); 2370e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Handle<i::String> source = i::String::Flatten(string); 2371594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EXCEPTION_PREAMBLE(isolate); 2372255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org i::MaybeHandle<i::Object> maybe_result = 2373255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org source->IsSeqOneByteString() ? i::JsonParser<true>::Parse(source) 2374255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org : i::JsonParser<false>::Parse(source); 2375594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::Handle<i::Object> result; 2376255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org has_pending_exception = !maybe_result.ToHandle(&result); 2377594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); 2378594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return Utils::ToLocal( 2379594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::Handle<i::Object>::cast(scope.CloseAndEscape(result))); 2380594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 2381594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2382594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 238343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- D a t a --- 238443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2385fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::FullIsUndefined() const { 2386fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org bool result = Utils::OpenHandle(this)->IsUndefined(); 2387e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(result, QuickIsUndefined()); 2388fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org return result; 238943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 239043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 239143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2392fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::FullIsNull() const { 2393fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org bool result = Utils::OpenHandle(this)->IsNull(); 2394e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(result, QuickIsNull()); 2395fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org return result; 239643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 239743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 239843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsTrue() const { 240043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsTrue(); 240143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 240243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 240343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsFalse() const { 240543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsFalse(); 240643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 240743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 240843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsFunction() const { 241043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsJSFunction(); 241143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 241243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 241343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2414e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgbool Value::IsName() const { 2415e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org return Utils::OpenHandle(this)->IsName(); 2416e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 2417e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 2418e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 241918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool Value::FullIsString() const { 242018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org bool result = Utils::OpenHandle(this)->IsString(); 2421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(result, QuickIsString()); 242218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return result; 242343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 242443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 242543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2426e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool Value::IsSymbol() const { 2427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::OpenHandle(this)->IsSymbol(); 2428e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2430e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 24313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsArray() const { 243243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsJSArray(); 243343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 243443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 243543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 243657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgbool Value::IsArrayBuffer() const { 243757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org return Utils::OpenHandle(this)->IsJSArrayBuffer(); 243857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org} 243957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 244057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 24411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool Value::IsArrayBufferView() const { 24421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Utils::OpenHandle(this)->IsJSArrayBufferView(); 24431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 24441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 244657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgbool Value::IsTypedArray() const { 244757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org return Utils::OpenHandle(this)->IsJSTypedArray(); 244857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org} 244957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 245057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 2451af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ 2452af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org bool Value::Is##Type##Array() const { \ 2453af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); \ 2454af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return obj->IsJSTypedArray() && \ 2455af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org i::JSTypedArray::cast(*obj)->type() == kExternal##Type##Array; \ 245657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 245757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 2458af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) 245957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 246057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#undef VALUE_IS_TYPED_ARRAY 246157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 246257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 24631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool Value::IsDataView() const { 24641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Utils::OpenHandle(this)->IsJSDataView(); 24651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 24661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsObject() const { 246943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsJSObject(); 247043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 247143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 247243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsNumber() const { 247443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsNumber(); 247543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 247643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 247743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define VALUE_IS_SPECIFIC_TYPE(Type, Class) \ 24796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org bool Value::Is##Type() const { \ 24806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); \ 24816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (!obj->IsHeapObject()) return false; \ 24826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); \ 24836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return obj->HasSpecificClassOf(isolate->heap()->Class##_string()); \ 24846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 24856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 24866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(ArgumentsObject, Arguments) 24876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(BooleanObject, Boolean) 24886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(NumberObject, Number) 24896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(StringObject, String) 24906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(SymbolObject, Symbol) 24916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(Date, Date) 24926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(Map, Map) 24936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(Set, Set) 24946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(WeakMap, WeakMap) 24956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgVALUE_IS_SPECIFIC_TYPE(WeakSet, WeakSet) 24966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 24976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#undef VALUE_IS_SPECIFIC_TYPE 24985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 24995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsBoolean() const { 250143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->IsBoolean(); 250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsExternal() const { 2506eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return Utils::OpenHandle(this)->IsExternal(); 250743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 250843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::IsInt32() const { 251143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 251243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) return true; 251343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsNumber()) { 2514ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org return i::IsInt32Double(obj->Number()); 251543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 251643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 251743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 251843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 251943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2520ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgbool Value::IsUint32() const { 2521ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 2522ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (obj->IsSmi()) return i::Smi::cast(*obj)->value() >= 0; 2523ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (obj->IsNumber()) { 2524ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org double value = obj->Number(); 2525ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org return !i::IsMinusZero(value) && 25264ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org value >= 0 && 25274ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org value <= i::kMaxUInt32 && 25284ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org value == i::FastUI2D(i::FastD2UI(value)); 2529ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 2530ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return false; 2531ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2532ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2533ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 253484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgstatic bool CheckConstructor(i::Isolate* isolate, 253584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::JSObject> obj, 253684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org const char* class_name) { 25379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org i::Handle<i::Object> constr(obj->map()->constructor(), isolate); 2538eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!constr->IsJSFunction()) return false; 25399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast(constr); 25409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return func->shared()->native() && constr.is_identical_to( 25419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org i::Object::GetProperty(isolate, 25429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org isolate->js_builtins_object(), 25439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org class_name).ToHandleChecked()); 254484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 254584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 254684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 254784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgbool Value::IsNativeError() const { 254884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 254984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org if (obj->IsJSObject()) { 255084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::JSObject> js_obj(i::JSObject::cast(*obj)); 2551e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = js_obj->GetIsolate(); 255284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return CheckConstructor(isolate, js_obj, "$Error") || 255384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$EvalError") || 255484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$RangeError") || 255584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$ReferenceError") || 255684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$SyntaxError") || 255784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$TypeError") || 255884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org CheckConstructor(isolate, js_obj, "$URIError"); 255984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org } else { 256084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return false; 256184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org } 256284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 256384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 256484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 256526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgbool Value::IsRegExp() const { 256626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 256726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return obj->IsJSRegExp(); 256826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 256926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 257026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 25713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<String> Value::ToString() const { 257243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 257343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> str; 257443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsString()) { 257543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen str = obj; 257643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 25777979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 25787979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToString"); 25797979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 25807979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 25812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToString( 25822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&str); 25837979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); 258443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2585f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>(str); 258643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 258743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 258843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<String> Value::ToDetailString() const { 259043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 259143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> str; 259243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsString()) { 259343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen str = obj; 259443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 25957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 25967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToDetailString"); 25977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 25987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 25992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToDetailString( 26002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&str); 26017979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); 260243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2603f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>(str); 260443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 260543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 260643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<v8::Object> Value::ToObject() const { 260843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 260943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> val; 261043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsJSObject()) { 261143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen val = obj; 261243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 26137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 26147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToObject"); 26157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 26167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 26172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToObject( 26182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&val); 26197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 262043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2621f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Object>(val); 262243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 262343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 262443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Boolean> Value::ToBoolean() const { 262643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 26278ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org if (obj->IsBoolean()) { 2628f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Boolean>(obj); 26298ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } else { 26307979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 26317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToBoolean"); 26327979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 26339faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org i::Handle<i::Object> val = 26349faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org isolate->factory()->ToBoolean(obj->BooleanValue()); 2635f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Boolean>(val); 26368ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } 263743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 263843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 263943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Number> Value::ToNumber() const { 264143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 264243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 264343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsNumber()) { 264443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 264543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2646e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 26477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToNumber"); 26487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 26497979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 26502ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToNumber( 26512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 26527979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Number>()); 265343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2654f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Number>(num); 265543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 265643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 265743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Integer> Value::ToInteger() const { 265943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 266043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 266143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 266243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 266343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2664e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 26657979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToInteger"); 26667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 26677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 26682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToInteger( 26692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 26707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); 267143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2672f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Integer>(num); 267343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 267443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 267543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 267693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgvoid i::Internals::CheckInitializedImpl(v8::Isolate* external_isolate) { 26771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); 26784ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 26794ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->IsInitialized() && 26804ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org !isolate->IsDead(), 26814ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::internal::Internals::CheckInitialized()", 26824ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Isolate is not initialized or V8 has died"); 26831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 26841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 26851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 268618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid External::CheckCast(v8::Value* that) { 26874ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(Utils::OpenHandle(that)->IsExternal(), 26884ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::External::Cast()", 26894ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to external"); 269043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 269143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 269243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 269318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Object::CheckCast(Value* that) { 269443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 26954ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSObject(), 26964ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Object::Cast()", 26974ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to object"); 269843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 269943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 270043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 270118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Function::CheckCast(Value* that) { 270243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 27034ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSFunction(), 27044ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Function::Cast()", 27054ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to function"); 270643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 270743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 270843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2709e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgvoid v8::Name::CheckCast(v8::Value* that) { 2710e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2711e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org Utils::ApiCheck(obj->IsName(), 2712e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org "v8::Name::Cast()", 2713e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org "Could not convert to name"); 2714e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 2715e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 2716e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 271718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::String::CheckCast(v8::Value* that) { 271843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 27194ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsString(), 27204ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::String::Cast()", 27214ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to string"); 272243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 272343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 272443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2725e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid v8::Symbol::CheckCast(v8::Value* that) { 2726e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 27274ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsSymbol(), 27284ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Symbol::Cast()", 27294ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to symbol"); 2730e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2731e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2732e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 273318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Number::CheckCast(v8::Value* that) { 273443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 27354ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsNumber(), 27364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Number::Cast()", 27374ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to number"); 273843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 273943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 274043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 274118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Integer::CheckCast(v8::Value* that) { 274243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 27434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsNumber(), 27444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Integer::Cast()", 27454ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to number"); 274643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 274743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 274843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 274918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Array::CheckCast(Value* that) { 275043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(that); 27514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSArray(), 27524ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Array::Cast()", 27534ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to array"); 275443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 275543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 275643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2757486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgvoid v8::Promise::CheckCast(Value* that) { 2758486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Utils::ApiCheck(that->IsPromise(), 2759486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org "v8::Promise::Cast()", 2760486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org "Could not convert to promise"); 2761486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 2762486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 2763486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 27642904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgvoid v8::Promise::Resolver::CheckCast(Value* that) { 27652904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org Utils::ApiCheck(that->IsPromise(), 27662904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org "v8::Promise::Resolver::Cast()", 27672904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org "Could not convert to promise resolver"); 27682904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org} 27692904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org 27702904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org 2771ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgvoid v8::ArrayBuffer::CheckCast(Value* that) { 2772ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 27734ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSArrayBuffer(), 27744ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::ArrayBuffer::Cast()", 27754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to ArrayBuffer"); 2776ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 2777ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 2778ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 27791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid v8::ArrayBufferView::CheckCast(Value* that) { 27801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 27814ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSArrayBufferView(), 27824ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::ArrayBufferView::Cast()", 27834ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to ArrayBufferView"); 27841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 27851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 27861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2787f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgvoid v8::TypedArray::CheckCast(Value* that) { 2788f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 27894ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSTypedArray(), 27904ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::TypedArray::Cast()", 27914ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to TypedArray"); 2792f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 2793f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2794f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2795af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define CHECK_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ 2796af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org void v8::Type##Array::CheckCast(Value* that) { \ 2797af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); \ 2798af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Utils::ApiCheck(obj->IsJSTypedArray() && \ 2799af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org i::JSTypedArray::cast(*obj)->type() == \ 2800af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org kExternal##Type##Array, \ 2801af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org "v8::" #Type "Array::Cast()", \ 2802af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org "Could not convert to " #Type "Array"); \ 2803f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } 2804f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2805f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2806af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(CHECK_TYPED_ARRAY_CAST) 2807f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2808f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#undef CHECK_TYPED_ARRAY_CAST 2809f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 2810f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 28111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid v8::DataView::CheckCast(Value* that) { 28121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 28134ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSDataView(), 28144ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::DataView::Cast()", 28154ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to DataView"); 28161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 28171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 28181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 281918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::Date::CheckCast(v8::Value* that) { 28205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2821e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = NULL; 2822e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2823e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 2824e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org obj->HasSpecificClassOf(isolate->heap()->Date_string()), 28254ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Date::Cast()", 28264ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to date"); 28275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 28285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 28295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 283084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgvoid v8::StringObject::CheckCast(v8::Value* that) { 283184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2832e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = NULL; 2833e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2834e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 2835e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org obj->HasSpecificClassOf(isolate->heap()->String_string()), 28364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::StringObject::Cast()", 28374ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to StringObject"); 283884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 283984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 284084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 2841e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid v8::SymbolObject::CheckCast(v8::Value* that) { 2842e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2843e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = NULL; 2844e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2845e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 2846e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org obj->HasSpecificClassOf(isolate->heap()->Symbol_string()), 28474ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::SymbolObject::Cast()", 28484ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to SymbolObject"); 2849e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2850e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2851e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 285284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgvoid v8::NumberObject::CheckCast(v8::Value* that) { 285384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2854e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = NULL; 2855e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2856e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 2857e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org obj->HasSpecificClassOf(isolate->heap()->Number_string()), 28584ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::NumberObject::Cast()", 28594ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to NumberObject"); 286084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 286184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 286284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 286384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgvoid v8::BooleanObject::CheckCast(v8::Value* that) { 286484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 2865e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = NULL; 2866e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2867e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Utils::ApiCheck(isolate != NULL && 2868e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org obj->HasSpecificClassOf(isolate->heap()->Boolean_string()), 28694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::BooleanObject::Cast()", 28704ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to BooleanObject"); 287184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 287284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 287384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 2874b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgvoid v8::RegExp::CheckCast(v8::Value* that) { 2875b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(that); 28764ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->IsJSRegExp(), 28774ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::RegExp::Cast()", 28784ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Could not convert to regular expression"); 2879b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 2880b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 2881b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 28823291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::BooleanValue() const { 28839faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org return Utils::OpenHandle(this)->BooleanValue(); 288443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 288543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 288643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28873291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgdouble Value::NumberValue() const { 288843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 288943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 289043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsNumber()) { 289143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 289243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2893e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 28947979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "NumberValue"); 28957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 28967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 28972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToNumber( 28982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 28995de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, base::OS::nan_value()); 290043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 290143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return num->Number(); 290243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 290343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 290443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint64_t Value::IntegerValue() const { 290643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 290743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 290843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsNumber()) { 290943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 291043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2911e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 29127979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "IntegerValue"); 29137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 29147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 29152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToInteger( 29162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 29177979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 291843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 291943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (num->IsSmi()) { 292043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*num)->value(); 292143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 292243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<int64_t>(num->Number()); 292343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 292443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 292543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 292643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Int32> Value::ToInt32() const { 292843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 292943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 293043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 293143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 293243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2933e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 29347979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToInt32"); 29357979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 29367979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 29372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); 29387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Int32>()); 293943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2940f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Int32>(num); 294143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 294243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 294343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Uint32> Value::ToUint32() const { 294543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 294643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> num; 294743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 294843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen num = obj; 294943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2950e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 29517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToUInt32"); 29527979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 29537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 29542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToUint32( 29552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 29567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Uint32>()); 295743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2958f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Uint32>(num); 295943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 296043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 296143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<Uint32> Value::ToArrayIndex() const { 296343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 296443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 296543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (i::Smi::cast(*obj)->value() >= 0) return Utils::Uint32ToLocal(obj); 296643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Local<Uint32>(); 296743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2968e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 29697979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "ToArrayIndex"); 29707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 29717979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 29722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> string_obj; 29732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToString( 29742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&string_obj); 29757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Uint32>()); 297643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> str = i::Handle<i::String>::cast(string_obj); 297743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint32_t index; 297843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (str->AsArrayIndex(&index)) { 297943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> value; 298043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (index <= static_cast<uint32_t>(i::Smi::kMaxValue)) { 298109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org value = i::Handle<i::Object>(i::Smi::FromInt(index), isolate); 298243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2983ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org value = isolate->factory()->NewNumber(index); 298443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 298543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::Uint32ToLocal(value); 298643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 298743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Local<Uint32>(); 298843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 298943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 299043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint32_t Value::Int32Value() const { 299243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 299343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 299443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*obj)->value(); 299543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2996e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 2997ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Int32Value (slow)"); 29987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 29997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 30002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> num; 30012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); 30027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 300343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (num->IsSmi()) { 300443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*num)->value(); 300543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 300643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<int32_t>(num->Number()); 300743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 300843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 300943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 301043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::Equals(Handle<Value> that) const { 3013ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 30141845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this, true); 30151845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), 30164ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Value::Equals()", 30174ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Reading from empty handle")) { 301843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 30198ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } 3020ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Equals"); 30217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 302243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> other = Utils::OpenHandle(*that); 3023496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org // If both obj and other are JSObjects, we'd better compare by identity 3024496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org // immediately when going into JS builtin. The reason is Invoke 3025496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org // would overwrite global object receiver with global proxy. 3026496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org if (obj->IsJSObject() && other->IsJSObject()) { 3027496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org return *obj == *other; 3028496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org } 3029a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org i::Handle<i::Object> args[] = { other }; 30307979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 30312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 30322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 3033fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org "EQUALS", obj, arraysize(args), args).ToHandle(&result); 30347979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 303543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return *result == i::Smi::FromInt(i::EQUAL); 303643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 303743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 303843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Value::StrictEquals(Handle<Value> that) const { 3040ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 30411845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this, true); 30421845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), 30434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Value::StrictEquals()", 30444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Reading from empty handle")) { 304543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 30468ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } 3047ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "StrictEquals"); 304843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> other = Utils::OpenHandle(*that); 304943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Must check HeapNumber first, since NaN !== NaN. 305043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsHeapNumber()) { 305143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!other->IsNumber()) return false; 305243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen double x = obj->Number(); 305343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen double y = other->Number(); 305443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Must check explicitly for NaN:s on Windows, but -0 works fine. 305577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org return x == y && !std::isnan(x) && !std::isnan(y); 305643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (*obj == *other) { // Also covers Booleans. 305743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 305843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (obj->IsSmi()) { 305943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return other->IsNumber() && obj->Number() == other->Number(); 306043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (obj->IsString()) { 306143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return other->IsString() && 30622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::String::Equals(i::Handle<i::String>::cast(obj), 30632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::String>::cast(other)); 306443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (obj->IsUndefined() || obj->IsUndetectableObject()) { 306543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return other->IsUndefined() || other->IsUndetectableObject(); 306643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 306743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 306843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 306943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 307043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 307143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30723d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.orgbool Value::SameValue(Handle<Value> that) const { 30731845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this, true); 30741845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), 30754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Value::SameValue()", 30764ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Reading from empty handle")) { 30773d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return false; 30783d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 30793d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org i::Handle<i::Object> other = Utils::OpenHandle(*that); 30803d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return obj->SameValue(*other); 30813d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org} 30823d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 30833d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 30843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orguint32_t Value::Uint32Value() const { 308543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 308643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 308743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*obj)->value(); 308843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 3089e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); 30907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org LOG_API(isolate, "Uint32Value"); 30917979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 30927979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 30932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> num; 30942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToUint32( 30952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&num); 30967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, 0); 309743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (num->IsSmi()) { 309843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*num)->value(); 309943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 310043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<uint32_t>(num->Number()); 310143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 310243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 310343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 310443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 310543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31069bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgbool v8::Object::Set(v8::Handle<Value> key, v8::Handle<Value> value) { 31077979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Set()", return false); 31097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3110ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 311143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> self = Utils::OpenHandle(this); 311243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 311343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 31147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 31159bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org has_pending_exception = 31169bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org i::Runtime::SetObjectProperty(isolate, self, key_obj, value_obj, 31179bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org i::SLOPPY).is_null(); 31187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 311943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 312043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 312143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 312243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3123ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgbool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { 31247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3125ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Set()", return false); 31267979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 3128ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3129ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 31307979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 31319e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org has_pending_exception = i::JSObject::SetElement( 31329e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org self, index, value_obj, NONE, i::SLOPPY).is_null(); 31337979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3134ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return true; 3135ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 3136ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 3137ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 313865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgbool v8::Object::ForceSet(v8::Handle<Value> key, 313965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<Value> value, 314065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::PropertyAttribute attribs) { 31417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3142ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::ForceSet()", return false); 31437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3144ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 314565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 314665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 314765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 31487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 3149248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org has_pending_exception = i::Runtime::DefineObjectProperty( 315065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org self, 315165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org key_obj, 315265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org value_obj, 31538f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static_cast<PropertyAttributes>(attribs)).is_null(); 31547979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 315565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return true; 315665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 315765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 315865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 31590cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgbool v8::Object::SetPrivate(v8::Handle<Private> key, v8::Handle<Value> value) { 3160fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org return ForceSet(v8::Handle<Value>(reinterpret_cast<Value*>(*key)), 3161fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org value, DontEnum); 31620cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 31630cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 31640cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 3165e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgbool v8::Object::ForceDelete(v8::Handle<Value> key) { 31667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::ForceDelete()", return false); 31687979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3169ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 3170e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3171e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 3172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 317388d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // When deleting a property on the global object using ForceDelete 317488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // deoptimize all functions as optimized code does not check for the hole 317588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // value with DontDelete properties. We have to deoptimize all contexts 317688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // because of possible cross-context inlined functions. 317788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org if (self->IsJSGlobalProxy() || self->IsGlobalObject()) { 3178876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org i::Deoptimizer::DeoptimizeAll(isolate); 317988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org } 3180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31817979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 31829e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org i::Handle<i::Object> obj; 31839e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org has_pending_exception = !i::Runtime::DeleteObjectProperty( 31849e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org isolate, self, key_obj, i::JSReceiver::FORCE_DELETION).ToHandle(&obj); 31857979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3186e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org return obj->IsTrue(); 3187e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 3188e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 3189e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 319043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<Value> v8::Object::Get(v8::Handle<Value> key) { 31917979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Get()", return Local<v8::Value>()); 31937979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 319443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> self = Utils::OpenHandle(this); 319543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 31967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 3197202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Handle<i::Object> result; 3198202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org has_pending_exception = 3199202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org !i::Runtime::GetObjectProperty(isolate, self, key_obj).ToHandle(&result); 32007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 320143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 320243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 320343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 320443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3205ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgLocal<Value> v8::Object::Get(uint32_t index) { 32067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3207ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Get()", return Local<v8::Value>()); 32087979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3209ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 32107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 3211202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Handle<i::Object> result; 3212202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org has_pending_exception = 3213202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org !i::Object::GetElement(isolate, self, index).ToHandle(&result); 32147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 3215ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return Utils::ToLocal(result); 3216ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 3217ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 3218ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 32190cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLocal<Value> v8::Object::GetPrivate(v8::Handle<Private> key) { 32200cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return Get(v8::Handle<Value>(reinterpret_cast<Value*>(*key))); 32210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 32220cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 32230cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 3224717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.orgPropertyAttribute v8::Object::GetPropertyAttributes(v8::Handle<Value> key) { 3225717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 32261845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org ON_BAILOUT(isolate, "v8::Object::GetPropertyAttributes()", 3227717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org return static_cast<PropertyAttribute>(NONE)); 3228717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org ENTER_V8(isolate); 3229717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org i::HandleScope scope(isolate); 3230717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3231717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 3232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!key_obj->IsName()) { 3233717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org EXCEPTION_PREAMBLE(isolate); 32342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::ToString( 32352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, key_obj).ToHandle(&key_obj); 3236717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, static_cast<PropertyAttribute>(NONE)); 3237717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org } 3238e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Name> key_name = i::Handle<i::Name>::cast(key_obj); 3239eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3240eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<PropertyAttributes> result = 32411845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::JSReceiver::GetPropertyAttributes(self, key_name); 3242eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !result.has_value; 3243eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, static_cast<PropertyAttribute>(NONE)); 3244eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org if (result.value == ABSENT) return static_cast<PropertyAttribute>(NONE); 3245eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return static_cast<PropertyAttribute>(result.value); 3246717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 3247717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 3248717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 3249d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgLocal<Value> v8::Object::GetOwnPropertyDescriptor(Local<String> key) { 3250d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3251d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org ON_BAILOUT(isolate, "v8::Object::GetOwnPropertyDescriptor()", 3252d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Local<Value>()); 3253d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org ENTER_V8(isolate); 3254d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 3255d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::Name> key_name = Utils::OpenHandle(*key); 3256d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::Object> args[] = { obj, key_name }; 3257d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3258d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org i::Handle<i::Object> result; 3259d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org has_pending_exception = !CallV8HeapFunction( 3260d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org "ObjectGetOwnPropertyDescriptor", 3261d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org isolate->factory()->undefined_value(), 3262fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(args), 3263d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org args).ToHandle(&result); 3264d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 3265d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return Utils::ToLocal(result); 3266d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 3267d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 3268d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 326943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<Value> v8::Object::GetPrototype() { 32707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3271fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org ON_BAILOUT(isolate, "v8::Object::GetPrototype()", return Local<v8::Value>()); 32727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 327343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> self = Utils::OpenHandle(this); 32749bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org i::PrototypeIterator iter(isolate, self); 32759bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org return Utils::ToLocal(i::PrototypeIterator::GetCurrent(iter)); 327643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 327743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 327843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32795c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool v8::Object::SetPrototype(Handle<Value> value) { 32807979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3281ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::SetPrototype()", return false); 32827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 32835c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 32845c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 328544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org // We do not allow exceptions thrown while setting the prototype 328644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org // to propagate outside. 328744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org TryCatch try_catch; 32887979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 328931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org i::MaybeHandle<i::Object> result = 329031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org i::JSObject::SetPrototype(self, value_obj, false); 32915c838251403b0be9a882540f1922577abba4c872ager@chromium.org has_pending_exception = result.is_null(); 32927979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 32935c838251403b0be9a882540f1922577abba4c872ager@chromium.org return true; 32945c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 32955c838251403b0be9a882540f1922577abba4c872ager@chromium.org 32965c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3297900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.orgLocal<Object> v8::Object::FindInstanceInPrototypeChain( 3298900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org v8::Handle<FunctionTemplate> tmpl) { 32997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 33007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, 3301ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::Object::FindInstanceInPrototypeChain()", 3302900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org return Local<v8::Object>()); 33037979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 330493720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org i::PrototypeIterator iter(isolate, *Utils::OpenHandle(this), 330593720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org i::PrototypeIterator::START_AT_RECEIVER); 3306900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org i::FunctionTemplateInfo* tmpl_info = *Utils::OpenHandle(*tmpl); 330793720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org while (!tmpl_info->IsTemplateFor(iter.GetCurrent())) { 330893720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org iter.Advance(); 330993720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org if (iter.IsAtEnd()) { 331093720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org return Local<Object>(); 331193720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org } 3312900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org } 331393720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org return Utils::ToLocal( 331493720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org i::handle(i::JSObject::cast(iter.GetCurrent()), isolate)); 3315900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org} 3316900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org 3317900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org 33185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgLocal<Array> v8::Object::GetPropertyNames() { 33197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3320ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::GetPropertyNames()", 3321ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::Array>()); 33227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 33237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::HandleScope scope(isolate); 33245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3325202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3326202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Handle<i::FixedArray> value; 33279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org has_pending_exception = !i::JSReceiver::GetKeys( 33289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org self, i::JSReceiver::INCLUDE_PROTOS).ToHandle(&value); 3329202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Array>()); 33305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Because we use caching to speed up enumeration it is important 33315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // to never change the result of the basic enumeration function so 33325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // we clone the result. 3333ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Handle<i::FixedArray> elms = isolate->factory()->CopyFixedArray(value); 3334ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Handle<i::JSArray> result = 3335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->factory()->NewJSArrayWithElements(elms); 33367979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return Utils::ToLocal(scope.CloseAndEscape(result)); 33375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 33385a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 33395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 33406d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgLocal<Array> v8::Object::GetOwnPropertyNames() { 33416d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 33426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org ON_BAILOUT(isolate, "v8::Object::GetOwnPropertyNames()", 33436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return Local<v8::Array>()); 33446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org ENTER_V8(isolate); 33456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::HandleScope scope(isolate); 33466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3347202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3348202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Handle<i::FixedArray> value; 33499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org has_pending_exception = !i::JSReceiver::GetKeys( 3350fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org self, i::JSReceiver::OWN_ONLY).ToHandle(&value); 3351202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Array>()); 33526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Because we use caching to speed up enumeration it is important 33536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // to never change the result of the basic enumeration function so 33546d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // we clone the result. 33556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Handle<i::FixedArray> elms = isolate->factory()->CopyFixedArray(value); 33566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Handle<i::JSArray> result = 33576d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org isolate->factory()->NewJSArrayWithElements(elms); 33586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return Utils::ToLocal(scope.CloseAndEscape(result)); 33596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 33606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 33616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 336243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<String> v8::Object::ObjectProtoToString() { 3363f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); 3364f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); 3365f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ON_BAILOUT(i_isolate, "v8::Object::ObjectProtoToString()", 3366ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::String>()); 3367f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ENTER_V8(i_isolate); 336843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> self = Utils::OpenHandle(this); 336943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3370f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org i::Handle<i::Object> name(self->class_name(), i_isolate); 337143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 337243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Native implementation of Object.prototype.toString (v8natives.js): 3373f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // var c = %_ClassOf(this); 337443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // if (c === 'Arguments') c = 'Object'; 337543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // return "[object " + c + "]"; 337643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 337743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!name->IsString()) { 3378f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return v8::String::NewFromUtf8(isolate, "[object ]"); 337943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 338043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> class_name = i::Handle<i::String>::cast(name); 33815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (i::String::Equals(class_name, 33825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org i_isolate->factory()->Arguments_string())) { 3383f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return v8::String::NewFromUtf8(isolate, "[object Object]"); 338443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 338543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* prefix = "[object "; 338643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Local<String> str = Utils::ToLocal(class_name); 338743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* postfix = "]"; 338843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3389c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org int prefix_len = i::StrLength(prefix); 339057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org int str_len = str->Utf8Length(); 3391c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org int postfix_len = i::StrLength(postfix); 339243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3393c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org int buf_len = prefix_len + str_len + postfix_len; 3394720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org i::ScopedVector<char> buf(buf_len); 339543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 339643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Write prefix. 3397720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org char* ptr = buf.start(); 3398d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org i::MemCopy(ptr, prefix, prefix_len * v8::internal::kCharSize); 339943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ptr += prefix_len; 340043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 340143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Write real content. 340257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org str->WriteUtf8(ptr, str_len); 340343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ptr += str_len; 340443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 340543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Write postfix. 3406d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org i::MemCopy(ptr, postfix, postfix_len * v8::internal::kCharSize); 340743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 340843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy the buffer into a heap-allocated string and return it. 3409f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Local<String> result = v8::String::NewFromUtf8( 3410f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org isolate, buf.start(), String::kNormalString, buf_len); 341143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 341243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 341343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 341443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 341543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 341643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3417beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgLocal<String> v8::Object::GetConstructorName() { 34187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::GetConstructorName()", 3420ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::String>()); 34217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3422beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3423beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org i::Handle<i::String> name(self->constructor_name()); 3424beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org return Utils::ToLocal(name); 3425beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org} 3426beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 3427beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 3428e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool v8::Object::Delete(v8::Handle<Value> key) { 34297979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3430ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Delete()", return false); 34317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3432ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 343343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3434e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 3435e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EXCEPTION_PREAMBLE(isolate); 34369e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org i::Handle<i::Object> obj; 34379e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org has_pending_exception = !i::Runtime::DeleteObjectProperty( 34389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org isolate, self, key_obj, i::JSReceiver::NORMAL_DELETION).ToHandle(&obj); 3439e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3440e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return obj->IsTrue(); 344143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 344243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 344343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34440cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgbool v8::Object::DeletePrivate(v8::Handle<Private> key) { 34450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return Delete(v8::Handle<Value>(reinterpret_cast<Value*>(*key))); 34460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 34470cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 34480cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 3449e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool v8::Object::Has(v8::Handle<Value> key) { 34507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 34517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::Has()", return false); 34527979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::JSReceiver> self = Utils::OpenHandle(this); 3454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); 3455e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EXCEPTION_PREAMBLE(isolate); 34569e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org i::Handle<i::Object> obj; 34579e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org has_pending_exception = !i::Runtime::HasObjectProperty( 34589e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org isolate, self, key_obj).ToHandle(&obj); 3459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return obj->IsTrue(); 346143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 346243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 346343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34640cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgbool v8::Object::HasPrivate(v8::Handle<Private> key) { 3465fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // TODO(rossberg): this should use HasOwnProperty, but we'd need to 3466fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // generalise that to a (noy yet existant) Name argument first. 34670cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return Has(v8::Handle<Value>(reinterpret_cast<Value*>(*key))); 34680cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 34690cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 34700cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 347143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::Delete(uint32_t index) { 34727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 34737979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::DeleteProperty()", 3474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 34757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 34762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(reinterpret_cast<Isolate*>(isolate)); 347743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> self = Utils::OpenHandle(this); 34789e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 34799e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 34809e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org i::Handle<i::Object> obj; 34819e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org has_pending_exception = 34829e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org !i::JSReceiver::DeleteElement(self, index).ToHandle(&obj); 34839e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 34849e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org return obj->IsTrue(); 348543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 348643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 348743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 348843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::Has(uint32_t index) { 34897979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 34907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::HasProperty()", return false); 349143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3492eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3493eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = i::JSReceiver::HasElement(self, index); 3494eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 3495eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3496eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return maybe.value; 349743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 349843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 349943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3500e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgtemplate<typename Getter, typename Setter, typename Data> 3501bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgstatic inline bool ObjectSetAccessor(Object* obj, 3502e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org Handle<Name> name, 3503e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org Getter getter, 3504e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org Setter setter, 3505bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Data data, 3506bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessControl settings, 3507bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org PropertyAttribute attributes) { 3508bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::Isolate* isolate = Utils::OpenHandle(obj)->GetIsolate(); 3509bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org ON_BAILOUT(isolate, "v8::Object::SetAccessor()", return false); 3510bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org ENTER_V8(isolate); 3511bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::HandleScope scope(isolate); 3512bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<AccessorSignature> signature; 3513bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::Handle<i::AccessorInfo> info = MakeAccessorInfo( 3514bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org name, getter, setter, data, settings, attributes, signature); 3515750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (info.is_null()) return false; 3516750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool fast = Utils::OpenHandle(obj)->HasFastProperties(); 35178496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Handle<i::Object> result; 35188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org ASSIGN_RETURN_ON_EXCEPTION_VALUE( 35198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org isolate, result, 35208496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::JSObject::SetAccessor(Utils::OpenHandle(obj), info), 35218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org false); 35228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org if (result->IsUndefined()) return false; 352308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (fast) i::JSObject::MigrateSlowToFast(Utils::OpenHandle(obj), 0); 3524750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return true; 3525750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 3526750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 3527750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 35289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgbool Object::SetAccessor(Handle<String> name, 3529bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessorGetterCallback getter, 3530bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessorSetterCallback setter, 3531bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org v8::Handle<Value> data, 3532bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org AccessControl settings, 3533bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org PropertyAttribute attributes) { 3534bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org return ObjectSetAccessor( 3535bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org this, name, getter, setter, data, settings, attributes); 3536750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 3537750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 3538750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 3539e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgbool Object::SetAccessor(Handle<Name> name, 3540e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameGetterCallback getter, 3541e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessorNameSetterCallback setter, 3542e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Handle<Value> data, 3543e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org AccessControl settings, 3544e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org PropertyAttribute attributes) { 3545e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org return ObjectSetAccessor( 3546e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org this, name, getter, setter, data, settings, attributes); 3547e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 3548e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 3549e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 3550e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgbool Object::SetDeclaredAccessor(Local<Name> name, 35513d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Local<DeclaredAccessorDescriptor> descriptor, 35523d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PropertyAttribute attributes, 35533d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org AccessControl settings) { 3554bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org void* null = NULL; 3555bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org return ObjectSetAccessor( 3556bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org this, name, descriptor, null, null, settings, attributes); 35579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} 35589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 35599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 3560e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgvoid Object::SetAccessorProperty(Local<Name> name, 3561a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Local<Function> getter, 3562a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<Function> setter, 3563a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org PropertyAttribute attribute, 3564a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org AccessControl settings) { 3565975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // TODO(verwaest): Remove |settings|. 3566e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(v8::DEFAULT, settings); 3567a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3568a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org ON_BAILOUT(isolate, "v8::Object::SetAccessorProperty()", return); 3569a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org ENTER_V8(isolate); 3570a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::HandleScope scope(isolate); 3571a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter); 3572a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true); 3573a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (setter_i.is_null()) setter_i = isolate->factory()->null_value(); 3574a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this), 3575a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org v8::Utils::OpenHandle(*name), 3576a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org getter_i, 3577a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org setter_i, 3578975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static_cast<PropertyAttributes>(attribute)); 3579a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org} 3580a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 3581a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 35828e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgbool v8::Object::HasOwnProperty(Handle<String> key) { 35838e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 35848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()", 35858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return false); 3586eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3587eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = i::JSReceiver::HasOwnProperty(Utils::OpenHandle(this), 3588eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Utils::OpenHandle(*key)); 3589eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 3590eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3591eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return maybe.value; 35928e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org} 35938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 35948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 359543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::HasRealNamedProperty(Handle<String> key) { 35967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 35977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::HasRealNamedProperty()", 3598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 3599eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3600eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = i::JSObject::HasRealNamedProperty( 3601eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Utils::OpenHandle(this), Utils::OpenHandle(*key)); 3602eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 3603eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3604eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return maybe.value; 360543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 360643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 360743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 360843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::HasRealIndexedProperty(uint32_t index) { 3609e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3610e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ON_BAILOUT(isolate, "v8::Object::HasRealIndexedProperty()", 3611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 3612eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3613eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = 3614eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org i::JSObject::HasRealElementProperty(Utils::OpenHandle(this), index); 3615eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 3616eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3617eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return maybe.value; 361843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 361943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 362043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 362143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::HasRealNamedCallbackProperty(Handle<String> key) { 36227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 36237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, 3624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::Object::HasRealNamedCallbackProperty()", 3625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 36267979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3627eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 3628eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Maybe<bool> maybe = i::JSObject::HasRealNamedCallbackProperty( 3629eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Utils::OpenHandle(this), Utils::OpenHandle(*key)); 3630eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org has_pending_exception = !maybe.has_value; 3631eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 3632eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org return maybe.value; 363343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 363443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 363543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 363643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::HasNamedLookupInterceptor() { 36377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 36387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::HasNamedLookupInterceptor()", 3639ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 364043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->HasNamedInterceptor(); 364143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 364243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 364343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 364443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::Object::HasIndexedLookupInterceptor() { 36457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 36467979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::HasIndexedLookupInterceptor()", 3647ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 364843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::OpenHandle(this)->HasIndexedInterceptor(); 364943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 365043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 365143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36527dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgstatic Local<Value> GetPropertyByLookup(i::LookupIterator* it) { 36537dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org // If the property being looked up is a callback, it can throw an exception. 36547dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org EXCEPTION_PREAMBLE(it->isolate()); 36558f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org i::Handle<i::Object> result; 36567dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org has_pending_exception = !i::Object::GetProperty(it).ToHandle(&result); 36577dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(it->isolate(), Local<Value>()); 365844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 3659e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org if (it->IsFound()) return Utils::ToLocal(result); 3660e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org return Local<Value>(); 366144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 366244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 366344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 366498aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.orgLocal<Value> v8::Object::GetRealNamedPropertyInPrototypeChain( 36654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Handle<String> key) { 36667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 36677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, 3668ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::Object::GetRealNamedPropertyInPrototypeChain()", 366943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Local<Value>()); 36707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 367143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); 367243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 36737dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::PrototypeIterator iter(isolate, self_obj); 36747dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org if (iter.IsAtEnd()) return Local<Value>(); 367521d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org i::Handle<i::Object> proto = i::PrototypeIterator::GetCurrent(iter); 367621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org i::LookupIterator it(self_obj, key_obj, i::Handle<i::JSReceiver>::cast(proto), 36779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 36787dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return GetPropertyByLookup(&it); 367943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 368043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 368143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 368298aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.orgLocal<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { 36837979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 36847979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(isolate, "v8::Object::GetRealNamedProperty()", 3685ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<Value>()); 36867979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 368798aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); 368898aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 36897dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::LookupIterator it(self_obj, key_obj, 36909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 36917dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return GetPropertyByLookup(&it); 369298aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org} 369398aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org 369498aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org 36955a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Turns on access checks by copying the map and setting the check flag. 36965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Because the object gets a new map, existing inline cache caching 36975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// the old map of this object will fail. 36985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid v8::Object::TurnOnAccessCheck() { 36997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3700ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::TurnOnAccessCheck()", return); 37017979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3702ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 37035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 37045a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 3705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // When turning on access checks for a global object deoptimize all functions 3706a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // as optimized code does not always handle access checks. 3707a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org i::Deoptimizer::DeoptimizeGlobalObject(*obj); 3708a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3709ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org i::Handle<i::Map> new_map = i::Map::Copy(i::Handle<i::Map>(obj->map())); 3710870a0b67c822d289024711912e2512af01b66c3bager@chromium.org new_map->set_is_access_check_needed(true); 371108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org i::JSObject::MigrateToMap(obj, new_map); 37125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 37135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 37145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 37152bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.combool v8::Object::IsDirty() { 37162bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com return Utils::OpenHandle(this)->IsDirty(); 37172bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com} 37182bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com 37192bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com 37203b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.orgLocal<v8::Object> v8::Object::Clone() { 37217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3722ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::Clone()", return Local<Object>()); 37237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 37243b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 37257979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 37263484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org i::Handle<i::JSObject> result = isolate->factory()->CopyJSObject(self); 37273b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org has_pending_exception = result.is_null(); 37287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); 37293b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org return Utils::ToLocal(result); 37303b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org} 37313b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37323b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 3733c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLocal<v8::Context> v8::Object::CreationContext() { 3734c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3735c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org ON_BAILOUT(isolate, 3736c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org "v8::Object::CreationContext()", return Local<v8::Context>()); 3737c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org ENTER_V8(isolate); 3738c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3739c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org i::Context* context = self->GetCreationContext(); 3740c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return Utils::ToLocal(i::Handle<i::Context>(context)); 3741c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 3742c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 3743c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 37443b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.orgint v8::Object::GetIdentityHash() { 37457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3746ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::GetIdentityHash()", return 0); 37477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3748ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 37493b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 37503c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org return i::JSReceiver::GetOrCreateIdentityHash(self)->value(); 37513b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org} 37523b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37533b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37543b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.orgbool v8::Object::SetHiddenValue(v8::Handle<v8::String> key, 37553b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org v8::Handle<v8::Value> value) { 37567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3757ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::SetHiddenValue()", return false); 3758471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org if (value.IsEmpty()) return DeleteHiddenValue(key); 37597979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3760ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 37613b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3762c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 37634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org i::Handle<i::String> key_string = 37644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org isolate->factory()->InternalizeString(key_obj); 37653b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 3766f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com i::Handle<i::Object> result = 37674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org i::JSObject::SetHiddenProperty(self, key_string, value_obj); 3768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return *result == *self; 37693b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org} 37703b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37713b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37723b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.orgv8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) { 37737979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3774ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Object::GetHiddenValue()", 3775ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::Value>()); 37767979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 37773b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 37783b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 3779d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org i::Handle<i::String> key_string = 3780d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org isolate->factory()->InternalizeString(key_obj); 37813484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org i::Handle<i::Object> result(self->GetHiddenProperty(key_string), isolate); 37821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (result->IsTheHole()) return v8::Local<v8::Value>(); 37833b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org return Utils::ToLocal(result); 37843b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org} 37853b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37863b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 37873b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.orgbool v8::Object::DeleteHiddenValue(v8::Handle<v8::String> key) { 37887979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3789ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::DeleteHiddenValue()", return false); 37907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3791ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 37923b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 37933b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 3794d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org i::Handle<i::String> key_string = 3795d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org isolate->factory()->InternalizeString(key_obj); 37968fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org i::JSObject::DeleteHiddenProperty(self, key_string); 3797c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return true; 37983b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org} 37993b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 38003b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 38014d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.orgnamespace { 38024d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 380383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.orgstatic i::ElementsKind GetElementsKindFromExternalArrayType( 380483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org ExternalArrayType array_type) { 380583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org switch (array_type) { 3806af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define ARRAY_TYPE_TO_ELEMENTS_KIND(Type, type, TYPE, ctype, size) \ 3807af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org case kExternal##Type##Array: \ 3808af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return i::EXTERNAL_##TYPE##_ELEMENTS; 3809af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 3810af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org TYPED_ARRAYS(ARRAY_TYPE_TO_ELEMENTS_KIND) 3811af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef ARRAY_TYPE_TO_ELEMENTS_KIND 381283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org } 381383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org UNREACHABLE(); 381483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org return i::DICTIONARY_ELEMENTS; 381583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org} 381683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 381783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 38184d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.orgvoid PrepareExternalArrayElements(i::Handle<i::JSObject> object, 38194d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org void* data, 38204d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org ExternalArrayType array_type, 38214d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org int length) { 38227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = object->GetIsolate(); 38234d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org i::Handle<i::ExternalArray> array = 38247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org isolate->factory()->NewExternalArray(length, array_type, data); 38254d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 3826c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com i::Handle<i::Map> external_array_map = 38279b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org i::JSObject::GetElementsTransitionMap( 3828c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object, 3829c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GetElementsKindFromExternalArrayType(array_type)); 3830c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 383163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org i::JSObject::SetMapAndElements(object, external_array_map, array); 38324d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org} 38334d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 38344d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org} // namespace 38354d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 38364d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 38370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid v8::Object::SetIndexedPropertiesToPixelData(uint8_t* data, int length) { 38387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3839ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::SetElementsToPixelData()", return); 38407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3841ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 38424ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(length >= 0 && 3843af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org length <= i::ExternalUint8ClampedArray::kMaxLength, 38444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Object::SetIndexedPropertiesToPixelData()", 38454ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "length exceeds max acceptable value")) { 38460b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org return; 38470b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org } 38480b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 38494ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(!self->IsJSArray(), 38504ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Object::SetIndexedPropertiesToPixelData()", 38514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "JSArray is not supported")) { 38520b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org return; 38530b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org } 3854af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org PrepareExternalArrayElements(self, data, kExternalUint8ClampedArray, length); 38550b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org} 38560b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 38570b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 38582c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgbool v8::Object::HasIndexedPropertiesInPixelData() { 38592c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 38607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), "v8::HasIndexedPropertiesInPixelData()", 38617979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return false); 3862af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return self->HasExternalUint8ClampedElements(); 38632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 38642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 38652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 38662c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orguint8_t* v8::Object::GetIndexedPropertiesPixelData() { 38672c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 38687979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), "v8::GetIndexedPropertiesPixelData()", 38697979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return NULL); 3870af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org if (self->HasExternalUint8ClampedElements()) { 3871af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return i::ExternalUint8ClampedArray::cast(self->elements())-> 3872af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org external_uint8_clamped_pointer(); 38732c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } else { 38742c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return NULL; 38752c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 38762c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 38772c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 38782c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 38792c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgint v8::Object::GetIndexedPropertiesPixelDataLength() { 38802c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 38817979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), "v8::GetIndexedPropertiesPixelDataLength()", 38827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return -1); 3883af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org if (self->HasExternalUint8ClampedElements()) { 3884af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return i::ExternalUint8ClampedArray::cast(self->elements())->length(); 38852c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } else { 38862c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return -1; 38872c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 38882c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 38892c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 389083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 38913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid v8::Object::SetIndexedPropertiesToExternalArrayData( 38923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org void* data, 38933811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org ExternalArrayType array_type, 38943811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org int length) { 38957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3896ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::SetIndexedPropertiesToExternalArrayData()", return); 38977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 3898ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 38994ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(length >= 0 && length <= i::ExternalArray::kMaxLength, 39004ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Object::SetIndexedPropertiesToExternalArrayData()", 39014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "length exceeds max acceptable value")) { 39023811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return; 39033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 39043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 39054ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(!self->IsJSArray(), 39064ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Object::SetIndexedPropertiesToExternalArrayData()", 39074ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "JSArray is not supported")) { 39083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return; 39093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 39104d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org PrepareExternalArrayElements(self, data, array_type, length); 39113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 39123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 39133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 39142c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgbool v8::Object::HasIndexedPropertiesInExternalArrayData() { 39157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 39167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), 3917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::HasIndexedPropertiesInExternalArrayData()", 3918ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 39192c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return self->HasExternalArrayElements(); 39202c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 39212c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39222c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39232c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvoid* v8::Object::GetIndexedPropertiesExternalArrayData() { 39247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 39257979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), 3926ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::GetIndexedPropertiesExternalArrayData()", 3927ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return NULL); 39282c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org if (self->HasExternalArrayElements()) { 39292c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return i::ExternalArray::cast(self->elements())->external_pointer(); 39302c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } else { 39312c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return NULL; 39322c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 39332c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 39342c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39352c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39362c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgExternalArrayType v8::Object::GetIndexedPropertiesExternalArrayDataType() { 39377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 39387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), 3939ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::GetIndexedPropertiesExternalArrayDataType()", 39402c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return static_cast<ExternalArrayType>(-1)); 39412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org switch (self->elements()->map()->instance_type()) { 3942af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ 3943af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org case i::EXTERNAL_##TYPE##_ARRAY_TYPE: \ 3944af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return kExternal##Type##Array; 3945af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE) 3946af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef INSTANCE_TYPE_TO_ARRAY_TYPE 39472c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org default: 39482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return static_cast<ExternalArrayType>(-1); 39492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 39502c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 39512c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39522c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39532c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgint v8::Object::GetIndexedPropertiesExternalArrayDataLength() { 39547979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 39557979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ON_BAILOUT(self->GetIsolate(), 3956ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org "v8::GetIndexedPropertiesExternalArrayDataLength()", 3957ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return 0); 39582c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org if (self->HasExternalArrayElements()) { 39592c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return i::ExternalArray::cast(self->elements())->length(); 39602c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } else { 39612c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return -1; 39622c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 39632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 39642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 39652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 396683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgbool v8::Object::IsCallable() { 396783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 396883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org ON_BAILOUT(isolate, "v8::Object::IsCallable()", return false); 396983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org ENTER_V8(isolate); 397083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org i::HandleScope scope(isolate); 397183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 39729f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org return obj->IsCallable(); 397383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org} 397483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 397583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 3976c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLocal<v8::Value> Object::CallAsFunction(v8::Handle<v8::Value> recv, 3977a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org int argc, 39781c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org v8::Handle<v8::Value> argv[]) { 39791c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 39801c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ON_BAILOUT(isolate, "v8::Object::CallAsFunction()", 39811c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Local<v8::Value>()); 39821c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org LOG_API(isolate, "Object::CallAsFunction"); 39831c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ENTER_V8(isolate); 39844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 39851c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::HandleScope scope(isolate); 39861c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 39871c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); 39881c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 3989a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 39901c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>(); 39911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org if (obj->IsJSFunction()) { 39921c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org fun = i::Handle<i::JSFunction>::cast(obj); 39931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org } else { 39941c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_PREAMBLE(isolate); 39952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> delegate; 39962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::TryGetFunctionDelegate( 39972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&delegate); 39981c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 39991c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org fun = i::Handle<i::JSFunction>::cast(delegate); 40001c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org recv_obj = obj; 40011c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org } 40021c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_PREAMBLE(isolate); 40032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> returned; 40042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 40052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, fun, recv_obj, argc, args, true).ToHandle(&returned); 4006fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); 40071c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Utils::ToLocal(scope.CloseAndEscape(returned)); 40081c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org} 40091c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 40101c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 40111c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgLocal<v8::Value> Object::CallAsConstructor(int argc, 40121c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org v8::Handle<v8::Value> argv[]) { 40131c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 40141c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ON_BAILOUT(isolate, "v8::Object::CallAsConstructor()", 40151c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Local<v8::Object>()); 40161c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org LOG_API(isolate, "Object::CallAsConstructor"); 40171c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ENTER_V8(isolate); 40184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 40191c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::HandleScope scope(isolate); 40201c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 40211c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 4022a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 40231c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org if (obj->IsJSFunction()) { 40241c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj); 40251c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_PREAMBLE(isolate); 40262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> returned; 40272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::New( 40282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org fun, argc, args).ToHandle(&returned); 4029fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); 40301c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Utils::ToLocal(scope.CloseAndEscape( 40311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSObject>::cast(returned))); 40321c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org } 40331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_PREAMBLE(isolate); 40342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> delegate; 40352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::TryGetConstructorDelegate( 40362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, obj).ToHandle(&delegate); 40371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 40381c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org if (!delegate->IsUndefined()) { 40391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate); 40401c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org EXCEPTION_PREAMBLE(isolate); 40412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> returned; 40422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 40432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, fun, obj, argc, args).ToHandle(&returned); 4044fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); 4045e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!delegate->IsUndefined()); 40461c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Utils::ToLocal(scope.CloseAndEscape(returned)); 40471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org } 40481c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return Local<v8::Object>(); 40491c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org} 40501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 40511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 4052639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgLocal<Function> Function::New(Isolate* v8_isolate, 4053639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org FunctionCallback callback, 4054639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org Local<Value> data, 4055639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org int length) { 4056639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 4057639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org LOG_API(isolate, "Function::New"); 4058639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org ENTER_V8(isolate); 4059639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org return FunctionTemplateNew( 4060639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org isolate, callback, data, Local<Signature>(), length, true)-> 40614ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org GetFunction(); 4062639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org} 4063639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 4064639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 40653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgLocal<v8::Object> Function::NewInstance() const { 406643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NewInstance(0, NULL); 406743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 406843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 406943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 407043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<v8::Object> Function::NewInstance(int argc, 40713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org v8::Handle<v8::Value> argv[]) const { 40727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4073ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Function::NewInstance()", 4074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::Object>()); 4075ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Function::NewInstance"); 40767979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 40774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 4078ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 407943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSFunction> function = Utils::OpenHandle(this); 408043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 4081a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 40827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 40832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> returned; 40842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::New( 40852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org function, argc, args).ToHandle(&returned); 4086fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); 4087ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return scope.Escape(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned))); 408843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 408943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 409043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4091c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLocal<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc, 409243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Handle<v8::Value> argv[]) { 40937979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4094ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>()); 4095ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "Function::Call"); 40967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 40974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 40982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::HandleScope scope(isolate); 40992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::JSFunction> fun = Utils::OpenHandle(this); 41002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); 41012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 41022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 41032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 41042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> returned; 41052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 41062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, fun, recv_obj, argc, args, true).ToHandle(&returned); 41072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>()); 41082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return Utils::ToLocal(scope.CloseAndEscape(returned)); 410943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 411043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 411143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 411243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Function::SetName(v8::Handle<v8::String> name) { 41137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 41147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 4115d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org USE(isolate); 411643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 411743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen func->shared()->set_name(*Utils::OpenHandle(*name)); 411843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 411943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 412043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgHandle<Value> Function::GetName() const { 412243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 412309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(), 412409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org func->GetIsolate())); 412543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 412643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 412743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4128659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgHandle<Value> Function::GetInferredName() const { 4129659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 413009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name(), 413109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org func->GetIsolate())); 4132659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org} 4133659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 4134659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 4135c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgHandle<Value> Function::GetDisplayName() const { 4136c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4137c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org ON_BAILOUT(isolate, "v8::Function::GetDisplayName()", 4138c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return ToApiHandle<Primitive>( 41394ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->factory()->undefined_value())); 4140c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org ENTER_V8(isolate); 4141c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4142c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org i::Handle<i::String> property_name = 4143c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org isolate->factory()->InternalizeOneByteString( 41442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org STATIC_CHAR_VECTOR("displayName")); 41457dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 41467dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::Object> value = 41477dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::JSObject::GetDataProperty(func, property_name); 41487dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org if (value->IsString()) { 41497dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> name = i::Handle<i::String>::cast(value); 41507dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org if (name->length() > 0) return Utils::ToLocal(name); 4151c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 41527dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 4153c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return ToApiHandle<Primitive>(isolate->factory()->undefined_value()); 4154c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 4155c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 4156c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 41575c838251403b0be9a882540f1922577abba4c872ager@chromium.orgScriptOrigin Function::GetScriptOrigin() const { 41585c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 41595c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (func->shared()->script()->IsScript()) { 41605c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 41619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org i::Handle<i::Object> scriptName = i::Script::GetNameOrSourceURL(script); 41620f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(func->GetIsolate()); 41635c838251403b0be9a882540f1922577abba4c872ager@chromium.org v8::ScriptOrigin origin( 41644ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ToLocal(scriptName), 41654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Integer::New(isolate, script->line_offset()->value()), 41664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::Integer::New(isolate, script->column_offset()->value())); 41675c838251403b0be9a882540f1922577abba4c872ager@chromium.org return origin; 41685c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 41695c838251403b0be9a882540f1922577abba4c872ager@chromium.org return v8::ScriptOrigin(Handle<Value>()); 41705c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 41715c838251403b0be9a882540f1922577abba4c872ager@chromium.org 41725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 41735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgconst int Function::kLineOffsetNotFound = -1; 41745c838251403b0be9a882540f1922577abba4c872ager@chromium.org 41755c838251403b0be9a882540f1922577abba4c872ager@chromium.org 41765c838251403b0be9a882540f1922577abba4c872ager@chromium.orgint Function::GetScriptLineNumber() const { 41775c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 41785c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (func->shared()->script()->IsScript()) { 41795c838251403b0be9a882540f1922577abba4c872ager@chromium.org i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 41809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return i::Script::GetLineNumber(script, func->shared()->start_position()); 41815c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 41825c838251403b0be9a882540f1922577abba4c872ager@chromium.org return kLineOffsetNotFound; 41835c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 41845c838251403b0be9a882540f1922577abba4c872ager@chromium.org 41855c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4186c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgint Function::GetScriptColumnNumber() const { 4187c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4188c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org if (func->shared()->script()->IsScript()) { 4189c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 41909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return i::Script::GetColumnNumber(script, func->shared()->start_position()); 4191c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 4192c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return kLineOffsetNotFound; 4193c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 4194c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 41951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4196db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.orgbool Function::IsBuiltin() const { 4197db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4198db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org return func->IsBuiltin(); 4199db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org} 4200db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 4201db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 42021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgint Function::ScriptId() const { 42031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 42046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (!func->shared()->script()->IsScript()) { 42056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return v8::UnboundScript::kNoScriptId; 42066b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 42071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 42081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return script->id()->value(); 42091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 42101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 42111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 42124954674151afa960af66efb4831df06bde727333yangguo@chromium.orgLocal<v8::Value> Function::GetBoundFunction() const { 42134954674151afa960af66efb4831df06bde727333yangguo@chromium.org i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 42144954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!func->shared()->bound()) { 42154954674151afa960af66efb4831df06bde727333yangguo@chromium.org return v8::Undefined(reinterpret_cast<v8::Isolate*>(func->GetIsolate())); 42164954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 42174954674151afa960af66efb4831df06bde727333yangguo@chromium.org i::Handle<i::FixedArray> bound_args = i::Handle<i::FixedArray>( 42184954674151afa960af66efb4831df06bde727333yangguo@chromium.org i::FixedArray::cast(func->function_bindings())); 42194954674151afa960af66efb4831df06bde727333yangguo@chromium.org i::Handle<i::Object> original( 42204954674151afa960af66efb4831df06bde727333yangguo@chromium.org bound_args->get(i::JSFunction::kBoundFunctionIndex), 42214954674151afa960af66efb4831df06bde727333yangguo@chromium.org func->GetIsolate()); 42224954674151afa960af66efb4831df06bde727333yangguo@chromium.org return Utils::ToLocal(i::Handle<i::JSFunction>::cast(original)); 42234954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 42244954674151afa960af66efb4831df06bde727333yangguo@chromium.org 42254954674151afa960af66efb4831df06bde727333yangguo@chromium.org 42263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint String::Length() const { 42277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 42287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return str->length(); 422943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 423043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42314cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 423246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgbool String::IsOneByte() const { 423346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 4234f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return str->HasOnlyOneByteChars(); 423546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 423646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 4237e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 42388a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org// Helpers for ContainsOnlyOneByteHelper 42398a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgtemplate<size_t size> struct OneByteMask; 42408a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgtemplate<> struct OneByteMask<4> { 42418a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org static const uint32_t value = 0xFF00FF00; 42428a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org}; 42438a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgtemplate<> struct OneByteMask<8> { 42448a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org static const uint64_t value = V8_2PART_UINT64_C(0xFF00FF00, FF00FF00); 42458a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org}; 42468a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgstatic const uintptr_t kOneByteMask = OneByteMask<sizeof(uintptr_t)>::value; 42478a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgstatic const uintptr_t kAlignmentMask = sizeof(uintptr_t) - 1; 42488a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgstatic inline bool Unaligned(const uint16_t* chars) { 42498a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org return reinterpret_cast<const uintptr_t>(chars) & kAlignmentMask; 42508a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org} 4251e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 4252e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 42538a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgstatic inline const uint16_t* Align(const uint16_t* chars) { 42548a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org return reinterpret_cast<uint16_t*>( 42554ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org reinterpret_cast<uintptr_t>(chars) & ~kAlignmentMask); 42568a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org} 425746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 4258dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgclass ContainsOnlyOneByteHelper { 4259dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org public: 4260dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org ContainsOnlyOneByteHelper() : is_one_byte_(true) {} 4261dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool Check(i::String* string) { 4262dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::ConsString* cons_string = i::String::VisitFlat(this, string, 0); 4263dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (cons_string == NULL) return is_one_byte_; 4264dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return CheckCons(cons_string); 4265dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4266dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org void VisitOneByteString(const uint8_t* chars, int length) { 4267dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Nothing to do. 4268dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4269dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org void VisitTwoByteString(const uint16_t* chars, int length) { 42708a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Accumulated bits. 42718a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org uintptr_t acc = 0; 42728a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Align to uintptr_t. 42738a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org const uint16_t* end = chars + length; 42748a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org while (Unaligned(chars) && chars != end) { 42754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org acc |= *chars++; 42768a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org } 42778a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Read word aligned in blocks, 42788a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // checking the return value at the end of each block. 42798a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org const uint16_t* aligned_end = Align(end); 42808a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org const int increment = sizeof(uintptr_t)/sizeof(uint16_t); 42818a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org const int inner_loops = 16; 42828a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org while (chars + inner_loops*increment < aligned_end) { 42838a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org for (int i = 0; i < inner_loops; i++) { 42848a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org acc |= *reinterpret_cast<const uintptr_t*>(chars); 42858a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org chars += increment; 42868a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org } 42878a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Check for early return. 42888a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org if ((acc & kOneByteMask) != 0) { 42898a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org is_one_byte_ = false; 42908a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org return; 42918a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org } 42928a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org } 42938a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Read the rest. 42948a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org while (chars != end) { 42958a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org acc |= *chars++; 4296dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 42978a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org // Check result. 42988a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org if ((acc & kOneByteMask) != 0) is_one_byte_ = false; 4299dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4300dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4301dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org private: 4302dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool CheckCons(i::ConsString* cons_string) { 4303dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org while (true) { 4304dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Check left side if flat. 4305dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::String* left = cons_string->first(); 4306dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::ConsString* left_as_cons = 4307dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::String::VisitFlat(this, left, 0); 4308dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (!is_one_byte_) return false; 4309dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Check right side if flat. 4310dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::String* right = cons_string->second(); 4311dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::ConsString* right_as_cons = 4312dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::String::VisitFlat(this, right, 0); 4313dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (!is_one_byte_) return false; 4314dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Standard recurse/iterate trick. 4315dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (left_as_cons != NULL && right_as_cons != NULL) { 4316dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (left->length() < right->length()) { 4317dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CheckCons(left_as_cons); 4318dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org cons_string = right_as_cons; 4319dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } else { 4320dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CheckCons(right_as_cons); 4321dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org cons_string = left_as_cons; 4322dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4323dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Check fast return. 4324dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (!is_one_byte_) return false; 4325dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org continue; 4326dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4327dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Descend left in place. 4328dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (left_as_cons != NULL) { 4329dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org cons_string = left_as_cons; 4330dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org continue; 4331dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4332dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Descend right in place. 4333dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (right_as_cons != NULL) { 4334dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org cons_string = right_as_cons; 4335dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org continue; 4336dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4337dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org // Terminate. 4338dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org break; 4339dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4340dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return is_one_byte_; 4341dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 4342dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool is_one_byte_; 4343dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org DISALLOW_COPY_AND_ASSIGN(ContainsOnlyOneByteHelper); 4344dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}; 4345dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4346dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4347dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgbool String::ContainsOnlyOneByte() const { 4348dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 4349dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org if (str->HasOnlyOneByteChars()) return true; 4350dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org ContainsOnlyOneByteHelper helper; 4351dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return helper.Check(*str); 4352dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 4353dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4354dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4355750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass Utf8LengthHelper : public i::AllStatic { 43564cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org public: 4357750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org enum State { 4358750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kEndsWithLeadingSurrogate = 1 << 0, 4359750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kStartsWithTrailingSurrogate = 1 << 1, 4360750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kLeftmostEdgeIsCalculated = 1 << 2, 4361750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kRightmostEdgeIsCalculated = 1 << 3, 4362750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kLeftmostEdgeIsSurrogate = 1 << 4, 4363750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kRightmostEdgeIsSurrogate = 1 << 5 4364750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org }; 4365750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4366750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const uint8_t kInitialState = 0; 4367750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4368750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline bool EndsWithSurrogate(uint8_t state) { 4369750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return state & kEndsWithLeadingSurrogate; 4370750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4371750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4372750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline bool StartsWithSurrogate(uint8_t state) { 4373750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return state & kStartsWithTrailingSurrogate; 4374750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4375750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4376750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org class Visitor { 4377750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public: 43785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Visitor() : utf8_length_(0), state_(kInitialState) {} 4379750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 43802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org void VisitOneByteString(const uint8_t* chars, int length) { 4381750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int utf8_length = 0; 43822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Add in length 1 for each non-Latin1 character. 4383750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org for (int i = 0; i < length; i++) { 43842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org utf8_length += *chars++ >> 7; 4385750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 43862bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Add in length 1 for each character. 43872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org utf8_length_ = utf8_length + length; 4388750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org state_ = kInitialState; 4389750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 43904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4391750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void VisitTwoByteString(const uint16_t* chars, int length) { 43922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int utf8_length = 0; 43932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int last_character = unibrow::Utf16::kNoPreviousCharacter; 43942bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org for (int i = 0; i < length; i++) { 43952bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org uint16_t c = chars[i]; 43962bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org utf8_length += unibrow::Utf8::Length(c, last_character); 43972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org last_character = c; 43982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 43992bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org utf8_length_ = utf8_length; 4400750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state = 0; 4401750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (unibrow::Utf16::IsTrailSurrogate(chars[0])) { 4402750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org state |= kStartsWithTrailingSurrogate; 4403750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4404750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (unibrow::Utf16::IsLeadSurrogate(chars[length-1])) { 4405750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org state |= kEndsWithLeadingSurrogate; 4406750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4407750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org state_ = state; 4408750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4409750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4410750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static i::ConsString* VisitFlat(i::String* string, 4411750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int* length, 4412750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t* state) { 4413750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Visitor visitor; 4414750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::ConsString* cons_string = i::String::VisitFlat(&visitor, string); 4415750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *length = visitor.utf8_length_; 4416750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state = visitor.state_; 4417750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return cons_string; 4418750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4419750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4420750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private: 4421750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int utf8_length_; 4422750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state_; 4423750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DISALLOW_COPY_AND_ASSIGN(Visitor); 4424750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org }; 4425750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4426750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline void MergeLeafLeft(int* length, 4427750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t* state, 4428750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t leaf_state) { 4429750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool edge_surrogate = StartsWithSurrogate(leaf_state); 4430750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (!(*state & kLeftmostEdgeIsCalculated)) { 4431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!(*state & kLeftmostEdgeIsSurrogate)); 4432750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state |= kLeftmostEdgeIsCalculated 4433750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org | (edge_surrogate ? kLeftmostEdgeIsSurrogate : 0); 4434750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else if (EndsWithSurrogate(*state) && edge_surrogate) { 4435750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; 4436750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4437750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (EndsWithSurrogate(leaf_state)) { 4438750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state |= kEndsWithLeadingSurrogate; 4439750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else { 4440750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state &= ~kEndsWithLeadingSurrogate; 4441750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 44424cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 44434cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4444750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline void MergeLeafRight(int* length, 4445750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t* state, 4446750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t leaf_state) { 4447750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool edge_surrogate = EndsWithSurrogate(leaf_state); 4448750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (!(*state & kRightmostEdgeIsCalculated)) { 4449e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!(*state & kRightmostEdgeIsSurrogate)); 4450750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state |= (kRightmostEdgeIsCalculated 44514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org | (edge_surrogate ? kRightmostEdgeIsSurrogate : 0)); 4452750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else if (edge_surrogate && StartsWithSurrogate(*state)) { 4453750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; 4454750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4455750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (StartsWithSurrogate(leaf_state)) { 4456750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state |= kStartsWithTrailingSurrogate; 4457750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else { 4458750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state &= ~kStartsWithTrailingSurrogate; 44594cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 44604cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 44614cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4462750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline void MergeTerminal(int* length, 4463750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state, 4464750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t* state_out) { 4465e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((state & kLeftmostEdgeIsCalculated) && 4466750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org (state & kRightmostEdgeIsCalculated)); 4467750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (EndsWithSurrogate(state) && StartsWithSurrogate(state)) { 4468750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; 4469750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4470750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org *state_out = kInitialState | 4471750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org (state & kLeftmostEdgeIsSurrogate ? kStartsWithTrailingSurrogate : 0) | 4472750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org (state & kRightmostEdgeIsSurrogate ? kEndsWithLeadingSurrogate : 0); 44734cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 44744cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4475750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static int Calculate(i::ConsString* current, uint8_t* state_out) { 4476750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org using namespace internal; 4477750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int total_length = 0; 4478750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state = kInitialState; 4479750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org while (true) { 4480750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::String* left = current->first(); 4481750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::String* right = current->second(); 4482750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t right_leaf_state; 4483750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t left_leaf_state; 4484750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int leaf_length; 4485750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ConsString* left_as_cons = 4486750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Visitor::VisitFlat(left, &leaf_length, &left_leaf_state); 4487750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (left_as_cons == NULL) { 4488750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org total_length += leaf_length; 4489750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org MergeLeafLeft(&total_length, &state, left_leaf_state); 4490750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4491750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ConsString* right_as_cons = 4492750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Visitor::VisitFlat(right, &leaf_length, &right_leaf_state); 4493750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (right_as_cons == NULL) { 4494750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org total_length += leaf_length; 4495750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org MergeLeafRight(&total_length, &state, right_leaf_state); 44962bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (left_as_cons != NULL) { 44972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // 1 Leaf node. Descend in place. 4498750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org current = left_as_cons; 4499750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org continue; 45002bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } else { 45012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Terminal node. 45022bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org MergeTerminal(&total_length, state, state_out); 45032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org return total_length; 4504750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 45052bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } else if (left_as_cons == NULL) { 45062bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // 1 Leaf node. Descend in place. 45072bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org current = right_as_cons; 45082bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org continue; 4509750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 45102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Both strings are ConsStrings. 45112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Recurse on smallest. 45122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (left->length() < right->length()) { 45132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org total_length += Calculate(left_as_cons, &left_leaf_state); 45142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org MergeLeafLeft(&total_length, &state, left_leaf_state); 4515750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org current = right_as_cons; 45162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } else { 45172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org total_length += Calculate(right_as_cons, &right_leaf_state); 45182bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org MergeLeafRight(&total_length, &state, right_leaf_state); 45192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org current = left_as_cons; 4520750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4521750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4522750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org UNREACHABLE(); 4523750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return 0; 4524750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4525750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4526750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline int Calculate(i::ConsString* current) { 4527750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state = kInitialState; 4528750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return Calculate(current, &state); 45294cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 45304cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45314cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org private: 4532750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Utf8LengthHelper); 45334cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org}; 45344cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45354cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45364cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.orgstatic int Utf8Length(i::String* str, i::Isolate* isolate) { 4537750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int length = str->length(); 45384cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (length == 0) return 0; 4539750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t state; 4540750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::ConsString* cons_string = 4541750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Utf8LengthHelper::Visitor::VisitFlat(str, &length, &state); 4542750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (cons_string == NULL) return length; 4543750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return Utf8LengthHelper::Calculate(cons_string); 45444cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org} 45454cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 454643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint String::Utf8Length() const { 45487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 45494cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org i::Isolate* isolate = str->GetIsolate(); 45504cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return v8::Utf8Length(*str, isolate); 45514cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org} 45524cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45534cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45544cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.orgclass Utf8WriterVisitor { 45554cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org public: 4556750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Utf8WriterVisitor( 4557c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org char* buffer, 4558c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org int capacity, 4559c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org bool skip_capacity_check, 4560c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org bool replace_invalid_utf8) 4561c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org : early_termination_(false), 4562c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org last_character_(unibrow::Utf16::kNoPreviousCharacter), 4563c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org buffer_(buffer), 4564c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org start_(buffer), 4565c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org capacity_(capacity), 4566c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org skip_capacity_check_(capacity == -1 || skip_capacity_check), 4567c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org replace_invalid_utf8_(replace_invalid_utf8), 4568c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org utf16_chars_read_(0) { 45694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 45704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 45714cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org static int WriteEndCharacter(uint16_t character, 45724cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int last_character, 45734cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int remaining, 4574c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org char* const buffer, 4575c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org bool replace_invalid_utf8) { 45764cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org using namespace unibrow; 4577e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(remaining > 0); 45784cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // We can't use a local buffer here because Encode needs to modify 45794cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // previous characters in the stream. We know, however, that 45804cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // exactly one character will be advanced. 4581c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org if (Utf16::IsSurrogatePair(last_character, character)) { 4582c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org int written = Utf8::Encode(buffer, 4583c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org character, 4584c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org last_character, 4585c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org replace_invalid_utf8); 4586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(written == 1); 45874cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return written; 458888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 45894cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Use a scratch buffer to check the required characters. 45904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org char temp_buffer[Utf8::kMaxEncodedSize]; 45914cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Can't encode using last_character as gcc has array bounds issues. 45924cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int written = Utf8::Encode(temp_buffer, 45934cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org character, 4594c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org Utf16::kNoPreviousCharacter, 4595c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org replace_invalid_utf8); 45964cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Won't fit. 45974cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (written > remaining) return 0; 45984cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Copy over the character from temp_buffer. 45994cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org for (int j = 0; j < written; j++) { 46004cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org buffer[j] = temp_buffer[j]; 46014cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 46024cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return written; 46034cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 46044cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4605c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // Visit writes out a group of code units (chars) of a v8::String to the 4606c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // internal buffer_. This is done in two phases. The first phase calculates a 4607c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // pesimistic estimate (writable_length) on how many code units can be safely 4608c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // written without exceeding the buffer capacity and without writing the last 4609c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // code unit (it could be a lead surrogate). The estimated number of code 4610c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // units is then written out in one go, and the reported byte usage is used 4611c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // to correct the estimate. This is repeated until the estimate becomes <= 0 4612c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // or all code units have been written out. The second phase writes out code 4613c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // units until the buffer capacity is reached, would be exceeded by the next 4614c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // unit, or all units have been written out. 46154cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org template<typename Char> 46164cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org void Visit(const Char* chars, const int length) { 46174cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org using namespace unibrow; 4618e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!early_termination_); 4619750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (length == 0) return; 46204cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Copy state to stack. 46214cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org char* buffer = buffer_; 4622750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int last_character = 4623750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org sizeof(Char) == 1 ? Utf16::kNoPreviousCharacter : last_character_; 46244cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int i = 0; 46254cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Do a fast loop where there is no exit capacity check. 46264cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org while (true) { 46274cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int fast_length; 4628750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (skip_capacity_check_) { 46294cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org fast_length = length; 46304cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } else { 46314cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); 46324cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Need enough space to write everything but one character. 46334cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org STATIC_ASSERT(Utf16::kMaxExtraUtf8BytesForOneUtf16CodeUnit == 3); 4634750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int max_size_per_char = sizeof(Char) == 1 ? 2 : 3; 4635750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int writable_length = 4636750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org (remaining_capacity - max_size_per_char)/max_size_per_char; 46374cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Need to drop into slow loop. 46384cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (writable_length <= 0) break; 46394cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org fast_length = i + writable_length; 46404cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (fast_length > length) fast_length = length; 464188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 46424cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Write the characters to the stream. 4643750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (sizeof(Char) == 1) { 4644750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org for (; i < fast_length; i++) { 4645750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org buffer += 46462bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Utf8::EncodeOneByte(buffer, static_cast<uint8_t>(*chars++)); 4647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(capacity_ == -1 || (buffer - start_) <= capacity_); 4648750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4649750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else { 4650750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org for (; i < fast_length; i++) { 4651750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint16_t character = *chars++; 4652c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org buffer += Utf8::Encode(buffer, 4653c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org character, 4654c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org last_character, 4655c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org replace_invalid_utf8_); 4656750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org last_character = character; 4657e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(capacity_ == -1 || (buffer - start_) <= capacity_); 4658750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 465988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 46604cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Array is fully written. Exit. 46614cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (fast_length == length) { 46624cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Write state back out to object. 46634cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org last_character_ = last_character; 46644cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org buffer_ = buffer; 4665750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org utf16_chars_read_ += length; 46664cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return; 466788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 46684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 4669e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!skip_capacity_check_); 46704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Slow loop. Must check capacity on each iteration. 46714cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); 4672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(remaining_capacity >= 0); 46734cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org for (; i < length && remaining_capacity > 0; i++) { 46744cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org uint16_t character = *chars++; 4675c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // remaining_capacity is <= 3 bytes at this point, so we do not write out 4676c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org // an umatched lead surrogate. 4677c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org if (replace_invalid_utf8_ && Utf16::IsLeadSurrogate(character)) { 4678c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org early_termination_ = true; 4679c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org break; 4680c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org } 46814cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int written = WriteEndCharacter(character, 46824cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org last_character, 46834cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org remaining_capacity, 4684c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org buffer, 4685c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org replace_invalid_utf8_); 46864cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (written == 0) { 46874cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org early_termination_ = true; 46884cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org break; 468988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 46904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org buffer += written; 46914cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org remaining_capacity -= written; 46924cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org last_character = character; 469388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 46944cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Write state back out to object. 46954cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org last_character_ = last_character; 46964cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org buffer_ = buffer; 46974cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org utf16_chars_read_ += i; 469888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 469988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 47004cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org inline bool IsDone() { 47014cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return early_termination_; 47024cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 470388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 4704750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline void VisitOneByteString(const uint8_t* chars, int length) { 4705750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Visit(chars, length); 47062c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org } 47074cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4708750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline void VisitTwoByteString(const uint16_t* chars, int length) { 4709750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Visit(chars, length); 47104cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 47114cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 4712750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int CompleteWrite(bool write_null, int* utf16_chars_read_out) { 47134cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Write out number of utf16 characters written to the stream. 47144cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (utf16_chars_read_out != NULL) { 47154cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org *utf16_chars_read_out = utf16_chars_read_; 47164cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 47174cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org // Only null terminate if all of the string was written and there's space. 47184cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (write_null && 47194cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org !early_termination_ && 47204cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org (capacity_ == -1 || (buffer_ - start_) < capacity_)) { 47214cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org *buffer_++ = '\0'; 47224cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 47234cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return static_cast<int>(buffer_ - start_); 47244cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 47254cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 47264cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org private: 47274cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org bool early_termination_; 47284cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int last_character_; 47294cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org char* buffer_; 47304cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org char* const start_; 47314cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int capacity_; 4732750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool const skip_capacity_check_; 4733c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org bool const replace_invalid_utf8_; 47344cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org int utf16_chars_read_; 47354cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Utf8WriterVisitor); 47364cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org}; 47372c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 47382c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 4739750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic bool RecursivelySerializeToUtf8(i::String* current, 47404ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utf8WriterVisitor* writer, 47414ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int recursion_budget) { 4742750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org while (!writer->IsDone()) { 4743750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::ConsString* cons_string = i::String::VisitFlat(writer, current); 4744750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (cons_string == NULL) return true; // Leaf node. 4745750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (recursion_budget <= 0) return false; 4746750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Must write the left branch first. 4747750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::String* first = cons_string->first(); 4748750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool success = RecursivelySerializeToUtf8(first, 4749750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org writer, 4750750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org recursion_budget - 1); 4751750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (!success) return false; 4752750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Inline tail recurse for right branch. 4753750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org current = cons_string->second(); 4754750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4755750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return true; 4756750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 4757750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4758750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 4759b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.orgint String::WriteUtf8(char* buffer, 4760b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org int capacity, 4761b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org int* nchars_ref, 4762ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org int options) const { 47637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4764ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "String::WriteUtf8"); 47657979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 47669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 4767304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (options & HINT_MANY_WRITES_EXPECTED) { 47689e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org str = i::String::Flatten(str); // Flatten the string for efficiency. 4769304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 4770750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const int string_length = str->length(); 4771750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool write_null = !(options & NO_NULL_TERMINATION); 4772c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org bool replace_invalid_utf8 = (options & REPLACE_INVALID_UTF8); 4773c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org int max16BitCodeUnitSize = unibrow::Utf8::kMax16BitCodeUnitSize; 4774750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // First check if we can just write the string without checking capacity. 4775c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org if (capacity == -1 || capacity / max16BitCodeUnitSize >= string_length) { 4776c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org Utf8WriterVisitor writer(buffer, capacity, true, replace_invalid_utf8); 4777750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const int kMaxRecursion = 100; 4778750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool success = RecursivelySerializeToUtf8(*str, &writer, kMaxRecursion); 4779750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (success) return writer.CompleteWrite(write_null, nchars_ref); 4780750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else if (capacity >= string_length) { 4781750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // First check that the buffer is large enough. 4782750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int utf8_bytes = v8::Utf8Length(*str, str->GetIsolate()); 4783750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (utf8_bytes <= capacity) { 47842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // one-byte fast path. 4785750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (utf8_bytes == string_length) { 4786750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org WriteOneByte(reinterpret_cast<uint8_t*>(buffer), 0, capacity, options); 4787750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (nchars_ref != NULL) *nchars_ref = string_length; 4788750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (write_null && (utf8_bytes+1 <= capacity)) { 4789750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return string_length + 1; 4790750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4791750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return string_length; 4792750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4793750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (write_null && (utf8_bytes+1 > capacity)) { 4794750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org options |= NO_NULL_TERMINATION; 4795750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 4796750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Recurse once without a capacity limit. 4797750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // This will get into the first branch above. 4798750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // TODO(dcarney) Check max left rec. in Utf8Length and fall through. 4799750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return WriteUtf8(buffer, -1, nchars_ref, options); 480088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 4801304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 4802750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Recursive slow path can potentially be unreasonable slow. Flatten. 48039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org str = i::String::Flatten(str); 4804c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org Utf8WriterVisitor writer(buffer, capacity, false, replace_invalid_utf8); 4805750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org i::String::VisitFlat(&writer, *str); 4806750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return writer.CompleteWrite(write_null, nchars_ref); 48079258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 48089258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 48099258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 481046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgtemplate<typename CharType> 481146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgstatic inline int WriteHelper(const String* string, 481246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CharType* buffer, 481346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int start, 481446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int length, 481546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int options) { 481646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); 4817e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org LOG_API(isolate, "String::Write"); 4818e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org ENTER_V8(isolate); 4819e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(start >= 0 && length >= -1); 482046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org i::Handle<i::String> str = Utils::OpenHandle(string); 4821e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org isolate->string_tracker()->RecordWrite(str); 482246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org if (options & String::HINT_MANY_WRITES_EXPECTED) { 4823e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org // Flatten the string for efficiency. This applies whether we are 4824e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org // using StringCharacterStream or Get(i) to access the characters. 48259e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org str = i::String::Flatten(str); 4826e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org } 4827e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org int end = start + length; 4828e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org if ((length == -1) || (length > str->length() - start) ) 4829e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org end = str->length(); 4830e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org if (end < 0) return 0; 4831e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org i::String::WriteToFlat(*str, buffer, start, end); 483246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org if (!(options & String::NO_NULL_TERMINATION) && 4833e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org (length == -1 || end - start < length)) { 4834e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org buffer[end - start] = '\0'; 4835e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org } 4836e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org return end - start; 483743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 483843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 483943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 484046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgint String::WriteOneByte(uint8_t* buffer, 484146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int start, 484246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int length, 484346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int options) const { 484446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return WriteHelper(this, buffer, start, length, options); 484546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 484646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 484746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 484846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgint String::Write(uint16_t* buffer, 484946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int start, 485046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int length, 485146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int options) const { 485246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return WriteHelper(this, buffer, start, length, options); 485346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 485446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 485546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 48563291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool v8::String::IsExternal() const { 485743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> str = Utils::OpenHandle(this); 4858bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org return i::StringShape(*str).IsExternalTwoByte(); 485943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 486043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 486143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgbool v8::String::IsExternalOneByte() const { 486343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> str = Utils::OpenHandle(this); 48642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return i::StringShape(*str).IsExternalOneByte(); 486543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 486643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 486743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 486818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid v8::String::VerifyExternalStringResource( 486918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org v8::String::ExternalStringResource* value) const { 487043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> str = Utils::OpenHandle(this); 4871c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::String::ExternalStringResource* expected; 48729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (i::StringShape(*str).IsExternalTwoByte()) { 4873c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const void* resource = 4874c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); 4875c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com expected = reinterpret_cast<const ExternalStringResource*>(resource); 48769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } else { 487718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org expected = NULL; 48789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 487918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org CHECK_EQ(expected, value); 488043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 488143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 488256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgvoid v8::String::VerifyExternalStringResourceBase( 488356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org v8::String::ExternalStringResourceBase* value, Encoding encoding) const { 488456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org i::Handle<i::String> str = Utils::OpenHandle(this); 488556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org const v8::String::ExternalStringResourceBase* expected; 488656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org Encoding expectedEncoding; 48872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (i::StringShape(*str).IsExternalOneByte()) { 488856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org const void* resource = 48892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Handle<i::ExternalOneByteString>::cast(str)->resource(); 489056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org expected = reinterpret_cast<const ExternalStringResourceBase*>(resource); 48912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org expectedEncoding = ONE_BYTE_ENCODING; 489256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } else if (i::StringShape(*str).IsExternalTwoByte()) { 489356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org const void* resource = 489456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); 489556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org expected = reinterpret_cast<const ExternalStringResourceBase*>(resource); 489656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org expectedEncoding = TWO_BYTE_ENCODING; 489756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } else { 489856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org expected = NULL; 48992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org expectedEncoding = 49002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org str->IsOneByteRepresentation() ? ONE_BYTE_ENCODING : TWO_BYTE_ENCODING; 490156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 490256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org CHECK_EQ(expected, value); 490356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org CHECK_EQ(expectedEncoding, encoding); 490456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org} 490543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst v8::String::ExternalOneByteStringResource* 49072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgv8::String::GetExternalOneByteStringResource() const { 490843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::String> str = Utils::OpenHandle(this); 49092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (i::StringShape(*str).IsExternalOneByte()) { 4910c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const void* resource = 49112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Handle<i::ExternalOneByteString>::cast(str)->resource(); 49122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return reinterpret_cast<const ExternalOneByteStringResource*>(resource); 49139085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } else { 49149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return NULL; 49159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 491643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 491743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 491843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4919e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLocal<Value> Symbol::Name() const { 4920e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Symbol> sym = Utils::OpenHandle(this); 4921e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> name(sym->name(), sym->GetIsolate()); 4922e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::ToLocal(name); 4923e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 4924e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 4925e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 49260cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLocal<Value> Private::Name() const { 49270cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return reinterpret_cast<const Symbol*>(this)->Name(); 49280cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 49290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 49300cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 49313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgdouble Number::Value() const { 493243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 493343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return obj->Number(); 493443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 493543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 493643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Boolean::Value() const { 493843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 493943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return obj->IsTrue(); 494043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 494143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 494243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint64_t Integer::Value() const { 494443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 494543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 494643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*obj)->value(); 494743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 494843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<int64_t>(obj->Number()); 494943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 495043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 495143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 495243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49533291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgint32_t Int32::Value() const { 495443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> obj = Utils::OpenHandle(this); 495543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (obj->IsSmi()) { 495643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(*obj)->value(); 495743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 495843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<int32_t>(obj->Number()); 495943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 496043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 496143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 496243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4963ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orguint32_t Uint32::Value() const { 4964ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 4965ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (obj->IsSmi()) { 4966ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return i::Smi::cast(*obj)->value(); 4967ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } else { 4968ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return static_cast<uint32_t>(obj->Number()); 4969ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 4970ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 4971ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 4972ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 497343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint v8::Object::InternalFieldCount() { 49747979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 497543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return obj->GetInternalFieldCount(); 497643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 497743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 497843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4979eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgstatic bool InternalFieldOK(i::Handle<i::JSObject> obj, 4980eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org int index, 4981eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location) { 49824ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return Utils::ApiCheck(index < obj->GetInternalFieldCount(), 49834ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org location, 49844ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Internal field out of bounds"); 4985eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 4986eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 4987eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 4988eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgLocal<Value> v8::Object::SlowGetInternalField(int index) { 49897979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 4990eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Object::GetInternalField()"; 4991eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!InternalFieldOK(obj, index, location)) return Local<Value>(); 4992eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::Object> value(obj->GetInternalField(index), obj->GetIsolate()); 4993eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return Utils::ToLocal(value); 499443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 499543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 499643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4997212ac23f8231d169b4aa6737d762099993020826kasper.lundvoid v8::Object::SetInternalField(int index, v8::Handle<Value> value) { 49987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 4999eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Object::SetInternalField()"; 5000eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!InternalFieldOK(obj, index, location)) return; 500143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> val = Utils::OpenHandle(*value); 500243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->SetInternalField(index, *val); 5003e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(value, GetInternalField(index)); 500443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 500543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 500643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5007eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* v8::Object::SlowGetAlignedPointerFromInternalField(int index) { 5008eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 5009eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Object::GetAlignedPointerFromInternalField()"; 5010eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!InternalFieldOK(obj, index, location)) return NULL; 5011eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return DecodeSmiToAligned(obj->GetInternalField(index), location); 5012c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 5013c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 5014c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 5015eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid v8::Object::SetAlignedPointerInInternalField(int index, void* value) { 5016eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 5017eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org const char* location = "v8::Object::SetAlignedPointerInInternalField()"; 5018eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!InternalFieldOK(obj, index, location)) return; 5019eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org obj->SetInternalField(index, EncodeAlignedAsSmi(value, location)); 5020e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(value, GetAlignedPointerFromInternalField(index)); 5021e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 5022e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 5023e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 5024eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgstatic void* ExternalValue(i::Object* obj) { 5025eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // Obscure semantics for undefined, but somehow checked in our unit tests... 5026eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (obj->IsUndefined()) return NULL; 5027eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org i::Object* foreign = i::JSObject::cast(obj)->GetInternalField(0); 5028eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return i::Foreign::cast(foreign)->foreign_address(); 5029eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 5030eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 5031eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 503243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- E n v i r o n m e n t --- 503343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5034ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 503590dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.orgvoid v8::V8::InitializePlatform(Platform* platform) { 503690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org i::V8::InitializePlatform(platform); 503790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org} 503890dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 503990dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 504090dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.orgvoid v8::V8::ShutdownPlatform() { 504190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org i::V8::ShutdownPlatform(); 504290dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org} 504390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 504490dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 504543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool v8::V8::Initialize() { 5046a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org i::V8::Initialize(); 5047a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return true; 504843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 504943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 505043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5051c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid v8::V8::SetEntropySource(EntropySource entropy_source) { 50525de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::RandomNumberGenerator::SetEntropySource(entropy_source); 505384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 505484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 505584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5056967e270a034432457500dbf950d2c4951a929e52ulan@chromium.orgvoid v8::V8::SetReturnAddressLocationResolver( 50574ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org ReturnAddressLocationResolver return_address_resolver) { 5058967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org i::V8::SetReturnAddressLocationResolver(return_address_resolver); 5059967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org} 5060967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 5061837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgvoid v8::V8::SetArrayBufferAllocator( 5062837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org ArrayBuffer::Allocator* allocator) { 50634ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(i::V8::ArrayBufferAllocator() == NULL, 50644ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::V8::SetArrayBufferAllocator", 50654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "ArrayBufferAllocator might only be set once")) 5066837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org return; 5067837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org i::V8::SetArrayBufferAllocator(allocator); 5068837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org} 5069837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org 5070355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 507141826e77311db718135ef6517b846933dfd275f3ager@chromium.orgbool v8::V8::Dispose() { 507241826e77311db718135ef6517b846933dfd275f3ager@chromium.org i::V8::TearDown(); 507341826e77311db718135ef6517b846933dfd275f3ager@chromium.org return true; 507441826e77311db718135ef6517b846933dfd275f3ager@chromium.org} 507541826e77311db718135ef6517b846933dfd275f3ager@chromium.org 507641826e77311db718135ef6517b846933dfd275f3ager@chromium.org 507701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgHeapStatistics::HeapStatistics(): total_heap_size_(0), 507801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org total_heap_size_executable_(0), 507972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org total_physical_size_(0), 5080c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org used_heap_size_(0), 5081c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org heap_size_limit_(0) { } 50823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 50833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 5084f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid v8::V8::VisitExternalResources(ExternalResourceVisitor* visitor) { 5085f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com i::Isolate* isolate = i::Isolate::Current(); 5086f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com isolate->heap()->VisitExternalResources(visitor); 5087f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 5088f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 5089f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 5090003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgclass VisitorAdapter : public i::ObjectVisitor { 5091003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org public: 5092003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org explicit VisitorAdapter(PersistentHandleVisitor* visitor) 5093003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org : visitor_(visitor) {} 5094003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org virtual void VisitPointers(i::Object** start, i::Object** end) { 5095003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org UNREACHABLE(); 5096003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 5097003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org virtual void VisitEmbedderReference(i::Object** p, uint16_t class_id) { 5098b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Value* value = ToApi<Value>(i::Handle<i::Object>(p)); 5099b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org visitor_->VisitPersistentHandle( 5100b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org reinterpret_cast<Persistent<Value>*>(&value), class_id); 5101003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 5102003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org private: 5103003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org PersistentHandleVisitor* visitor_; 5104003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}; 5105003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5106003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 510789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgvoid v8::V8::VisitHandlesWithClassIds(PersistentHandleVisitor* visitor) { 510889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org i::Isolate* isolate = i::Isolate::Current(); 510979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org i::DisallowHeapAllocation no_allocation; 511089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 5111003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org VisitorAdapter visitor_adapter(visitor); 511289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org isolate->global_handles()->IterateAllRootsWithClassIds(&visitor_adapter); 511389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org} 511489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 511589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 5116003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgvoid v8::V8::VisitHandlesForPartialDependence( 5117003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org Isolate* exported_isolate, PersistentHandleVisitor* visitor) { 5118003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(exported_isolate); 5119e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate == i::Isolate::Current()); 512079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org i::DisallowHeapAllocation no_allocation; 5121003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5122003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org VisitorAdapter visitor_adapter(visitor); 5123003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org isolate->global_handles()->IterateAllRootsInNewSpaceWithClassIds( 5124003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org &visitor_adapter); 5125003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org} 5126003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5127003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5128b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.orgbool v8::V8::InitializeICU(const char* icu_data_file) { 5129b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return i::InitializeICU(icu_data_file); 5130169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 5131169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 5132169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 51337276f14ca716596e0a0d17539516370c1f453847kasper.lundconst char* v8::V8::GetVersion() { 5134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return i::Version::GetVersion(); 51355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 51365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 51375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 5138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic i::Handle<i::Context> CreateEnvironment( 5139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* isolate, 51405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::ExtensionConfiguration* extensions, 51415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::Handle<ObjectTemplate> global_template, 514258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org v8::Handle<Value> maybe_global_proxy) { 5143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Context> env; 51445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 51458ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Enter V8 via an ENTER_V8 scope. 51468ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org { 51477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 51488ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org v8::Handle<ObjectTemplate> proxy_template = global_template; 51498ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org i::Handle<i::FunctionTemplateInfo> proxy_constructor; 51508ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org i::Handle<i::FunctionTemplateInfo> global_constructor; 51518ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 51528ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org if (!global_template.IsEmpty()) { 51538ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Make sure that the global_template has a constructor. 51544f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org global_constructor = EnsureConstructor(isolate, *global_template); 51558ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 51568ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Create a fresh template for the global proxy object. 51579cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org proxy_template = ObjectTemplate::New( 51589cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org reinterpret_cast<v8::Isolate*>(isolate)); 51594f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org proxy_constructor = EnsureConstructor(isolate, *proxy_template); 51608ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 51618ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Set the global template to be the prototype template of 51628ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // global proxy template. 51638ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org proxy_constructor->set_prototype_template( 51648ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org *Utils::OpenHandle(*global_template)); 51658ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 51668ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Migrate security handlers from global_template to 51678ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // proxy_template. Temporarily removing access check 51688ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // information from the global template. 51698ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org if (!global_constructor->access_check_info()->IsUndefined()) { 51708ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org proxy_constructor->set_access_check_info( 51718ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org global_constructor->access_check_info()); 51728ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org proxy_constructor->set_needs_access_check( 51738ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org global_constructor->needs_access_check()); 51748ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org global_constructor->set_needs_access_check(false); 51757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org global_constructor->set_access_check_info( 51767979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org isolate->heap()->undefined_value()); 51778ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } 51785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 51798bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 518058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org i::Handle<i::Object> proxy = Utils::OpenHandle(*maybe_global_proxy, true); 518158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org i::MaybeHandle<i::JSGlobalProxy> maybe_proxy; 518258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org if (!proxy.is_null()) { 518358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org maybe_proxy = i::Handle<i::JSGlobalProxy>::cast(proxy); 518458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org } 51858ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Create the environment. 5186ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org env = isolate->bootstrapper()->CreateEnvironment( 518758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org maybe_proxy, proxy_template, extensions); 51888ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 51898ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Restore the access check info on the global template. 51908ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org if (!global_template.IsEmpty()) { 5191e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!global_constructor.is_null()); 5192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!proxy_constructor.is_null()); 51938ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org global_constructor->set_access_check_info( 51948ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org proxy_constructor->access_check_info()); 51958ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org global_constructor->set_needs_access_check( 51968ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org proxy_constructor->needs_access_check()); 51978ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org } 51988bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 51998ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Leave V8. 52008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 5201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return env; 5202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 5203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLocal<Context> v8::Context::New( 5205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::Isolate* external_isolate, 5206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::ExtensionConfiguration* extensions, 5207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::Handle<ObjectTemplate> global_template, 5208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::Handle<Value> global_object) { 5209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); 5210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOG_API(isolate, "Context::New"); 5211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ON_BAILOUT(isolate, "v8::Context::New()", return Local<Context>()); 5212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::HandleScope scope(isolate); 521326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ExtensionConfiguration no_extensions; 521426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org if (extensions == NULL) extensions = &no_extensions; 5215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Context> env = 5216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CreateEnvironment(isolate, extensions, global_template, global_object); 5217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (env.is_null()) return Local<Context>(); 5218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::ToLocal(scope.CloseAndEscape(env)); 521943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 522043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 522143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 522243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid v8::Context::SetSecurityToken(Handle<Value> token) { 52237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 52247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 522543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Context> env = Utils::OpenHandle(this); 522643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Object> token_handle = Utils::OpenHandle(*token); 52275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org env->set_security_token(*token_handle); 52285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 52295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 52305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 52315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid v8::Context::UseDefaultSecurityToken() { 52327979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 52337979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 52345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Handle<i::Context> env = Utils::OpenHandle(this); 523546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org env->set_security_token(env->global_object()); 523643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 523743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 523843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 523943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Value> v8::Context::GetSecurityToken() { 52407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 524143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::Context> env = Utils::OpenHandle(this); 52425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Object* security_token = env->security_token(); 524309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::Object> token_handle(security_token, isolate); 524443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(token_handle); 524543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 524643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgv8::Isolate* Context::GetIsolate() { 524946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org i::Handle<i::Context> env = Utils::OpenHandle(this); 525046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return reinterpret_cast<Isolate*>(env->GetIsolate()); 525146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 525246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 525346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 52545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgv8::Local<v8::Object> Context::Global() { 5255528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Context> context = Utils::OpenHandle(this); 5256528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = context->GetIsolate(); 5257fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org i::Handle<i::Object> global(context->global_proxy(), isolate); 5258113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // TODO(dcarney): This should always return the global proxy 5259113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // but can't presently as calls to GetProtoype will return the wrong result. 5260113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org if (i::Handle<i::JSGlobalProxy>::cast( 5261113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org global)->IsDetachedFrom(context->global_object())) { 52624ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org global = i::Handle<i::Object>(context->global_object(), isolate); 5263113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org } 52645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return Utils::ToLocal(i::Handle<i::JSObject>::cast(global)); 526543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 526643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 526743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid Context::DetachGlobal() { 5269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Context> context = Utils::OpenHandle(this); 5270528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = context->GetIsolate(); 52717979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 52727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org isolate->bootstrapper()->DetachGlobal(context); 527343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 527443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 527543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5276fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgvoid Context::AllowCodeGenerationFromStrings(bool allow) { 5277528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Context> context = Utils::OpenHandle(this); 5278528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = context->GetIsolate(); 5279fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org ENTER_V8(isolate); 5280fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org context->set_allow_code_gen_from_strings( 5281fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org allow ? isolate->heap()->true_value() : isolate->heap()->false_value()); 5282fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org} 5283fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 5284fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 52851145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.orgbool Context::IsCodeGenerationFromStringsAllowed() { 5286528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Context> context = Utils::OpenHandle(this); 52871145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org return !context->allow_code_gen_from_strings()->IsFalse(); 52881145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org} 52891145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 52901145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 529156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgvoid Context::SetErrorMessageForCodeGenerationFromStrings( 529256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org Handle<String> error) { 5293528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Context> context = Utils::OpenHandle(this); 529409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::String> error_handle = Utils::OpenHandle(*error); 529556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context->set_error_message_for_code_gen_from_strings(*error_handle); 529656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org} 529756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 529856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 529943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<v8::Object> ObjectTemplate::NewInstance() { 5300ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 5301ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::ObjectTemplate::NewInstance()", 5302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Local<v8::Object>()); 5303ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "ObjectTemplate::NewInstance"); 53047979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 53057979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 53062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> obj; 53072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::InstantiateObject( 53082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Utils::OpenHandle(this)).ToHandle(&obj); 53097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 531043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(i::Handle<i::JSObject>::cast(obj)); 531143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 531243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 531343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 531443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<v8::Function> FunctionTemplate::GetFunction() { 5315ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 5316ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::FunctionTemplate::GetFunction()", 531743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Local<v8::Function>()); 5318ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "FunctionTemplate::GetFunction"); 53197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 53207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 53212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> obj; 53222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::InstantiateFunction( 53232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Utils::OpenHandle(this)).ToHandle(&obj); 53247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Function>()); 532543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(i::Handle<i::JSFunction>::cast(obj)); 532643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 532743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 532843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 532943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool FunctionTemplate::HasInstance(v8::Handle<v8::Value> value) { 5330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(i::Isolate::Current(), "v8::FunctionTemplate::HasInstanceOf()", 5331ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false); 533243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Object* obj = *Utils::OpenHandle(*value); 53339af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return Utils::OpenHandle(this)->IsTemplateFor(obj); 533443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 533543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 533643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53370cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLocal<External> v8::External::New(Isolate* isolate, void* value) { 5338eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org STATIC_ASSERT(sizeof(value) == sizeof(i::Address)); 53390cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 53400cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOG_API(i_isolate, "External::New"); 53410cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org ENTER_V8(i_isolate); 53420cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org i::Handle<i::JSObject> external = i_isolate->factory()->NewExternal(value); 5343eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return Utils::ExternalToLocal(external); 5344bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org} 5345bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 5346bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 5347bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvoid* External::Value() const { 5348eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return ExternalValue(*Utils::OpenHandle(this)); 534943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 535043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 535143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 535232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// anonymous namespace for string creation helper functions 535332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgnamespace { 535443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 535532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orginline int StringLength(const char* string) { 535632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return i::StrLength(string); 53579d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 53589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 53599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 536032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orginline int StringLength(const uint8_t* string) { 536132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return i::StrLength(reinterpret_cast<const char*>(string)); 536243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 536343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 536443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 536532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orginline int StringLength(const uint16_t* string) { 536643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int length = 0; 536732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org while (string[length] != '\0') 536832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org length++; 536943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return length; 537043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 537143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 537243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53738496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orgMUST_USE_RESULT 53748496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orginline i::MaybeHandle<i::String> NewString(i::Factory* factory, 53758496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org String::NewStringType type, 53768496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Vector<const char> string) { 5377f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org if (type == String::kInternalizedString) { 537832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->InternalizeUtf8String(string); 537932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 538032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->NewStringFromUtf8(string); 538132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 538232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 538332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 53848496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orgMUST_USE_RESULT 53858496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orginline i::MaybeHandle<i::String> NewString(i::Factory* factory, 53868496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org String::NewStringType type, 53878496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Vector<const uint8_t> string) { 538832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (type == String::kInternalizedString) { 538932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->InternalizeOneByteString(string); 539032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 539132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->NewStringFromOneByte(string); 539232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 539332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 539432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 53958496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orgMUST_USE_RESULT 53968496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orginline i::MaybeHandle<i::String> NewString(i::Factory* factory, 53978496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org String::NewStringType type, 53988496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Vector<const uint16_t> string) { 539932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (type == String::kInternalizedString) { 540032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->InternalizeTwoByteString(string); 540132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 540232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return factory->NewStringFromTwoByte(string); 540332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 540432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 540532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 540632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgtemplate<typename Char> 540732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orginline Local<String> NewString(Isolate* v8_isolate, 540832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const char* location, 540932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const char* env, 541032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const Char* data, 541132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org String::NewStringType type, 541232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int length) { 541332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org i::Isolate* isolate = reinterpret_cast<internal::Isolate*>(v8_isolate); 541432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org LOG_API(isolate, env); 541532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (length == 0 && type != String::kUndetectableString) { 54160f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org return String::Empty(v8_isolate); 541732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 54187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 541932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (length == -1) length = StringLength(data); 5420b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to fail. Change this if it does. 54218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Handle<i::String> result = NewString( 54228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org isolate->factory(), 54238496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org type, 54248496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org i::Vector<const Char>(data, length)).ToHandleChecked(); 542532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (type == String::kUndetectableString) { 542632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org result->MarkAsUndetectable(); 542732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 542843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 542943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 543043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} // anonymous namespace 543243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 543432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewFromUtf8(Isolate* isolate, 543532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const char* data, 543632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org NewStringType type, 543732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int length) { 543832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return NewString(isolate, 543932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "v8::String::NewFromUtf8()", 544032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "String::NewFromUtf8", 544132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data, 544232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org type, 544332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org length); 544432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 544532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 544632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 544732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewFromOneByte(Isolate* isolate, 544832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const uint8_t* data, 544932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org NewStringType type, 545032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int length) { 545132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return NewString(isolate, 545232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "v8::String::NewFromOneByte()", 545332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "String::NewFromOneByte", 545432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data, 545532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org type, 545632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org length); 545732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 545832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 545932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 546032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewFromTwoByte(Isolate* isolate, 546132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org const uint16_t* data, 546232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org NewStringType type, 546332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int length) { 546432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return NewString(isolate, 546532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "v8::String::NewFromTwoByte()", 546632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org "String::NewFromTwoByte", 546732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data, 546832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org type, 546932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org length); 547032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 547132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 547232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 547332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> v8::String::Concat(Handle<String> left, Handle<String> right) { 547432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org i::Handle<i::String> left_string = Utils::OpenHandle(*left); 547532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org i::Isolate* isolate = left_string->GetIsolate(); 547632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org LOG_API(isolate, "String::New(char)"); 54777979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 547832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org i::Handle<i::String> right_string = Utils::OpenHandle(*right); 5479b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to fail. Change this if it does. 5480255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org i::Handle<i::String> result = isolate->factory()->NewConsString( 5481255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org left_string, right_string).ToHandleChecked(); 548243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 548343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 548443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 548543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54864ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgstatic i::Handle<i::String> NewExternalStringHandle( 54874ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::Isolate* isolate, 54884ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::String::ExternalStringResource* resource) { 5489b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to fail. Change this if it does. 5490255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org return isolate->factory()->NewExternalStringFromTwoByte( 5491255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org resource).ToHandleChecked(); 549243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 549343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 549443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgstatic i::Handle<i::String> NewExternalOneByteStringHandle( 54962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { 5497b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to fail. Change this if it does. 54982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return isolate->factory() 54992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ->NewExternalStringFromOneByte(resource) 55002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org .ToHandleChecked(); 550143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 550243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 550343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 550443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<String> v8::String::NewExternal( 55054ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Isolate* isolate, 55064ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org v8::String::ExternalStringResource* resource) { 550737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 550837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "String::NewExternal"); 550937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 5510de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK(resource && resource->data()); 551137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Handle<i::String> result = NewExternalStringHandle(i_isolate, resource); 551237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->heap()->external_string_table()->AddString(*result); 551343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 551443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 551543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 551643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55176f10e41fef1524c70846d970268de222e41c594cager@chromium.orgbool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { 5518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Handle<i::String> obj = Utils::OpenHandle(this); 5519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = obj->GetIsolate(); 552031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org if (i::StringShape(*obj).IsExternal()) { 55217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return false; // Already an external string. 55227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org } 55237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 5524ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (isolate->string_tracker()->IsFreshUnusedString(obj)) { 5525ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false; 5526ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 5527d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com if (isolate->heap()->IsInGCPostProcessing()) { 5528d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com return false; 5529d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com } 5530de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK(resource && resource->data()); 5531d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 55328297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org bool result = obj->MakeExternal(resource); 553331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org // Assert that if CanMakeExternal(), then externalizing actually succeeds. 553431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org DCHECK(!CanMakeExternal() || result); 5535113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org if (result) { 5536e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(obj->IsExternalString()); 55378297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org isolate->heap()->external_string_table()->AddString(*obj); 55386f10e41fef1524c70846d970268de222e41c594cager@chromium.org } 55396f10e41fef1524c70846d970268de222e41c594cager@chromium.org return result; 55406f10e41fef1524c70846d970268de222e41c594cager@chromium.org} 55416f10e41fef1524c70846d970268de222e41c594cager@chromium.org 55426f10e41fef1524c70846d970268de222e41c594cager@chromium.org 554343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<String> v8::String::NewExternal( 55442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { 554537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 554637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "String::NewExternal"); 554737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 5548de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK(resource && resource->data()); 554937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Handle<i::String> result = 55502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org NewExternalOneByteStringHandle(i_isolate, resource); 555137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->heap()->external_string_table()->AddString(*result); 555243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(result); 555343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 555443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 555543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55566f10e41fef1524c70846d970268de222e41c594cager@chromium.orgbool v8::String::MakeExternal( 55572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org v8::String::ExternalOneByteStringResource* resource) { 5558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Handle<i::String> obj = Utils::OpenHandle(this); 5559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = obj->GetIsolate(); 556031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org if (i::StringShape(*obj).IsExternal()) { 55617979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org return false; // Already an external string. 55627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org } 55637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 5564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (isolate->string_tracker()->IsFreshUnusedString(obj)) { 5565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false; 5566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 5567d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com if (isolate->heap()->IsInGCPostProcessing()) { 5568d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com return false; 5569d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com } 5570de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK(resource && resource->data()); 5571d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 55728297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org bool result = obj->MakeExternal(resource); 557331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org // Assert that if CanMakeExternal(), then externalizing actually succeeds. 557431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org DCHECK(!CanMakeExternal() || result); 5575113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org if (result) { 5576e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(obj->IsExternalString()); 55778297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org isolate->heap()->external_string_table()->AddString(*obj); 55786f10e41fef1524c70846d970268de222e41c594cager@chromium.org } 55796f10e41fef1524c70846d970268de222e41c594cager@chromium.org return result; 55806f10e41fef1524c70846d970268de222e41c594cager@chromium.org} 55816f10e41fef1524c70846d970268de222e41c594cager@chromium.org 55826f10e41fef1524c70846d970268de222e41c594cager@chromium.org 55835a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.combool v8::String::CanMakeExternal() { 5584b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (!internal::FLAG_clever_optimizations) return false; 55855a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com i::Handle<i::String> obj = Utils::OpenHandle(this); 5586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = obj->GetIsolate(); 558732aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org 55881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org if (isolate->string_tracker()->IsFreshUnusedString(obj)) return false; 55895a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com int size = obj->Size(); // Byte size of the original string. 55901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org if (size < i::ExternalString::kShortSize) return false; 55915a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com i::StringShape shape(*obj); 55925a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com return !shape.IsExternal(); 55935a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com} 55945a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 55955a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 559637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<v8::Object> v8::Object::New(Isolate* isolate) { 559737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 559837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "Object::New"); 559937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 560043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSObject> obj = 560137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->factory()->NewJSObject(i_isolate->object_function()); 560243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 560343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 560443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 560543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 560637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<v8::Value> v8::NumberObject::New(Isolate* isolate, double value) { 560737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 560837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "NumberObject::New"); 560937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 561037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Handle<i::Object> number = i_isolate->factory()->NewNumber(value); 561174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Handle<i::Object> obj = 561274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Object::ToObject(i_isolate, number).ToHandleChecked(); 561384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return Utils::ToLocal(obj); 561484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 561584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 561684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5617d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgdouble v8::NumberObject::ValueOf() const { 561884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 561984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 5620e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = jsvalue->GetIsolate(); 5621e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org LOG_API(isolate, "NumberObject::NumberValue"); 562284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return jsvalue->value()->Number(); 562384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 562484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 562584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 562684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgLocal<v8::Value> v8::BooleanObject::New(bool value) { 562784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Isolate* isolate = i::Isolate::Current(); 562884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org LOG_API(isolate, "BooleanObject::New"); 562984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org ENTER_V8(isolate); 563009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org i::Handle<i::Object> boolean(value 563109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org ? isolate->heap()->true_value() 563209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org : isolate->heap()->false_value(), 563309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate); 563474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Handle<i::Object> obj = 563574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Object::ToObject(isolate, boolean).ToHandleChecked(); 563684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return Utils::ToLocal(obj); 563784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 563884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 563984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5640d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgbool v8::BooleanObject::ValueOf() const { 564184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 564284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 5643e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = jsvalue->GetIsolate(); 5644e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org LOG_API(isolate, "BooleanObject::BooleanValue"); 564584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return jsvalue->value()->IsTrue(); 564684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 564784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 564884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 564984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgLocal<v8::Value> v8::StringObject::New(Handle<String> value) { 5650e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Handle<i::String> string = Utils::OpenHandle(*value); 5651e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = string->GetIsolate(); 565284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org LOG_API(isolate, "StringObject::New"); 565384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org ENTER_V8(isolate); 5654e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Handle<i::Object> obj = 5655e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Object::ToObject(isolate, string).ToHandleChecked(); 565684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return Utils::ToLocal(obj); 565784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 565884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 565984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5660d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgLocal<v8::String> v8::StringObject::ValueOf() const { 566184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 566284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 5663e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = jsvalue->GetIsolate(); 5664e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org LOG_API(isolate, "StringObject::StringValue"); 566584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return Utils::ToLocal( 566684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::Handle<i::String>(i::String::cast(jsvalue->value()))); 566784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 566884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 566984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5670e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLocal<v8::Value> v8::SymbolObject::New(Isolate* isolate, Handle<Symbol> value) { 5671e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 5672e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOG_API(i_isolate, "SymbolObject::New"); 5673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ENTER_V8(i_isolate); 567474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i::Handle<i::Object> obj = i::Object::ToObject( 567574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org i_isolate, Utils::OpenHandle(*value)).ToHandleChecked(); 5676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::ToLocal(obj); 5677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 5678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5680d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgLocal<v8::Symbol> v8::SymbolObject::ValueOf() const { 5681e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 5682e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 5683e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = jsvalue->GetIsolate(); 5684e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org LOG_API(isolate, "SymbolObject::SymbolValue"); 5685e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::ToLocal( 5686e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Symbol>(i::Symbol::cast(jsvalue->value()))); 5687e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 5688e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5689e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 569037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<v8::Value> v8::Date::New(Isolate* isolate, double time) { 569137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 569237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "Date::New"); 569377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (std::isnan(time)) { 56943811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Introduce only canonical NaN value into the VM, to avoid signaling NaNs. 56955de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org time = base::OS::nan_value(); 56963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 569737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 569837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org EXCEPTION_PREAMBLE(i_isolate); 56992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> obj; 57002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::NewDate( 57012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i_isolate, time).ToHandle(&obj); 570237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org EXCEPTION_BAILOUT_CHECK(i_isolate, Local<v8::Value>()); 570343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 570443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 570543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 570643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5707d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgdouble v8::Date::ValueOf() const { 57085a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(this); 57094efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org i::Handle<i::JSDate> jsdate = i::Handle<i::JSDate>::cast(obj); 5710e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = jsdate->GetIsolate(); 5711e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org LOG_API(isolate, "Date::NumberValue"); 57124efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org return jsdate->value()->Number(); 57135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 57145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 57155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 571637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgvoid v8::Date::DateTimeConfigurationChangeNotification(Isolate* isolate) { 571737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 57182f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org if (!i_isolate->IsInitialized()) return; 571937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ON_BAILOUT(i_isolate, "v8::Date::DateTimeConfigurationChangeNotification()", 5720ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return); 572137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "Date::DateTimeConfigurationChangeNotification"); 572237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 5723023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 572437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->date_cache()->ResetDateCache(); 57254efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 5726486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (!i_isolate->eternal_handles()->Exists( 5727486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::EternalHandles::DATE_CACHE_VERSION)) { 5728023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org return; 5729023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 5730486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::FixedArray> date_cache_version = 5731486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::FixedArray>::cast(i_isolate->eternal_handles()->GetSingleton( 5732486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::EternalHandles::DATE_CACHE_VERSION)); 5733e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(1, date_cache_version->length()); 5734486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org CHECK(date_cache_version->get(0)->IsSmi()); 5735486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org date_cache_version->set( 5736486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 0, 5737486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Smi::FromInt(i::Smi::cast(date_cache_version->get(0))->value() + 1)); 5738023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org} 5739023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 5740023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 5741b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgstatic i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { 5742d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org i::Isolate* isolate = i::Isolate::Current(); 574359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t flags_buf[3]; 5744b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org int num_flags = 0; 5745b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g'; 5746b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm'; 5747b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i'; 5748fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org DCHECK(num_flags <= static_cast<int>(arraysize(flags_buf))); 5749d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return isolate->factory()->InternalizeOneByteString( 575059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org i::Vector<const uint8_t>(flags_buf, num_flags)); 5751b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 5752b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5753b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5754b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgLocal<v8::RegExp> v8::RegExp::New(Handle<String> pattern, 5755b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Flags flags) { 57567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); 5757ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG_API(isolate, "RegExp::New"); 57587979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 57597979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 57602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::JSRegExp> obj; 57612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::NewJSRegExp( 5762b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Utils::OpenHandle(*pattern), 57632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org RegExpFlagsToString(flags)).ToHandle(&obj); 57647979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::RegExp>()); 5765b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org return Utils::ToLocal(i::Handle<i::JSRegExp>::cast(obj)); 5766b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 5767b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5768b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5769b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgLocal<v8::String> v8::RegExp::GetSource() const { 5770b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this); 5771b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org return Utils::ToLocal(i::Handle<i::String>(obj->Pattern())); 5772b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 5773b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5774b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5775b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org// Assert that the static flags cast in GetFlags is valid. 57764ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org#define REGEXP_FLAG_ASSERT_EQ(api_flag, internal_flag) \ 57774ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org STATIC_ASSERT(static_cast<int>(v8::RegExp::api_flag) == \ 5778b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org static_cast<int>(i::JSRegExp::internal_flag)) 5779b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgREGEXP_FLAG_ASSERT_EQ(kNone, NONE); 5780b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgREGEXP_FLAG_ASSERT_EQ(kGlobal, GLOBAL); 5781b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgREGEXP_FLAG_ASSERT_EQ(kIgnoreCase, IGNORE_CASE); 5782b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgREGEXP_FLAG_ASSERT_EQ(kMultiline, MULTILINE); 5783b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#undef REGEXP_FLAG_ASSERT_EQ 5784b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5785b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgv8::RegExp::Flags v8::RegExp::GetFlags() const { 5786b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this); 5787b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org return static_cast<RegExp::Flags>(obj->GetFlags().value()); 5788b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 5789b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5790b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 579137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<v8::Array> v8::Array::New(Isolate* isolate, int length) { 579237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 579337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "Array::New"); 579437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 5795badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org int real_length = length > 0 ? length : 0; 579637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Handle<i::JSArray> obj = i_isolate->factory()->NewJSArray(real_length); 5797c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org i::Handle<i::Object> length_obj = 579837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->factory()->NewNumberFromInt(real_length); 5799c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org obj->set_length(*length_obj); 580043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::ToLocal(obj); 580143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 580243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 580343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orguint32_t v8::Array::Length() const { 580543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Handle<i::JSArray> obj = Utils::OpenHandle(this); 580643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::Object* length = obj->length(); 580743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (length->IsSmi()) { 580843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return i::Smi::cast(length)->value(); 580943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 581043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<uint32_t>(length->Number()); 581143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 581243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 581343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 581443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58153e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgLocal<Object> Array::CloneElementAt(uint32_t index) { 58167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 5817ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Array::CloneElementAt()", return Local<Object>()); 58183e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org i::Handle<i::JSObject> self = Utils::OpenHandle(this); 5819830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org if (!self->HasFastObjectElements()) { 58203e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org return Local<Object>(); 58213e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org } 58220b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org i::FixedArray* elms = i::FixedArray::cast(self->elements()); 58233e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org i::Object* paragon = elms->get(index); 58243e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org if (!paragon->IsJSObject()) { 58253e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org return Local<Object>(); 58263e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org } 58273e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org i::Handle<i::JSObject> paragon_handle(i::JSObject::cast(paragon)); 58287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 58297979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 58303484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org i::Handle<i::JSObject> result = 58313484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org isolate->factory()->CopyJSObject(paragon_handle); 58323e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org has_pending_exception = result.is_null(); 58337979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); 58343e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org return Utils::ToLocal(result); 58353e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 58363e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 58373e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 5838486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgbool Value::IsPromise() const { 5839486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> val = Utils::OpenHandle(this); 58405924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (!val->IsJSObject()) return false; 5841486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::JSObject> obj = i::Handle<i::JSObject>::cast(val); 5842486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = obj->GetIsolate(); 5843486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOG_API(isolate, "IsPromise"); 5844486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5845486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 5846486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> argv[] = { obj }; 58472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> b; 58482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 5849486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 585058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->is_promise(), 5851486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate->factory()->undefined_value(), 5852fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 58532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).ToHandle(&b); 5854486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, false); 5855486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return b->BooleanValue(); 5856486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5857486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5858486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 58592904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgLocal<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) { 5860486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 58612904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org LOG_API(isolate, "Promise::Resolver::New"); 5862486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5863486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 58642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 58652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 5866486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 586758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_create(), 5868486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate->factory()->undefined_value(), 5869486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 0, NULL, 58702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).ToHandle(&result); 58712904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise::Resolver>()); 58722904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org return Local<Promise::Resolver>::Cast(Utils::ToLocal(result)); 58732904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org} 58742904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org 58752904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org 58762904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgLocal<Promise> Promise::Resolver::GetPromise() { 58772904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 58782904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org return Local<Promise>::Cast(Utils::ToLocal(promise)); 5879486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5880486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5881486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 58822904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgvoid Promise::Resolver::Resolve(Handle<Value> value) { 5883486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 5884486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = promise->GetIsolate(); 58852904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org LOG_API(isolate, "Promise::Resolver::Resolve"); 5886486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5887486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 5888486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; 58892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = i::Execution::Call( 5890486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 589158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_resolve(), 5892486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate->factory()->undefined_value(), 5893fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 58942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).is_null(); 5895486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); 5896486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5897486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5898486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 58992904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgvoid Promise::Resolver::Reject(Handle<Value> value) { 5900486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 5901486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = promise->GetIsolate(); 59022904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org LOG_API(isolate, "Promise::Resolver::Reject"); 5903486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5904486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 5905486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; 59062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = i::Execution::Call( 5907486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 590858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_reject(), 5909486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate->factory()->undefined_value(), 5910fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 59112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).is_null(); 5912486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); 5913486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5914486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5915486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5916486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgLocal<Promise> Promise::Chain(Handle<Function> handler) { 5917486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 5918486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = promise->GetIsolate(); 5919486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOG_API(isolate, "Promise::Chain"); 5920486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5921486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 5922486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; 59232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 59242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 5925486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 592658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_chain(), 5927486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org promise, 5928fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 59292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).ToHandle(&result); 5930486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); 5931486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return Local<Promise>::Cast(Utils::ToLocal(result)); 5932486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5933486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5934486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5935486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgLocal<Promise> Promise::Catch(Handle<Function> handler) { 5936486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 5937486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Isolate* isolate = promise->GetIsolate(); 5938486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOG_API(isolate, "Promise::Catch"); 5939486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ENTER_V8(isolate); 5940486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_PREAMBLE(isolate); 5941486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; 59422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 59432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !i::Execution::Call( 5944486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org isolate, 594558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_catch(), 5946486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org promise, 5947fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 59482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org false).ToHandle(&result); 5949486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); 5950486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return Local<Promise>::Cast(Utils::ToLocal(result)); 5951486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org} 5952486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 5953486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 59541845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgLocal<Promise> Promise::Then(Handle<Function> handler) { 59551845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 59561845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Isolate* isolate = promise->GetIsolate(); 59571845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org LOG_API(isolate, "Promise::Then"); 59581845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org ENTER_V8(isolate); 59591845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); 59601845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; 59611845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org i::Handle<i::Object> result; 59621845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org has_pending_exception = !i::Execution::Call( 59631845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org isolate, 596458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org isolate->promise_then(), 59651845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org promise, 5966fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org arraysize(argv), argv, 59671845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org false).ToHandle(&result); 59681845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); 59691845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return Local<Promise>::Cast(Utils::ToLocal(result)); 59701845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org} 59711845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 59721845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 5973a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgbool v8::ArrayBuffer::IsExternal() const { 5974a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return Utils::OpenHandle(this)->is_external(); 5975a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org} 5976a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 5977e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5978837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgv8::ArrayBuffer::Contents v8::ArrayBuffer::Externalize() { 5979ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); 59804ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(!obj->is_external(), 59814ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::ArrayBuffer::Externalize", 59824ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "ArrayBuffer already externalized"); 5983a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org obj->set_is_external(true); 5984a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org size_t byte_length = static_cast<size_t>(obj->byte_length()->Number()); 5985837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org Contents contents; 5986837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org contents.data_ = obj->backing_store(); 5987837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org contents.byte_length_ = byte_length; 5988837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org return contents; 5989ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 5990ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 5991ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 59921fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid v8::ArrayBuffer::Neuter() { 59931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); 59941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org i::Isolate* isolate = obj->GetIsolate(); 59954ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(obj->is_external(), 59964ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::ArrayBuffer::Neuter", 59974ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Only externalized ArrayBuffers can be neutered"); 59981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org LOG_API(obj->GetIsolate(), "v8::ArrayBuffer::Neuter()"); 59991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ENTER_V8(isolate); 60004452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org i::Runtime::NeuterArrayBuffer(obj); 60011fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org} 60021fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 60031fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 6004a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgsize_t v8::ArrayBuffer::ByteLength() const { 6005ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); 6006a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return static_cast<size_t>(obj->byte_length()->Number()); 6007ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6008ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6009ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 601037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, size_t byte_length) { 601137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 601237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "v8::ArrayBuffer::New(size_t)"); 601337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 6014ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Handle<i::JSArrayBuffer> obj = 601537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->factory()->NewJSArrayBuffer(); 601637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length); 6017ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return Utils::ToLocal(obj); 6018ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6019ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6020ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 602137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, void* data, 602237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org size_t byte_length) { 602337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 602437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOG_API(i_isolate, "v8::ArrayBuffer::New(void*, size_t)"); 602537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ENTER_V8(i_isolate); 6026ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Handle<i::JSArrayBuffer> obj = 602737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i_isolate->factory()->NewJSArrayBuffer(); 602837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org i::Runtime::SetupArrayBuffer(i_isolate, obj, true, data, byte_length); 6029ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return Utils::ToLocal(obj); 6030ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6031ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6032ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 60331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLocal<ArrayBuffer> v8::ArrayBufferView::Buffer() { 60341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); 6035895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org i::Handle<i::JSArrayBuffer> buffer; 6036895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org if (obj->IsJSDataView()) { 6037895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org i::Handle<i::JSDataView> data_view(i::JSDataView::cast(*obj)); 6038e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(data_view->buffer()->IsJSArrayBuffer()); 6039895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org buffer = i::handle(i::JSArrayBuffer::cast(data_view->buffer())); 6040895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org } else { 6041e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(obj->IsJSTypedArray()); 6042895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org buffer = i::JSTypedArray::cast(*obj)->GetBuffer(); 6043895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org } 6044f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return Utils::ToLocal(buffer); 6045f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 6046f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6047f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 60481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgsize_t v8::ArrayBufferView::ByteOffset() { 60491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); 6050f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return static_cast<size_t>(obj->byte_offset()->Number()); 6051f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 6052f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6053f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 60541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgsize_t v8::ArrayBufferView::ByteLength() { 60551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); 6056f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return static_cast<size_t>(obj->byte_length()->Number()); 6057f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 6058f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6059f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6060f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgsize_t v8::TypedArray::Length() { 6061f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); 6062f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return static_cast<size_t>(obj->length()->Number()); 6063f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 6064f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6065f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 60661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic inline void SetupArrayBufferView( 60671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Isolate* isolate, 60681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSArrayBufferView> obj, 60691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSArrayBuffer> buffer, 60701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org size_t byte_offset, 60711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org size_t byte_length) { 6072e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(byte_offset + byte_length <= 60734ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org static_cast<size_t>(buffer->byte_length()->Number())); 6074f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 60751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org obj->set_buffer(*buffer); 60761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 60771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org obj->set_weak_next(buffer->weak_first_view()); 60781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org buffer->set_weak_first_view(*obj); 60791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 60801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Object> byte_offset_object = 60814ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->factory()->NewNumberFromSize(byte_offset); 60821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org obj->set_byte_offset(*byte_offset_object); 60831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 60841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Object> byte_length_object = 60854ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->factory()->NewNumberFromSize(byte_length); 60861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org obj->set_byte_length(*byte_length_object); 60871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 6088f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6089f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgtemplate<typename ElementType, 6090f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org ExternalArrayType array_type, 6091f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::ElementsKind elements_kind> 6092f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgi::Handle<i::JSTypedArray> NewTypedArray( 6093f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Isolate* isolate, 6094f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Handle<ArrayBuffer> array_buffer, size_t byte_offset, size_t length) { 6095f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::JSTypedArray> obj = 6096f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org isolate->factory()->NewJSTypedArray(array_type); 6097f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); 6098f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6099e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(byte_offset % sizeof(ElementType) == 0); 6100f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6101b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CHECK(length <= (std::numeric_limits<size_t>::max() / sizeof(ElementType))); 610249ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org CHECK(length <= static_cast<size_t>(i::Smi::kMaxValue)); 6103b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org size_t byte_length = length * sizeof(ElementType); 61041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SetupArrayBufferView( 6105b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org isolate, obj, buffer, byte_offset, byte_length); 6106f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 61071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::Object> length_object = 61084ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org isolate->factory()->NewNumberFromSize(length); 6109f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org obj->set_length(*length_object); 6110f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6111f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::ExternalArray> elements = 6112f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org isolate->factory()->NewExternalArray( 6113f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org static_cast<int>(length), array_type, 6114f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); 6115895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org i::Handle<i::Map> map = 6116895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org i::JSObject::GetElementsTransitionMap(obj, elements_kind); 611763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org i::JSObject::SetMapAndElements(obj, map, elements); 6118f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return obj; 6119f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 6120f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6121f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6122af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define TYPED_ARRAY_NEW(Type, type, TYPE, ctype, size) \ 6123af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Local<Type##Array> Type##Array::New(Handle<ArrayBuffer> array_buffer, \ 6124f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org size_t byte_offset, size_t length) { \ 6125e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = Utils::OpenHandle(*array_buffer)->GetIsolate(); \ 6126f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org LOG_API(isolate, \ 6127af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)"); \ 6128f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org ENTER_V8(isolate); \ 612949ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org if (!Utils::ApiCheck(length <= static_cast<size_t>(i::Smi::kMaxValue), \ 613049ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)", \ 613149ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org "length exceeds max allowed value")) { \ 613249ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org return Local<Type##Array>(); \ 613349ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org } \ 6134f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org i::Handle<i::JSTypedArray> obj = \ 6135af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org NewTypedArray<ctype, v8::kExternal##Type##Array, \ 6136af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org i::EXTERNAL_##TYPE##_ELEMENTS>( \ 6137f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org isolate, array_buffer, byte_offset, length); \ 6138af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return Utils::ToLocal##Type##Array(obj); \ 6139af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 6140af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 6141f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6142af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(TYPED_ARRAY_NEW) 6143f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#undef TYPED_ARRAY_NEW 6144f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 61451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLocal<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, 61461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org size_t byte_offset, size_t byte_length) { 6147e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); 6148e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* isolate = buffer->GetIsolate(); 61491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LOG_API(isolate, "v8::DataView::New(void*, size_t, size_t)"); 61501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ENTER_V8(isolate); 61511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::Handle<i::JSDataView> obj = isolate->factory()->NewJSDataView(); 61521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SetupArrayBufferView( 61531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org isolate, obj, buffer, byte_offset, byte_length); 61541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Utils::ToLocal(obj); 61551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 61561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6157f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 6158a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgLocal<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) { 6159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOG_API(i_isolate, "Symbol::New()"); 6161e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ENTER_V8(i_isolate); 6162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); 6163a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name)); 6164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Utils::ToLocal(result); 6165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 6166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 6167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 61687dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgstatic i::Handle<i::Symbol> SymbolFor(i::Isolate* isolate, 61697dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> name, 61707dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> part) { 61717dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry(); 6172a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::JSObject> symbols = 61732f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org i::Handle<i::JSObject>::cast( 6174202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); 61752f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org i::Handle<i::Object> symbol = 61767dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked(); 6177a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (!symbol->IsSymbol()) { 6178e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(symbol->IsUndefined()); 61797dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org symbol = isolate->factory()->NewSymbol(); 61807dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::Symbol>::cast(symbol)->set_name(*name); 61817dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::JSObject::SetProperty(symbols, name, symbol, i::STRICT).Assert(); 6182a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 61837dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return i::Handle<i::Symbol>::cast(symbol); 61847dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org} 61857dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 61867dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 61877dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgLocal<Symbol> v8::Symbol::For(Isolate* isolate, Local<String> name) { 61887dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 61897dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> i_name = Utils::OpenHandle(*name); 61907dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> part = i_isolate->factory()->for_string(); 61917dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return Utils::ToLocal(SymbolFor(i_isolate, i_name, part)); 6192a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org} 6193a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6194a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6195a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgLocal<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { 6196a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6197a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::String> i_name = Utils::OpenHandle(*name); 6198a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::String> part = i_isolate->factory()->for_api_string(); 61997dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return Utils::ToLocal(SymbolFor(i_isolate, i_name, part)); 62007dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org} 62017dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62027dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62037dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgstatic Local<Symbol> GetWellKnownSymbol(Isolate* isolate, const char* name) { 62047dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 62057dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> i_name = 62067dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org Utils::OpenHandle(*String::NewFromUtf8(isolate, name)); 62077dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org i::Handle<i::String> part = i_isolate->factory()->for_intern_string(); 62087dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return Utils::ToLocal(SymbolFor(i_isolate, i_name, part)); 62097dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org} 62107dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62117dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62127dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgLocal<Symbol> v8::Symbol::GetIterator(Isolate* isolate) { 62137dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return GetWellKnownSymbol(isolate, "Symbol.iterator"); 62147dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org} 62157dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62167dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org 62177dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.orgLocal<Symbol> v8::Symbol::GetUnscopables(Isolate* isolate) { 62187dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org return GetWellKnownSymbol(isolate, "Symbol.unscopables"); 6219a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org} 6220a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6221a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6222a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgLocal<Private> v8::Private::New(Isolate* isolate, Local<String> name) { 6223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 62240cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOG_API(i_isolate, "Private::New()"); 6225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ENTER_V8(i_isolate); 62260cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org i::Handle<i::Symbol> symbol = i_isolate->factory()->NewPrivateSymbol(); 6227ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (!name.IsEmpty()) symbol->set_name(*Utils::OpenHandle(*name)); 62280cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Local<Symbol> result = Utils::ToLocal(symbol); 62290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); 6230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 6231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 6232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 6233a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgLocal<Private> v8::Private::ForApi(Isolate* isolate, Local<String> name) { 6234a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6235a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::String> i_name = Utils::OpenHandle(*name); 6236a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); 6237a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::String> part = i_isolate->factory()->private_api_string(); 6238a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::JSObject> privates = 62392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org i::Handle<i::JSObject>::cast( 6240202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); 62412f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org i::Handle<i::Object> symbol = 6242202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::Object::GetPropertyOrElement(privates, i_name).ToHandleChecked(); 6243a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (!symbol->IsSymbol()) { 6244e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(symbol->IsUndefined()); 6245a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org symbol = i_isolate->factory()->NewPrivateSymbol(); 6246a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); 62479bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org i::JSObject::SetProperty(privates, i_name, symbol, i::STRICT).Assert(); 6248a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 6249a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Local<Symbol> result = Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); 6250a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); 6251a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org} 6252a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6253a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 6254bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Number> v8::Number::New(Isolate* isolate, double value) { 6255bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(internal_isolate->IsInitialized()); 625777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (std::isnan(value)) { 62583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Introduce only canonical NaN value into the VM, to avoid signaling NaNs. 62595de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org value = base::OS::nan_value(); 62603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 6261bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org ENTER_V8(internal_isolate); 6262bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); 626343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::NumberToLocal(result); 626443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 626543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 626643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 626737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<Integer> v8::Integer::New(Isolate* isolate, int32_t value) { 626889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6269e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(internal_isolate->IsInitialized()); 627043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (i::Smi::IsValid(value)) { 6271ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value), 627289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org internal_isolate)); 627343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 627489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org ENTER_V8(internal_isolate); 627589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); 627643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Utils::IntegerToLocal(result); 627743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 627843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 627943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 628037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgLocal<Integer> v8::Integer::NewFromUnsigned(Isolate* isolate, uint32_t value) { 628189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(internal_isolate->IsInitialized()); 62833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org bool fits_into_int32_t = (value & (1 << 31)) == 0; 62843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org if (fits_into_int32_t) { 62850f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org return Integer::New(isolate, static_cast<int32_t>(value)); 62863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 628789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org ENTER_V8(internal_isolate); 628889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); 62893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return Utils::IntegerToLocal(result); 62903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 62913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 62923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 62938432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.orgbool V8::AddMessageListener(MessageCallback that, Handle<Value> data) { 6294ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6295ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::V8::AddMessageListener()", return false); 62967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 6297ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 6298ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NeanderArray listeners(isolate->factory()->message_listeners()); 62994610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org NeanderObject obj(isolate, 2); 63008432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org obj.set(0, *isolate->factory()->NewForeign(FUNCTION_ADDR(that))); 63018432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org obj.set(1, data.IsEmpty() ? isolate->heap()->undefined_value() 63024ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org : *Utils::OpenHandle(*data)); 63038432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org listeners.add(obj.value()); 630443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 630543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 630643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 630743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 630843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid V8::RemoveMessageListeners(MessageCallback that) { 6309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6310ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::V8::RemoveMessageListeners()", return); 63117979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 6312ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 6313ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NeanderArray listeners(isolate->factory()->message_listeners()); 631443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < listeners.length(); i++) { 631543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (listeners.get(i)->IsUndefined()) continue; // skip deleted ones 631643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org NeanderObject listener(i::JSObject::cast(listeners.get(i))); 63188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); 6319c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { 63207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org listeners.set(i, isolate->heap()->undefined_value()); 632143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 632243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 632343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 632443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 632543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.orgvoid V8::SetCaptureStackTraceForUncaughtExceptions( 63274ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org bool capture, 63284ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int frame_limit, 63294ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org StackTrace::StackTraceOptions options) { 6330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate::Current()->SetCaptureStackTraceForUncaughtExceptions( 63316a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org capture, 63326a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org frame_limit, 63336a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org options); 63346a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org} 63356a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 63366a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 633743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid V8::SetFailedAccessCheckCallbackFunction( 63384ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org FailedAccessCheckCallback callback) { 6339ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6340ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->SetFailedAccessCheckCallback(callback); 634143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 634243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 634332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 63441e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgvoid Isolate::CollectAllGarbage(const char* gc_reason) { 63451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->heap()->CollectAllGarbage( 63461e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org i::Heap::kNoGCFlags, gc_reason); 63472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 63482bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 63492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 6350f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgHeapProfiler* Isolate::GetHeapProfiler() { 6351f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org i::HeapProfiler* heap_profiler = 6352f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::Isolate*>(this)->heap_profiler(); 6353f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<HeapProfiler*>(heap_profiler); 6354f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 6355f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 6356f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 6357f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgCpuProfiler* Isolate::GetCpuProfiler() { 6358f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org i::CpuProfiler* cpu_profiler = 6359f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::Isolate*>(this)->cpu_profiler(); 6360f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<CpuProfiler*>(cpu_profiler); 6361f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 6362f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 6363f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 6364528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgbool Isolate::InContext() { 6365528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6366528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return isolate->context() != NULL; 6367528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6368528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6369528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 637040ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.orgv8::Local<v8::Context> Isolate::GetCurrentContext() { 6371528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6372528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Context* context = isolate->context(); 63731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (context == NULL) return Local<Context>(); 637458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org i::Context* native_context = context->native_context(); 63751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (native_context == NULL) return Local<Context>(); 63761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Utils::ToLocal(i::Handle<i::Context>(native_context)); 637740ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org} 637840ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org 637940ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org 6380528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgv8::Local<v8::Context> Isolate::GetCallingContext() { 6381528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6382528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Object> calling = isolate->GetCallingNativeContext(); 6383528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (calling.is_null()) return Local<Context>(); 6384528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); 6385528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6386528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6387528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6388528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgv8::Local<v8::Context> Isolate::GetEnteredContext() { 6389528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6390528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Handle<i::Object> last = 6391528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->handle_scope_implementer()->LastEnteredContext(); 6392528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (last.is_null()) return Local<Context>(); 6393528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return Utils::ToLocal(i::Handle<i::Context>::cast(last)); 6394528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6395528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6396528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6397cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgv8::Local<Value> Isolate::ThrowException(v8::Local<v8::Value> value) { 6398cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6399cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org ENTER_V8(isolate); 6400cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // If we're passed an empty handle, we throw an undefined exception 6401cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // to deal more gracefully with out of memory situations. 6402cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (value.IsEmpty()) { 6403cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org isolate->ScheduleThrow(isolate->heap()->undefined_value()); 6404cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } else { 6405cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org isolate->ScheduleThrow(*Utils::OpenHandle(*value)); 6406cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 6407cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 6408cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org} 6409cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 6410cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 6411690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetObjectGroupId(internal::Object** object, UniqueId id) { 6412ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); 6413ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org internal_isolate->global_handles()->SetObjectGroupId( 6414690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org v8::internal::Handle<v8::internal::Object>(object).location(), 6415f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org id); 6416ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6417ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6418ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6419690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetReferenceFromGroup(UniqueId id, internal::Object** object) { 6420ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); 6421f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org internal_isolate->global_handles()->SetReferenceFromGroup( 6422f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org id, 6423690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org v8::internal::Handle<v8::internal::Object>(object).location()); 6424ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6425ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6426ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6427690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetReference(internal::Object** parent, 6428690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org internal::Object** child) { 6429ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); 6430690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org i::Object** parent_location = 6431690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org v8::internal::Handle<v8::internal::Object>(parent).location(); 6432ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org internal_isolate->global_handles()->SetReference( 6433f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org reinterpret_cast<i::HeapObject**>(parent_location), 6434690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org v8::internal::Handle<v8::internal::Object>(child).location()); 6435ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 6436ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6437ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6438528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Isolate::AddGCPrologueCallback(GCPrologueCallback callback, 6439528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type) { 6440528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6441528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->AddGCPrologueCallback(callback, gc_type); 64424f626d111ff758f7428aaa0cfe2153b477d4ed1ehpayer@chromium.org} 64434f626d111ff758f7428aaa0cfe2153b477d4ed1ehpayer@chromium.org 64444f626d111ff758f7428aaa0cfe2153b477d4ed1ehpayer@chromium.org 6445528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Isolate::RemoveGCPrologueCallback(GCPrologueCallback callback) { 6446528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6447528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->RemoveGCPrologueCallback(callback); 6448528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6449528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6450528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6451528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Isolate::AddGCEpilogueCallback(GCEpilogueCallback callback, 6452528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type) { 6453528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6454528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->AddGCEpilogueCallback(callback, gc_type); 6455528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6456528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6457528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6458528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Isolate::RemoveGCEpilogueCallback(GCEpilogueCallback callback) { 6459528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6460528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->RemoveGCEpilogueCallback(callback); 646143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 646243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 646343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid V8::AddGCPrologueCallback(GCPrologueCallback callback, GCType gc_type) { 6465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6466528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->AddGCPrologueCallback( 6467528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::Isolate::GCPrologueCallback>(callback), 6468528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_type, 6469528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org false); 64705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 64715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid V8::RemoveGCPrologueCallback(GCPrologueCallback callback) { 6474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6475528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->RemoveGCPrologueCallback( 6476528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::Isolate::GCPrologueCallback>(callback)); 64775d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 64785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid V8::AddGCEpilogueCallback(GCEpilogueCallback callback, GCType gc_type) { 6481ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6482528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->AddGCEpilogueCallback( 6483528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::Isolate::GCEpilogueCallback>(callback), 6484528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_type, 6485528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org false); 64865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 64875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64885d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64895d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid V8::RemoveGCEpilogueCallback(GCEpilogueCallback callback) { 6490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6491528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate->heap()->RemoveGCEpilogueCallback( 6492528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::Isolate::GCEpilogueCallback>(callback)); 64935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 64945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 64963cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.orgvoid V8::AddMemoryAllocationCallback(MemoryAllocationCallback callback, 64973cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org ObjectSpace space, 64983cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org AllocationAction action) { 6499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->memory_allocator()->AddMemoryAllocationCallback( 6501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org callback, space, action); 65023cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org} 65033cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 65043cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 65053cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.orgvoid V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { 6506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6507ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->memory_allocator()->RemoveMemoryAllocationCallback( 6508ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org callback); 65093cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org} 65103cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 65113cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 6512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid V8::TerminateExecution(Isolate* isolate) { 65133c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 65143c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->stack_guard()->RequestTerminateExecution(); 6515c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org} 6516c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org 6517c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org 65186d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgbool V8::IsExecutionTerminating(Isolate* isolate) { 65196d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Isolate* i_isolate = isolate != NULL ? 65206d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org reinterpret_cast<i::Isolate*>(isolate) : i::Isolate::Current(); 65216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return IsExecutionTerminatingCheck(i_isolate); 65222ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org} 65232ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org 65242ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org 652532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgvoid V8::CancelTerminateExecution(Isolate* isolate) { 652632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 65273c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->stack_guard()->ClearTerminateExecution(); 65283c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->CancelTerminateExecution(); 652932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 653032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 653132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 6532ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.orgvoid Isolate::RequestInterrupt(InterruptCallback callback, void* data) { 65333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this); 65343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->set_api_interrupt_callback(callback); 65353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->set_api_interrupt_callback_data(data); 65363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->stack_guard()->RequestApiInterrupt(); 6537ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org} 6538ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org 6539ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org 6540ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.orgvoid Isolate::ClearInterrupt() { 65413c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this); 65423c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->stack_guard()->ClearApiInterrupt(); 65433c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->set_api_interrupt_callback(NULL); 65443c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org i_isolate->set_api_interrupt_callback_data(NULL); 6545ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org} 6546ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org 6547ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org 65484ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgvoid Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) { 65494ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org CHECK(i::FLAG_expose_gc); 65504ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (type == kMinorGarbageCollection) { 65514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->heap()->CollectGarbage( 65524ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org i::NEW_SPACE, "Isolate::RequestGarbageCollection", 65534ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org kGCCallbackFlagForced); 65544ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } else { 6555e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(kFullGarbageCollection, type); 65564ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->heap()->CollectAllGarbage( 6557c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org i::Heap::kAbortIncrementalMarkingMask, 6558c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org "Isolate::RequestGarbageCollection", kGCCallbackFlagForced); 65594ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 65604ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org} 65614ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 65624ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 6563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate* Isolate::GetCurrent() { 65646b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return reinterpret_cast<Isolate*>(isolate); 6566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 6567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 65699e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgIsolate* Isolate::New(const Isolate::CreateParams& params) { 6570ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = new i::Isolate(); 6571d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org Isolate* v8_isolate = reinterpret_cast<Isolate*>(isolate); 65729e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (params.entry_hook) { 65739e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org isolate->set_function_entry_hook(params.entry_hook); 65749e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 65759e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (params.code_event_handler) { 65769e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org isolate->InitializeLoggingAndCounters(); 65779e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org isolate->logger()->SetCodeEventHandler(kJitCodeEventDefault, 65789e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org params.code_event_handler); 65799e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 6580a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org SetResourceConstraints(isolate, params.constraints); 6581a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (params.enable_serializer) { 6582a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org isolate->enable_serializer(); 6583a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 6584a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // TODO(jochen): Once we got rid of Isolate::Current(), we can remove this. 6585a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Isolate::Scope isolate_scope(v8_isolate); 6586a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (params.entry_hook || !i::Snapshot::Initialize(isolate)) { 6587a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // If the isolate has a function entry hook, it needs to re-build all its 6588a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // code stubs with entry hooks embedded, so don't deserialize a snapshot. 6589a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org isolate->Init(NULL); 6590a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 6591d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org return v8_isolate; 6592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 6593ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Dispose() { 6596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 65974ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(!isolate->IsInUse(), 65984ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Isolate::Dispose()", 65994ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Disposing the isolate that is entered by a thread.")) { 6600ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return; 6601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 6602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->TearDown(); 6603ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 6604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Enter() { 6607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6608ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->Enter(); 6609ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 6610ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Exit() { 6613ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6614ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->Exit(); 6615ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 6616ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6617ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 66185697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.orgIsolate::DisallowJavascriptExecutionScope::DisallowJavascriptExecutionScope( 66195697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org Isolate* isolate, 66205697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org Isolate::DisallowJavascriptExecutionScope::OnFailure on_failure) 66215697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org : on_failure_(on_failure) { 66225697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 66235697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org if (on_failure_ == CRASH_ON_FAILURE) { 66245697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org internal_ = reinterpret_cast<void*>( 66255697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org new i::DisallowJavascriptExecution(i_isolate)); 66265697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org } else { 6627e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(THROW_ON_FAILURE, on_failure); 66285697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org internal_ = reinterpret_cast<void*>( 66295697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org new i::ThrowOnJavascriptExecution(i_isolate)); 66305697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org } 66315697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org} 66325697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66335697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66345697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.orgIsolate::DisallowJavascriptExecutionScope::~DisallowJavascriptExecutionScope() { 66355697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org if (on_failure_ == CRASH_ON_FAILURE) { 66365697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org delete reinterpret_cast<i::DisallowJavascriptExecution*>(internal_); 66375697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org } else { 66385697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org delete reinterpret_cast<i::ThrowOnJavascriptExecution*>(internal_); 66395697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org } 66405697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org} 66415697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66425697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66435697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.orgIsolate::AllowJavascriptExecutionScope::AllowJavascriptExecutionScope( 66445697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org Isolate* isolate) { 66455697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 66465697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org internal_assert_ = reinterpret_cast<void*>( 66475697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org new i::AllowJavascriptExecution(i_isolate)); 66485697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org internal_throws_ = reinterpret_cast<void*>( 66495697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org new i::NoThrowOnJavascriptExecution(i_isolate)); 66505697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org} 66515697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66525697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66535697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.orgIsolate::AllowJavascriptExecutionScope::~AllowJavascriptExecutionScope() { 66545697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org delete reinterpret_cast<i::AllowJavascriptExecution*>(internal_assert_); 66555697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org delete reinterpret_cast<i::NoThrowOnJavascriptExecution*>(internal_throws_); 66565697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org} 66575697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 66585697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 6659c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgIsolate::SuppressMicrotaskExecutionScope::SuppressMicrotaskExecutionScope( 6660c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org Isolate* isolate) 6661c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org : isolate_(reinterpret_cast<i::Isolate*>(isolate)) { 6662c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org isolate_->handle_scope_implementer()->IncrementCallDepth(); 6663c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 6664c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6665c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6666c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgIsolate::SuppressMicrotaskExecutionScope::~SuppressMicrotaskExecutionScope() { 6667c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org isolate_->handle_scope_implementer()->DecrementCallDepth(); 6668c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 6669c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6670c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 66717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgvoid Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) { 66727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6673f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (!isolate->IsInitialized()) { 6674f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_statistics->total_heap_size_ = 0; 6675f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_statistics->total_heap_size_executable_ = 0; 6676f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_statistics->total_physical_size_ = 0; 6677f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_statistics->used_heap_size_ = 0; 6678f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_statistics->heap_size_limit_ = 0; 6679f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return; 6680f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 66817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org i::Heap* heap = isolate->heap(); 66827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap_statistics->total_heap_size_ = heap->CommittedMemory(); 66837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap_statistics->total_heap_size_executable_ = 66847c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap->CommittedMemoryExecutable(); 66857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory(); 66867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap_statistics->used_heap_size_ = heap->SizeOfObjects(); 66877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org heap_statistics->heap_size_limit_ = heap->MaxReserved(); 66887c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org} 66897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 66907c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 6691ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid Isolate::SetEventLogger(LogEventCallback that) { 6692e7553c2faf3f3a5539d2561d024ab1e9a527d8famvstanton@chromium.org // Do not overwrite the event logger if we want to log explicitly. 6693e7553c2faf3f3a5539d2561d024ab1e9a527d8famvstanton@chromium.org if (i::FLAG_log_timer_events) return; 6694ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6695ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org isolate->set_event_logger(that); 6696ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 6697ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 6698255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 6699255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgvoid Isolate::AddCallCompletedCallback(CallCompletedCallback callback) { 6700255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org if (callback == NULL) return; 6701865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6702865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org isolate->AddCallCompletedCallback(callback); 6703255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org} 6704255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 6705255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 6706255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgvoid Isolate::RemoveCallCompletedCallback(CallCompletedCallback callback) { 6707865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6708865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org isolate->RemoveCallCompletedCallback(callback); 6709255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org} 6710255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 6711255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 6712c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgvoid Isolate::RunMicrotasks() { 671354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->RunMicrotasks(); 6714c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 6715c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6716c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6717c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgvoid Isolate::EnqueueMicrotask(Handle<Function> microtask) { 671854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 671954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org isolate->EnqueueMicrotask(Utils::OpenHandle(*microtask)); 6720c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 6721c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6722c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 672338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.orgvoid Isolate::EnqueueMicrotask(MicrotaskCallback microtask, void* data) { 672438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 672538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org i::HandleScope scope(isolate); 672638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org i::Handle<i::CallHandlerInfo> callback_info = 672738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org i::Handle<i::CallHandlerInfo>::cast( 672838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE)); 672938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org SET_FIELD_WRAPPED(callback_info, set_callback, microtask); 673038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org SET_FIELD_WRAPPED(callback_info, set_data, data); 673138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org isolate->EnqueueMicrotask(callback_info); 673238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org} 673338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org 673438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org 6735c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgvoid Isolate::SetAutorunMicrotasks(bool autorun) { 6736c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->set_autorun_microtasks(autorun); 6737c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 6738c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6739c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6740a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.orgbool Isolate::WillAutorunMicrotasks() const { 6741a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org return reinterpret_cast<const i::Isolate*>(this)->autorun_microtasks(); 6742a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org} 6743a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 6744a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 6745975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgvoid Isolate::SetUseCounterCallback(UseCounterCallback callback) { 6746975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org reinterpret_cast<i::Isolate*>(this)->SetUseCounterCallback(callback); 6747975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org} 6748975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 6749975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 67506b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.orgvoid Isolate::SetCounterFunction(CounterLookupCallback callback) { 67516b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 67526b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->stats_table()->SetCounterFunction(callback); 67536b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->InitializeLoggingAndCounters(); 67546b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->counters()->ResetCounters(); 67556b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org} 67566b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 67576b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 67586b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.orgvoid Isolate::SetCreateHistogramFunction(CreateHistogramCallback callback) { 67596b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 67606b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->stats_table()->SetCreateHistogramFunction(callback); 67616b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->InitializeLoggingAndCounters(); 67626b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->counters()->ResetHistograms(); 67636b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org} 67646b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 67656b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 67666b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.orgvoid Isolate::SetAddHistogramSampleFunction( 67676b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org AddHistogramSampleCallback callback) { 67686b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org reinterpret_cast<i::Isolate*>(this) 67696b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org ->stats_table() 67706b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org ->SetAddHistogramSampleFunction(callback); 67716b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org} 67726b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 67736b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org 6774f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgbool v8::Isolate::IdleNotification(int idle_time_in_ms) { 6775f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Returning true tells the caller that it need not 6776f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // continue to call IdleNotification. 6777f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6778f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org if (!i::FLAG_use_idle_notification) return true; 6779f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org return isolate->heap()->IdleNotification(idle_time_in_ms); 6780f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 6781f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 6782f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 6783f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgvoid v8::Isolate::LowMemoryNotification() { 6784f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6785f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org { 6786f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i::HistogramTimerScope idle_notification_scope( 6787f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->counters()->gc_low_memory_notification()); 6788f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->heap()->CollectAllAvailableGarbage("low memory notification"); 6789f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 6790f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 6791f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 6792f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 6793f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgint v8::Isolate::ContextDisposedNotification() { 6794f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6795f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org return isolate->heap()->NotifyContextDisposed(); 6796f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 6797f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 6798f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 67999e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgvoid v8::Isolate::SetJitCodeEventHandler(JitCodeEventOptions options, 68009e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org JitCodeEventHandler event_handler) { 68019e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 68029e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // Ensure that logging is initialized for our isolate. 68039e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org isolate->InitializeLoggingAndCounters(); 68049e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org isolate->logger()->SetCodeEventHandler(options, event_handler); 68059e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org} 68069e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 68079e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 6808d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.orgvoid v8::Isolate::SetStackLimit(uintptr_t stack_limit) { 6809d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6810d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org CHECK(stack_limit); 6811d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org isolate->stack_guard()->SetStackLimit(stack_limit); 6812d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org} 6813d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org 6814d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org 681583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgString::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) 681683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org : str_(NULL), length_(0) { 68177979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 681883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (obj.IsEmpty()) return; 68197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 68207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::HandleScope scope(isolate); 68219258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org TryCatch try_catch; 68229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org Handle<String> str = obj->ToString(); 682383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (str.IsEmpty()) return; 6824154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org i::Handle<i::String> i_str = Utils::OpenHandle(*str); 68254cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org length_ = v8::Utf8Length(*i_str, isolate); 682683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org str_ = i::NewArray<char>(length_ + 1); 682783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org str->WriteUtf8(str_); 68289258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 68299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 68309258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 68319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgString::Utf8Value::~Utf8Value() { 68329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org i::DeleteArray(str_); 68339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 68349258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 68359258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 683683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgString::Value::Value(v8::Handle<v8::Value> obj) 683783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org : str_(NULL), length_(0) { 68387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 683983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (obj.IsEmpty()) return; 68407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 68417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::HandleScope scope(isolate); 68429258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org TryCatch try_catch; 684343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<String> str = obj->ToString(); 684483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (str.IsEmpty()) return; 684583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org length_ = str->Length(); 684683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org str_ = i::NewArray<uint16_t>(length_ + 1); 684783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org str->Write(str_); 684843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 684943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 685043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 685143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenString::Value::~Value() { 685243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen i::DeleteArray(str_); 685343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 685443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6855e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 6856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#define DEFINE_ERROR(NAME) \ 6857ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Local<Value> Exception::NAME(v8::Handle<v8::String> raw_message) { \ 6858ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::Isolate* isolate = i::Isolate::Current(); \ 6859ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org LOG_API(isolate, #NAME); \ 6860ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ON_BAILOUT(isolate, "v8::Exception::" #NAME "()", return Local<Value>()); \ 6861ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ENTER_V8(isolate); \ 6862ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::Object* error; \ 6863ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org { \ 6864ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::HandleScope scope(isolate); \ 6865ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::Handle<i::String> message = Utils::OpenHandle(*raw_message); \ 6866ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::Handle<i::Object> result; \ 6867ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org EXCEPTION_PREAMBLE(isolate); \ 6868ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::MaybeHandle<i::Object> maybe_result = \ 6869ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org isolate->factory()->New##NAME(message); \ 6870ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org has_pending_exception = !maybe_result.ToHandle(&result); \ 6871ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org /* TODO(yangguo): crbug/403509. Return empty handle instead. */ \ 6872ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org EXCEPTION_BAILOUT_CHECK( \ 6873ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org isolate, v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate))); \ 6874ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org error = *result; \ 6875ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org } \ 6876ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i::Handle<i::Object> result(error, isolate); \ 6877ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return Utils::ToLocal(result); \ 6878ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org } 6879ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 6880ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgDEFINE_ERROR(RangeError) 6881ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgDEFINE_ERROR(ReferenceError) 6882ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgDEFINE_ERROR(SyntaxError) 6883ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgDEFINE_ERROR(TypeError) 6884ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgDEFINE_ERROR(Error) 6885ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 6886ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#undef DEFINE_ERROR 688743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 688843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 688943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- D e b u g S u p p o r t --- 689043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6891aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgbool Debug::SetDebugEventListener(EventCallback that, Handle<Value> data) { 6892ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6893aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org ON_BAILOUT(isolate, "v8::Debug::SetDebugEventListener()", return false); 68947979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 6895ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::HandleScope scope(isolate); 6896ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org i::Handle<i::Object> foreign = isolate->factory()->undefined_value(); 6897381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (that != NULL) { 6898ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org foreign = isolate->factory()->NewForeign(FUNCTION_ADDR(that)); 6899381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 6900d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org isolate->debug()->SetEventListener(foreign, 6901d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Utils::OpenHandle(*data, true)); 690243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 690343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 690443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 690543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6906ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Debug::DebugBreak(Isolate* isolate) { 69073c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->RequestDebugBreak(); 690843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 690943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 691043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6911ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Debug::CancelDebugBreak(Isolate* isolate) { 6912e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 69133c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org internal_isolate->stack_guard()->ClearDebugBreak(); 6914f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 6915f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 6916f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 6917e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgbool Debug::CheckDebugBreak(Isolate* isolate) { 6918e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6919e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org return internal_isolate->stack_guard()->CheckDebugBreak(); 6920e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} 6921e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 6922e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 6923e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgvoid Debug::DebugBreakForCommand(Isolate* isolate, ClientData* data) { 6924e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6925d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org internal_isolate->debug()->EnqueueDebugCommand(data); 692622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com} 692722762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 692822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 6929aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgvoid Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { 69307979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 69317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 6932d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org isolate->debug()->SetMessageHandler(handler); 693343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 693443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 693543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6936528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Debug::SendCommand(Isolate* isolate, 6937528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org const uint16_t* command, 6938528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int length, 6939528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ClientData* client_data) { 6940528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 6941d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org internal_isolate->debug()->EnqueueCommandMessage( 6942528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Vector<const uint16_t>(command, length), client_data); 6943528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 6944528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6945528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 6946911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgLocal<Value> Debug::Call(v8::Handle<v8::Function> fun, 6947911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org v8::Handle<v8::Value> data) { 6948ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6949ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!isolate->IsInitialized()) return Local<Value>(); 6950ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Debug::Call()", return Local<Value>()); 69517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 69522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::MaybeHandle<i::Object> maybe_result; 69537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 6954a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (data.IsEmpty()) { 6955d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org maybe_result = isolate->debug()->Call( 69562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Utils::OpenHandle(*fun), isolate->factory()->undefined_value()); 6957a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 6958d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org maybe_result = isolate->debug()->Call( 69592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Utils::OpenHandle(*fun), Utils::OpenHandle(*data)); 6960a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 69612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> result; 69622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org has_pending_exception = !maybe_result.ToHandle(&result); 69637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 6964a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return Utils::ToLocal(result); 6965a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 6966a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 6967a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 6968911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgLocal<Value> Debug::GetMirror(v8::Handle<v8::Value> obj) { 6969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 6970ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!isolate->IsInitialized()) return Local<Value>(); 6971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ON_BAILOUT(isolate, "v8::Debug::GetMirror()", return Local<Value>()); 69727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 6973ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org v8::EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 69747979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Debug* isolate_debug = isolate->debug(); 69757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_PREAMBLE(isolate); 69768f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org has_pending_exception = !isolate_debug->Load(); 69778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org v8::Local<v8::Value> result; 69788f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org if (!has_pending_exception) { 69798f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org i::Handle<i::JSObject> debug( 69808f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate_debug->debug_context()->global_object()); 69818f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org i::Handle<i::String> name = isolate->factory()->InternalizeOneByteString( 69822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org STATIC_CHAR_VECTOR("MakeMirror")); 69832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Handle<i::Object> fun_obj = 69842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org i::Object::GetProperty(debug, name).ToHandleChecked(); 69858f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(fun_obj); 69868f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org v8::Handle<v8::Function> v8_fun = Utils::ToLocal(fun); 69878f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org const int kArgc = 1; 69888f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org v8::Handle<v8::Value> argv[kArgc] = { obj }; 69898f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org result = v8_fun->Call(Utils::ToLocal(debug), kArgc, argv); 69908f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org has_pending_exception = result.IsEmpty(); 69918f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 69927979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 6993ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return scope.Escape(result); 6994911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 6995911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 6996911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 6997b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Debug::ProcessDebugMessages() { 69988d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org i::Isolate::Current()->debug()->ProcessDebugMessages(true); 6999b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 7000b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7001de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7002df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.orgLocal<Context> Debug::GetDebugContext() { 70037979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org i::Isolate* isolate = i::Isolate::Current(); 70047979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org ENTER_V8(isolate); 7005d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return Utils::ToLocal(i::Isolate::Current()->debug()->GetDebugContext()); 7006df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org} 7007df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org 7008de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7009e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgvoid Debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { 7010e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); 7011d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org internal_isolate->debug()->set_live_edit_enabled(enable); 7012de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org} 7013de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7014de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7015357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgHandle<String> CpuProfileNode::GetFunctionName() const { 7016ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7017357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); 7018357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::CodeEntry* entry = node->entry(); 7019255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org i::Handle<i::String> name = 7020255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org isolate->factory()->InternalizeUtf8String(entry->name()); 7021357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (!entry->has_name_prefix()) { 7022255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org return ToApiHandle<String>(name); 7023357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } else { 7024255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org // We do not expect this to fail. Change this if it does. 70257010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org i::Handle<i::String> cons = isolate->factory()->NewConsString( 70264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org isolate->factory()->InternalizeUtf8String(entry->name_prefix()), 7027255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org name).ToHandleChecked(); 70287010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return ToApiHandle<String>(cons); 7029357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 7030357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7031357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7032357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 703393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgint CpuProfileNode::GetScriptId() const { 703493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); 703593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org const i::CodeEntry* entry = node->entry(); 703693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org return entry->script_id(); 703793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org} 703893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 703993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 7040357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgHandle<String> CpuProfileNode::GetScriptResourceName() const { 7041ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7042357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); 7043f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( 7044f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org node->entry()->resource_name())); 7045357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7046357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7047357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7048357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgint CpuProfileNode::GetLineNumber() const { 7049357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); 7050357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7051357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7052357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7053dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.orgint CpuProfileNode::GetColumnNumber() const { 7054dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)-> 7055dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org entry()->column_number(); 7056dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org} 7057dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org 7058dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org 70592c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgconst char* CpuProfileNode::GetBailoutReason() const { 70602c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); 70612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org return node->entry()->bailout_reason(); 70622c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org} 70632c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 70642c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 7065594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgunsigned CpuProfileNode::GetHitCount() const { 7066594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); 7067594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 7068594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 7069594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 7070357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgunsigned CpuProfileNode::GetCallUid() const { 7071c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid(); 7072357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7073357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7074357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7075f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgunsigned CpuProfileNode::GetNodeId() const { 7076f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)->id(); 7077f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 7078f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7079f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7080357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgint CpuProfileNode::GetChildrenCount() const { 7081357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return reinterpret_cast<const i::ProfileNode*>(this)->children()->length(); 7082357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7083357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7084357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7085357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgconst CpuProfileNode* CpuProfileNode::GetChild(int index) const { 7086357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::ProfileNode* child = 7087357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index); 7088357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return reinterpret_cast<const CpuProfileNode*>(child); 7089357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7090357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7091357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7092ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid CpuProfile::Delete() { 7093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7094f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org i::CpuProfiler* profiler = isolate->cpu_profiler(); 7095e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(profiler != NULL); 7096f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); 7097ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 7098ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7099ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7100357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgHandle<String> CpuProfile::GetTitle() const { 7101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7102357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 7103f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( 7104f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org profile->title())); 7105357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7106357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7107357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7108357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgconst CpuProfileNode* CpuProfile::GetTopDownRoot() const { 7109357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 7110357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root()); 7111357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 7112357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7113357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 7114f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgconst CpuProfileNode* CpuProfile::GetSample(int index) const { 7115f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 7116f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<const CpuProfileNode*>(profile->sample(index)); 7117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 7118f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7119f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7120865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgint64_t CpuProfile::GetSampleTimestamp(int index) const { 7121865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 71225de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return (profile->sample_timestamp(index) - base::TimeTicks()) 71235de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org .InMicroseconds(); 7124865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org} 7125865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 7126865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 712789acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.orgint64_t CpuProfile::GetStartTime() const { 712889acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 71295de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return (profile->start_time() - base::TimeTicks()).InMicroseconds(); 713089acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org} 713189acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org 713289acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org 713389acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.orgint64_t CpuProfile::GetEndTime() const { 713489acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); 71355de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return (profile->end_time() - base::TimeTicks()).InMicroseconds(); 713689acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org} 713789acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org 713889acc0bef1acf051e807b057dbcbcd478a8ad301danno@chromium.org 7139f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgint CpuProfile::GetSamplesCount() const { 7140f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<const i::CpuProfile*>(this)->samples_count(); 7141f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 7142f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7143f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 71443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgvoid CpuProfiler::SetSamplingInterval(int us) { 7145e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(us >= 0); 71463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return reinterpret_cast<i::CpuProfiler*>(this)->set_sampling_interval( 71475de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::TimeDelta::FromMicroseconds(us)); 71483d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org} 71493d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 71503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 71516b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgvoid CpuProfiler::StartProfiling(Handle<String> title, bool record_samples) { 7152f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling( 7153f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org *Utils::OpenHandle(*title), record_samples); 71547bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org} 71557bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org 71567bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org 71576b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgvoid CpuProfiler::StartCpuProfiling(Handle<String> title, bool record_samples) { 71586b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org StartProfiling(title, record_samples); 71596b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 71606b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 71616b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 71626b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgCpuProfile* CpuProfiler::StopProfiling(Handle<String> title) { 71636b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return reinterpret_cast<CpuProfile*>( 7164c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org reinterpret_cast<i::CpuProfiler*>(this)->StopProfiling( 7165c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org *Utils::OpenHandle(*title))); 7166c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 7167c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 7168c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 71696b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgconst CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title) { 71706b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return StopProfiling(title); 71716b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 71726b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 71736b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 7174594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid CpuProfiler::SetIdle(bool is_idle) { 7175594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::Isolate* isolate = reinterpret_cast<i::CpuProfiler*>(this)->isolate(); 7176594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::StateTag state = isolate->current_vm_state(); 7177e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(state == i::EXTERNAL || state == i::IDLE); 7178594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (isolate->js_entry_sp() != NULL) return; 7179594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (is_idle) { 7180594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate->set_current_vm_state(i::IDLE); 7181594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else if (state == i::IDLE) { 7182594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate->set_current_vm_state(i::EXTERNAL); 7183594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 7184594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 7185594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 7186594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 718726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgstatic i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { 718826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return const_cast<i::HeapGraphEdge*>( 718926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org reinterpret_cast<const i::HeapGraphEdge*>(edge)); 719026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 7191d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 719226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 71932c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgHeapGraphEdge::Type HeapGraphEdge::GetType() const { 719426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); 71952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 71962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 71972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 71982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgHandle<Value> HeapGraphEdge::GetName() const { 7199ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 720026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org i::HeapGraphEdge* edge = ToInternal(this); 72012c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org switch (edge->type()) { 720226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org case i::HeapGraphEdge::kContextVariable: 720326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org case i::HeapGraphEdge::kInternal: 720426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org case i::HeapGraphEdge::kProperty: 720521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org case i::HeapGraphEdge::kShortcut: 7206af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org case i::HeapGraphEdge::kWeak: 7207f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>( 7208f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org isolate->factory()->InternalizeUtf8String(edge->name())); 720926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org case i::HeapGraphEdge::kElement: 721021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org case i::HeapGraphEdge::kHidden: 7211f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<Number>( 7212f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org isolate->factory()->NewNumberFromInt(edge->index())); 72132c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org default: UNREACHABLE(); 72142c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 7215cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 72162c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72172c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72182c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72192c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgconst HeapGraphNode* HeapGraphEdge::GetFromNode() const { 7220ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const i::HeapEntry* from = ToInternal(this)->from(); 72212c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return reinterpret_cast<const HeapGraphNode*>(from); 72222c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72232c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72242c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72252c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgconst HeapGraphNode* HeapGraphEdge::GetToNode() const { 722626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const i::HeapEntry* to = ToInternal(this)->to(); 72272c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return reinterpret_cast<const HeapGraphNode*>(to); 72282c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72292c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72302c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 723126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgstatic i::HeapEntry* ToInternal(const HeapGraphNode* entry) { 723226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return const_cast<i::HeapEntry*>( 723326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org reinterpret_cast<const i::HeapEntry*>(entry)); 723426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 723526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 723626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 72372c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgHeapGraphNode::Type HeapGraphNode::GetType() const { 723826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); 72392c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72402c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72422c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgHandle<String> HeapGraphNode::GetName() const { 7243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7244f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>( 7245f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org isolate->factory()->InternalizeUtf8String(ToInternal(this)->name())); 72462c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72472c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgSnapshotObjectId HeapGraphNode::GetId() const { 725026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return ToInternal(this)->id(); 72514980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org} 72524980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 72534980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 72542c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgint HeapGraphNode::GetSelfSize() const { 7255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org size_t size = ToInternal(this)->self_size(); 7256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK(size <= static_cast<size_t>(internal::kMaxInt)); 7257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return static_cast<int>(size); 7258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 7259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 7260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 7261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgsize_t HeapGraphNode::GetShallowSize() const { 726226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return ToInternal(this)->self_size(); 72632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72662c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgint HeapGraphNode::GetChildrenCount() const { 726726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return ToInternal(this)->children().length(); 72682c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72692c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72702c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72712c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgconst HeapGraphEdge* HeapGraphNode::GetChild(int index) const { 72722c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return reinterpret_cast<const HeapGraphEdge*>( 7273212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org ToInternal(this)->children()[index]); 72742c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72752c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72762c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 727726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgstatic i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { 727826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return const_cast<i::HeapSnapshot*>( 727926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org reinterpret_cast<const i::HeapSnapshot*>(snapshot)); 728026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 728126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 728226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 7283ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid HeapSnapshot::Delete() { 7284ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7285f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { 7286ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ToInternal(this)->Delete(); 7287ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else { 7288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // If this is the last snapshot, clean up all accessory data as well. 7289f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org isolate->heap_profiler()->DeleteAllSnapshots(); 7290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 7291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 7292ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7293ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 72942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgunsigned HeapSnapshot::GetUid() const { 729526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return ToInternal(this)->uid(); 72962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 72972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 72992c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgHandle<String> HeapSnapshot::GetTitle() const { 7300ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7301f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return ToApiHandle<String>( 7302f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org isolate->factory()->InternalizeUtf8String(ToInternal(this)->title())); 73032c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 73042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73064980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.orgconst HeapGraphNode* HeapSnapshot::GetRoot() const { 730726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->root()); 73082c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 73092c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73102c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst HeapGraphNode* HeapSnapshot::GetNodeById(SnapshotObjectId id) const { 7312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return reinterpret_cast<const HeapGraphNode*>( 73131456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org ToInternal(this)->GetEntryById(id)); 7314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7317ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgint HeapSnapshot::GetNodesCount() const { 7318212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org return ToInternal(this)->entries().length(); 7319ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org} 7320ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 7321ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 7322ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgconst HeapGraphNode* HeapSnapshot::GetNode(int index) const { 7323ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org return reinterpret_cast<const HeapGraphNode*>( 7324212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org &ToInternal(this)->entries().at(index)); 7325ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org} 7326ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 7327ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 73281456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgSnapshotObjectId HeapSnapshot::GetMaxSnapshotJSObjectId() const { 73291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org return ToInternal(this)->max_snapshot_js_object_id(); 73301456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 73311456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 73321456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 7333d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.comvoid HeapSnapshot::Serialize(OutputStream* stream, 7334d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com HeapSnapshot::SerializationFormat format) const { 73354ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(format == kJSON, 73364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::HeapSnapshot::Serialize", 73374ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Unknown serialization format"); 73384ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Utils::ApiCheck(stream->GetChunkSize() > 0, 73394ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::HeapSnapshot::Serialize", 73404ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Invalid stream chunk size"); 7341d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com i::HeapSnapshotJSONSerializer serializer(ToInternal(this)); 7342d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com serializer.Serialize(stream); 7343d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com} 7344d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 7345d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 7346f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgint HeapProfiler::GetSnapshotCount() { 7347f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotsCount(); 73482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 73492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73502c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 7351f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgconst HeapSnapshot* HeapProfiler::GetHeapSnapshot(int index) { 7352f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<const HeapSnapshot*>( 7353f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshot(index)); 73542c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 73552c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 73562c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 7357f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgSnapshotObjectId HeapProfiler::GetObjectId(Handle<Value> value) { 7358f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org i::Handle<i::Object> obj = Utils::OpenHandle(*value); 7359f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<i::HeapProfiler*>(this)->GetSnapshotObjectId(obj); 7360ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 7361ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 7362ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 73634f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgHandle<Value> HeapProfiler::FindObjectById(SnapshotObjectId id) { 73644f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org i::Handle<i::Object> obj = 73654f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->FindHeapObjectById(id); 73664f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org if (obj.is_null()) return Local<Value>(); 73674f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return Utils::ToLocal(obj); 73684f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org} 73694f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 73704f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 73714f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgvoid HeapProfiler::ClearObjectIds() { 73724f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->ClearHeapObjectMap(); 73734f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org} 73744f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 73754f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 7376f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgconst HeapSnapshot* HeapProfiler::TakeHeapSnapshot( 7377f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Handle<String> title, 7378f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org ActivityControl* control, 7379f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org ObjectNameResolver* resolver) { 7380f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<const HeapSnapshot*>( 7381f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->TakeSnapshot( 7382f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org *Utils::OpenHandle(*title), control, resolver)); 73832c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 73842c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 7385b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 7386ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid HeapProfiler::StartTrackingHeapObjects(bool track_allocations) { 7387ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->StartHeapObjectsTracking( 7388ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org track_allocations); 738928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 739028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 739128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 7392f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid HeapProfiler::StopTrackingHeapObjects() { 7393f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->StopHeapObjectsTracking(); 739428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 739528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 739628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 7397f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgSnapshotObjectId HeapProfiler::GetHeapStats(OutputStream* stream) { 7398f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<i::HeapProfiler*>(this)->PushHeapObjectsStats(stream); 739928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 740028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 740128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 7402f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid HeapProfiler::DeleteAllHeapSnapshots() { 7403f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->DeleteAllSnapshots(); 7404ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 7405ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7407f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid HeapProfiler::SetWrapperClassInfoProvider(uint16_t class_id, 7408f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org WrapperInfoCallback callback) { 7409f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->DefineWrapperClass(class_id, 7410f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org callback); 7411f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} 7412f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7413f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 7414f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgsize_t HeapProfiler::GetProfilerMemorySize() { 7415f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return reinterpret_cast<i::HeapProfiler*>(this)-> 7416f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org GetMemorySizeUsedByProfiler(); 74177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org} 74187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 74197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 7420ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgvoid HeapProfiler::SetRetainedObjectInfo(UniqueId id, 7421ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org RetainedObjectInfo* info) { 7422ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org reinterpret_cast<i::HeapProfiler*>(this)->SetRetainedObjectInfo(id, info); 7423ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 7424ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 7425ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 7426a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgv8::Testing::StressType internal::Testing::stress_type_ = 7427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Testing::kStressTypeOpt; 7428a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Testing::SetStressRunType(Testing::StressType type) { 7431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org internal::Testing::set_stress_type(type); 7432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7433a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7434e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgint Testing::GetStressRuns() { 74365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org if (internal::FLAG_stress_runs != 0) return internal::FLAG_stress_runs; 7437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG 7438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // In debug mode the code runs much slower so stressing will only make two 7439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // runs. 7440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 2; 7441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#else 7442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 5; 7443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 7444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic void SetFlagsFromString(const char* flags) { 7448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org V8::SetFlagsFromString(flags, i::StrLength(flags)); 7449a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7451a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Testing::PrepareStressRun(int run) { 7453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const char* kLazyOptimizations = 745488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org "--prepare-always-opt " 745588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org "--max-inlined-source-size=999999 " 745688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org "--max-inlined-nodes=999999 " 745788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org "--max-inlined-nodes-cumulative=999999 " 745888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org "--noalways-opt"; 7459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const char* kForcedOptimizations = "--always-opt"; 7460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // If deoptimization stressed turn on frequent deoptimization. If no value 7462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // is spefified through --deopt-every-n-times use a default default value. 7463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const char* kDeoptEvery13Times = "--deopt-every-n-times=13"; 7464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (internal::Testing::stress_type() == Testing::kStressTypeDeopt && 7465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org internal::FLAG_deopt_every_n_times == 0) { 7466a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetFlagsFromString(kDeoptEvery13Times); 7467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG 7470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // As stressing in debug mode only make two runs skip the deopt stressing 7471a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // here. 7472a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (run == GetStressRuns() - 1) { 7473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetFlagsFromString(kForcedOptimizations); 7474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 7475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetFlagsFromString(kLazyOptimizations); 7476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#else 7478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (run == GetStressRuns() - 1) { 7479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetFlagsFromString(kForcedOptimizations); 748078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } else if (run != GetStressRuns() - 2) { 7481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetFlagsFromString(kLazyOptimizations); 7482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 7484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7487c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org// TODO(svenpanne) Deprecate this. 7488b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgvoid Testing::DeoptimizeAll() { 7489c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org i::Isolate* isolate = i::Isolate::Current(); 7490c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org i::HandleScope scope(isolate); 7491876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org internal::Deoptimizer::DeoptimizeAll(isolate); 7492b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 7493b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 7494b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 749543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace internal { 749643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 749743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7498c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid HandleScopeImplementer::FreeThreadResources() { 7499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Free(); 7500c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 7501c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 7502c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 750343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* HandleScopeImplementer::ArchiveThread(char* storage) { 750426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HandleScopeData* current = isolate_->handle_scope_data(); 750543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen handle_scope_data_ = *current; 7506d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(storage, this, sizeof(*this)); 750743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7508c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org ResetAfterArchive(); 750943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen current->Initialize(); 751043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 751143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return storage + ArchiveSpacePerThread(); 751243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 751343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 751443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 751543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint HandleScopeImplementer::ArchiveSpacePerThread() { 7516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return sizeof(HandleScopeImplementer); 751743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 751843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 751943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 752043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* HandleScopeImplementer::RestoreThread(char* storage) { 7521d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(this, storage, sizeof(*this)); 75221c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *isolate_->handle_scope_data() = handle_scope_data_; 752343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return storage + ArchiveSpacePerThread(); 752443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 752543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 752643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7527a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.orgvoid HandleScopeImplementer::IterateThis(ObjectVisitor* v) { 752899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#ifdef DEBUG 752999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org bool found_block_before_deferred = false; 753099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#endif 753143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterate over all handles in the blocks except for the last. 7532c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org for (int i = blocks()->length() - 2; i >= 0; --i) { 7533c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Object** block = blocks()->at(i); 753499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org if (last_handle_before_deferred_block_ != NULL && 7535876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org (last_handle_before_deferred_block_ <= &block[kHandleBlockSize]) && 753699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org (last_handle_before_deferred_block_ >= block)) { 753799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org v->VisitPointers(block, last_handle_before_deferred_block_); 7538e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!found_block_before_deferred); 753999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#ifdef DEBUG 754099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org found_block_before_deferred = true; 754199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#endif 754299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } else { 754399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org v->VisitPointers(block, &block[kHandleBlockSize]); 754499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 754543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 754643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_handle_before_deferred_block_ == NULL || 754899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org found_block_before_deferred); 754999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 755043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterate over live handles in the last block (if any). 7551c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (!blocks()->is_empty()) { 7552c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org v->VisitPointers(blocks()->last(), handle_scope_data_.next); 7553a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org } 7554a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org 75553d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; 7556fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org for (unsigned i = 0; i < arraysize(context_lists); i++) { 75573d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (context_lists[i]->is_empty()) continue; 75583d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org Object** start = reinterpret_cast<Object**>(&context_lists[i]->first()); 75593d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org v->VisitPointers(start, start + context_lists[i]->length()); 756043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 756143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 756243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 756343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 756443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HandleScopeImplementer::Iterate(ObjectVisitor* v) { 756526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HandleScopeData* current = isolate_->handle_scope_data(); 7566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org handle_scope_data_ = *current; 7567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org IterateThis(v); 756843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 756943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 757043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 757143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { 75727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org HandleScopeImplementer* scope_implementer = 757343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<HandleScopeImplementer*>(storage); 75747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org scope_implementer->IterateThis(v); 757543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return storage + ArchiveSpacePerThread(); 757643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 757743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 757899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 757999aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgDeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) { 7580304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org DeferredHandles* deferred = 7581304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org new DeferredHandles(isolate()->handle_scope_data()->next, isolate()); 758299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 758399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org while (!blocks_.is_empty()) { 758499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org Object** block_start = blocks_.last(); 758599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org Object** block_limit = &block_start[kHandleBlockSize]; 758679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org // We should not need to check for SealHandleScope here. Assert this. 7587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(prev_limit == block_limit || 758899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org !(block_start <= prev_limit && prev_limit <= block_limit)); 758999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org if (prev_limit == block_limit) break; 759099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org deferred->blocks_.Add(blocks_.last()); 759199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org blocks_.RemoveLast(); 759299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 759399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 759499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org // deferred->blocks_ now contains the blocks installed on the 759599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org // HandleScope stack since BeginDeferredScope was called, but in 759699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org // reverse order. 759799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 7598e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(prev_limit == NULL || !blocks_.is_empty()); 759999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 7600e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!blocks_.is_empty() && prev_limit != NULL); 7601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_handle_before_deferred_block_ != NULL); 760299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org last_handle_before_deferred_block_ = NULL; 760399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org return deferred; 760499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 760599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 760699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 760799aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgvoid HandleScopeImplementer::BeginDeferredScope() { 7608e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_handle_before_deferred_block_ == NULL); 760999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org last_handle_before_deferred_block_ = isolate()->handle_scope_data()->next; 761099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 761199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 761299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 761399aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgDeferredHandles::~DeferredHandles() { 7614304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org isolate_->UnlinkDeferredHandles(this); 7615304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 7616304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org for (int i = 0; i < blocks_.length(); i++) { 7617c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org#ifdef ENABLE_HANDLE_ZAPPING 7618304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]); 7619304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#endif 7620304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]); 7621304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 762299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 762399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 762499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 762599aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgvoid DeferredHandles::Iterate(ObjectVisitor* v) { 7626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!blocks_.is_empty()); 762799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 7628e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((first_block_limit_ >= blocks_.first()) && 7629753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org (first_block_limit_ <= &(blocks_.first())[kHandleBlockSize])); 763099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 763199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org v->VisitPointers(blocks_.first(), first_block_limit_); 763299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 763399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org for (int i = 1; i < blocks_.length(); i++) { 763499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); 763599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 763699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 763799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 763899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 7639b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgvoid InvokeAccessorGetterCallback( 7640e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::Local<v8::Name> property, 7641b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info, 7642e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org v8::AccessorNameGetterCallback getter) { 7643b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Leaving JavaScript. 7644b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7645b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org Address getter_address = reinterpret_cast<Address>(reinterpret_cast<intptr_t>( 7646b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org getter)); 7647b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org VMState<EXTERNAL> state(isolate); 7648b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org ExternalCallbackScope call_scope(isolate, getter_address); 7649639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org getter(property, info); 7650b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org} 7651b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 7652b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 7653b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgvoid InvokeFunctionCallback(const v8::FunctionCallbackInfo<v8::Value>& info, 7654b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org v8::FunctionCallback callback) { 7655b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7656b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org Address callback_address = 7657b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 7658b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org VMState<EXTERNAL> state(isolate); 7659b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org ExternalCallbackScope call_scope(isolate, callback_address); 7660639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org callback(info); 7661b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org} 7662b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 7663b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 766443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 7665