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/hydrogen.h

Issue 935603002: Stop using HeapType in IC and Crankshaft (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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/accessors.cc ('k') | src/hydrogen.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_HYDROGEN_H_ 5 #ifndef V8_HYDROGEN_H_
6 #define V8_HYDROGEN_H_ 6 #define V8_HYDROGEN_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 2264 matching lines...) Expand 10 before | Expand all | Expand 10 after
2275 template <class Instruction> HInstruction* PreProcessCall(Instruction* call); 2275 template <class Instruction> HInstruction* PreProcessCall(Instruction* call);
2276 void PushArgumentsFromEnvironment(int count); 2276 void PushArgumentsFromEnvironment(int count);
2277 2277
2278 void SetUpScope(Scope* scope); 2278 void SetUpScope(Scope* scope);
2279 void VisitStatements(ZoneList<Statement*>* statements) OVERRIDE; 2279 void VisitStatements(ZoneList<Statement*>* statements) OVERRIDE;
2280 2280
2281 #define DECLARE_VISIT(type) virtual void Visit##type(type* node) OVERRIDE; 2281 #define DECLARE_VISIT(type) virtual void Visit##type(type* node) OVERRIDE;
2282 AST_NODE_LIST(DECLARE_VISIT) 2282 AST_NODE_LIST(DECLARE_VISIT)
2283 #undef DECLARE_VISIT 2283 #undef DECLARE_VISIT
2284 2284
2285 Type* ToType(Handle<Map> map);
2286
2287 private: 2285 private:
2288 // Helpers for flow graph construction. 2286 // Helpers for flow graph construction.
2289 enum GlobalPropertyAccess { 2287 enum GlobalPropertyAccess {
2290 kUseCell, 2288 kUseCell,
2291 kUseGeneric 2289 kUseGeneric
2292 }; 2290 };
2293 GlobalPropertyAccess LookupGlobalProperty(Variable* var, LookupIterator* it, 2291 GlobalPropertyAccess LookupGlobalProperty(Variable* var, LookupIterator* it,
2294 PropertyAccessType access_type); 2292 PropertyAccessType access_type);
2295 2293
2296 void EnsureArgumentsArePushedForAccess(); 2294 void EnsureArgumentsArePushedForAccess();
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2427 return handle(isolate()->native_context()->array_function()); 2425 return handle(isolate()->native_context()->array_function());
2428 } 2426 }
2429 2427
2430 bool IsCallArrayInlineable(int argument_count, Handle<AllocationSite> site); 2428 bool IsCallArrayInlineable(int argument_count, Handle<AllocationSite> site);
2431 void BuildInlinedCallArray(Expression* expression, int argument_count, 2429 void BuildInlinedCallArray(Expression* expression, int argument_count,
2432 Handle<AllocationSite> site); 2430 Handle<AllocationSite> site);
2433 2431
2434 class PropertyAccessInfo { 2432 class PropertyAccessInfo {
2435 public: 2433 public:
2436 PropertyAccessInfo(HOptimizedGraphBuilder* builder, 2434 PropertyAccessInfo(HOptimizedGraphBuilder* builder,
2437 PropertyAccessType access_type, 2435 PropertyAccessType access_type, Handle<Map> map,
2438 Type* type,
2439 Handle<String> name) 2436 Handle<String> name)
2440 : lookup_(builder->isolate()), 2437 : lookup_(builder->isolate()),
2441 builder_(builder), 2438 builder_(builder),
2442 access_type_(access_type), 2439 access_type_(access_type),
2443 type_(type), 2440 map_(map),
2444 name_(name), 2441 name_(name),
2445 field_type_(HType::Tagged()), 2442 field_type_(HType::Tagged()),
2446 access_(HObjectAccess::ForMap()) { } 2443 access_(HObjectAccess::ForMap()) {}
2447 2444
2448 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic 2445 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic
2449 // load named. It additionally fills in the fields necessary to generate the 2446 // load named. It additionally fills in the fields necessary to generate the
2450 // lookup code. 2447 // lookup code.
2451 bool CanAccessMonomorphic(); 2448 bool CanAccessMonomorphic();
2452 2449
2453 // Checks whether all types behave uniform when loading name. If all maps 2450 // Checks whether all types behave uniform when loading name. If all maps
2454 // behave the same, a single monomorphic load instruction can be emitted, 2451 // behave the same, a single monomorphic load instruction can be emitted,
2455 // guarded by a single map-checks instruction that whether the receiver is 2452 // guarded by a single map-checks instruction that whether the receiver is
2456 // an instance of any of the types. 2453 // an instance of any of the types.
2457 // This method skips the first type in types, assuming that this 2454 // This method skips the first type in types, assuming that this
2458 // PropertyAccessInfo is built for types->first(). 2455 // PropertyAccessInfo is built for types->first().
2459 bool CanAccessAsMonomorphic(SmallMapList* types); 2456 bool CanAccessAsMonomorphic(SmallMapList* types);
2460 2457
2458 bool NeedsWrappingFor(Handle<JSFunction> target) const;
2459
2461 Handle<Map> map(); 2460 Handle<Map> map();
2462 Type* type() const { return type_; }
2463 Handle<String> name() const { return name_; } 2461 Handle<String> name() const { return name_; }
2464 2462
2465 bool IsJSObjectFieldAccessor() { 2463 bool IsJSObjectFieldAccessor() {
2466 int offset; // unused 2464 int offset; // unused
2467 return Accessors::IsJSObjectFieldAccessor<Type>(type_, name_, &offset); 2465 return Accessors::IsJSObjectFieldAccessor(map(), name_, &offset);
2468 } 2466 }
2469 2467
2470 bool GetJSObjectFieldAccess(HObjectAccess* access) { 2468 bool GetJSObjectFieldAccess(HObjectAccess* access) {
2471 int offset; 2469 int offset;
2472 if (Accessors::IsJSObjectFieldAccessor<Type>(type_, name_, &offset)) { 2470 if (Accessors::IsJSObjectFieldAccessor(map(), name_, &offset)) {
2473 if (type_->Is(Type::String())) { 2471 if (IsStringType()) {
2474 DCHECK(String::Equals(isolate()->factory()->length_string(), name_)); 2472 DCHECK(String::Equals(isolate()->factory()->length_string(), name_));
2475 *access = HObjectAccess::ForStringLength(); 2473 *access = HObjectAccess::ForStringLength();
2476 } else if (type_->Is(Type::Array())) { 2474 } else if (IsArrayType()) {
2477 DCHECK(String::Equals(isolate()->factory()->length_string(), name_)); 2475 DCHECK(String::Equals(isolate()->factory()->length_string(), name_));
2478 *access = HObjectAccess::ForArrayLength(map()->elements_kind()); 2476 *access = HObjectAccess::ForArrayLength(map()->elements_kind());
2479 } else { 2477 } else {
2480 *access = HObjectAccess::ForMapAndOffset(map(), offset); 2478 *access = HObjectAccess::ForMapAndOffset(map(), offset);
2481 } 2479 }
2482 return true; 2480 return true;
2483 } 2481 }
2484 return false; 2482 return false;
2485 } 2483 }
2486 2484
(...skipping 12 matching lines...) Expand all
2499 bool IsFound() const { return lookup_.IsFound(); } 2497 bool IsFound() const { return lookup_.IsFound(); }
2500 bool IsProperty() const { return lookup_.IsProperty(); } 2498 bool IsProperty() const { return lookup_.IsProperty(); }
2501 bool IsData() const { return lookup_.IsData(); } 2499 bool IsData() const { return lookup_.IsData(); }
2502 bool IsDataConstant() const { return lookup_.IsDataConstant(); } 2500 bool IsDataConstant() const { return lookup_.IsDataConstant(); }
2503 bool IsAccessorConstant() const { return lookup_.IsAccessorConstant(); } 2501 bool IsAccessorConstant() const { return lookup_.IsAccessorConstant(); }
2504 bool IsTransition() const { return lookup_.IsTransition(); } 2502 bool IsTransition() const { return lookup_.IsTransition(); }
2505 2503
2506 bool IsConfigurable() const { return lookup_.IsConfigurable(); } 2504 bool IsConfigurable() const { return lookup_.IsConfigurable(); }
2507 bool IsReadOnly() const { return lookup_.IsReadOnly(); } 2505 bool IsReadOnly() const { return lookup_.IsReadOnly(); }
2508 2506
2507 bool IsStringType() { return map_->instance_type() < FIRST_NONSTRING_TYPE; }
2508 bool IsNumberType() { return map_->instance_type() == HEAP_NUMBER_TYPE; }
2509 bool IsValueWrapped() { return IsStringType() || IsNumberType(); }
2510 bool IsArrayType() { return map_->instance_type() == JS_ARRAY_TYPE; }
2511
2509 private: 2512 private:
2510 Handle<Object> GetAccessorsFromMap(Handle<Map> map) const { 2513 Handle<Object> GetAccessorsFromMap(Handle<Map> map) const {
2511 return handle(lookup_.GetValueFromMap(*map), isolate()); 2514 return handle(lookup_.GetValueFromMap(*map), isolate());
2512 } 2515 }
2513 Handle<Object> GetConstantFromMap(Handle<Map> map) const { 2516 Handle<Object> GetConstantFromMap(Handle<Map> map) const {
2514 return handle(lookup_.GetConstantFromMap(*map), isolate()); 2517 return handle(lookup_.GetConstantFromMap(*map), isolate());
2515 } 2518 }
2516 Handle<HeapType> GetFieldTypeFromMap(Handle<Map> map) const { 2519 Handle<HeapType> GetFieldTypeFromMap(Handle<Map> map) const {
2517 return handle(lookup_.GetFieldTypeFromMap(*map), isolate()); 2520 return handle(lookup_.GetFieldTypeFromMap(*map), isolate());
2518 } 2521 }
2519 Handle<Map> GetFieldOwnerFromMap(Handle<Map> map) const { 2522 Handle<Map> GetFieldOwnerFromMap(Handle<Map> map) const {
2520 return handle(lookup_.GetFieldOwnerFromMap(*map)); 2523 return handle(lookup_.GetFieldOwnerFromMap(*map));
2521 } 2524 }
2522 int GetLocalFieldIndexFromMap(Handle<Map> map) const { 2525 int GetLocalFieldIndexFromMap(Handle<Map> map) const {
2523 return lookup_.GetLocalFieldIndexFromMap(*map); 2526 return lookup_.GetLocalFieldIndexFromMap(*map);
2524 } 2527 }
2525 Representation representation() const { return lookup_.representation(); } 2528 Representation representation() const { return lookup_.representation(); }
2526 2529
2527 Type* ToType(Handle<Map> map) { return builder_->ToType(map); }
2528 Zone* zone() { return builder_->zone(); } 2530 Zone* zone() { return builder_->zone(); }
2529 CompilationInfo* top_info() { return builder_->top_info(); } 2531 CompilationInfo* top_info() { return builder_->top_info(); }
2530 CompilationInfo* current_info() { return builder_->current_info(); } 2532 CompilationInfo* current_info() { return builder_->current_info(); }
2531 2533
2532 bool LoadResult(Handle<Map> map); 2534 bool LoadResult(Handle<Map> map);
2533 void LoadFieldMaps(Handle<Map> map); 2535 void LoadFieldMaps(Handle<Map> map);
2534 bool LookupDescriptor(); 2536 bool LookupDescriptor();
2535 bool LookupInPrototypes(); 2537 bool LookupInPrototypes();
2536 bool IsCompatible(PropertyAccessInfo* other); 2538 bool IsCompatible(PropertyAccessInfo* other);
2537 2539
2538 void GeneralizeRepresentation(Representation r) { 2540 void GeneralizeRepresentation(Representation r) {
2539 access_ = access_.WithRepresentation( 2541 access_ = access_.WithRepresentation(
2540 access_.representation().generalize(r)); 2542 access_.representation().generalize(r));
2541 } 2543 }
2542 2544
2543 LookupResult lookup_; 2545 LookupResult lookup_;
2544 HOptimizedGraphBuilder* builder_; 2546 HOptimizedGraphBuilder* builder_;
2545 PropertyAccessType access_type_; 2547 PropertyAccessType access_type_;
2546 Type* type_; 2548 Handle<Map> map_;
2547 Handle<String> name_; 2549 Handle<String> name_;
2548 Handle<JSObject> holder_; 2550 Handle<JSObject> holder_;
2549 Handle<JSFunction> accessor_; 2551 Handle<JSFunction> accessor_;
2550 Handle<JSObject> api_holder_; 2552 Handle<JSObject> api_holder_;
2551 Handle<Object> constant_; 2553 Handle<Object> constant_;
2552 SmallMapList field_maps_; 2554 SmallMapList field_maps_;
2553 HType field_type_; 2555 HType field_type_;
2554 HObjectAccess access_; 2556 HObjectAccess access_;
2555 }; 2557 };
2556 2558
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
2915 } 2917 }
2916 2918
2917 private: 2919 private:
2918 HGraphBuilder* builder_; 2920 HGraphBuilder* builder_;
2919 }; 2921 };
2920 2922
2921 2923
2922 } } // namespace v8::internal 2924 } } // namespace v8::internal
2923 2925
2924 #endif // V8_HYDROGEN_H_ 2926 #endif // V8_HYDROGEN_H_
OLDNEW
« no previous file with comments | « src/accessors.cc ('k') | src/hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698