| 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 |