📄 handles.cc.svn-base
字号:
// 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 + -