| 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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 215     ASSERT(slot != NULL); | 215     ASSERT(slot != NULL); | 
| 216     if (expr->location().is_temporary()) { | 216     if (expr->location().is_temporary()) { | 
| 217       __ push(Operand(rbp, SlotOffset(slot))); | 217       __ push(Operand(rbp, SlotOffset(slot))); | 
| 218     } else { | 218     } else { | 
| 219       ASSERT(expr->location().is_nowhere()); | 219       ASSERT(expr->location().is_nowhere()); | 
| 220     } | 220     } | 
| 221   } | 221   } | 
| 222 } | 222 } | 
| 223 | 223 | 
| 224 | 224 | 
|  | 225 void FastCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 
|  | 226   Comment cmnt(masm_, "[ RegExp Literal"); | 
|  | 227   Label done; | 
|  | 228   // Registers will be used as follows: | 
|  | 229   // rdi = JS function. | 
|  | 230   // rbx = literals array. | 
|  | 231   // rax = regexp literal. | 
|  | 232   __ movq(rdi, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | 
|  | 233   __ movq(rbx, FieldOperand(rdi, JSFunction::kLiteralsOffset)); | 
|  | 234   int literal_offset = | 
|  | 235     FixedArray::kHeaderSize + expr->literal_index() * kPointerSize; | 
|  | 236   __ movq(rax, FieldOperand(rbx, literal_offset)); | 
|  | 237   __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); | 
|  | 238   __ j(not_equal, &done); | 
|  | 239   // Create regexp literal using runtime function | 
|  | 240   // Result will be in rax. | 
|  | 241   __ push(rbx); | 
|  | 242   __ Push(Smi::FromInt(expr->literal_index())); | 
|  | 243   __ Push(expr->pattern()); | 
|  | 244   __ Push(expr->flags()); | 
|  | 245   __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); | 
|  | 246   // Label done: | 
|  | 247   __ bind(&done); | 
|  | 248   if (expr->location().is_temporary()) { | 
|  | 249     __ push(rax); | 
|  | 250   } else { | 
|  | 251     ASSERT(expr->location().is_nowhere()); | 
|  | 252   } | 
|  | 253 } | 
|  | 254 | 
|  | 255 | 
| 225 void FastCodeGenerator::VisitAssignment(Assignment* expr) { | 256 void FastCodeGenerator::VisitAssignment(Assignment* expr) { | 
| 226   Comment cmnt(masm_, "[ Assignment"); | 257   Comment cmnt(masm_, "[ Assignment"); | 
| 227   ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); | 258   ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); | 
| 228   Expression* rhs = expr->value(); | 259   Expression* rhs = expr->value(); | 
| 229   Visit(rhs); | 260   Visit(rhs); | 
| 230 | 261 | 
| 231   // Left-hand side can only be a global or a (parameter or local) slot. | 262   // Left-hand side can only be a global or a (parameter or local) slot. | 
| 232   Variable* var = expr->target()->AsVariableProxy()->AsVariable(); | 263   Variable* var = expr->target()->AsVariableProxy()->AsVariable(); | 
| 233   ASSERT(var != NULL); | 264   ASSERT(var != NULL); | 
| 234   ASSERT(var->is_global() || var->slot() != NULL); | 265   ASSERT(var->is_global() || var->slot() != NULL); | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 334   ASSERT(function != NULL); | 365   ASSERT(function != NULL); | 
| 335 | 366 | 
| 336   // Push the arguments ("left-to-right"). | 367   // Push the arguments ("left-to-right"). | 
| 337   int arg_count = args->length(); | 368   int arg_count = args->length(); | 
| 338   for (int i = 0; i < arg_count; i++) { | 369   for (int i = 0; i < arg_count; i++) { | 
| 339     Visit(args->at(i)); | 370     Visit(args->at(i)); | 
| 340     ASSERT(!args->at(i)->location().is_nowhere()); | 371     ASSERT(!args->at(i)->location().is_nowhere()); | 
| 341     if (args->at(i)->location().is_constant()) { | 372     if (args->at(i)->location().is_constant()) { | 
| 342       ASSERT(args->at(i)->AsLiteral() != NULL); | 373       ASSERT(args->at(i)->AsLiteral() != NULL); | 
| 343       __ Push(args->at(i)->AsLiteral()->handle()); | 374       __ Push(args->at(i)->AsLiteral()->handle()); | 
|  | 375     } else { | 
|  | 376       ASSERT(args->at(i)->location().is_temporary()); | 
|  | 377       // If location is temporary, it is already on the stack, | 
|  | 378       // so nothing to do here. | 
| 344     } | 379     } | 
| 345   } | 380   } | 
| 346 | 381 | 
| 347   __ CallRuntime(function, arg_count); | 382   __ CallRuntime(function, arg_count); | 
| 348   if (expr->location().is_temporary()) { | 383   if (expr->location().is_temporary()) { | 
| 349     __ push(rax); | 384     __ push(rax); | 
| 350   } else { | 385   } else { | 
| 351     ASSERT(expr->location().is_nowhere()); | 386     ASSERT(expr->location().is_nowhere()); | 
| 352   } | 387   } | 
| 353 } | 388 } | 
| 354 | 389 | 
| 355 | 390 | 
| 356 } }  // namespace v8::internal | 391 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|