OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 6372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6383 void CodeGenerator::VisitCallNew(CallNew* node) { | 6383 void CodeGenerator::VisitCallNew(CallNew* node) { |
6384 ASSERT(!in_safe_int32_mode()); | 6384 ASSERT(!in_safe_int32_mode()); |
6385 Comment cmnt(masm_, "[ CallNew"); | 6385 Comment cmnt(masm_, "[ CallNew"); |
6386 | 6386 |
6387 // According to ECMA-262, section 11.2.2, page 44, the function | 6387 // According to ECMA-262, section 11.2.2, page 44, the function |
6388 // expression in new calls must be evaluated before the | 6388 // expression in new calls must be evaluated before the |
6389 // arguments. This is different from ordinary calls, where the | 6389 // arguments. This is different from ordinary calls, where the |
6390 // actual function to call is resolved after the arguments have been | 6390 // actual function to call is resolved after the arguments have been |
6391 // evaluated. | 6391 // evaluated. |
6392 | 6392 |
6393 // Compute function to call and use the global object as the | 6393 // Push constructor on the stack. If it's not a function it's used as |
6394 // receiver. There is no need to use the global proxy here because | 6394 // receiver for CALL_NON_FUNCTION, otherwise the value on the stack is |
6395 // it will always be replaced with a newly allocated object. | 6395 // ignored. |
6396 Load(node->expression()); | 6396 Load(node->expression()); |
6397 LoadGlobal(); | |
6398 | 6397 |
6399 // Push the arguments ("left-to-right") on the stack. | 6398 // Push the arguments ("left-to-right") on the stack. |
6400 ZoneList<Expression*>* args = node->arguments(); | 6399 ZoneList<Expression*>* args = node->arguments(); |
6401 int arg_count = args->length(); | 6400 int arg_count = args->length(); |
6402 for (int i = 0; i < arg_count; i++) { | 6401 for (int i = 0; i < arg_count; i++) { |
6403 Load(args->at(i)); | 6402 Load(args->at(i)); |
6404 } | 6403 } |
6405 | 6404 |
6406 // Call the construct call builtin that handles allocation and | 6405 // Call the construct call builtin that handles allocation and |
6407 // constructor invocation. | 6406 // constructor invocation. |
6408 CodeForSourcePosition(node->position()); | 6407 CodeForSourcePosition(node->position()); |
6409 Result result = frame_->CallConstructor(arg_count); | 6408 Result result = frame_->CallConstructor(arg_count); |
6410 // Replace the function on the stack with the result. | 6409 frame_->Push(&result); |
6411 frame_->SetElementAt(0, &result); | |
6412 } | 6410 } |
6413 | 6411 |
6414 | 6412 |
6415 void CodeGenerator::GenerateIsSmi(ZoneList<Expression*>* args) { | 6413 void CodeGenerator::GenerateIsSmi(ZoneList<Expression*>* args) { |
6416 ASSERT(args->length() == 1); | 6414 ASSERT(args->length() == 1); |
6417 Load(args->at(0)); | 6415 Load(args->at(0)); |
6418 Result value = frame_->Pop(); | 6416 Result value = frame_->Pop(); |
6419 value.ToRegister(); | 6417 value.ToRegister(); |
6420 ASSERT(value.is_valid()); | 6418 ASSERT(value.is_valid()); |
6421 __ test(value.reg(), Immediate(kSmiTagMask)); | 6419 __ test(value.reg(), Immediate(kSmiTagMask)); |
(...skipping 8082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14504 masm.GetCode(&desc); | 14502 masm.GetCode(&desc); |
14505 // Call the function from C++. | 14503 // Call the function from C++. |
14506 return FUNCTION_CAST<MemCopyFunction>(buffer); | 14504 return FUNCTION_CAST<MemCopyFunction>(buffer); |
14507 } | 14505 } |
14508 | 14506 |
14509 #undef __ | 14507 #undef __ |
14510 | 14508 |
14511 } } // namespace v8::internal | 14509 } } // namespace v8::internal |
14512 | 14510 |
14513 #endif // V8_TARGET_ARCH_IA32 | 14511 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |