| OLD | NEW | 
|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 70   bool is_illegal() const { return type_ == ILLEGAL; } | 70   bool is_illegal() const { return type_ == ILLEGAL; } | 
| 71   bool is_slot() const { return type_ == SLOT; } | 71   bool is_slot() const { return type_ == SLOT; } | 
| 72   bool is_property() const { return type_ == NAMED || type_ == KEYED; } | 72   bool is_property() const { return type_ == NAMED || type_ == KEYED; } | 
| 73 | 73 | 
| 74   // Return the name.  Only valid for named property references. | 74   // Return the name.  Only valid for named property references. | 
| 75   Handle<String> GetName(); | 75   Handle<String> GetName(); | 
| 76 | 76 | 
| 77   // Generate code to push the value of the reference on top of the | 77   // Generate code to push the value of the reference on top of the | 
| 78   // expression stack.  The reference is expected to be already on top of | 78   // expression stack.  The reference is expected to be already on top of | 
| 79   // the expression stack, and it is left in place with its value above it. | 79   // the expression stack, and it is left in place with its value above it. | 
| 80   void GetValue(TypeofState typeof_state); | 80   void GetValue(); | 
| 81 | 81 | 
| 82   // Like GetValue except that the slot is expected to be written to before | 82   // Like GetValue except that the slot is expected to be written to before | 
| 83   // being read from again.  Thae value of the reference may be invalidated, | 83   // being read from again.  Thae value of the reference may be invalidated, | 
| 84   // causing subsequent attempts to read it to fail. | 84   // causing subsequent attempts to read it to fail. | 
| 85   void TakeValue(TypeofState typeof_state); | 85   void TakeValue(); | 
| 86 | 86 | 
| 87   // Generate code to store the value on top of the expression stack in the | 87   // Generate code to store the value on top of the expression stack in the | 
| 88   // reference.  The reference is expected to be immediately below the value | 88   // reference.  The reference is expected to be immediately below the value | 
| 89   // on the expression stack.  The stored value is left in place (with the | 89   // on the expression stack.  The stored value is left in place (with the | 
| 90   // reference intact below it) to support chained assignments. | 90   // reference intact below it) to support chained assignments. | 
| 91   void SetValue(InitState init_state); | 91   void SetValue(InitState init_state); | 
| 92 | 92 | 
| 93  private: | 93  private: | 
| 94   CodeGenerator* cgen_; | 94   CodeGenerator* cgen_; | 
| 95   Expression* expression_; | 95   Expression* expression_; | 
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 234 // The code generator state is only used for expressions, so statements have | 234 // The code generator state is only used for expressions, so statements have | 
| 235 // the initial state. | 235 // the initial state. | 
| 236 | 236 | 
| 237 class CodeGenState BASE_EMBEDDED { | 237 class CodeGenState BASE_EMBEDDED { | 
| 238  public: | 238  public: | 
| 239   // Create an initial code generator state.  Destroying the initial state | 239   // Create an initial code generator state.  Destroying the initial state | 
| 240   // leaves the code generator with a NULL state. | 240   // leaves the code generator with a NULL state. | 
| 241   explicit CodeGenState(CodeGenerator* owner); | 241   explicit CodeGenState(CodeGenerator* owner); | 
| 242 | 242 | 
| 243   // Create a code generator state based on a code generator's current | 243   // Create a code generator state based on a code generator's current | 
| 244   // state.  The new state may or may not be inside a typeof, and has its | 244   // state.  The new state has its own control destination. | 
| 245   // own control destination. | 245   CodeGenState(CodeGenerator* owner, ControlDestination* destination); | 
| 246   CodeGenState(CodeGenerator* owner, |  | 
| 247                TypeofState typeof_state, |  | 
| 248                ControlDestination* destination); |  | 
| 249 | 246 | 
| 250   // Destroy a code generator state and restore the owning code generator's | 247   // Destroy a code generator state and restore the owning code generator's | 
| 251   // previous state. | 248   // previous state. | 
| 252   ~CodeGenState(); | 249   ~CodeGenState(); | 
| 253 | 250 | 
| 254   // Accessors for the state. | 251   // Accessors for the state. | 
| 255   TypeofState typeof_state() const { return typeof_state_; } |  | 
| 256   ControlDestination* destination() const { return destination_; } | 252   ControlDestination* destination() const { return destination_; } | 
| 257 | 253 | 
| 258  private: | 254  private: | 
| 259   // The owning code generator. | 255   // The owning code generator. | 
| 260   CodeGenerator* owner_; | 256   CodeGenerator* owner_; | 
| 261 | 257 | 
| 262   // A flag indicating whether we are compiling the immediate subexpression |  | 
| 263   // of a typeof expression. |  | 
| 264   TypeofState typeof_state_; |  | 
| 265 |  | 
| 266   // A control destination in case the expression has a control-flow | 258   // A control destination in case the expression has a control-flow | 
| 267   // effect. | 259   // effect. | 
| 268   ControlDestination* destination_; | 260   ControlDestination* destination_; | 
| 269 | 261 | 
| 270   // The previous state of the owning code generator, restored when | 262   // The previous state of the owning code generator, restored when | 
| 271   // this state is destroyed. | 263   // this state is destroyed. | 
| 272   CodeGenState* previous_; | 264   CodeGenState* previous_; | 
| 273 }; | 265 }; | 
| 274 | 266 | 
| 275 | 267 | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 345   virtual ~CodeGenerator() { delete masm_; } | 337   virtual ~CodeGenerator() { delete masm_; } | 
| 346 | 338 | 
| 347   // Accessors | 339   // Accessors | 
| 348   Scope* scope() const { return scope_; } | 340   Scope* scope() const { return scope_; } | 
| 349   bool is_eval() { return is_eval_; } | 341   bool is_eval() { return is_eval_; } | 
| 350 | 342 | 
| 351   // Generating deferred code. | 343   // Generating deferred code. | 
| 352   void ProcessDeferred(); | 344   void ProcessDeferred(); | 
| 353 | 345 | 
| 354   // State | 346   // State | 
| 355   TypeofState typeof_state() const { return state_->typeof_state(); } |  | 
| 356   ControlDestination* destination() const { return state_->destination(); } | 347   ControlDestination* destination() const { return state_->destination(); } | 
| 357 | 348 | 
| 358   // Track loop nesting level. | 349   // Track loop nesting level. | 
| 359   int loop_nesting() const { return loop_nesting_; } | 350   int loop_nesting() const { return loop_nesting_; } | 
| 360   void IncrementLoopNesting() { loop_nesting_++; } | 351   void IncrementLoopNesting() { loop_nesting_++; } | 
| 361   void DecrementLoopNesting() { loop_nesting_--; } | 352   void DecrementLoopNesting() { loop_nesting_--; } | 
| 362 | 353 | 
| 363   // Node visitors. | 354   // Node visitors. | 
| 364   void VisitStatements(ZoneList<Statement*>* statements); | 355   void VisitStatements(ZoneList<Statement*>* statements); | 
| 365 | 356 | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 405   Operand ContextSlotOperandCheckExtensions(Slot* slot, | 396   Operand ContextSlotOperandCheckExtensions(Slot* slot, | 
| 406                                             Result tmp, | 397                                             Result tmp, | 
| 407                                             JumpTarget* slow); | 398                                             JumpTarget* slow); | 
| 408 | 399 | 
| 409   // Expressions | 400   // Expressions | 
| 410   static Operand GlobalObject() { | 401   static Operand GlobalObject() { | 
| 411     return ContextOperand(esi, Context::GLOBAL_INDEX); | 402     return ContextOperand(esi, Context::GLOBAL_INDEX); | 
| 412   } | 403   } | 
| 413 | 404 | 
| 414   void LoadCondition(Expression* x, | 405   void LoadCondition(Expression* x, | 
| 415                      TypeofState typeof_state, |  | 
| 416                      ControlDestination* destination, | 406                      ControlDestination* destination, | 
| 417                      bool force_control); | 407                      bool force_control); | 
| 418   void Load(Expression* x, TypeofState typeof_state = NOT_INSIDE_TYPEOF); | 408   void Load(Expression* expr); | 
| 419   void LoadGlobal(); | 409   void LoadGlobal(); | 
| 420   void LoadGlobalReceiver(); | 410   void LoadGlobalReceiver(); | 
| 421 | 411 | 
| 422   // Generate code to push the value of an expression on top of the frame | 412   // Generate code to push the value of an expression on top of the frame | 
| 423   // and then spill the frame fully to memory.  This function is used | 413   // and then spill the frame fully to memory.  This function is used | 
| 424   // temporarily while the code generator is being transformed. | 414   // temporarily while the code generator is being transformed. | 
| 425   void LoadAndSpill(Expression* expression, | 415   void LoadAndSpill(Expression* expression); | 
| 426                     TypeofState typeof_state = NOT_INSIDE_TYPEOF); |  | 
| 427 | 416 | 
| 428   // Read a value from a slot and leave it on top of the expression stack. | 417   // Read a value from a slot and leave it on top of the expression stack. | 
| 429   void LoadFromSlot(Slot* slot, TypeofState typeof_state); | 418   void LoadFromSlot(Slot* slot, TypeofState typeof_state); | 
| 430   void LoadFromSlotCheckForArguments(Slot* slot, TypeofState typeof_state); | 419   void LoadFromSlotCheckForArguments(Slot* slot, TypeofState typeof_state); | 
| 431   Result LoadFromGlobalSlotCheckExtensions(Slot* slot, | 420   Result LoadFromGlobalSlotCheckExtensions(Slot* slot, | 
| 432                                            TypeofState typeof_state, | 421                                            TypeofState typeof_state, | 
| 433                                            JumpTarget* slow); | 422                                            JumpTarget* slow); | 
| 434 | 423 | 
| 435   // Store the value on top of the expression stack into a slot, leaving the | 424   // Store the value on top of the expression stack into a slot, leaving the | 
| 436   // value in place. | 425   // value in place. | 
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 746   void SetArgsReversed() { args_reversed_ = true; } | 735   void SetArgsReversed() { args_reversed_ = true; } | 
| 747   bool HasSmiCodeInStub() { return (flags_ & NO_SMI_CODE_IN_STUB) == 0; } | 736   bool HasSmiCodeInStub() { return (flags_ & NO_SMI_CODE_IN_STUB) == 0; } | 
| 748   bool HasArgumentsInRegisters() { return args_in_registers_; } | 737   bool HasArgumentsInRegisters() { return args_in_registers_; } | 
| 749   bool HasArgumentsReversed() { return args_reversed_; } | 738   bool HasArgumentsReversed() { return args_reversed_; } | 
| 750 }; | 739 }; | 
| 751 | 740 | 
| 752 | 741 | 
| 753 } }  // namespace v8::internal | 742 } }  // namespace v8::internal | 
| 754 | 743 | 
| 755 #endif  // V8_IA32_CODEGEN_IA32_H_ | 744 #endif  // V8_IA32_CODEGEN_IA32_H_ | 
| OLD | NEW | 
|---|