Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: src/arm/full-codegen-arm.cc

Issue 6878009: Fix x64 typefeedback for property assignments. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/full-codegen.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 765 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 __ mov(r2, r0); 776 __ mov(r2, r0);
777 __ LoadRoot(r0, Heap::kTheHoleValueRootIndex); 777 __ LoadRoot(r0, Heap::kTheHoleValueRootIndex);
778 } 778 }
779 ASSERT(prop->key()->AsLiteral() != NULL && 779 ASSERT(prop->key()->AsLiteral() != NULL &&
780 prop->key()->AsLiteral()->handle()->IsSmi()); 780 prop->key()->AsLiteral()->handle()->IsSmi());
781 __ mov(r1, Operand(prop->key()->AsLiteral()->handle())); 781 __ mov(r1, Operand(prop->key()->AsLiteral()->handle()));
782 782
783 Handle<Code> ic = is_strict_mode() 783 Handle<Code> ic = is_strict_mode()
784 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() 784 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
785 : isolate()->builtins()->KeyedStoreIC_Initialize(); 785 : isolate()->builtins()->KeyedStoreIC_Initialize();
786 EmitCallIC(ic, RelocInfo::CODE_TARGET); 786 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
787 // Value in r0 is ignored (declarations are statements). 787 // Value in r0 is ignored (declarations are statements).
788 } 788 }
789 } 789 }
790 } 790 }
791 791
792 792
793 void FullCodeGenerator::VisitDeclaration(Declaration* decl) { 793 void FullCodeGenerator::VisitDeclaration(Declaration* decl) {
794 EmitDeclaration(decl->proxy()->var(), decl->mode(), decl->fun()); 794 EmitDeclaration(decl->proxy()->var(), decl->mode(), decl->fun());
795 } 795 }
796 796
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 __ b(&loop); 1159 __ b(&loop);
1160 __ bind(&fast); 1160 __ bind(&fast);
1161 } 1161 }
1162 1162
1163 __ ldr(r0, GlobalObjectOperand()); 1163 __ ldr(r0, GlobalObjectOperand());
1164 __ mov(r2, Operand(slot->var()->name())); 1164 __ mov(r2, Operand(slot->var()->name()));
1165 RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF) 1165 RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF)
1166 ? RelocInfo::CODE_TARGET 1166 ? RelocInfo::CODE_TARGET
1167 : RelocInfo::CODE_TARGET_CONTEXT; 1167 : RelocInfo::CODE_TARGET_CONTEXT;
1168 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); 1168 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1169 EmitCallIC(ic, mode); 1169 EmitCallIC(ic, mode, AstNode::kNoNumber);
1170 } 1170 }
1171 1171
1172 1172
1173 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions( 1173 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(
1174 Slot* slot, 1174 Slot* slot,
1175 Label* slow) { 1175 Label* slow) {
1176 ASSERT(slot->type() == Slot::CONTEXT); 1176 ASSERT(slot->type() == Slot::CONTEXT);
1177 Register context = cp; 1177 Register context = cp;
1178 Register next = r3; 1178 Register next = r3;
1179 Register temp = r4; 1179 Register temp = r4;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 key_literal->handle()->IsSmi()) { 1241 key_literal->handle()->IsSmi()) {
1242 // Load arguments object if there are no eval-introduced 1242 // Load arguments object if there are no eval-introduced
1243 // variables. Then load the argument from the arguments 1243 // variables. Then load the argument from the arguments
1244 // object using keyed load. 1244 // object using keyed load.
1245 __ ldr(r1, 1245 __ ldr(r1,
1246 ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(), 1246 ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(),
1247 slow)); 1247 slow));
1248 __ mov(r0, Operand(key_literal->handle())); 1248 __ mov(r0, Operand(key_literal->handle()));
1249 Handle<Code> ic = 1249 Handle<Code> ic =
1250 isolate()->builtins()->KeyedLoadIC_Initialize(); 1250 isolate()->builtins()->KeyedLoadIC_Initialize();
1251 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1251 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1252 __ jmp(done); 1252 __ jmp(done);
1253 } 1253 }
1254 } 1254 }
1255 } 1255 }
1256 } 1256 }
1257 } 1257 }
1258 1258
1259 1259
1260 void FullCodeGenerator::EmitVariableLoad(Variable* var) { 1260 void FullCodeGenerator::EmitVariableLoad(Variable* var) {
1261 // Four cases: non-this global variables, lookup slots, all other 1261 // Four cases: non-this global variables, lookup slots, all other
1262 // types of slots, and parameters that rewrite to explicit property 1262 // types of slots, and parameters that rewrite to explicit property
1263 // accesses on the arguments object. 1263 // accesses on the arguments object.
1264 Slot* slot = var->AsSlot(); 1264 Slot* slot = var->AsSlot();
1265 Property* property = var->AsProperty(); 1265 Property* property = var->AsProperty();
1266 1266
1267 if (var->is_global() && !var->is_this()) { 1267 if (var->is_global() && !var->is_this()) {
1268 Comment cmnt(masm_, "Global variable"); 1268 Comment cmnt(masm_, "Global variable");
1269 // Use inline caching. Variable name is passed in r2 and the global 1269 // Use inline caching. Variable name is passed in r2 and the global
1270 // object (receiver) in r0. 1270 // object (receiver) in r0.
1271 __ ldr(r0, GlobalObjectOperand()); 1271 __ ldr(r0, GlobalObjectOperand());
1272 __ mov(r2, Operand(var->name())); 1272 __ mov(r2, Operand(var->name()));
1273 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); 1273 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1274 EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); 1274 EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT, AstNode::kNoNumber);
1275 context()->Plug(r0); 1275 context()->Plug(r0);
1276 1276
1277 } else if (slot != NULL && slot->type() == Slot::LOOKUP) { 1277 } else if (slot != NULL && slot->type() == Slot::LOOKUP) {
1278 Label done, slow; 1278 Label done, slow;
1279 1279
1280 // Generate code for loading from variables potentially shadowed 1280 // Generate code for loading from variables potentially shadowed
1281 // by eval-introduced variables. 1281 // by eval-introduced variables.
1282 EmitDynamicLoadFromSlotFastCase(slot, NOT_INSIDE_TYPEOF, &slow, &done); 1282 EmitDynamicLoadFromSlotFastCase(slot, NOT_INSIDE_TYPEOF, &slow, &done);
1283 1283
1284 __ bind(&slow); 1284 __ bind(&slow);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 // Assert that the key is a smi. 1323 // Assert that the key is a smi.
1324 Literal* key_literal = property->key()->AsLiteral(); 1324 Literal* key_literal = property->key()->AsLiteral();
1325 ASSERT_NOT_NULL(key_literal); 1325 ASSERT_NOT_NULL(key_literal);
1326 ASSERT(key_literal->handle()->IsSmi()); 1326 ASSERT(key_literal->handle()->IsSmi());
1327 1327
1328 // Load the key. 1328 // Load the key.
1329 __ mov(r0, Operand(key_literal->handle())); 1329 __ mov(r0, Operand(key_literal->handle()));
1330 1330
1331 // Call keyed load IC. It has arguments key and receiver in r0 and r1. 1331 // Call keyed load IC. It has arguments key and receiver in r0 and r1.
1332 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); 1332 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
1333 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1333 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1334 context()->Plug(r0); 1334 context()->Plug(r0);
1335 } 1335 }
1336 } 1336 }
1337 1337
1338 1338
1339 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { 1339 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
1340 Comment cmnt(masm_, "[ RegExpLiteral"); 1340 Comment cmnt(masm_, "[ RegExpLiteral");
1341 Label materialized; 1341 Label materialized;
1342 // Registers will be used as follows: 1342 // Registers will be used as follows:
1343 // r5 = materialized value (RegExp literal) 1343 // r5 = materialized value (RegExp literal)
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
1689 } 1689 }
1690 1690
1691 1691
1692 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { 1692 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
1693 SetSourcePosition(prop->position()); 1693 SetSourcePosition(prop->position());
1694 Literal* key = prop->key()->AsLiteral(); 1694 Literal* key = prop->key()->AsLiteral();
1695 __ mov(r2, Operand(key->handle())); 1695 __ mov(r2, Operand(key->handle()));
1696 // Call load IC. It has arguments receiver and property name r0 and r2. 1696 // Call load IC. It has arguments receiver and property name r0 and r2.
1697 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); 1697 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1698 if (prop->is_synthetic()) { 1698 if (prop->is_synthetic()) {
1699 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1699 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1700 } else { 1700 } else {
1701 EmitCallIC(ic, RelocInfo::CODE_TARGET_WITH_ID, prop->id()); 1701 EmitCallIC(ic, RelocInfo::CODE_TARGET_WITH_ID, prop->id());
1702 } 1702 }
1703 } 1703 }
1704 1704
1705 1705
1706 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { 1706 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
1707 SetSourcePosition(prop->position()); 1707 SetSourcePosition(prop->position());
1708 // Call keyed load IC. It has arguments key and receiver in r0 and r1. 1708 // Call keyed load IC. It has arguments key and receiver in r0 and r1.
1709 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); 1709 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
1710 if (prop->is_synthetic()) { 1710 if (prop->is_synthetic()) {
1711 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1711 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1712 } else { 1712 } else {
1713 EmitCallIC(ic, RelocInfo::CODE_TARGET_WITH_ID, prop->id()); 1713 EmitCallIC(ic, RelocInfo::CODE_TARGET_WITH_ID, prop->id());
1714 } 1714 }
1715 } 1715 }
1716 1716
1717 1717
1718 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, 1718 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
1719 Token::Value op, 1719 Token::Value op,
1720 OverwriteMode mode, 1720 OverwriteMode mode,
1721 Expression* left_expr, 1721 Expression* left_expr,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 } 1852 }
1853 case NAMED_PROPERTY: { 1853 case NAMED_PROPERTY: {
1854 __ push(r0); // Preserve value. 1854 __ push(r0); // Preserve value.
1855 VisitForAccumulatorValue(prop->obj()); 1855 VisitForAccumulatorValue(prop->obj());
1856 __ mov(r1, r0); 1856 __ mov(r1, r0);
1857 __ pop(r0); // Restore value. 1857 __ pop(r0); // Restore value.
1858 __ mov(r2, Operand(prop->key()->AsLiteral()->handle())); 1858 __ mov(r2, Operand(prop->key()->AsLiteral()->handle()));
1859 Handle<Code> ic = is_strict_mode() 1859 Handle<Code> ic = is_strict_mode()
1860 ? isolate()->builtins()->StoreIC_Initialize_Strict() 1860 ? isolate()->builtins()->StoreIC_Initialize_Strict()
1861 : isolate()->builtins()->StoreIC_Initialize(); 1861 : isolate()->builtins()->StoreIC_Initialize();
1862 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1862 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1863 break; 1863 break;
1864 } 1864 }
1865 case KEYED_PROPERTY: { 1865 case KEYED_PROPERTY: {
1866 __ push(r0); // Preserve value. 1866 __ push(r0); // Preserve value.
1867 if (prop->is_synthetic()) { 1867 if (prop->is_synthetic()) {
1868 ASSERT(prop->obj()->AsVariableProxy() != NULL); 1868 ASSERT(prop->obj()->AsVariableProxy() != NULL);
1869 ASSERT(prop->key()->AsLiteral() != NULL); 1869 ASSERT(prop->key()->AsLiteral() != NULL);
1870 { AccumulatorValueContext for_object(this); 1870 { AccumulatorValueContext for_object(this);
1871 EmitVariableLoad(prop->obj()->AsVariableProxy()->var()); 1871 EmitVariableLoad(prop->obj()->AsVariableProxy()->var());
1872 } 1872 }
1873 __ mov(r2, r0); 1873 __ mov(r2, r0);
1874 __ mov(r1, Operand(prop->key()->AsLiteral()->handle())); 1874 __ mov(r1, Operand(prop->key()->AsLiteral()->handle()));
1875 } else { 1875 } else {
1876 VisitForStackValue(prop->obj()); 1876 VisitForStackValue(prop->obj());
1877 VisitForAccumulatorValue(prop->key()); 1877 VisitForAccumulatorValue(prop->key());
1878 __ mov(r1, r0); 1878 __ mov(r1, r0);
1879 __ pop(r2); 1879 __ pop(r2);
1880 } 1880 }
1881 __ pop(r0); // Restore value. 1881 __ pop(r0); // Restore value.
1882 Handle<Code> ic = is_strict_mode() 1882 Handle<Code> ic = is_strict_mode()
1883 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() 1883 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
1884 : isolate()->builtins()->KeyedStoreIC_Initialize(); 1884 : isolate()->builtins()->KeyedStoreIC_Initialize();
1885 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1885 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
1886 break; 1886 break;
1887 } 1887 }
1888 } 1888 }
1889 PrepareForBailoutForId(bailout_ast_id, TOS_REG); 1889 PrepareForBailoutForId(bailout_ast_id, TOS_REG);
1890 context()->Plug(r0); 1890 context()->Plug(r0);
1891 } 1891 }
1892 1892
1893 1893
1894 void FullCodeGenerator::EmitVariableAssignment(Variable* var, 1894 void FullCodeGenerator::EmitVariableAssignment(Variable* var,
1895 Token::Value op) { 1895 Token::Value op) {
1896 // Left-hand sides that rewrite to explicit property accesses do not reach 1896 // Left-hand sides that rewrite to explicit property accesses do not reach
1897 // here. 1897 // here.
1898 ASSERT(var != NULL); 1898 ASSERT(var != NULL);
1899 ASSERT(var->is_global() || var->AsSlot() != NULL); 1899 ASSERT(var->is_global() || var->AsSlot() != NULL);
1900 1900
1901 if (var->is_global()) { 1901 if (var->is_global()) {
1902 ASSERT(!var->is_this()); 1902 ASSERT(!var->is_this());
1903 // Assignment to a global variable. Use inline caching for the 1903 // Assignment to a global variable. Use inline caching for the
1904 // assignment. Right-hand-side value is passed in r0, variable name in 1904 // assignment. Right-hand-side value is passed in r0, variable name in
1905 // r2, and the global object in r1. 1905 // r2, and the global object in r1.
1906 __ mov(r2, Operand(var->name())); 1906 __ mov(r2, Operand(var->name()));
1907 __ ldr(r1, GlobalObjectOperand()); 1907 __ ldr(r1, GlobalObjectOperand());
1908 Handle<Code> ic = is_strict_mode() 1908 Handle<Code> ic = is_strict_mode()
1909 ? isolate()->builtins()->StoreIC_Initialize_Strict() 1909 ? isolate()->builtins()->StoreIC_Initialize_Strict()
1910 : isolate()->builtins()->StoreIC_Initialize(); 1910 : isolate()->builtins()->StoreIC_Initialize();
1911 EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); 1911 EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT, AstNode::kNoNumber);
1912 1912
1913 } else if (op == Token::INIT_CONST) { 1913 } else if (op == Token::INIT_CONST) {
1914 // Like var declarations, const declarations are hoisted to function 1914 // Like var declarations, const declarations are hoisted to function
1915 // scope. However, unlike var initializers, const initializers are able 1915 // scope. However, unlike var initializers, const initializers are able
1916 // to drill a hole to that function context, even from inside a 'with' 1916 // to drill a hole to that function context, even from inside a 'with'
1917 // context. We thus bypass the normal static scope lookup. 1917 // context. We thus bypass the normal static scope lookup.
1918 Slot* slot = var->AsSlot(); 1918 Slot* slot = var->AsSlot();
1919 Label skip; 1919 Label skip;
1920 switch (slot->type()) { 1920 switch (slot->type()) {
1921 case Slot::PARAMETER: 1921 case Slot::PARAMETER:
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
2343 __ ldr(r1, operand); 2343 __ ldr(r1, operand);
2344 2344
2345 ASSERT(prop->key()->AsLiteral() != NULL); 2345 ASSERT(prop->key()->AsLiteral() != NULL);
2346 ASSERT(prop->key()->AsLiteral()->handle()->IsSmi()); 2346 ASSERT(prop->key()->AsLiteral()->handle()->IsSmi());
2347 __ mov(r0, Operand(prop->key()->AsLiteral()->handle())); 2347 __ mov(r0, Operand(prop->key()->AsLiteral()->handle()));
2348 2348
2349 // Record source code position for IC call. 2349 // Record source code position for IC call.
2350 SetSourcePosition(prop->position()); 2350 SetSourcePosition(prop->position());
2351 2351
2352 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); 2352 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
2353 EmitCallIC(ic, RelocInfo::CODE_TARGET); 2353 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
2354 __ ldr(r1, GlobalObjectOperand()); 2354 __ ldr(r1, GlobalObjectOperand());
2355 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); 2355 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset));
2356 __ Push(r0, r1); // Function, receiver. 2356 __ Push(r0, r1); // Function, receiver.
2357 EmitCallWithStub(expr); 2357 EmitCallWithStub(expr);
2358 } else { 2358 } else {
2359 { PreservePositionScope scope(masm()->positions_recorder()); 2359 { PreservePositionScope scope(masm()->positions_recorder());
2360 VisitForStackValue(prop->obj()); 2360 VisitForStackValue(prop->obj());
2361 } 2361 }
2362 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET_WITH_ID); 2362 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET_WITH_ID);
2363 } 2363 }
(...skipping 1652 matching lines...) Expand 10 before | Expand all | Expand 10 after
4016 ASSERT(!context()->IsEffect()); 4016 ASSERT(!context()->IsEffect());
4017 ASSERT(!context()->IsTest()); 4017 ASSERT(!context()->IsTest());
4018 VariableProxy* proxy = expr->AsVariableProxy(); 4018 VariableProxy* proxy = expr->AsVariableProxy();
4019 if (proxy != NULL && !proxy->var()->is_this() && proxy->var()->is_global()) { 4019 if (proxy != NULL && !proxy->var()->is_this() && proxy->var()->is_global()) {
4020 Comment cmnt(masm_, "Global variable"); 4020 Comment cmnt(masm_, "Global variable");
4021 __ ldr(r0, GlobalObjectOperand()); 4021 __ ldr(r0, GlobalObjectOperand());
4022 __ mov(r2, Operand(proxy->name())); 4022 __ mov(r2, Operand(proxy->name()));
4023 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); 4023 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
4024 // Use a regular load, not a contextual load, to avoid a reference 4024 // Use a regular load, not a contextual load, to avoid a reference
4025 // error. 4025 // error.
4026 EmitCallIC(ic, RelocInfo::CODE_TARGET); 4026 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber);
4027 PrepareForBailout(expr, TOS_REG); 4027 PrepareForBailout(expr, TOS_REG);
4028 context()->Plug(r0); 4028 context()->Plug(r0);
4029 } else if (proxy != NULL && 4029 } else if (proxy != NULL &&
4030 proxy->var()->AsSlot() != NULL && 4030 proxy->var()->AsSlot() != NULL &&
4031 proxy->var()->AsSlot()->type() == Slot::LOOKUP) { 4031 proxy->var()->AsSlot()->type() == Slot::LOOKUP) {
4032 Label done, slow; 4032 Label done, slow;
4033 4033
4034 // Generate code for loading from variables potentially shadowed 4034 // Generate code for loading from variables potentially shadowed
4035 // by eval-introduced variables. 4035 // by eval-introduced variables.
4036 Slot* slot = proxy->var()->AsSlot(); 4036 Slot* slot = proxy->var()->AsSlot();
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
4390 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. 4390 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value.
4391 __ add(pc, r1, Operand(masm_->CodeObject())); 4391 __ add(pc, r1, Operand(masm_->CodeObject()));
4392 } 4392 }
4393 4393
4394 4394
4395 #undef __ 4395 #undef __
4396 4396
4397 } } // namespace v8::internal 4397 } } // namespace v8::internal
4398 4398
4399 #endif // V8_TARGET_ARCH_ARM 4399 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/full-codegen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698