| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/control-builders.h" | 8 #include "src/compiler/control-builders.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 | 165 |
| 166 AstGraphBuilder::Environment::Environment(AstGraphBuilder* builder, | 166 AstGraphBuilder::Environment::Environment(AstGraphBuilder* builder, |
| 167 Scope* scope, | 167 Scope* scope, |
| 168 Node* control_dependency) | 168 Node* control_dependency) |
| 169 : StructuredGraphBuilder::Environment(builder, control_dependency), | 169 : StructuredGraphBuilder::Environment(builder, control_dependency), |
| 170 parameters_count_(scope->num_parameters() + 1), | 170 parameters_count_(scope->num_parameters() + 1), |
| 171 locals_count_(scope->num_stack_slots()), | 171 locals_count_(scope->num_stack_slots()), |
| 172 parameters_node_(NULL), | 172 parameters_node_(NULL), |
| 173 locals_node_(NULL), | 173 locals_node_(NULL), |
| 174 stack_node_(NULL), | 174 stack_node_(NULL), |
| 175 parameters_dirty_(false), | 175 parameters_dirty_(true), |
| 176 locals_dirty_(false), | 176 locals_dirty_(true), |
| 177 stack_dirty_(false) { | 177 stack_dirty_(true) { |
| 178 DCHECK_EQ(scope->num_parameters() + 1, parameters_count()); | 178 DCHECK_EQ(scope->num_parameters() + 1, parameters_count()); |
| 179 | 179 |
| 180 // Bind the receiver variable. | 180 // Bind the receiver variable. |
| 181 Node* receiver = builder->graph()->NewNode(common()->Parameter(0), | 181 Node* receiver = builder->graph()->NewNode(common()->Parameter(0), |
| 182 builder->graph()->start()); | 182 builder->graph()->start()); |
| 183 values()->push_back(receiver); | 183 values()->push_back(receiver); |
| 184 | 184 |
| 185 // Bind all parameter variables. The parameter indices are shifted by 1 | 185 // Bind all parameter variables. The parameter indices are shifted by 1 |
| 186 // (receiver is parameter index -1 but environment index 0). | 186 // (receiver is parameter index -1 but environment index 0). |
| 187 for (int i = 0; i < scope->num_parameters(); ++i) { | 187 for (int i = 0; i < scope->num_parameters(); ++i) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 203 locals_count_(copy.locals_count_), | 203 locals_count_(copy.locals_count_), |
| 204 parameters_node_(copy.parameters_node_), | 204 parameters_node_(copy.parameters_node_), |
| 205 locals_node_(copy.locals_node_), | 205 locals_node_(copy.locals_node_), |
| 206 stack_node_(copy.stack_node_), | 206 stack_node_(copy.stack_node_), |
| 207 parameters_dirty_(copy.parameters_dirty_), | 207 parameters_dirty_(copy.parameters_dirty_), |
| 208 locals_dirty_(copy.locals_dirty_), | 208 locals_dirty_(copy.locals_dirty_), |
| 209 stack_dirty_(copy.stack_dirty_) {} | 209 stack_dirty_(copy.stack_dirty_) {} |
| 210 | 210 |
| 211 | 211 |
| 212 Node* AstGraphBuilder::Environment::Checkpoint(BailoutId ast_id) { | 212 Node* AstGraphBuilder::Environment::Checkpoint(BailoutId ast_id) { |
| 213 UNIMPLEMENTED(); // TODO(mstarzinger): Implementation below is incomplete. | |
| 214 if (parameters_dirty_) { | 213 if (parameters_dirty_) { |
| 215 Node** parameters = &values()->front(); | 214 Operator* op = common()->StateValues(parameters_count()); |
| 216 parameters_node_ = graph()->NewNode(NULL, parameters_count(), parameters); | 215 if (parameters_count() != 0) { |
| 216 Node** parameters = &values()->front(); |
| 217 parameters_node_ = graph()->NewNode(op, parameters_count(), parameters); |
| 218 } else { |
| 219 parameters_node_ = graph()->NewNode(op); |
| 220 } |
| 217 parameters_dirty_ = false; | 221 parameters_dirty_ = false; |
| 218 } | 222 } |
| 219 if (locals_dirty_) { | 223 if (locals_dirty_) { |
| 220 Node** locals = &values()->at(parameters_count_); | 224 Operator* op = common()->StateValues(locals_count()); |
| 221 locals_node_ = graph()->NewNode(NULL, locals_count(), locals); | 225 if (locals_count() != 0) { |
| 226 Node** locals = &values()->at(parameters_count_); |
| 227 locals_node_ = graph()->NewNode(op, locals_count(), locals); |
| 228 } else { |
| 229 locals_node_ = graph()->NewNode(op); |
| 230 } |
| 222 locals_dirty_ = false; | 231 locals_dirty_ = false; |
| 223 } | 232 } |
| 224 FrameStateDescriptor descriptor(ast_id); | 233 if (stack_dirty_) { |
| 225 // TODO(jarin): add environment to the node. | 234 Operator* op = common()->StateValues(stack_height()); |
| 226 Operator* op = common()->FrameState(descriptor); | 235 if (stack_height() != 0) { |
| 236 Node** stack = &values()->at(parameters_count_ + locals_count_); |
| 237 stack_node_ = graph()->NewNode(op, stack_height(), stack); |
| 238 } else { |
| 239 stack_node_ = graph()->NewNode(op); |
| 240 } |
| 241 stack_dirty_ = false; |
| 242 } |
| 227 | 243 |
| 228 return graph()->NewNode(op); | 244 Operator* op = common()->FrameState(ast_id); |
| 245 |
| 246 return graph()->NewNode(op, parameters_node_, locals_node_, stack_node_); |
| 229 } | 247 } |
| 230 | 248 |
| 231 | 249 |
| 232 AstGraphBuilder::AstContext::AstContext(AstGraphBuilder* own, | 250 AstGraphBuilder::AstContext::AstContext(AstGraphBuilder* own, |
| 233 Expression::Context kind) | 251 Expression::Context kind) |
| 234 : kind_(kind), owner_(own), outer_(own->ast_context()) { | 252 : kind_(kind), owner_(own), outer_(own->ast_context()) { |
| 235 owner()->set_ast_context(this); // Push. | 253 owner()->set_ast_context(this); // Push. |
| 236 #ifdef DEBUG | 254 #ifdef DEBUG |
| 237 original_height_ = environment()->stack_height(); | 255 original_height_ = environment()->stack_height(); |
| 238 #endif | 256 #endif |
| (...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1956 | 1974 |
| 1957 StructuredGraphBuilder::Environment* continuation_env = | 1975 StructuredGraphBuilder::Environment* continuation_env = |
| 1958 environment_internal(); | 1976 environment_internal(); |
| 1959 // Create environment for the deoptimization block, and build the block. | 1977 // Create environment for the deoptimization block, and build the block. |
| 1960 StructuredGraphBuilder::Environment* deopt_env = | 1978 StructuredGraphBuilder::Environment* deopt_env = |
| 1961 CopyEnvironment(continuation_env); | 1979 CopyEnvironment(continuation_env); |
| 1962 set_environment(deopt_env); | 1980 set_environment(deopt_env); |
| 1963 | 1981 |
| 1964 NewNode(common()->LazyDeoptimization()); | 1982 NewNode(common()->LazyDeoptimization()); |
| 1965 | 1983 |
| 1966 FrameStateDescriptor stateDescriptor(ast_id); | 1984 Node* state_node = environment()->Checkpoint(ast_id); |
| 1967 Node* state_node = NewNode(common()->FrameState(stateDescriptor)); | |
| 1968 | 1985 |
| 1969 Node* deoptimize_node = NewNode(common()->Deoptimize(), state_node); | 1986 Node* deoptimize_node = NewNode(common()->Deoptimize(), state_node); |
| 1970 | 1987 |
| 1971 UpdateControlDependencyToLeaveFunction(deoptimize_node); | 1988 UpdateControlDependencyToLeaveFunction(deoptimize_node); |
| 1972 | 1989 |
| 1973 // Continue with the original environment. | 1990 // Continue with the original environment. |
| 1974 set_environment(continuation_env); | 1991 set_environment(continuation_env); |
| 1975 | 1992 |
| 1976 NewNode(common()->Continuation()); | 1993 NewNode(common()->Continuation()); |
| 1977 } | 1994 } |
| 1978 } | 1995 } |
| 1979 } | 1996 } |
| 1980 } | 1997 } |
| 1981 } // namespace v8::internal::compiler | 1998 } // namespace v8::internal::compiler |
| OLD | NEW |