| OLD | NEW | 
|---|
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 3852 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3863     __ movq(temp.reg(), SlotOperand(slot, temp.reg())); | 3863     __ movq(temp.reg(), SlotOperand(slot, temp.reg())); | 
| 3864     frame_->Push(&temp); | 3864     frame_->Push(&temp); | 
| 3865   } | 3865   } | 
| 3866 } | 3866 } | 
| 3867 | 3867 | 
| 3868 | 3868 | 
| 3869 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { | 3869 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { | 
| 3870   // TODO(X64): Enable more types of slot. | 3870   // TODO(X64): Enable more types of slot. | 
| 3871 | 3871 | 
| 3872   if (slot->type() == Slot::LOOKUP) { | 3872   if (slot->type() == Slot::LOOKUP) { | 
| 3873     UNIMPLEMENTED(); |  | 
| 3874     /* |  | 
| 3875     ASSERT(slot->var()->is_dynamic()); | 3873     ASSERT(slot->var()->is_dynamic()); | 
| 3876 | 3874 | 
| 3877     // For now, just do a runtime call.  Since the call is inevitable, | 3875     // For now, just do a runtime call.  Since the call is inevitable, | 
| 3878     // we eagerly sync the virtual frame so we can directly push the | 3876     // we eagerly sync the virtual frame so we can directly push the | 
| 3879     // arguments into place. | 3877     // arguments into place. | 
| 3880     frame_->SyncRange(0, frame_->element_count() - 1); | 3878     frame_->SyncRange(0, frame_->element_count() - 1); | 
| 3881 | 3879 | 
| 3882     frame_->EmitPush(esi); | 3880     frame_->EmitPush(rsi); | 
| 3883     frame_->EmitPush(Immediate(slot->var()->name())); | 3881     frame_->EmitPush(slot->var()->name()); | 
| 3884 | 3882 | 
| 3885     Result value; | 3883     Result value; | 
| 3886     if (init_state == CONST_INIT) { | 3884     if (init_state == CONST_INIT) { | 
| 3887       // Same as the case for a normal store, but ignores attribute | 3885       // Same as the case for a normal store, but ignores attribute | 
| 3888       // (e.g. READ_ONLY) of context slot so that we can initialize const | 3886       // (e.g. READ_ONLY) of context slot so that we can initialize const | 
| 3889       // properties (introduced via eval("const foo = (some expr);")). Also, | 3887       // properties (introduced via eval("const foo = (some expr);")). Also, | 
| 3890       // uses the current function context instead of the top context. | 3888       // uses the current function context instead of the top context. | 
| 3891       // | 3889       // | 
| 3892       // Note that we must declare the foo upon entry of eval(), via a | 3890       // Note that we must declare the foo upon entry of eval(), via a | 
| 3893       // context slot declaration, but we cannot initialize it at the same | 3891       // context slot declaration, but we cannot initialize it at the same | 
| 3894       // time, because the const declaration may be at the end of the eval | 3892       // time, because the const declaration may be at the end of the eval | 
| 3895       // code (sigh...) and the const variable may have been used before | 3893       // code (sigh...) and the const variable may have been used before | 
| 3896       // (where its value is 'undefined'). Thus, we can only do the | 3894       // (where its value is 'undefined'). Thus, we can only do the | 
| 3897       // initialization when we actually encounter the expression and when | 3895       // initialization when we actually encounter the expression and when | 
| 3898       // the expression operands are defined and valid, and thus we need the | 3896       // the expression operands are defined and valid, and thus we need the | 
| 3899       // split into 2 operations: declaration of the context slot followed | 3897       // split into 2 operations: declaration of the context slot followed | 
| 3900       // by initialization. | 3898       // by initialization. | 
| 3901       value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); | 3899       value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); | 
| 3902     } else { | 3900     } else { | 
| 3903       value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); | 3901       value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); | 
| 3904     } | 3902     } | 
| 3905     // Storing a variable must keep the (new) value on the expression | 3903     // Storing a variable must keep the (new) value on the expression | 
| 3906     // stack. This is necessary for compiling chained assignment | 3904     // stack. This is necessary for compiling chained assignment | 
| 3907     // expressions. | 3905     // expressions. | 
| 3908     frame_->Push(&value); | 3906     frame_->Push(&value); | 
| 3909     */ |  | 
| 3910   } else { | 3907   } else { | 
| 3911     ASSERT(!slot->var()->is_dynamic()); | 3908     ASSERT(!slot->var()->is_dynamic()); | 
| 3912 | 3909 | 
| 3913     JumpTarget exit; | 3910     JumpTarget exit; | 
| 3914     if (init_state == CONST_INIT) { | 3911     if (init_state == CONST_INIT) { | 
| 3915       ASSERT(slot->var()->mode() == Variable::CONST); | 3912       ASSERT(slot->var()->mode() == Variable::CONST); | 
| 3916       // Only the first const initialization must be executed (the slot | 3913       // Only the first const initialization must be executed (the slot | 
| 3917       // still contains 'the hole' value). When the assignment is executed, | 3914       // still contains 'the hole' value). When the assignment is executed, | 
| 3918       // the code is identical to a normal store (see below). | 3915       // the code is identical to a normal store (see below). | 
| 3919       // | 3916       // | 
| (...skipping 2836 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6756       break; | 6753       break; | 
| 6757     default: | 6754     default: | 
| 6758       UNREACHABLE(); | 6755       UNREACHABLE(); | 
| 6759   } | 6756   } | 
| 6760 } | 6757 } | 
| 6761 | 6758 | 
| 6762 | 6759 | 
| 6763 #undef __ | 6760 #undef __ | 
| 6764 | 6761 | 
| 6765 } }  // namespace v8::internal | 6762 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|