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

📄 factory.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 "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 + -