📄 factory.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 "api.h"#include "debug.h"#include "execution.h"#include "factory.h"#include "macro-assembler.h"namespace v8 { namespace internal {Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { ASSERT(0 <= size); CALL_HEAP_FUNCTION(Heap::AllocateFixedArray(size, pretenure), FixedArray);}Handle<DescriptorArray> Factory::NewDescriptorArray(int number_of_descriptors) { ASSERT(0 <= number_of_descriptors); CALL_HEAP_FUNCTION(DescriptorArray::Allocate(number_of_descriptors), DescriptorArray);}// Symbols are created in the old generation (data space).Handle<String> Factory::LookupSymbol(Vector<const char> string) { CALL_HEAP_FUNCTION(Heap::LookupSymbol(string), String);}Handle<String> Factory::NewStringFromAscii(Vector<const char> string, PretenureFlag pretenure) { CALL_HEAP_FUNCTION(Heap::AllocateStringFromAscii(string, pretenure), String);}Handle<String> Factory::NewStringFromUtf8(Vector<const char> string, PretenureFlag pretenure) { CALL_HEAP_FUNCTION(Heap::AllocateStringFromUtf8(string, pretenure), String);}Handle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string) { CALL_HEAP_FUNCTION(Heap::AllocateStringFromTwoByte(string), String);}Handle<String> Factory::NewRawTwoByteString(int length, PretenureFlag pretenure) { CALL_HEAP_FUNCTION(Heap::AllocateRawTwoByteString(length, pretenure), String);}Handle<String> Factory::NewConsString(Handle<String> first, Handle<String> second) { CALL_HEAP_FUNCTION(Heap::AllocateConsString(*first, *second), String);}Handle<String> Factory::NewStringSlice(Handle<String> str, int begin, int end) { CALL_HEAP_FUNCTION(str->Slice(begin, end), String);}Handle<String> Factory::NewExternalStringFromAscii( ExternalAsciiString::Resource* resource) { CALL_HEAP_FUNCTION(Heap::AllocateExternalStringFromAscii(resource), String);}Handle<String> Factory::NewExternalStringFromTwoByte( ExternalTwoByteString::Resource* resource) { CALL_HEAP_FUNCTION(Heap::AllocateExternalStringFromTwoByte(resource), String);}Handle<Context> Factory::NewGlobalContext() { CALL_HEAP_FUNCTION(Heap::AllocateGlobalContext(), Context);}Handle<Context> Factory::NewFunctionContext(int length, Handle<JSFunction> closure) { CALL_HEAP_FUNCTION(Heap::AllocateFunctionContext(length, *closure), Context);}Handle<Context> Factory::NewWithContext(Handle<Context> previous, Handle<JSObject> extension) { CALL_HEAP_FUNCTION(Heap::AllocateWithContext(*previous, *extension), Context);}Handle<Struct> Factory::NewStruct(InstanceType type) { CALL_HEAP_FUNCTION(Heap::AllocateStruct(type), Struct);}Handle<AccessorInfo> Factory::NewAccessorInfo() { Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(NewStruct(ACCESSOR_INFO_TYPE)); info->set_flag(0); // Must clear the flag, it was initialized as undefined. return info;}Handle<Script> Factory::NewScript(Handle<String> source) { Handle<Script> script = Handle<Script>::cast(NewStruct(SCRIPT_TYPE)); script->set_source(*source); script->set_name(Heap::undefined_value()); script->set_line_offset(Smi::FromInt(0)); script->set_column_offset(Smi::FromInt(0)); script->set_wrapper(*Factory::NewProxy(0, TENURED)); script->set_type(Smi::FromInt(SCRIPT_TYPE_NORMAL)); return script;}Handle<Proxy> Factory::NewProxy(Address addr, PretenureFlag pretenure) { CALL_HEAP_FUNCTION(Heap::AllocateProxy(addr, pretenure), Proxy);}Handle<Proxy> Factory::NewProxy(const AccessorDescriptor* desc) { return NewProxy((Address) desc, TENURED);}Handle<ByteArray> Factory::NewByteArray(int length) { ASSERT(0 <= length); CALL_HEAP_FUNCTION(Heap::AllocateByteArray(length), ByteArray);}Handle<Map> Factory::NewMap(InstanceType type, int instance_size) { CALL_HEAP_FUNCTION(Heap::AllocateMap(type, instance_size), Map);}Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { CALL_HEAP_FUNCTION(Heap::AllocateFunctionPrototype(*function), JSObject);}Handle<Map> Factory::CopyMap(Handle<Map> src) { CALL_HEAP_FUNCTION(src->Copy(), Map);}Handle<Map> Factory::CopyMapDropTransitions(Handle<Map> src) { CALL_HEAP_FUNCTION(src->CopyDropTransitions(), Map);}Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { CALL_HEAP_FUNCTION(array->Copy(), FixedArray);}Handle<JSFunction> Factory::BaseNewFunctionFromBoilerplate( Handle<JSFunction> boilerplate, Handle<Map> function_map) { ASSERT(boilerplate->IsBoilerplate()); ASSERT(!boilerplate->has_initial_map()); ASSERT(!boilerplate->has_prototype()); ASSERT(boilerplate->properties() == Heap::empty_fixed_array()); ASSERT(boilerplate->elements() == Heap::empty_fixed_array()); CALL_HEAP_FUNCTION(Heap::AllocateFunction(*function_map, boilerplate->shared(), Heap::the_hole_value()), JSFunction);}Handle<JSFunction> Factory::NewFunctionFromBoilerplate( Handle<JSFunction> boilerplate, Handle<Context> context) { Handle<JSFunction> result = BaseNewFunctionFromBoilerplate(boilerplate, Top::function_map()); result->set_context(*context); int number_of_literals = boilerplate->NumberOfLiterals(); Handle<FixedArray> literals = Factory::NewFixedArray(number_of_literals, TENURED); if (number_of_literals > 0) { // Store the object, regexp and array functions in the literals // array prefix. These functions will be used when creating // object, regexp and array literals in this function. literals->set(JSFunction::kLiteralGlobalContextIndex, context->global_context()); } result->set_literals(*literals); ASSERT(!result->IsBoilerplate()); return result;}Handle<Object> Factory::NewNumber(double value, PretenureFlag pretenure) { CALL_HEAP_FUNCTION(Heap::NumberFromDouble(value, pretenure), Object);}Handle<Object> Factory::NewNumberFromInt(int value) { CALL_HEAP_FUNCTION(Heap::NumberFromInt32(value), Object);}Handle<JSObject> Factory::NewNeanderObject() { CALL_HEAP_FUNCTION(Heap::AllocateJSObjectFromMap(Heap::neander_map()), JSObject);}Handle<Object> Factory::NewTypeError(const char* type, Vector< Handle<Object> > args) { return NewError("MakeTypeError", type, args);}Handle<Object> Factory::NewTypeError(Handle<String> message) { return NewError("$TypeError", message);}Handle<Object> Factory::NewRangeError(const char* type, Vector< Handle<Object> > args) { return NewError("MakeRangeError", type, args);}Handle<Object> Factory::NewRangeError(Handle<String> message) { return NewError("$RangeError", message);}Handle<Object> Factory::NewSyntaxError(const char* type, Handle<JSArray> args) { return NewError("MakeSyntaxError", type, args);}Handle<Object> Factory::NewSyntaxError(Handle<String> message) { return NewError("$SyntaxError", message);}Handle<Object> Factory::NewReferenceError(const char* type, Vector< Handle<Object> > args) { return NewError("MakeReferenceError", type, args);}Handle<Object> Factory::NewReferenceError(Handle<String> message) { return NewError("$ReferenceError", message);}Handle<Object> Factory::NewError(const char* maker, const char* type, Vector< Handle<Object> > args) { HandleScope scope; Handle<JSArray> array = NewJSArray(args.length()); for (int i = 0; i < args.length(); i++) SetElement(array, i, args[i]); Handle<Object> result = NewError(maker, type, array); return result.EscapeFrom(&scope);}Handle<Object> Factory::NewEvalError(const char* type, Vector< Handle<Object> > args) { return NewError("MakeEvalError", type, args);}Handle<Object> Factory::NewError(const char* type, Vector< Handle<Object> > args) { return NewError("MakeError", type, args);}Handle<Object> Factory::NewError(const char* maker, const char* type, Handle<JSArray> args) { Handle<String> make_str = Factory::LookupAsciiSymbol(maker); Handle<JSFunction> fun = Handle<JSFunction>( JSFunction::cast( Top::security_context_builtins()->GetProperty(*make_str))); Handle<Object> type_obj = Factory::LookupAsciiSymbol(type); Object** argv[2] = { type_obj.location(), Handle<Object>::cast(args).location() }; // Invoke the JavaScript factory method. If an exception is thrown while // running the factory method, use the exception as the result. bool caught_exception; Handle<Object> result = Execution::TryCall(fun, Top::security_context_builtins(), 2, argv, &caught_exception); return result;}Handle<Object> Factory::NewError(Handle<String> message) { return NewError("$Error", message);}Handle<Object> Factory::NewError(const char* constructor, Handle<String> message) { Handle<String> constr = Factory::LookupAsciiSymbol(constructor); Handle<JSFunction> fun = Handle<JSFunction>( JSFunction::cast( Top::security_context_builtins()->GetProperty(*constr))); Object** argv[1] = { Handle<Object>::cast(message).location() }; // Invoke the JavaScript factory method. If an exception is thrown while // running the factory method, use the exception as the result. bool caught_exception; Handle<Object> result = Execution::TryCall(fun, Top::security_context_builtins(), 1, argv, &caught_exception); return result;}Handle<JSFunction> Factory::NewFunction(Handle<String> name, InstanceType type, int instance_size, Handle<Code> code, bool force_initial_map) { // Allocate the function Handle<JSFunction> function = NewFunction(name, the_hole_value()); function->set_code(*code); if (force_initial_map || type != JS_OBJECT_TYPE || instance_size != JSObject::kHeaderSize) { Handle<Map> initial_map = NewMap(type, instance_size); Handle<JSObject> prototype = NewFunctionPrototype(function); initial_map->set_prototype(*prototype); function->set_initial_map(*initial_map); initial_map->set_constructor(*function); } else { ASSERT(!function->has_initial_map()); ASSERT(!function->has_prototype()); } return function;}Handle<JSFunction> Factory::NewFunctionBoilerplate(Handle<String> name, int number_of_literals, bool contains_array_literal, Handle<Code> code) { Handle<JSFunction> function = NewFunctionBoilerplate(name); function->set_code(*code); int literals_array_size = number_of_literals; // If the function contains object, regexp or array literals, // allocate extra space for a literals array prefix containing the // object, regexp and array constructor functions. if (number_of_literals > 0 || contains_array_literal) { literals_array_size += JSFunction::kLiteralsPrefixSize; } Handle<FixedArray> literals = Factory::NewFixedArray(literals_array_size, TENURED); function->set_literals(*literals); ASSERT(!function->has_initial_map()); ASSERT(!function->has_prototype()); return function;}Handle<JSFunction> Factory::NewFunctionBoilerplate(Handle<String> name) { Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(name); CALL_HEAP_FUNCTION(Heap::AllocateFunction(Heap::boilerplate_function_map(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -