Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement ES2017 Object.getOwnPropertyDescriptors #934

Closed
p-bakker opened this issue Jun 21, 2021 · 18 comments · Fixed by #1193 or #1227
Closed

Implement ES2017 Object.getOwnPropertyDescriptors #934

p-bakker opened this issue Jun 21, 2021 · 18 comments · Fixed by #1193 or #1227
Labels
feature Issues considered a new feature good first issue Great place to start if you're looking to start an open source "resume"

Comments

@p-bakker
Copy link
Collaborator

p-bakker commented Jun 21, 2021

@rbri
Copy link
Collaborator

rbri commented Jun 21, 2021

I think this is also there.

@p-bakker
Copy link
Collaborator Author

Don't think so. We've got the method to get a single descriptor (Object.getOwnPropertyDescriptor), but not the method to get them all in one go (Object.getOwnPropertyDescriptors)

@p-bakker p-bakker added this to the ES2017 milestone Jun 29, 2021
@p-bakker p-bakker added the feature Issues considered a new feature label Oct 13, 2021
@p-bakker p-bakker added the good first issue Great place to start if you're looking to start an open source "resume" label Nov 22, 2021
tuchida added a commit to tuchida/rhino that referenced this issue Mar 9, 2022
tuchida added a commit to tuchida/rhino that referenced this issue Mar 12, 2022
tuchida added a commit to tuchida/rhino that referenced this issue Mar 12, 2022
tuchida added a commit to tuchida/rhino that referenced this issue Mar 14, 2022
@p-bakker p-bakker modified the milestones: ES2017, Release 1.7.15 Mar 18, 2022
@RuralHunter
Copy link

This change seems causing a regression as I commented here: HtmlUnit@c696e34

@p-bakker
Copy link
Collaborator Author

p-bakker commented May 14, 2022

@RuralHunter would you happen to have some sample code that reproduces this issue, cause all tests passed, so it must be somewhat of an edge case I think

@rbri
Copy link
Collaborator

rbri commented May 15, 2022

Have started to dig into this

@RuralHunter
Copy link

RuralHunter commented May 16, 2022

@p-bakker Not yet. I just raised this question to see if anyone has some quick insight. I will try to find the minimal test case but maybe need some time since the original js is quite complex and I don't have much knowledge on rhino.

@rbri rbri reopened this May 17, 2022
@rbri
Copy link
Collaborator

rbri commented May 17, 2022

Ok, was able to make a simple case that reproduces this problem... will report this alter if i understand what is going on here.
But i hope this is the first step for a solution.

var obj = {};
obj.prop = 42;
desc = Object.getOwnPropertyDescriptor(obj, 'prop');
console.log(desc.prototype);
console.log(desc.hasOwnProperty('property1'));

@rbri
Copy link
Collaborator

rbri commented May 17, 2022

Sorry the sample was wrong, i saw a ghost from bug hunting.

@rbri
Copy link
Collaborator

rbri commented May 17, 2022

Another theory - buildDataDescriptor is called with a broken scope and because of this the prototype is set to null.
Will try to find the reasons - maybe this is a problem in HtmlUnit and not in Rhino.
Will inform about the progress....

@p-bakker
Copy link
Collaborator Author

a scope without prototype: doesn't that happen when using shared/sealed/dynamic scopes?

@tuchida
Copy link
Contributor

tuchida commented May 18, 2022

Can you show me the stack trace of JavaScript part as well as Java?

@RuralHunter
Copy link

RuralHunter commented May 19, 2022

======= EXCEPTION START ========
EcmaError: lineNumber=[42] column=[0] lineSource=[null] name=[TypeError] sourceName=[https://s2.ssl.qhres2.com/!c954cb38/feb/page.js] message=[TypeError: Cannot find default value for object. (https://s2.ssl.qhres2.com/!c954cb38/feb/page.js#42)]
com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot find default value for object. (https://s2.ssl.qhres2.com/!c954cb38/feb/page.js#42)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:996)
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:596)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:487)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.callSecured(HtmlUnitContextFactory.java:349)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:923)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:895)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2613)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2606)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventListenersContainer.executeEventListeners(EventListenersContainer.java:342)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventListenersContainer.executeAtTargetListeners(EventListenersContainer.java:379)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventTarget.executeEventLocally(EventTarget.java:102)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport.executeEvent(ScriptElementSupport.java:335)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport.executeScriptIfNeeded(ScriptElementSupport.java:203)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport$1.execute(ScriptElementSupport.java:120)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:1044)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:991)
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:596)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:487)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.callSecured(HtmlUnitContextFactory.java:349)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:923)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:895)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2613)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2606)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptFunctionJob.runJavaScript(JavaScriptFunctionJob.java:57)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutionJob.run(JavaScriptExecutionJob.java:102)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl.runSingleJob(JavaScriptJobManagerImpl.java:428)
	at com.gargoylesoftware.htmlunit.javascript.background.DefaultJavaScriptExecutor.run(DefaultJavaScriptExecutor.java:148)
	at java.lang.Thread.run(Thread.java:748)
Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot find default value for object. (https://s2.ssl.qhres2.com/!c954cb38/feb/page.js#42)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4610)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4591)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:4623)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeErrorById(ScriptRuntime.java:4628)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:813)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:769)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.toString(ScriptRuntime.java:1015)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:4697)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2615)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2598)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1663)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:1053)
	at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:92)
	at net.sourceforge.htmlunit.corejs.javascript.NativeArray.iterativeMethod(NativeArray.java:2035)
	at net.sourceforge.htmlunit.corejs.javascript.NativeArray.execIdCall(NativeArray.java:438)
	at net.sourceforge.htmlunit.corejs.javascript.IdFunctionObject.call(IdFunctionObject.java:84)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1876)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:1053)
	at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:92)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:395)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:335)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3913)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:916)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:979)
	... 27 more
Enclosed exception: 
net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot find default value for object. (https://s2.ssl.qhres2.com/!c954cb38/feb/page.js#42)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4610)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4591)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:4623)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeErrorById(ScriptRuntime.java:4628)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:813)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:769)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.toString(ScriptRuntime.java:1015)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:4697)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2615)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2598)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1663)
	at script.re(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:42)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:58)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:58)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:1053)
	at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:92)
	at net.sourceforge.htmlunit.corejs.javascript.NativeArray.iterativeMethod(NativeArray.java:2035)
	at net.sourceforge.htmlunit.corejs.javascript.NativeArray.execIdCall(NativeArray.java:438)
	at net.sourceforge.htmlunit.corejs.javascript.IdFunctionObject.call(IdFunctionObject.java:84)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1876)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:58)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:58)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:42)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:42)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:42)
	at script.t(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:42)
	at script.t(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:14)
	at script.t(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:94)
	at script.t(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:66)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:66)
	at script.t(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s2.ssl.qhres2.com/!c954cb38/feb/page.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script.A(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at script(https://s0.ssl.qhres2.com/static/1b8910197a53ca91/v5/libs/require.btime.js:1)
	at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:1053)
	at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:92)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:395)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:335)
	at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3913)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:916)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:979)
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:596)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:487)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.callSecured(HtmlUnitContextFactory.java:349)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:923)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:895)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2613)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2606)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventListenersContainer.executeEventListeners(EventListenersContainer.java:342)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventListenersContainer.executeAtTargetListeners(EventListenersContainer.java:379)
	at com.gargoylesoftware.htmlunit.javascript.host.event.EventTarget.executeEventLocally(EventTarget.java:102)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport.executeEvent(ScriptElementSupport.java:335)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport.executeScriptIfNeeded(ScriptElementSupport.java:203)
	at com.gargoylesoftware.htmlunit.html.ScriptElementSupport$1.execute(ScriptElementSupport.java:120)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:1044)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:991)
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:596)
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:487)
	at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.callSecured(HtmlUnitContextFactory.java:349)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:923)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:895)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2613)
	at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunction(HtmlPage.java:2606)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptFunctionJob.runJavaScript(JavaScriptFunctionJob.java:57)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutionJob.run(JavaScriptExecutionJob.java:102)
	at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl.runSingleJob(JavaScriptJobManagerImpl.java:428)
	at com.gargoylesoftware.htmlunit.javascript.background.DefaultJavaScriptExecutor.run(DefaultJavaScriptExecutor.java:148)
	at java.lang.Thread.run(Thread.java:748)
== CALLING JAVASCRIPT ==
  function (e) {
      if (e.type === "load" || readyRegExp.test((e.currentTarget || e.srcElement).readyState)) {
          interactiveScript = null;
          var t = M(e);
          r.completeLoad(t.id);
      }
  }
======= EXCEPTION END ========

@rbri
Copy link
Collaborator

rbri commented May 19, 2022

What i found so far

  • the problem occurred while calling hasOwnProperty on a property descriptor
  • this descriptor has no prototype set
  • the descriptor was definitely created by buildDataDescriptor
  • but the scope used in this method did not have a prototype for Object (native object) - this results in setting the prototype to null

From my point of view i expect the scope (topLevelScope) has to be the window (like it was in many other buildDataDescriptor calls forces by the same script before. But in this case it seems to be a (Native) object created by the script itself.
So far i have no idea why.

Digging more into the script requires more setup on my side - i have to use my favorite Charles proxy :-)
Will try to spend more time on this during the next days.

@RuralHunter
Copy link

ok, I got the test code:

var rr=function(t) {
    var desc={
    configurable: true,
    enumerable: false,
    key: "wfunc",
    value: function(){},
    writable: true
    };
    Object.defineProperty(t.prototype,"wfunc",desc);
};

var Fl = function() {
        function e() {}
        rr(e);
        return e;
    }();

var l=Fl.prototype;

var props1=Object.getOwnPropertyNames(l);
console.log('getOwnPropertyNames='+props1);
var props2=Object.getOwnPropertySymbols(l);
console.log('getOwnPropertySymbols='+props2);
var u=Object.getOwnPropertyDescriptors(l);
console.log('u=');
console.log(u);
var props=props1.concat(props2);
console.log('props='+props);
props.forEach(function(t) {
    var a=u[t];
    console.log(t+": "+a.hasOwnProperty("value"));
});

@tuchida
Copy link
Contributor

tuchida commented May 20, 2022

I didn't know why I was using parentScope, but now I can call hasOwnProperty. (Fix any compile errors as you see fit.)
Is this the correct way to handle Rhino scope?

--- a/src/org/mozilla/javascript/NativeObject.java
+++ b/src/org/mozilla/javascript/NativeObject.java
@@ -510,7 +510,7 @@ public class NativeObject extends IdScriptableObject implements Map {
                     Scriptable s = getCompatibleObject(cx, scope, arg);
                     ScriptableObject obj = ensureScriptableObject(s);
                     Object nameArg = args.length < 2 ? Undefined.instance : args[1];
-                    Scriptable desc = obj.getOwnPropertyDescriptor(cx, nameArg);
+                    Scriptable desc = obj.getOwnPropertyDescriptor(cx, scope, nameArg);
                     return desc == null ? Undefined.instance : desc;
                 }
             case ConstructorId_getOwnPropertyDescriptors:
@@ -521,7 +521,7 @@ public class NativeObject extends IdScriptableObject implements Map {
 
                     ScriptableObject descs = (ScriptableObject) cx.newObject(scope);
                     for (Object key : obj.getIds(true, true)) {
-                        Scriptable desc = obj.getOwnPropertyDescriptor(cx, key);
+                        Scriptable desc = obj.getOwnPropertyDescriptor(cx, scope, key);
                         if (desc == null) {
                             continue;
                         } else if (key instanceof Symbol) {

--- a/src/org/mozilla/javascript/ScriptableObject.java
+++ b/src/org/mozilla/javascript/ScriptableObject.java
@@ -2648,11 +2652,10 @@ public abstract class ScriptableObject
         }
     }
 
-    protected ScriptableObject getOwnPropertyDescriptor(Context cx, Object id) {
+    protected ScriptableObject getOwnPropertyDescriptor(Context cx, Scriptable scope, Object id) {
         Slot slot = querySlot(cx, id);
         if (slot == null) return null;
-        Scriptable scope = getParentScope();
-        return slot.getPropertyDescriptor(cx, (scope == null ? this : scope));
+        return slot.getPropertyDescriptor(cx, scope);
     }
 
     protected Slot querySlot(Context cx, Object id) {
var l = (function(){}).prototype;
console.log('l', l);

var desc = Object.getOwnPropertyDescriptor(l, 'constructor');
console.log('desc', desc.hasOwnProperty('value')); // true

@rbri
Copy link
Collaborator

rbri commented May 20, 2022

a more simplified version

var foo = function e() {}
var fooProto = foo.prototype;

var descProp = Object.getOwnPropertyDescriptor(fooProto, 'constructor');

console.log( descProp.hasOwnProperty('value'));

@rbri
Copy link
Collaborator

rbri commented May 20, 2022

have made a pr out of @tuchida's suggestion (#1226)

@gbrail
Copy link
Collaborator

gbrail commented May 27, 2022

OK -- I belatedly realized that this whole issue is re-opened from the original issue that introduced the future.

For future reference, let's not do this -- if we fix an issue, but there's a bug in the fix, then please open a new issue rather than re-opening an old one.

gbrail pushed a commit that referenced this issue May 27, 2022
…ons at some places

Fix handling of the parent scope in a number of places.

Fixes #934, which was re-opened due to a bug in the original implementation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Issues considered a new feature good first issue Great place to start if you're looking to start an open source "resume"
Projects
None yet
5 participants