| 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 // Generate code to push the value of a reference on top of the expression | 82 // Generate code to push the value of a reference on top of the expression |
| 83 // stack and then spill the stack frame. This function is used temporarily | 83 // stack and then spill the stack frame. This function is used temporarily |
| 84 // while the code generator is being transformed. | 84 // while the code generator is being transformed. |
| 85 inline void GetValueAndSpill(TypeofState typeof_state); | 85 inline void GetValueAndSpill(); |
| 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_; |
| 96 Type type_; | 96 Type type_; |
| 97 }; | 97 }; |
| 98 | 98 |
| 99 | 99 |
| 100 // ------------------------------------------------------------------------- | 100 // ------------------------------------------------------------------------- |
| 101 // Code generation state | 101 // Code generation state |
| 102 | 102 |
| 103 // The state is passed down the AST by the code generator (and back up, in | 103 // The state is passed down the AST by the code generator (and back up, in |
| 104 // the form of the state of the label pair). It is threaded through the | 104 // the form of the state of the label pair). It is threaded through the |
| 105 // call stack. Constructing a state implicitly pushes it on the owning code | 105 // call stack. Constructing a state implicitly pushes it on the owning code |
| 106 // generator's stack of states, and destroying one implicitly pops it. | 106 // generator's stack of states, and destroying one implicitly pops it. |
| 107 | 107 |
| 108 class CodeGenState BASE_EMBEDDED { | 108 class CodeGenState BASE_EMBEDDED { |
| 109 public: | 109 public: |
| 110 // Create an initial code generator state. Destroying the initial state | 110 // Create an initial code generator state. Destroying the initial state |
| 111 // leaves the code generator with a NULL state. | 111 // leaves the code generator with a NULL state. |
| 112 explicit CodeGenState(CodeGenerator* owner); | 112 explicit CodeGenState(CodeGenerator* owner); |
| 113 | 113 |
| 114 // Create a code generator state based on a code generator's current | 114 // Create a code generator state based on a code generator's current |
| 115 // state. The new state has its own typeof state and pair of branch | 115 // state. The new state has its own pair of branch labels. |
| 116 // labels. | |
| 117 CodeGenState(CodeGenerator* owner, | 116 CodeGenState(CodeGenerator* owner, |
| 118 TypeofState typeof_state, | |
| 119 JumpTarget* true_target, | 117 JumpTarget* true_target, |
| 120 JumpTarget* false_target); | 118 JumpTarget* false_target); |
| 121 | 119 |
| 122 // Destroy a code generator state and restore the owning code generator's | 120 // Destroy a code generator state and restore the owning code generator's |
| 123 // previous state. | 121 // previous state. |
| 124 ~CodeGenState(); | 122 ~CodeGenState(); |
| 125 | 123 |
| 126 TypeofState typeof_state() const { return typeof_state_; } | |
| 127 JumpTarget* true_target() const { return true_target_; } | 124 JumpTarget* true_target() const { return true_target_; } |
| 128 JumpTarget* false_target() const { return false_target_; } | 125 JumpTarget* false_target() const { return false_target_; } |
| 129 | 126 |
| 130 private: | 127 private: |
| 131 CodeGenerator* owner_; | 128 CodeGenerator* owner_; |
| 132 TypeofState typeof_state_; | |
| 133 JumpTarget* true_target_; | 129 JumpTarget* true_target_; |
| 134 JumpTarget* false_target_; | 130 JumpTarget* false_target_; |
| 135 CodeGenState* previous_; | 131 CodeGenState* previous_; |
| 136 }; | 132 }; |
| 137 | 133 |
| 138 | 134 |
| 139 // ------------------------------------------------------------------------- | 135 // ------------------------------------------------------------------------- |
| 140 // CodeGenerator | 136 // CodeGenerator |
| 141 | 137 |
| 142 class CodeGenerator: public AstVisitor { | 138 class CodeGenerator: public AstVisitor { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 // Accessors | 199 // Accessors |
| 204 Scope* scope() const { return scope_; } | 200 Scope* scope() const { return scope_; } |
| 205 | 201 |
| 206 // Generating deferred code. | 202 // Generating deferred code. |
| 207 void ProcessDeferred(); | 203 void ProcessDeferred(); |
| 208 | 204 |
| 209 bool is_eval() { return is_eval_; } | 205 bool is_eval() { return is_eval_; } |
| 210 | 206 |
| 211 // State | 207 // State |
| 212 bool has_cc() const { return cc_reg_ != al; } | 208 bool has_cc() const { return cc_reg_ != al; } |
| 213 TypeofState typeof_state() const { return state_->typeof_state(); } | |
| 214 JumpTarget* true_target() const { return state_->true_target(); } | 209 JumpTarget* true_target() const { return state_->true_target(); } |
| 215 JumpTarget* false_target() const { return state_->false_target(); } | 210 JumpTarget* false_target() const { return state_->false_target(); } |
| 216 | 211 |
| 217 // We don't track loop nesting level on ARM yet. | 212 // We don't track loop nesting level on ARM yet. |
| 218 int loop_nesting() const { return 0; } | 213 int loop_nesting() const { return 0; } |
| 219 | 214 |
| 220 // Node visitors. | 215 // Node visitors. |
| 221 void VisitStatements(ZoneList<Statement*>* statements); | 216 void VisitStatements(ZoneList<Statement*>* statements); |
| 222 | 217 |
| 223 #define DEF_VISIT(type) \ | 218 #define DEF_VISIT(type) \ |
| (...skipping 28 matching lines...) Expand all Loading... |
| 252 Register tmp, | 247 Register tmp, |
| 253 Register tmp2, | 248 Register tmp2, |
| 254 JumpTarget* slow); | 249 JumpTarget* slow); |
| 255 | 250 |
| 256 // Expressions | 251 // Expressions |
| 257 static MemOperand GlobalObject() { | 252 static MemOperand GlobalObject() { |
| 258 return ContextOperand(cp, Context::GLOBAL_INDEX); | 253 return ContextOperand(cp, Context::GLOBAL_INDEX); |
| 259 } | 254 } |
| 260 | 255 |
| 261 void LoadCondition(Expression* x, | 256 void LoadCondition(Expression* x, |
| 262 TypeofState typeof_state, | |
| 263 JumpTarget* true_target, | 257 JumpTarget* true_target, |
| 264 JumpTarget* false_target, | 258 JumpTarget* false_target, |
| 265 bool force_cc); | 259 bool force_cc); |
| 266 void Load(Expression* x, TypeofState typeof_state = NOT_INSIDE_TYPEOF); | 260 void Load(Expression* expr); |
| 267 void LoadGlobal(); | 261 void LoadGlobal(); |
| 268 void LoadGlobalReceiver(Register scratch); | 262 void LoadGlobalReceiver(Register scratch); |
| 269 | 263 |
| 270 // Generate code to push the value of an expression on top of the frame | 264 // Generate code to push the value of an expression on top of the frame |
| 271 // and then spill the frame fully to memory. This function is used | 265 // and then spill the frame fully to memory. This function is used |
| 272 // temporarily while the code generator is being transformed. | 266 // temporarily while the code generator is being transformed. |
| 273 inline void LoadAndSpill(Expression* expression, | 267 inline void LoadAndSpill(Expression* expression); |
| 274 TypeofState typeof_state = NOT_INSIDE_TYPEOF); | |
| 275 | 268 |
| 276 // Call LoadCondition and then spill the virtual frame unless control flow | 269 // Call LoadCondition and then spill the virtual frame unless control flow |
| 277 // cannot reach the end of the expression (ie, by emitting only | 270 // cannot reach the end of the expression (ie, by emitting only |
| 278 // unconditional jumps to the control targets). | 271 // unconditional jumps to the control targets). |
| 279 inline void LoadConditionAndSpill(Expression* expression, | 272 inline void LoadConditionAndSpill(Expression* expression, |
| 280 TypeofState typeof_state, | |
| 281 JumpTarget* true_target, | 273 JumpTarget* true_target, |
| 282 JumpTarget* false_target, | 274 JumpTarget* false_target, |
| 283 bool force_control); | 275 bool force_control); |
| 284 | 276 |
| 285 // Read a value from a slot and leave it on top of the expression stack. | 277 // Read a value from a slot and leave it on top of the expression stack. |
| 286 void LoadFromSlot(Slot* slot, TypeofState typeof_state); | 278 void LoadFromSlot(Slot* slot, TypeofState typeof_state); |
| 287 void LoadFromGlobalSlotCheckExtensions(Slot* slot, | 279 void LoadFromGlobalSlotCheckExtensions(Slot* slot, |
| 288 TypeofState typeof_state, | 280 TypeofState typeof_state, |
| 289 Register tmp, | 281 Register tmp, |
| 290 Register tmp2, | 282 Register tmp2, |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 constant_rhs_); | 532 constant_rhs_); |
| 541 } | 533 } |
| 542 } | 534 } |
| 543 #endif | 535 #endif |
| 544 }; | 536 }; |
| 545 | 537 |
| 546 | 538 |
| 547 } } // namespace v8::internal | 539 } } // namespace v8::internal |
| 548 | 540 |
| 549 #endif // V8_ARM_CODEGEN_ARM_H_ | 541 #endif // V8_ARM_CODEGEN_ARM_H_ |
| OLD | NEW |