Home | History | Annotate | Download | only in src
      1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // This file contains infrastructure used by the API.  See
     29 // v8natives.js for an explanation of these files are processed and
     30 // loaded.
     31 
     32 
     33 function CreateDate(time) {
     34   var date = new $Date();
     35   date.setTime(time);
     36   return date;
     37 }
     38 
     39 
     40 const kApiFunctionCache = {};
     41 const functionCache = kApiFunctionCache;
     42 
     43 
     44 function Instantiate(data, name) {
     45   if (!%IsTemplate(data)) return data;
     46   var tag = %GetTemplateField(data, kApiTagOffset);
     47   switch (tag) {
     48     case kFunctionTag:
     49       return InstantiateFunction(data, name);
     50     case kNewObjectTag:
     51       var Constructor = %GetTemplateField(data, kApiConstructorOffset);
     52       var result = Constructor ? new (Instantiate(Constructor))() : {};
     53       ConfigureTemplateInstance(result, data);
     54       result = %ToFastProperties(result);
     55       return result;
     56     default:
     57       throw 'Unknown API tag <' + tag + '>';
     58   }
     59 }
     60 
     61 
     62 function InstantiateFunction(data, name) {
     63   // We need a reference to kApiFunctionCache in the stack frame
     64   // if we need to bail out from a stack overflow.
     65   var cache = kApiFunctionCache;
     66   var serialNumber = %GetTemplateField(data, kApiSerialNumberOffset);
     67   var isFunctionCached =
     68    (serialNumber in cache) && (cache[serialNumber] != kUninitialized);
     69   if (!isFunctionCached) {
     70     try {
     71       cache[serialNumber] = null;
     72       var fun = %CreateApiFunction(data);
     73       if (name) %FunctionSetName(fun, name);
     74       cache[serialNumber] = fun;
     75       var prototype = %GetTemplateField(data, kApiPrototypeTemplateOffset);
     76       fun.prototype = prototype ? Instantiate(prototype) : {};
     77       %SetProperty(fun.prototype, "constructor", fun, DONT_ENUM);
     78       var parent = %GetTemplateField(data, kApiParentTemplateOffset);
     79       if (parent) {
     80         var parent_fun = Instantiate(parent);
     81         fun.prototype.__proto__ = parent_fun.prototype;
     82       }
     83       ConfigureTemplateInstance(fun, data);
     84     } catch (e) {
     85       cache[serialNumber] = kUninitialized;
     86       throw e;
     87     }
     88   }
     89   return cache[serialNumber];
     90 }
     91 
     92 
     93 function ConfigureTemplateInstance(obj, data) {
     94   var properties = %GetTemplateField(data, kApiPropertyListOffset);
     95   if (properties) {
     96     // Disable access checks while instantiating the object.
     97     var requires_access_checks = %DisableAccessChecks(obj);
     98     try {
     99       for (var i = 0; i < properties[0]; i += 3) {
    100         var name = properties[i + 1];
    101         var prop_data = properties[i + 2];
    102         var attributes = properties[i + 3];
    103         var value = Instantiate(prop_data, name);
    104         %SetProperty(obj, name, value, attributes);
    105       }
    106     } finally {
    107       if (requires_access_checks) %EnableAccessChecks(obj);
    108     }
    109   }
    110 }
    111