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

📄 contexts.cc.svn-base

📁 Google浏览器V8内核代码
💻 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 "debug.h"#include "scopeinfo.h"namespace v8 { namespace internal {JSBuiltinsObject* Context::builtins() {  GlobalObject* object = global();  if (object->IsJSGlobalObject()) {    return JSGlobalObject::cast(object)->builtins();  } else {    ASSERT(object->IsJSBuiltinsObject());    return JSBuiltinsObject::cast(object);  }}Context* Context::global_context() {  // Fast case: the global object for this context has been set.  In  // that case, the global object has a direct pointer to the global  // context.  if (global()->IsGlobalObject()) {    return global()->global_context();  }  // During bootstrapping, the global object might not be set and we  // have to search the context chain to find the global context.  Context* current = this;  while (!current->IsGlobalContext()) {    current = Context::cast(JSFunction::cast(current->closure())->context());  }  return current;}Handle<Object> Context::Lookup(Handle<String> name, ContextLookupFlags flags,                               int* index_, PropertyAttributes* attributes) {  Handle<Context> context(this);  // The context must be in frame slot 0 (if not debugging).  if (kDebug && !Debug::InDebugger()) {    StackFrameLocator locator;    ASSERT(context->fcontext() ==           Context::cast(               locator.FindJavaScriptFrame(0)->context())->fcontext());  }  bool follow_context_chain = (flags & FOLLOW_CONTEXT_CHAIN) != 0;  *index_ = -1;  *attributes = ABSENT;  if (FLAG_trace_contexts) {    PrintF("Context::Lookup(");    name->ShortPrint();    PrintF(")\n");  }  do {    if (FLAG_trace_contexts) {      PrintF(" - looking in context %p", *context);      if (context->IsGlobalContext()) PrintF(" (global context)");      PrintF("\n");    }    // check extension/with object    Handle<JSObject> context_ext(context->extension());    if (*context_ext != NULL) {      if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0) {        *attributes = context_ext->GetLocalPropertyAttribute(*name);      } else {        *attributes = context_ext->GetPropertyAttribute(*name);      }      if (*attributes != ABSENT) {        // property found        if (FLAG_trace_contexts) {          PrintF("=> found property in context object %p\n", *context_ext);        }        return context_ext;      }    }    if (context->is_function_context()) {      // we have context-local slots      // check non-parameter locals in context      Handle<Code> code(context->closure()->code());      Variable::Mode mode;      int index = ScopeInfo<>::ContextSlotIndex(*code, *name, &mode);      ASSERT(index < 0 || index >= MIN_CONTEXT_SLOTS);      if (index >= 0) {        // slot found        if (FLAG_trace_contexts) {          PrintF("=> found local in context slot %d (mode = %d)\n",                 index, mode);        }        *index_ = index;        // Note: Fixed context slots are statically allocated by the compiler.        // Statically allocated variables always have a statically known mode,        // which is the mode with which they were declared when added to the        // scope. Thus, the DYNAMIC mode (which corresponds to dynamically        // declared variables that were introduced through declaration nodes)        // must not appear here.        switch (mode) {          case Variable::INTERNAL :  // fall through          case Variable::VAR      : *attributes = NONE; break;          case Variable::CONST    : *attributes = READ_ONLY; break;          case Variable::DYNAMIC  : UNREACHABLE(); break;          case Variable::TEMPORARY: UNREACHABLE(); break;        }        return context;      }      // check parameter locals in context      int param_index = ScopeInfo<>::ParameterIndex(*code, *name);      if (param_index >= 0) {        // slot found        int index =            ScopeInfo<>::ContextSlotIndex(*code,                                          Heap::arguments_shadow_symbol(),                                          NULL);        ASSERT(index >= 0);  // arguments must exist and be in the heap context        Handle<JSObject> arguments(JSObject::cast(context->get(index)));        ASSERT(arguments->HasLocalProperty(Heap::length_symbol()));        if (FLAG_trace_contexts) {          PrintF("=> found parameter %d in arguments object\n", param_index);        }        *index_ = param_index;        *attributes = NONE;        return arguments;      }      // check intermediate context (holding only the function name variable)      if (follow_context_chain) {        int index = ScopeInfo<>::FunctionContextSlotIndex(*code, *name);        if (index >= 0) {          // slot found          if (FLAG_trace_contexts) {            PrintF("=> found intermediate function in context slot %d\n",                   index);          }          *index_ = index;          *attributes = READ_ONLY;          return context;        }      }    }    // proceed with enclosing context    if (context->IsGlobalContext()) {      follow_context_chain = false;    } else if (context->previous() != NULL) {      context = Handle<Context>(context->previous());    } else {      ASSERT(context->is_function_context());      context = Handle<Context>(Context::cast(context->closure()->context()));    }  } while (follow_context_chain);  // slot not found  if (FLAG_trace_contexts) {    PrintF("=> no property/slot found\n");  }  return Handle<Object>(reinterpret_cast<JSObject*>(NULL));}} }  // namespace v8::internal

⌨️ 快捷键说明

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