| Index: src/hydrogen.cc
|
| ===================================================================
|
| --- src/hydrogen.cc (revision 12254)
|
| +++ src/hydrogen.cc (working copy)
|
| @@ -5215,8 +5215,13 @@
|
|
|
| HInstruction* instr = NULL;
|
| SmallMapList* types = expr->GetReceiverTypes();
|
| - if (expr->IsMonomorphic()) {
|
| - Handle<Map> map = types->first();
|
| + bool monomorphic = expr->IsMonomorphic();
|
| + Handle<Map> map;
|
| + if (monomorphic) {
|
| + map = types->first();
|
| + if (map->is_dictionary_map()) monomorphic = false;
|
| + }
|
| + if (monomorphic) {
|
| Handle<AccessorPair> accessors;
|
| Handle<JSObject> holder;
|
| if (LookupAccessorPair(map, name, &accessors, &holder)) {
|
| @@ -5392,8 +5397,14 @@
|
| Handle<String> name = prop->key()->AsLiteral()->AsPropertyName();
|
| Handle<Map> map;
|
| HInstruction* load;
|
| - if (prop->IsMonomorphic()) {
|
| + bool monomorphic = prop->IsMonomorphic();
|
| + if (monomorphic) {
|
| map = prop->GetReceiverTypes()->first();
|
| + // We can't generate code for a monomorphic dict mode load so
|
| + // just pretend it is not monomorphic.
|
| + if (map->is_dictionary_map()) monomorphic = false;
|
| + }
|
| + if (monomorphic) {
|
| Handle<AccessorPair> accessors;
|
| Handle<JSObject> holder;
|
| if (LookupAccessorPair(map, name, &accessors, &holder)) {
|
| @@ -5416,7 +5427,7 @@
|
| if (instr->HasObservableSideEffects()) AddSimulate(operation->id());
|
|
|
| HInstruction* store;
|
| - if (map.is_null()) {
|
| + if (!monomorphic) {
|
| // If we don't know the monomorphic type, do a generic store.
|
| CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, instr));
|
| } else {
|
| @@ -5717,6 +5728,7 @@
|
| Property* expr,
|
| Handle<Map> map) {
|
| // Handle a load from a known field.
|
| + ASSERT(!map->is_dictionary_map());
|
| LookupResult lookup(isolate());
|
| map->LookupDescriptor(NULL, *name, &lookup);
|
| if (lookup.IsField()) {
|
| @@ -6350,8 +6362,13 @@
|
| Handle<String> name = expr->key()->AsLiteral()->AsPropertyName();
|
| SmallMapList* types = expr->GetReceiverTypes();
|
|
|
| + bool monomorphic = expr->IsMonomorphic();
|
| + Handle<Map> map;
|
| if (expr->IsMonomorphic()) {
|
| - Handle<Map> map = types->first();
|
| + map = types->first();
|
| + if (map->is_dictionary_map()) monomorphic = false;
|
| + }
|
| + if (monomorphic) {
|
| Handle<AccessorPair> accessors;
|
| Handle<JSObject> holder;
|
| if (LookupAccessorPair(map, name, &accessors, &holder)) {
|
| @@ -7860,8 +7877,12 @@
|
| Handle<String> name = prop->key()->AsLiteral()->AsPropertyName();
|
| Handle<Map> map;
|
| HInstruction* load;
|
| - if (prop->IsMonomorphic()) {
|
| + bool monomorphic = prop->IsMonomorphic();
|
| + if (monomorphic) {
|
| map = prop->GetReceiverTypes()->first();
|
| + if (map->is_dictionary_map()) monomorphic = false;
|
| + }
|
| + if (monomorphic) {
|
| Handle<AccessorPair> accessors;
|
| Handle<JSObject> holder;
|
| if (LookupAccessorPair(map, name, &accessors, &holder)) {
|
| @@ -7879,7 +7900,7 @@
|
| input = Pop();
|
|
|
| HInstruction* store;
|
| - if (map.is_null()) {
|
| + if (!monomorphic) {
|
| // If we don't know the monomorphic type, do a generic store.
|
| CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, after));
|
| } else {
|
|
|