OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |