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 #ifndef V8_ARGUMENTS_H_
     29 #define V8_ARGUMENTS_H_
     30 
     31 namespace v8 {
     32 namespace internal {
     33 
     34 // Arguments provides access to runtime call parameters.
     35 //
     36 // It uses the fact that the instance fields of Arguments
     37 // (length_, arguments_) are "overlayed" with the parameters
     38 // (no. of parameters, and the parameter pointer) passed so
     39 // that inside the C++ function, the parameters passed can
     40 // be accessed conveniently:
     41 //
     42 //   Object* Runtime_function(Arguments args) {
     43 //     ... use args[i] here ...
     44 //   }
     45 
     46 class Arguments BASE_EMBEDDED {
     47  public:
     48   Arguments(int length, Object** arguments)
     49       : length_(length), arguments_(arguments) { }
     50 
     51   Object*& operator[] (int index) {
     52     ASSERT(0 <= index && index < length_);
     53     return arguments_[-index];
     54   }
     55 
     56   template <class S> Handle<S> at(int index) {
     57     Object** value = &((*this)[index]);
     58     // This cast checks that the object we're accessing does indeed have the
     59     // expected type.
     60     S::cast(*value);
     61     return Handle<S>(reinterpret_cast<S**>(value));
     62   }
     63 
     64   // Get the total number of arguments including the receiver.
     65   int length() const { return length_; }
     66 
     67   Object** arguments() { return arguments_; }
     68 
     69  private:
     70   int length_;
     71   Object** arguments_;
     72 };
     73 
     74 
     75 // Cursom arguments replicate a small segment of stack that can be
     76 // accessed through an Arguments object the same way the actual stack
     77 // can.
     78 class CustomArguments : public Relocatable {
     79  public:
     80   inline CustomArguments(Object* data,
     81                          JSObject* self,
     82                          JSObject* holder) {
     83     values_[3] = self;
     84     values_[2] = holder;
     85     values_[1] = Smi::FromInt(0);
     86     values_[0] = data;
     87   }
     88   void IterateInstance(ObjectVisitor* v);
     89   Object** end() { return values_ + 3; }
     90  private:
     91   Object* values_[4];
     92 };
     93 
     94 
     95 } }  // namespace v8::internal
     96 
     97 #endif  // V8_ARGUMENTS_H_
     98