-
Notifications
You must be signed in to change notification settings - Fork 850
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into scratch/satish/support-default-arguments
- Loading branch information
Showing
17 changed files
with
937 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
129 changes: 129 additions & 0 deletions
129
rhino/src/main/java/org/mozilla/javascript/LambdaAccessorSlot.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
package org.mozilla.javascript; | ||
|
||
import java.util.function.BiConsumer; | ||
import java.util.function.Function; | ||
|
||
/** | ||
* A specialized property accessor using lambda functions, similar to {@link LambdaSlot}, but allows | ||
* defining properties with getter and setter lambdas that require access to the owner object | ||
* ('this'). This enables the implementation of properties that can access instance fields of the | ||
* owner. | ||
* | ||
* <p>Unlike {@link LambdaSlot}, Lambda functions used to define getter and setter logic require the | ||
* owner's `Scriptable` object as one of the parameters. This is particularly useful for | ||
* implementing properties that behave like standard JavaScript properties, but are implemented with | ||
* native functionality without the need for reflection. | ||
*/ | ||
public class LambdaAccessorSlot extends Slot { | ||
private transient Function<Scriptable, Object> getter; | ||
private transient BiConsumer<Scriptable, Object> setter; | ||
private LambdaFunction getterFunction; | ||
private LambdaFunction setterFunction; | ||
|
||
LambdaAccessorSlot(Object name, int index) { | ||
super(name, index, 0); | ||
} | ||
|
||
LambdaAccessorSlot(Slot oldSlot) { | ||
super(oldSlot); | ||
} | ||
|
||
@Override | ||
boolean isValueSlot() { | ||
return false; | ||
} | ||
|
||
@Override | ||
boolean isSetterSlot() { | ||
return true; | ||
} | ||
|
||
@Override | ||
ScriptableObject getPropertyDescriptor(Context cx, Scriptable scope) { | ||
ScriptableObject desc = (ScriptableObject) cx.newObject(scope); | ||
|
||
int attr = getAttributes(); | ||
boolean es6 = cx.getLanguageVersion() >= Context.VERSION_ES6; | ||
if (es6) { | ||
if (getterFunction == null && setterFunction == null) { | ||
desc.defineProperty( | ||
"writable", | ||
(attr & ScriptableObject.READONLY) == 0, | ||
ScriptableObject.EMPTY); | ||
} | ||
} else { | ||
desc.setCommonDescriptorProperties( | ||
attr, getterFunction == null && setterFunction == null); | ||
} | ||
|
||
if (getterFunction != null) { | ||
desc.defineProperty("get", this.getterFunction, ScriptableObject.EMPTY); | ||
} | ||
|
||
if (setterFunction != null) { | ||
desc.defineProperty("set", this.setterFunction, ScriptableObject.EMPTY); | ||
} else if (es6) { | ||
desc.defineProperty("set", Undefined.instance, ScriptableObject.EMPTY); | ||
} | ||
|
||
if (es6) { | ||
desc.defineProperty( | ||
"enumerable", (attr & ScriptableObject.DONTENUM) == 0, ScriptableObject.EMPTY); | ||
desc.defineProperty( | ||
"configurable", | ||
(attr & ScriptableObject.PERMANENT) == 0, | ||
ScriptableObject.EMPTY); | ||
} | ||
return desc; | ||
} | ||
|
||
@Override | ||
public boolean setValue(Object value, Scriptable scope, Scriptable start, boolean isThrow) { | ||
if (setter == null) { | ||
if (getter != null) { | ||
throwNoSetterException(start, value); | ||
return true; | ||
} | ||
} else { | ||
setter.accept(start, value); | ||
return true; | ||
} | ||
|
||
return super.setValue(value, start, start, isThrow); | ||
} | ||
|
||
@Override | ||
public Object getValue(Scriptable owner) { | ||
if (getter != null) { | ||
return getter.apply(owner); | ||
} | ||
return super.getValue(owner); | ||
} | ||
|
||
public void setGetter(Scriptable scope, Function<Scriptable, Object> getter) { | ||
this.getter = getter; | ||
if (getter != null) { | ||
this.getterFunction = | ||
new LambdaFunction( | ||
scope, | ||
"get " + super.name, | ||
0, | ||
(cx1, scope1, thisObj, args) -> getter.apply(thisObj)); | ||
} | ||
} | ||
|
||
public void setSetter(Scriptable scope, BiConsumer<Scriptable, Object> setter) { | ||
this.setter = setter; | ||
if (setter != null) { | ||
this.setterFunction = | ||
new LambdaFunction( | ||
scope, | ||
"set " + super.name, | ||
1, | ||
(cx1, scope1, thisObj, args) -> { | ||
setter.accept(thisObj, args[0]); | ||
return Undefined.instance; | ||
}); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.