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