| 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 |