Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 2677163003: WIP: type profiling. (Closed)
Patch Set: Rebaseline. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | src/interpreter/bytecodes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/ast/compile-time-value.h" 7 #include "src/ast/compile-time-value.h"
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/builtins/builtins-constructor.h" 9 #include "src/builtins/builtins-constructor.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 case VariableLocation::LOOKUP: { 891 case VariableLocation::LOOKUP: {
892 DCHECK_EQ(VAR, variable->mode()); 892 DCHECK_EQ(VAR, variable->mode());
893 DCHECK(!variable->binding_needs_init()); 893 DCHECK(!variable->binding_needs_init());
894 894
895 Register name = register_allocator()->NewRegister(); 895 Register name = register_allocator()->NewRegister();
896 896
897 builder() 897 builder()
898 ->LoadLiteral(variable->raw_name()) 898 ->LoadLiteral(variable->raw_name())
899 .StoreAccumulatorInRegister(name) 899 .StoreAccumulatorInRegister(name)
900 .CallRuntime(Runtime::kDeclareEvalVar, name); 900 .CallRuntime(Runtime::kDeclareEvalVar, name);
901
901 break; 902 break;
902 } 903 }
903 case VariableLocation::MODULE: 904 case VariableLocation::MODULE:
904 if (variable->IsExport() && variable->binding_needs_init()) { 905 if (variable->IsExport() && variable->binding_needs_init()) {
905 builder()->LoadTheHole(); 906 builder()->LoadTheHole();
906 BuildVariableAssignment(variable, Token::INIT, FeedbackSlot::Invalid(), 907 BuildVariableAssignment(variable, Token::INIT, FeedbackSlot::Invalid(),
907 HoleCheckMode::kElided); 908 HoleCheckMode::kElided);
908 } 909 }
909 // Nothing to do for imports. 910 // Nothing to do for imports.
910 break; 911 break;
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); 2184 DCHECK(expr->target()->IsValidReferenceExpressionOrThis());
2184 Register object, key; 2185 Register object, key;
2185 RegisterList super_property_args; 2186 RegisterList super_property_args;
2186 const AstRawString* name; 2187 const AstRawString* name;
2187 2188
2188 // Left-hand side can only be a property, a global or a variable slot. 2189 // Left-hand side can only be a property, a global or a variable slot.
2189 Property* property = expr->target()->AsProperty(); 2190 Property* property = expr->target()->AsProperty();
2190 LhsKind assign_type = Property::GetAssignType(property); 2191 LhsKind assign_type = Property::GetAssignType(property);
2191 2192
2192 // Evaluate LHS expression. 2193 // Evaluate LHS expression.
2194 Register lhs_name = register_allocator()->NewRegister();
2195
2193 switch (assign_type) { 2196 switch (assign_type) {
2194 case VARIABLE: 2197 case VARIABLE:
2198 if (true || FLAG_type_profile) {
2199 builder()
2200 ->LoadLiteral(expr->target()->AsVariableProxy()->var()->raw_name())
2201 .StoreAccumulatorInRegister(lhs_name);
2202 }
2195 // Nothing to do to evaluate variable assignment LHS. 2203 // Nothing to do to evaluate variable assignment LHS.
2196 break; 2204 break;
2197 case NAMED_PROPERTY: { 2205 case NAMED_PROPERTY: {
2198 object = VisitForRegisterValue(property->obj()); 2206 object = VisitForRegisterValue(property->obj());
2199 name = property->key()->AsLiteral()->AsRawPropertyName(); 2207 name = property->key()->AsLiteral()->AsRawPropertyName();
2208 if (true || FLAG_type_profile) {
2209 builder()->LoadLiteral(name).StoreAccumulatorInRegister(lhs_name);
2210 }
2200 break; 2211 break;
2201 } 2212 }
2202 case KEYED_PROPERTY: { 2213 case KEYED_PROPERTY: {
2203 object = VisitForRegisterValue(property->obj()); 2214 object = VisitForRegisterValue(property->obj());
2204 key = VisitForRegisterValue(property->key()); 2215 key = VisitForRegisterValue(property->key());
2216 if (true || FLAG_type_profile) {
2217 builder()->StoreAccumulatorInRegister(lhs_name);
2218 }
2205 break; 2219 break;
2206 } 2220 }
2207 case NAMED_SUPER_PROPERTY: { 2221 case NAMED_SUPER_PROPERTY: {
2208 super_property_args = register_allocator()->NewRegisterList(4); 2222 super_property_args = register_allocator()->NewRegisterList(4);
2209 SuperPropertyReference* super_property = 2223 SuperPropertyReference* super_property =
2210 property->obj()->AsSuperPropertyReference(); 2224 property->obj()->AsSuperPropertyReference();
2211 VisitForRegisterValue(super_property->this_var(), super_property_args[0]); 2225 VisitForRegisterValue(super_property->this_var(), super_property_args[0]);
2212 VisitForRegisterValue(super_property->home_object(), 2226 VisitForRegisterValue(super_property->home_object(),
2213 super_property_args[1]); 2227 super_property_args[1]);
2214 builder() 2228 builder()
2215 ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName()) 2229 ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName())
2216 .StoreAccumulatorInRegister(super_property_args[2]); 2230 .StoreAccumulatorInRegister(super_property_args[2]);
2231 if (true || FLAG_type_profile) {
2232 builder()->StoreAccumulatorInRegister(lhs_name);
2233 }
2217 break; 2234 break;
2218 } 2235 }
2219 case KEYED_SUPER_PROPERTY: { 2236 case KEYED_SUPER_PROPERTY: {
2220 super_property_args = register_allocator()->NewRegisterList(4); 2237 super_property_args = register_allocator()->NewRegisterList(4);
2221 SuperPropertyReference* super_property = 2238 SuperPropertyReference* super_property =
2222 property->obj()->AsSuperPropertyReference(); 2239 property->obj()->AsSuperPropertyReference();
2223 VisitForRegisterValue(super_property->this_var(), super_property_args[0]); 2240 VisitForRegisterValue(super_property->this_var(), super_property_args[0]);
2224 VisitForRegisterValue(super_property->home_object(), 2241 VisitForRegisterValue(super_property->home_object(),
2225 super_property_args[1]); 2242 super_property_args[1]);
2226 VisitForRegisterValue(property->key(), super_property_args[2]); 2243 VisitForRegisterValue(property->key(), super_property_args[2]);
2244 if (true || FLAG_type_profile) {
2245 builder()->StoreAccumulatorInRegister(lhs_name);
2246 }
2247
2227 break; 2248 break;
2228 } 2249 }
2229 } 2250 }
2230 2251
2231 // Evaluate the value and potentially handle compound assignments by loading 2252 // Evaluate the value and potentially handle compound assignments by loading
2232 // the left-hand side value and performing a binary operation. 2253 // the left-hand side value and performing a binary operation.
2233 if (expr->is_compound()) { 2254 if (expr->is_compound()) {
2234 Register old_value = register_allocator()->NewRegister(); 2255 Register old_value = register_allocator()->NewRegister();
2235 switch (assign_type) { 2256 switch (assign_type) {
2236 case VARIABLE: { 2257 case VARIABLE: {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2305 .CallRuntime(StoreToSuperRuntimeId(), super_property_args); 2326 .CallRuntime(StoreToSuperRuntimeId(), super_property_args);
2306 break; 2327 break;
2307 } 2328 }
2308 case KEYED_SUPER_PROPERTY: { 2329 case KEYED_SUPER_PROPERTY: {
2309 builder() 2330 builder()
2310 ->StoreAccumulatorInRegister(super_property_args[3]) 2331 ->StoreAccumulatorInRegister(super_property_args[3])
2311 .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args); 2332 .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args);
2312 break; 2333 break;
2313 } 2334 }
2314 } 2335 }
2336
2337 // Value is in accumulator.
2338 if (FLAG_type_profile) {
2339 Register value = register_allocator()->NewRegister();
2340 builder()->StoreAccumulatorInRegister(value);
2341
2342 FeedbackSlot collect_type_feedback_slot = expr->CollectTypeProfileSlot();
2343
2344 builder()->CollectTypeProfile(lhs_name, value,
2345 feedback_index(collect_type_feedback_slot));
2346 }
2315 } 2347 }
2316 2348
2317 void BytecodeGenerator::VisitYield(Yield* expr) { 2349 void BytecodeGenerator::VisitYield(Yield* expr) {
2318 builder()->SetExpressionPosition(expr); 2350 builder()->SetExpressionPosition(expr);
2319 Register value = VisitForRegisterValue(expr->expression()); 2351 Register value = VisitForRegisterValue(expr->expression());
2320 2352
2321 Register generator = VisitForRegisterValue(expr->generator_object()); 2353 Register generator = VisitForRegisterValue(expr->generator_object());
2322 2354
2323 // Save context, registers, and state. Then return. 2355 // Save context, registers, and state. Then return.
2324 builder() 2356 builder()
(...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after
3449 } 3481 }
3450 3482
3451 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { 3483 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() {
3452 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict 3484 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict
3453 : Runtime::kStoreKeyedToSuper_Sloppy; 3485 : Runtime::kStoreKeyedToSuper_Sloppy;
3454 } 3486 }
3455 3487
3456 } // namespace interpreter 3488 } // namespace interpreter
3457 } // namespace internal 3489 } // namespace internal
3458 } // namespace v8 3490 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | src/interpreter/bytecodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698