@@ -9,25 +9,32 @@ using namespace Js;
9
9
Var JavascriptObject::NewInstance (RecyclableObject* function, CallInfo callInfo, ...)
10
10
{
11
11
PROBE_STACK (function->GetScriptContext (), Js::Constants::MinStackDefault);
12
-
13
12
ARGUMENTS (args, callInfo);
14
13
ScriptContext* scriptContext = function->GetScriptContext ();
14
+ JavascriptLibrary* library = scriptContext->GetLibrary ();
15
15
16
16
AssertMsg (args.HasArg (), " Should always have implicit 'this'" );
17
17
18
- // SkipDefaultNewObject function flag should have prevented the default object from
19
- // being created, except when call true a host dispatch.
20
18
Var newTarget = args.GetNewTarget ();
21
- bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall (args);
19
+ if (JavascriptOperators::GetAndAssertIsConstructorSuperCall (args) &&
20
+ newTarget != function)
21
+ {
22
+ return JavascriptOperators::OrdinaryCreateFromConstructor (
23
+ VarTo<RecyclableObject>(newTarget),
24
+ library->CreateObject (true ),
25
+ nullptr ,
26
+ scriptContext);
27
+ }
22
28
23
- if (args.Info .Count > 1 )
29
+ Var arg = args.Info .Count > 1 ? args[1 ] : library->GetUndefined ();
30
+ switch (JavascriptOperators::GetTypeId (arg))
24
31
{
25
- switch (JavascriptOperators::GetTypeId (args[1 ]))
26
- {
27
32
case TypeIds_Undefined:
28
33
case TypeIds_Null:
29
- // Break to return a new object
30
- break ;
34
+ // Null and undefined result in a new object
35
+ return (callInfo.Flags & CallFlags_NotUsed)
36
+ ? arg
37
+ : library->CreateObject (true );
31
38
32
39
case TypeIds_StringObject:
33
40
case TypeIds_Function:
@@ -43,32 +50,14 @@ Var JavascriptObject::NewInstance(RecyclableObject* function, CallInfo callInfo,
43
50
case TypeIds_Arguments:
44
51
case TypeIds_ActivationObject:
45
52
case TypeIds_SymbolObject:
46
- return isCtorSuperCall ?
47
- JavascriptOperators::OrdinaryCreateFromConstructor (VarTo<RecyclableObject>(newTarget), VarTo<RecyclableObject>(args[1 ]), nullptr , scriptContext) :
48
- args[1 ];
49
-
50
- default :
51
- RecyclableObject* result = nullptr ;
52
- if (FALSE == JavascriptConversion::ToObject (args[1 ], scriptContext, &result))
53
- {
54
- // JavascriptConversion::ToObject should only return FALSE for null and undefined.
55
- Assert (false );
56
- }
57
-
58
- return isCtorSuperCall ?
59
- JavascriptOperators::OrdinaryCreateFromConstructor (VarTo<RecyclableObject>(newTarget), result, nullptr , scriptContext) :
60
- result;
61
- }
53
+ // Since we know this is an object, we can skip ToObject
54
+ return arg;
62
55
}
63
56
64
- if (callInfo.Flags & CallFlags_NotUsed)
65
- {
66
- return args[0 ];
67
- }
68
- Var newObj = scriptContext->GetLibrary ()->CreateObject (true );
69
- return isCtorSuperCall ?
70
- JavascriptOperators::OrdinaryCreateFromConstructor (VarTo<RecyclableObject>(newTarget), VarTo<RecyclableObject>(newObj), nullptr , scriptContext) :
71
- newObj;
57
+ RecyclableObject* result = nullptr ;
58
+ JavascriptConversion::ToObject (arg, scriptContext, &result);
59
+ Assert (result);
60
+ return result;
72
61
}
73
62
74
63
Var JavascriptObject::EntryHasOwnProperty (RecyclableObject* function, CallInfo callInfo, ...)
0 commit comments