| Index: src/hydrogen.h
|
| diff --git a/src/hydrogen.h b/src/hydrogen.h
|
| index 55e7274d0fd4937fcd646ee5a8987ea4e6e27047..a9c0d3204aff09ce3005e2006b61337e29366742 100644
|
| --- a/src/hydrogen.h
|
| +++ b/src/hydrogen.h
|
| @@ -2256,9 +2256,12 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
|
|
| class PropertyAccessInfo {
|
| public:
|
| - PropertyAccessInfo(Isolate* isolate, Handle<Map> map, Handle<String> name)
|
| - : lookup_(isolate),
|
| - map_(map),
|
| + PropertyAccessInfo(HOptimizedGraphBuilder* builder,
|
| + Handle<HeapType> type,
|
| + Handle<String> name)
|
| + : lookup_(builder->isolate()),
|
| + builder_(builder),
|
| + type_(type),
|
| name_(name),
|
| access_(HObjectAccess::ForMap()) { }
|
|
|
| @@ -2275,32 +2278,48 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| // PropertyAccessInfo is built for types->first().
|
| bool CanLoadAsMonomorphic(SmallMapList* types);
|
|
|
| + Handle<Map> map() {
|
| + if (type_->Is(HeapType::Number())) {
|
| + Context* context = current_info()->closure()->context();
|
| + context = context->native_context();
|
| + return handle(context->number_function()->initial_map());
|
| + } else if (type_->Is(HeapType::String())) {
|
| + Context* context = current_info()->closure()->context();
|
| + context = context->native_context();
|
| + return handle(context->string_function()->initial_map());
|
| + } else {
|
| + return type_->AsClass();
|
| + }
|
| + }
|
| + Handle<HeapType> type() const { return type_; }
|
| + Handle<String> name() const { return name_; }
|
| +
|
| bool IsJSObjectFieldAccessor() {
|
| int offset; // unused
|
| - return Accessors::IsJSObjectFieldAccessor(map_, name_, &offset);
|
| + return Accessors::IsJSObjectFieldAccessor(type_, name_, &offset);
|
| }
|
|
|
| bool GetJSObjectFieldAccess(HObjectAccess* access) {
|
| - if (IsStringLength()) {
|
| - *access = HObjectAccess::ForStringLength();
|
| - return true;
|
| - } else if (IsArrayLength()) {
|
| - *access = HObjectAccess::ForArrayLength(map_->elements_kind());
|
| + if (IsArrayLength()) {
|
| + *access = HObjectAccess::ForArrayLength(map()->elements_kind());
|
| return true;
|
| - } else {
|
| - int offset;
|
| - if (Accessors::IsJSObjectFieldAccessor(map_, name_, &offset)) {
|
| + }
|
| + int offset;
|
| + if (Accessors::IsJSObjectFieldAccessor(type_, name_, &offset)) {
|
| + if (type_->Is(HeapType::String())) {
|
| + ASSERT(name_->Equals(isolate()->heap()->length_string()));
|
| + *access = HObjectAccess::ForStringLength();
|
| + } else {
|
| *access = HObjectAccess::ForJSObjectOffset(offset);
|
| - return true;
|
| }
|
| - return false;
|
| + return true;
|
| }
|
| + return false;
|
| }
|
|
|
| bool has_holder() { return !holder_.is_null(); }
|
|
|
| LookupResult* lookup() { return &lookup_; }
|
| - Handle<Map> map() { return map_; }
|
| Handle<JSObject> holder() { return holder_; }
|
| Handle<JSFunction> accessor() { return accessor_; }
|
| Handle<Object> constant() { return constant_; }
|
| @@ -2308,14 +2327,10 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
|
|
| private:
|
| Isolate* isolate() { return lookup_.isolate(); }
|
| -
|
| - bool IsStringLength() {
|
| - return map_->instance_type() < FIRST_NONSTRING_TYPE &&
|
| - name_->Equals(isolate()->heap()->length_string());
|
| - }
|
| + CompilationInfo* current_info() { return builder_->current_info(); }
|
|
|
| bool IsArrayLength() {
|
| - return map_->instance_type() == JS_ARRAY_TYPE &&
|
| + return map()->instance_type() == JS_ARRAY_TYPE &&
|
| name_->Equals(isolate()->heap()->length_string());
|
| }
|
|
|
| @@ -2330,7 +2345,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| }
|
|
|
| LookupResult lookup_;
|
| - Handle<Map> map_;
|
| + HOptimizedGraphBuilder* builder_;
|
| + Handle<HeapType> type_;
|
| Handle<String> name_;
|
| Handle<JSObject> holder_;
|
| Handle<JSFunction> accessor_;
|
| @@ -2340,7 +2356,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
|
|
| HInstruction* BuildLoadMonomorphic(PropertyAccessInfo* info,
|
| HValue* object,
|
| - HInstruction* checked_object,
|
| + HValue* checked_object,
|
| BailoutId ast_id,
|
| BailoutId return_id,
|
| bool can_inline_accessor = true);
|
|
|