⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handles.cc.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
// Copyright 2006-2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright//       notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above//       copyright notice, this list of conditions and the following//       disclaimer in the documentation and/or other materials provided//       with the distribution.//     * Neither the name of Google Inc. nor the names of its//       contributors may be used to endorse or promote products derived//       from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#include "v8.h"#include "accessors.h"#include "api.h"#include "bootstrapper.h"#include "compiler.h"#include "debug.h"#include "execution.h"#include "global-handles.h"#include "natives.h"#include "runtime.h"namespace v8 { namespace internal {#define CALL_GC(RESULT)                                             \  {                                                                 \    Failure* __failure__ = Failure::cast(RESULT);                   \    if (!Heap::CollectGarbage(__failure__->requested(),             \                              __failure__->allocation_space())) {   \       /* TODO(1181417): Fix this. */                               \       V8::FatalProcessOutOfMemory("Handles");                      \    }                                                               \  }Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content,                                      Handle<JSArray> array) {  CALL_HEAP_FUNCTION(content->AddKeysFromJSArray(*array), FixedArray);}Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first,                               Handle<FixedArray> second) {  CALL_HEAP_FUNCTION(first->UnionOfKeys(*second), FixedArray);}Handle<JSGlobalObject> ReinitializeJSGlobalObject(    Handle<JSFunction> constructor,    Handle<JSGlobalObject> global) {  CALL_HEAP_FUNCTION(Heap::ReinitializeJSGlobalObject(*constructor, *global),                     JSGlobalObject);}void SetExpectedNofProperties(Handle<JSFunction> func, int nof) {  func->shared()->set_expected_nof_properties(nof);  if (func->has_initial_map()) {    Handle<Map> new_initial_map =        Factory::CopyMapDropTransitions(Handle<Map>(func->initial_map()));    new_initial_map->set_unused_property_fields(nof);    func->set_initial_map(*new_initial_map);  }}void SetPrototypeProperty(Handle<JSFunction> func, Handle<JSObject> value) {  CALL_HEAP_FUNCTION_VOID(func->SetPrototype(*value));}void SetExpectedNofPropertiesFromEstimate(Handle<SharedFunctionInfo> shared,                                          int estimate) {  // TODO(1231235): We need dynamic feedback to estimate the number  // of expected properties in an object. The static hack below  // is barely a solution.  shared->set_expected_nof_properties(estimate + 2);}void SetExpectedNofPropertiesFromEstimate(Handle<JSFunction> func,                                          int estimate) {  // TODO(1231235): We need dynamic feedback to estimate the number  // of expected properties in an object. The static hack below  // is barely a solution.  SetExpectedNofProperties(func, estimate + 2);}void NormalizeProperties(Handle<JSObject> object) {  CALL_HEAP_FUNCTION_VOID(object->NormalizeProperties());}void NormalizeElements(Handle<JSObject> object) {  CALL_HEAP_FUNCTION_VOID(object->NormalizeElements());}void TransformToFastProperties(Handle<JSObject> object,                               int unused_property_fields) {  CALL_HEAP_FUNCTION_VOID(      object->TransformToFastProperties(unused_property_fields));}void FlattenString(Handle<String> string) {  if (string->IsFlat()) return;  CALL_HEAP_FUNCTION_VOID(String::cast(*string)->Flatten());  ASSERT(string->IsFlat());}Handle<Object> SetPrototype(Handle<JSFunction> function,                            Handle<Object> prototype) {  CALL_HEAP_FUNCTION(Accessors::FunctionSetPrototype(*function,                                                     *prototype,                                                     NULL),                     Object);}void AddProperty(Handle<JSObject> object,                 Handle<String> key,                 Handle<Object> value,                 PropertyAttributes attributes) {  CALL_HEAP_FUNCTION_VOID(object->AddProperty(*key, *value, attributes));}Handle<Object> SetProperty(Handle<JSObject> object,                           Handle<String> key,                           Handle<Object> value,                           PropertyAttributes attributes) {  CALL_HEAP_FUNCTION(object->SetProperty(*key, *value, attributes), Object);}Handle<Object> SetProperty(Handle<Object> object,                           Handle<Object> key,                           Handle<Object> value,                           PropertyAttributes attributes) {  CALL_HEAP_FUNCTION(Runtime::SetObjectProperty(object, key, value, attributes),                     Object);}Handle<Object> SetPropertyWithInterceptor(Handle<JSObject> object,                                          Handle<String> key,                                          Handle<Object> value,                                          PropertyAttributes attributes) {  CALL_HEAP_FUNCTION(object->SetPropertyWithInterceptor(*key,                                                        *value,                                                        attributes),                     Object);}Handle<Object> GetProperty(Handle<JSObject> obj,                           const char* name) {  Handle<String> str = Factory::LookupAsciiSymbol(name);  CALL_HEAP_FUNCTION(obj->GetProperty(*str), Object);}Handle<Object> GetProperty(Handle<Object> obj,                           Handle<Object> key) {  CALL_HEAP_FUNCTION(Runtime::GetObjectProperty(obj, key), Object);}Handle<Object> GetPropertyWithInterceptor(Handle<JSObject> receiver,                                          Handle<JSObject> holder,                                          Handle<String> name,                                          PropertyAttributes* attributes) {  CALL_HEAP_FUNCTION(holder->GetPropertyWithInterceptor(*receiver,                                                        *name,                                                        attributes),                     Object);}Handle<Object> GetPrototype(Handle<Object> obj) {  Handle<Object> result(obj->GetPrototype());  return result;}Handle<Object> DeleteElement(Handle<JSObject> obj,                             uint32_t index) {  CALL_HEAP_FUNCTION(obj->DeleteElement(index), Object);}Handle<Object> DeleteProperty(Handle<JSObject> obj,                              Handle<String> prop) {  CALL_HEAP_FUNCTION(obj->DeleteProperty(*prop), Object);}Handle<Object> LookupSingleCharacterStringFromCode(uint32_t index) {  CALL_HEAP_FUNCTION(Heap::LookupSingleCharacterStringFromCode(index), Object);}Handle<String> SubString(Handle<String> str, int start, int end) {  CALL_HEAP_FUNCTION(str->Slice(start, end), String);}Handle<Object> SetElement(Handle<JSObject> object,                          uint32_t index,                          Handle<Object> value) {  CALL_HEAP_FUNCTION(object->SetElement(index, *value), Object);}Handle<JSObject> Copy(Handle<JSObject> obj, PretenureFlag pretenure) {  CALL_HEAP_FUNCTION(obj->Copy(pretenure), JSObject);}// Wrappers for scripts are kept alive and cached in weak global// handles referred from proxy objects held by the scripts as long as// they are used. When they are not used anymore, the garbage// collector will call the weak callback on the global handle// associated with the wrapper and get rid of both the wrapper and the// handle.static void ClearWrapperCache(Persistent<v8::Object> handle, void*) {  Handle<Object> cache = Utils::OpenHandle(*handle);  JSValue* wrapper = JSValue::cast(*cache);  Proxy* proxy = Script::cast(wrapper->value())->wrapper();  ASSERT(proxy->proxy() == reinterpret_cast<Address>(cache.location()));  proxy->set_proxy(0);  GlobalHandles::Destroy(cache.location());  Counters::script_wrappers.Decrement();}Handle<JSValue> GetScriptWrapper(Handle<Script> script) {  Handle<Object> cache(reinterpret_cast<Object**>(script->wrapper()->proxy()));  if (!cache.is_null()) {    // Return the script wrapper directly from the cache.    return Handle<JSValue>(JSValue::cast(*cache));  }  // Construct a new script wrapper.  Counters::script_wrappers.Increment();  Handle<JSFunction> constructor = Top::script_function();  Handle<JSValue> result =      Handle<JSValue>::cast(Factory::NewJSObject(constructor));  result->set_value(*script);  // Create a new weak global handle and use it to cache the wrapper  // for future use. The cache will automatically be cleared by the  // garbage collector when it is not used anymore.  Handle<Object> handle = GlobalHandles::Create(*result);  GlobalHandles::MakeWeak(handle.location(), NULL, &ClearWrapperCache);  script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location()));  return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -