OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2177 template <class Instruction> HInstruction* PreProcessCall(Instruction* call); | 2177 template <class Instruction> HInstruction* PreProcessCall(Instruction* call); |
2178 void PushArgumentsFromEnvironment(int count); | 2178 void PushArgumentsFromEnvironment(int count); |
2179 | 2179 |
2180 void SetUpScope(Scope* scope); | 2180 void SetUpScope(Scope* scope); |
2181 virtual void VisitStatements(ZoneList<Statement*>* statements) V8_OVERRIDE; | 2181 virtual void VisitStatements(ZoneList<Statement*>* statements) V8_OVERRIDE; |
2182 | 2182 |
2183 #define DECLARE_VISIT(type) virtual void Visit##type(type* node) V8_OVERRIDE; | 2183 #define DECLARE_VISIT(type) virtual void Visit##type(type* node) V8_OVERRIDE; |
2184 AST_NODE_LIST(DECLARE_VISIT) | 2184 AST_NODE_LIST(DECLARE_VISIT) |
2185 #undef DECLARE_VISIT | 2185 #undef DECLARE_VISIT |
2186 | 2186 |
2187 Type* ToType(Handle<Map> map) { return IC::MapToType<Type>(map, zone()); } | |
2188 | |
2187 private: | 2189 private: |
2188 // Helpers for flow graph construction. | 2190 // Helpers for flow graph construction. |
2189 enum GlobalPropertyAccess { | 2191 enum GlobalPropertyAccess { |
2190 kUseCell, | 2192 kUseCell, |
2191 kUseGeneric | 2193 kUseGeneric |
2192 }; | 2194 }; |
2193 GlobalPropertyAccess LookupGlobalProperty(Variable* var, | 2195 GlobalPropertyAccess LookupGlobalProperty(Variable* var, |
2194 LookupResult* lookup, | 2196 LookupResult* lookup, |
2195 bool is_store); | 2197 bool is_store); |
2196 | 2198 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2258 void VisitTypedArrayInitialize(CallRuntime* expr); | 2260 void VisitTypedArrayInitialize(CallRuntime* expr); |
2259 | 2261 |
2260 bool IsCallNewArrayInlineable(CallNew* expr); | 2262 bool IsCallNewArrayInlineable(CallNew* expr); |
2261 void BuildInlinedCallNewArray(CallNew* expr); | 2263 void BuildInlinedCallNewArray(CallNew* expr); |
2262 | 2264 |
2263 void VisitDataViewInitialize(CallRuntime* expr); | 2265 void VisitDataViewInitialize(CallRuntime* expr); |
2264 | 2266 |
2265 class PropertyAccessInfo { | 2267 class PropertyAccessInfo { |
2266 public: | 2268 public: |
2267 PropertyAccessInfo(HOptimizedGraphBuilder* builder, | 2269 PropertyAccessInfo(HOptimizedGraphBuilder* builder, |
2268 Handle<HeapType> type, | 2270 Type* type, |
2269 Handle<String> name) | 2271 Handle<String> name) |
2270 : lookup_(builder->isolate()), | 2272 : lookup_(builder->isolate()), |
2271 builder_(builder), | 2273 builder_(builder), |
2272 type_(type), | 2274 type_(type), |
2273 name_(name), | 2275 name_(name), |
2274 access_(HObjectAccess::ForMap()) { } | 2276 access_(HObjectAccess::ForMap()) { } |
2275 | 2277 |
2276 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic | 2278 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic |
2277 // load named. It additionally fills in the fields necessary to generate the | 2279 // load named. It additionally fills in the fields necessary to generate the |
2278 // lookup code. | 2280 // lookup code. |
2279 bool CanLoadMonomorphic(); | 2281 bool CanLoadMonomorphic(); |
2280 | 2282 |
2281 // Checks whether all types behave uniform when loading name. If all maps | 2283 // Checks whether all types behave uniform when loading name. If all maps |
2282 // behave the same, a single monomorphic load instruction can be emitted, | 2284 // behave the same, a single monomorphic load instruction can be emitted, |
2283 // guarded by a single map-checks instruction that whether the receiver is | 2285 // guarded by a single map-checks instruction that whether the receiver is |
2284 // an instance of any of the types. | 2286 // an instance of any of the types. |
2285 // This method skips the first type in types, assuming that this | 2287 // This method skips the first type in types, assuming that this |
2286 // PropertyAccessInfo is built for types->first(). | 2288 // PropertyAccessInfo is built for types->first(). |
2287 bool CanLoadAsMonomorphic(SmallMapList* types); | 2289 bool CanLoadAsMonomorphic(SmallMapList* types); |
2288 | 2290 |
2289 Handle<Map> map() { | 2291 Handle<Map> map() { |
2290 if (type_->Is(HeapType::Number())) { | 2292 if (type_->Is(Type::Number())) { |
2291 Context* context = current_info()->closure()->context(); | 2293 Context* context = current_info()->closure()->context(); |
2292 context = context->native_context(); | 2294 context = context->native_context(); |
2293 return handle(context->number_function()->initial_map()); | 2295 return handle(context->number_function()->initial_map()); |
2294 } else if (type_->Is(HeapType::Boolean())) { | 2296 } else if (type_->Is(Type::Boolean())) { |
2295 Context* context = current_info()->closure()->context(); | 2297 Context* context = current_info()->closure()->context(); |
2296 context = context->native_context(); | 2298 context = context->native_context(); |
2297 return handle(context->boolean_function()->initial_map()); | 2299 return handle(context->boolean_function()->initial_map()); |
2298 } else if (type_->Is(HeapType::String())) { | 2300 } else if (type_->Is(Type::String())) { |
2299 Context* context = current_info()->closure()->context(); | 2301 Context* context = current_info()->closure()->context(); |
2300 context = context->native_context(); | 2302 context = context->native_context(); |
2301 return handle(context->string_function()->initial_map()); | 2303 return handle(context->string_function()->initial_map()); |
2302 } else { | 2304 } else { |
2303 return type_->AsClass(); | 2305 return type_->AsClass(); |
2304 } | 2306 } |
2305 } | 2307 } |
2306 Handle<HeapType> type() const { return type_; } | 2308 Type* type() const { return type_; } |
2307 Handle<String> name() const { return name_; } | 2309 Handle<String> name() const { return name_; } |
2308 | 2310 |
2309 bool IsJSObjectFieldAccessor() { | 2311 bool IsJSObjectFieldAccessor() { |
2310 int offset; // unused | 2312 int offset; // unused |
2311 return Accessors::IsJSObjectFieldAccessor(type_, name_, &offset); | 2313 return Accessors::IsJSObjectFieldAccessor<Type>(type_, name_, &offset); |
rossberg
2014/02/03 16:54:05
Was it necessary to specify the template argument?
| |
2312 } | 2314 } |
2313 | 2315 |
2314 bool GetJSObjectFieldAccess(HObjectAccess* access) { | 2316 bool GetJSObjectFieldAccess(HObjectAccess* access) { |
2315 if (IsArrayLength()) { | 2317 if (IsArrayLength()) { |
2316 *access = HObjectAccess::ForArrayLength(map()->elements_kind()); | 2318 *access = HObjectAccess::ForArrayLength(map()->elements_kind()); |
2317 return true; | 2319 return true; |
2318 } | 2320 } |
2319 int offset; | 2321 int offset; |
2320 if (Accessors::IsJSObjectFieldAccessor(type_, name_, &offset)) { | 2322 if (Accessors::IsJSObjectFieldAccessor<Type>(type_, name_, &offset)) { |
2321 if (type_->Is(HeapType::String())) { | 2323 if (type_->Is(Type::String())) { |
2322 ASSERT(name_->Equals(isolate()->heap()->length_string())); | 2324 ASSERT(name_->Equals(isolate()->heap()->length_string())); |
2323 *access = HObjectAccess::ForStringLength(); | 2325 *access = HObjectAccess::ForStringLength(); |
2324 } else { | 2326 } else { |
2325 *access = HObjectAccess::ForJSObjectOffset(offset); | 2327 *access = HObjectAccess::ForJSObjectOffset(offset); |
2326 } | 2328 } |
2327 return true; | 2329 return true; |
2328 } | 2330 } |
2329 return false; | 2331 return false; |
2330 } | 2332 } |
2331 | 2333 |
2332 bool has_holder() { return !holder_.is_null(); } | 2334 bool has_holder() { return !holder_.is_null(); } |
2333 | 2335 |
2334 LookupResult* lookup() { return &lookup_; } | 2336 LookupResult* lookup() { return &lookup_; } |
2335 Handle<JSObject> holder() { return holder_; } | 2337 Handle<JSObject> holder() { return holder_; } |
2336 Handle<JSFunction> accessor() { return accessor_; } | 2338 Handle<JSFunction> accessor() { return accessor_; } |
2337 Handle<Object> constant() { return constant_; } | 2339 Handle<Object> constant() { return constant_; } |
2338 HObjectAccess access() { return access_; } | 2340 HObjectAccess access() { return access_; } |
2339 | 2341 |
2340 private: | 2342 private: |
2343 Type* ToType(Handle<Map> map) { return builder_->ToType(map); } | |
2341 Isolate* isolate() { return lookup_.isolate(); } | 2344 Isolate* isolate() { return lookup_.isolate(); } |
2342 CompilationInfo* current_info() { return builder_->current_info(); } | 2345 CompilationInfo* current_info() { return builder_->current_info(); } |
2343 | 2346 |
2344 bool IsArrayLength() { | 2347 bool IsArrayLength() { |
2345 return map()->instance_type() == JS_ARRAY_TYPE && | 2348 return map()->instance_type() == JS_ARRAY_TYPE && |
2346 name_->Equals(isolate()->heap()->length_string()); | 2349 name_->Equals(isolate()->heap()->length_string()); |
2347 } | 2350 } |
2348 | 2351 |
2349 bool LoadResult(Handle<Map> map); | 2352 bool LoadResult(Handle<Map> map); |
2350 bool LookupDescriptor(); | 2353 bool LookupDescriptor(); |
2351 bool LookupInPrototypes(); | 2354 bool LookupInPrototypes(); |
2352 bool IsCompatibleForLoad(PropertyAccessInfo* other); | 2355 bool IsCompatibleForLoad(PropertyAccessInfo* other); |
2353 | 2356 |
2354 void GeneralizeRepresentation(Representation r) { | 2357 void GeneralizeRepresentation(Representation r) { |
2355 access_ = access_.WithRepresentation( | 2358 access_ = access_.WithRepresentation( |
2356 access_.representation().generalize(r)); | 2359 access_.representation().generalize(r)); |
2357 } | 2360 } |
2358 | 2361 |
2359 LookupResult lookup_; | 2362 LookupResult lookup_; |
2360 HOptimizedGraphBuilder* builder_; | 2363 HOptimizedGraphBuilder* builder_; |
2361 Handle<HeapType> type_; | 2364 Type* type_; |
2362 Handle<String> name_; | 2365 Handle<String> name_; |
2363 Handle<JSObject> holder_; | 2366 Handle<JSObject> holder_; |
2364 Handle<JSFunction> accessor_; | 2367 Handle<JSFunction> accessor_; |
2365 Handle<Object> constant_; | 2368 Handle<Object> constant_; |
2366 HObjectAccess access_; | 2369 HObjectAccess access_; |
2367 }; | 2370 }; |
2368 | 2371 |
2369 HInstruction* BuildLoadMonomorphic(PropertyAccessInfo* info, | 2372 HInstruction* BuildLoadMonomorphic(PropertyAccessInfo* info, |
2370 HValue* object, | 2373 HValue* object, |
2371 HValue* checked_object, | 2374 HValue* checked_object, |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2716 } | 2719 } |
2717 | 2720 |
2718 private: | 2721 private: |
2719 HGraphBuilder* builder_; | 2722 HGraphBuilder* builder_; |
2720 }; | 2723 }; |
2721 | 2724 |
2722 | 2725 |
2723 } } // namespace v8::internal | 2726 } } // namespace v8::internal |
2724 | 2727 |
2725 #endif // V8_HYDROGEN_H_ | 2728 #endif // V8_HYDROGEN_H_ |
OLD | NEW |