Sfoglia il codice sorgente

[1.2>master] [MERGE #914] Function.name on the getter/setter on defineProperty.

Merge pull request #914 from akroshg:name
For getter/setter function in the object literal we were initially giving them get/set name respectively. However if they appear in the defineProperty we were changing them for diagnostics purpose. In the diagnostics side we were expected to give <propname>.get but due to function.name we have changed it to "get <propname>"., which is not needed and not consistent.
This change is removing that and putting the <propname>.get as full name for the current function. The short name will now automatically be given as get/set correctly.
Akrosh Gandhi 9 anni fa
parent
commit
cfa733feea

+ 8 - 50
lib/Runtime/Library/JavascriptObject.cpp

@@ -2046,35 +2046,6 @@ namespace Js
         return finalName;
     }
 
-    /*static*/
-    char16 * JavascriptObject::ConstructAccessorNameES6(const PropertyRecord * propertyRecord, const char16 * getOrSetStr, ScriptContext* scriptContext)
-    {
-        Assert(propertyRecord);
-        Assert(scriptContext);
-        char16 * finalName = nullptr;
-        size_t propertyLength = static_cast<size_t>(propertyRecord->GetLength() + 1); //+ 1 (for null terminator)
-        if (propertyLength > 0)
-        {
-            size_t totalChars;
-            const size_t getSetLength = 4;    // 4 = 3 (get or set) +1 (for space)
-            if (SizeTAdd(propertyLength, getSetLength, &totalChars) == S_OK)
-            {
-                finalName = RecyclerNewArrayLeaf(scriptContext->GetRecycler(), char16, totalChars);
-                Assert(finalName != nullptr);
-
-                Assert(getOrSetStr != nullptr);
-                Assert(wcslen(getOrSetStr) == 4);
-                wcscpy_s(finalName, totalChars, getOrSetStr);
-
-                const char16* propertyName = propertyRecord->GetBuffer();
-                Assert(propertyName != nullptr);
-                js_wmemcpy_s(finalName + getSetLength, propertyLength, propertyName, propertyLength);
-
-            }
-        }
-        return finalName;
-    }
-
     /*static*/
     void JavascriptObject::ModifyGetterSetterFuncName(const PropertyRecord * propertyRecord, const PropertyDescriptor& descriptor, ScriptContext* scriptContext)
     {
@@ -2082,25 +2053,20 @@ namespace Js
         Assert(propertyRecord);
         if (descriptor.GetterSpecified() || descriptor.SetterSpecified())
         {
+            charcount_t propertyLength = propertyRecord->GetLength();
+
             if (descriptor.GetterSpecified()
                 && Js::ScriptFunction::Is(descriptor.GetGetter())
                 && _wcsicmp(Js::ScriptFunction::FromVar(descriptor.GetGetter())->GetFunctionProxy()->GetDisplayName(), _u("get")) == 0)
             {
                 // modify to name.get
-                char16* finalName;
-                if (scriptContext->GetConfig()->IsES6FunctionNameEnabled())
-                {
-                    finalName = ConstructAccessorNameES6(propertyRecord, _u("get "), scriptContext);
-                }
-                else
-                {
-                    finalName = ConstructName(propertyRecord, _u(".get"), scriptContext);
-                }
+                char16* finalName = ConstructName(propertyRecord, _u(".get"), scriptContext);
                 if (finalName != nullptr)
                 {
                     FunctionProxy::SetDisplayNameFlags flags = (FunctionProxy::SetDisplayNameFlags) (FunctionProxy::SetDisplayNameFlagsDontCopy | FunctionProxy::SetDisplayNameFlagsRecyclerAllocated);
 
-                    Js::ScriptFunction::FromVar(descriptor.GetGetter())->GetFunctionProxy()->SetDisplayName(finalName, propertyRecord->GetLength() + 4 /*".get" or "get "*/, flags);
+                    Js::ScriptFunction::FromVar(descriptor.GetGetter())->GetFunctionProxy()->SetDisplayName(finalName,
+                        propertyLength + 4 /*".get"*/, propertyLength + 1, flags);
                 }
             }
 
@@ -2109,21 +2075,13 @@ namespace Js
                 && _wcsicmp(Js::ScriptFunction::FromVar(descriptor.GetSetter())->GetFunctionProxy()->GetDisplayName(), _u("set")) == 0)
             {
                 // modify to name.set
-                char16* finalName;
-                if (scriptContext->GetConfig()->IsES6FunctionNameEnabled())
-                {
-                    finalName = ConstructAccessorNameES6(propertyRecord, _u("set "), scriptContext);
-                }
-                else
-                {
-                    finalName = ConstructName(propertyRecord, _u(".set"), scriptContext);
-                }
-
+                char16* finalName = ConstructName(propertyRecord, _u(".set"), scriptContext);
                 if (finalName != nullptr)
                 {
                     FunctionProxy::SetDisplayNameFlags flags = (FunctionProxy::SetDisplayNameFlags) (FunctionProxy::SetDisplayNameFlagsDontCopy | FunctionProxy::SetDisplayNameFlagsRecyclerAllocated);
 
-                    Js::ScriptFunction::FromVar(descriptor.GetSetter())->GetFunctionProxy()->SetDisplayName(finalName, propertyRecord->GetLength() + 4 /*".set" or "set "*/, flags);
+                    Js::ScriptFunction::FromVar(descriptor.GetSetter())->GetFunctionProxy()->SetDisplayName(finalName,
+                        propertyLength + 4 /*".set"*/, propertyLength + 1, flags);
                 }
             }
         }

+ 0 - 1
lib/Runtime/Library/JavascriptObject.h

@@ -115,7 +115,6 @@ namespace Js
 
         static void ModifyGetterSetterFuncName(const PropertyRecord * propertyRecord, const PropertyDescriptor& descriptor, ScriptContext* scriptContext);
         static char16 * ConstructName(const PropertyRecord * propertyRecord, const char16 * getOrSetStr, ScriptContext* scriptContext);
-        static char16 * ConstructAccessorNameES6(const PropertyRecord * propertyRecord, const char16 * getOrSetStr, ScriptContext* scriptContext);
         static Var DefinePropertiesHelper(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
         static Var DefinePropertiesHelperForGenericObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
         static Var DefinePropertiesHelperForProxyObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);

+ 4 - 4
test/StackTrace/StackTraceLimit.baseline

@@ -267,10 +267,10 @@ Error: Out of stack space
 
 --Throw new Error() in getter for a number of times
 Error: My error in custom stackTraceLimit getter
-	at get stackTraceLimit (stacktracelimit.js:94:13)
-	at get stackTraceLimit (stacktracelimit.js:94:13)
-	at get stackTraceLimit (stacktracelimit.js:94:13)
-	at get stackTraceLimit (stacktracelimit.js:94:13)
+	at stackTraceLimit.get (stacktracelimit.js:94:13)
+	at stackTraceLimit.get (stacktracelimit.js:94:13)
+	at stackTraceLimit.get (stacktracelimit.js:94:13)
+	at stackTraceLimit.get (stacktracelimit.js:94:13)
 	at throwException (longcallstackthrow.js:33:5)
 	at throwExceptionWithCatch (longcallstackthrow.js:22:9)
 	at Anonymous function (longcallstackthrow.js:45:17)

+ 11 - 0
test/es6/function.name.js

@@ -750,6 +750,17 @@ var tests = [
             class C { foo(){} };
             assert.areEqual("foo",(new C).foo.name);
         }
+    },
+	{
+        name: "Getter and setter have correct name in defineProperty",
+        body: function()
+        {
+            var obj = {};
+            Object.defineProperty(obj, 'test', {get : function () {}, set : function () {} });
+            var desc = Object.getOwnPropertyDescriptor(obj, 'test');
+            assert.areEqual("get", desc.get.name);
+            assert.areEqual("set", desc.set.name);
+        }
     }
 
 ];