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 var kApiFunctionCache = new InternalArray();
     41 var 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       // Note: Do not directly use a function template as a condition, our
     53       // internal ToBoolean doesn't handle that!
     54       var result = typeof Constructor === 'undefined' ?
     55           {} : new (Instantiate(Constructor))();
     56       ConfigureTemplateInstance(result, data);
     57       result = %ToFastProperties(result);
     58       return result;
     59     default:
     60       throw 'Unknown API tag <' + tag + '>';
     61   }
     62 }
     63 
     64 
     65 function InstantiateFunction(data, name) {
     66   // We need a reference to kApiFunctionCache in the stack frame
     67   // if we need to bail out from a stack overflow.
     68   var cache = kApiFunctionCache;
     69   var serialNumber = %GetTemplateField(data, kApiSerialNumberOffset);
     70   var isFunctionCached =
     71    (serialNumber in cache) && (cache[serialNumber] != kUninitialized);
     72   if (!isFunctionCached) {
     73     try {
     74       cache[serialNumber] = null;
     75       var fun = %CreateApiFunction(data);
     76       if (name) %FunctionSetName(fun, name);
     77       cache[serialNumber] = fun;
     78       var prototype = %GetTemplateField(data, kApiPrototypeTemplateOffset);
     79       var flags = %GetTemplateField(data, kApiFlagOffset);
     80       // Note: Do not directly use an object template as a condition, our
     81       // internal ToBoolean doesn't handle that!
     82       fun.prototype = typeof prototype === 'undefined' ?
     83           {} : Instantiate(prototype);
     84       if (flags & (1 << kReadOnlyPrototypeBit)) {
     85         %FunctionSetReadOnlyPrototype(fun);
     86       }
     87       %SetProperty(fun.prototype, "constructor", fun, DONT_ENUM);
     88       var parent = %GetTemplateField(data, kApiParentTemplateOffset);
     89       // Note: Do not directly use a function template as a condition, our
     90       // internal ToBoolean doesn't handle that!
     91       if (!(typeof parent === 'undefined')) {
     92         var parent_fun = Instantiate(parent);
     93         %SetPrototype(fun.prototype, parent_fun.prototype);
     94       }
     95       ConfigureTemplateInstance(fun, data);
     96     } catch (e) {
     97       cache[serialNumber] = kUninitialized;
     98       throw e;
     99     }
    100   }
    101   return cache[serialNumber];
    102 }
    103 
    104 
    105 function ConfigureTemplateInstance(obj, data) {
    106   var properties = %GetTemplateField(data, kApiPropertyListOffset);
    107   if (properties) {
    108     // Disable access checks while instantiating the object.
    109     var requires_access_checks = %DisableAccessChecks(obj);
    110     try {
    111       for (var i = 0; i < properties[0]; i += 3) {
    112         var name = properties[i + 1];
    113         var prop_data = properties[i + 2];
    114         var attributes = properties[i + 3];
    115         var value = Instantiate(prop_data, name);
    116         %SetProperty(obj, name, value, attributes);
    117       }
    118     } finally {
    119       if (requires_access_checks) %EnableAccessChecks(obj);
    120     }
    121   }
    122 }
    123