77import java .util .Map ;
88import java .util .Objects ;
99import java .util .function .Predicate ;
10+ import org .mozilla .javascript .ScriptableObject .DescriptorInfo ;
1011
1112/**
1213 * Abstract Object Operations as defined by EcmaScript
@@ -83,12 +84,11 @@ static boolean testIntegrityLevel(Context cx, Object o, INTEGRITY_LEVEL level) {
8384 ids = obj .getIds (map , true , true );
8485 }
8586 for (Object name : ids ) {
86- ScriptableObject desc = obj .getOwnPropertyDescriptor (cx , name );
87- if (Boolean . TRUE . equals ( desc .get ( "configurable" ) )) return false ;
87+ DescriptorInfo desc = obj .getOwnPropertyDescriptor (cx , name );
88+ if (desc .isConfigurable ( )) return false ;
8889
89- if (level == INTEGRITY_LEVEL .FROZEN
90- && ScriptableObject .isDataDescriptor (desc )
91- && Boolean .TRUE .equals (desc .get ("writable" ))) return false ;
90+ if (level == INTEGRITY_LEVEL .FROZEN && desc .isDataDescriptor () && desc .isWritable ())
91+ return false ;
9292 }
9393
9494 return true ;
@@ -150,21 +150,20 @@ static boolean setIntegrityLevel(Context cx, Object o, INTEGRITY_LEVEL level) {
150150 ids = obj .getIds (map , true , true );
151151 }
152152 for (Object key : ids ) {
153- ScriptableObject desc = obj .getOwnPropertyDescriptor (cx , key );
153+ DescriptorInfo desc = obj .getOwnPropertyDescriptor (cx , key );
154154
155155 if (level == INTEGRITY_LEVEL .SEALED ) {
156- if (Boolean . TRUE . equals ( desc .get ( "configurable" ) )) {
157- desc .put ( " configurable" , desc , Boolean . FALSE ) ;
156+ if (desc .isConfigurable ( )) {
157+ desc .configurable = false ;
158158
159159 obj .defineOwnProperty (cx , key , desc , false );
160160 }
161161 } else {
162- if (ScriptableObject .isDataDescriptor (desc )
163- && Boolean .TRUE .equals (desc .get ("writable" ))) {
164- desc .put ("writable" , desc , Boolean .FALSE );
162+ if (desc .isDataDescriptor () && desc .isWritable ()) {
163+ desc .writable = false ;
165164 }
166- if (Boolean . TRUE . equals ( desc .get ( "configurable" ) )) {
167- desc .put ( " configurable" , desc , Boolean . FALSE ) ;
165+ if (desc .isConfigurable ( )) {
166+ desc .configurable = false ;
168167 }
169168 obj .defineOwnProperty (cx , key , desc , false );
170169 }
@@ -402,7 +401,7 @@ public static long lengthOfArrayLike(Context cx, Scriptable o) {
402401 * IsCompatiblePropertyDescriptor (Extensible, Desc, Current)</a>
403402 */
404403 static boolean isCompatiblePropertyDescriptor (
405- Context cx , boolean extensible , ScriptableObject desc , ScriptableObject current ) {
404+ Context cx , boolean extensible , DescriptorInfo desc , DescriptorInfo current ) {
406405 return validateAndApplyPropertyDescriptor (
407406 cx ,
408407 Undefined .SCRIPTABLE_UNDEFINED ,
@@ -424,15 +423,14 @@ static boolean validateAndApplyPropertyDescriptor(
424423 Scriptable o ,
425424 Scriptable p ,
426425 boolean extensible ,
427- ScriptableObject desc ,
428- ScriptableObject current ) {
426+ DescriptorInfo desc ,
427+ DescriptorInfo current ) {
429428 if (Undefined .isUndefined (current )) {
430429 if (!extensible ) {
431430 return false ;
432431 }
433432
434- if (ScriptableObject .isGenericDescriptor (desc )
435- || ScriptableObject .isDataDescriptor (desc )) {
433+ if (desc .isGenericDescriptor () || desc .isDataDescriptor ()) {
436434 /*
437435 i. i. If O is not undefined, create an own data property named P of object O whose [[Value]], [[Writable]], [[Enumerable]], and [[Configurable]] attribute values are described by Desc.
438436 If the value of an attribute field of Desc is absent, the attribute of the newly created property is set to its default value.
@@ -445,32 +443,35 @@ static boolean validateAndApplyPropertyDescriptor(
445443 return true ;
446444 }
447445
448- if (desc .getIds ().length == 0 ) {
446+ if (!desc .hasEnumerable ()
447+ && !desc .hasConfigurable ()
448+ && !desc .hasWritable ()
449+ && !desc .hasGetter ()
450+ && !desc .hasSetter ()
451+ && !desc .hasValue ()) {
449452 return true ;
450453 }
451454
452- if (Boolean .FALSE .equals (current .get ("configurable" ))) {
453- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "configurable" ))
454- && Boolean .TRUE .equals (desc .get ("configurable" ))) {
455+ if (current .isConfigurable (false )) {
456+ if (desc .isConfigurable ()) {
455457 return false ;
456458 }
457459
458- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "enumerable" ))
459- && !Objects .equals (desc .get ("enumerable" ), current .get ("enumerable" ))) {
460+ if (desc .hasEnumerable () && !Objects .equals (desc .enumerable , current .enumerable )) {
460461 return false ;
461462 }
462463 }
463464
464- if (ScriptableObject .isGenericDescriptor (desc )) {
465+ if (desc .isGenericDescriptor ()) {
465466 return true ;
466467 }
467468
468- if (ScriptableObject .isDataDescriptor (current ) != ScriptableObject .isDataDescriptor (desc )) {
469- if (Boolean . FALSE . equals ( current .get ( "configurable" ) )) {
469+ if (current .isDataDescriptor () != desc .isDataDescriptor ()) {
470+ if (current .isConfigurable ( false )) {
470471 return false ;
471472 }
472- if (ScriptableObject .isDataDescriptor (current )) {
473- if (Boolean . FALSE . equals ( current .get ( "configurable" ) )) {
473+ if (current .isDataDescriptor ()) {
474+ if (current .isConfigurable ( false )) {
474475 // i. i. If O is not undefined, convert the property named P of object O from a
475476 // data property to an accessor property. Preserve the existing values of the
476477 // converted property's [[Configurable]] and [[Enumerable]] attributes and set
@@ -482,28 +483,22 @@ static boolean validateAndApplyPropertyDescriptor(
482483 // the rest of the property's attributes to their default values.
483484 }
484485 }
485- } else if (ScriptableObject .isDataDescriptor (current )
486- && ScriptableObject .isDataDescriptor (desc )) {
487- if (Boolean .FALSE .equals (current .get ("configurable" ))
488- && Boolean .FALSE .equals (current .get ("writable" ))) {
489- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "writable" ))
490- && Boolean .TRUE .equals (desc .get ("writable" ))) {
486+ } else if (current .isDataDescriptor () && desc .isDataDescriptor ()) {
487+ if (current .isConfigurable (false ) && current .isWritable (false )) {
488+ if (desc .isWritable ()) {
491489 return false ;
492490 }
493- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "value" ))
494- && !Objects .equals (desc .get ("value" ), current .get ("value" ))) {
491+ if (desc .hasValue () && !Objects .equals (desc .value , current .value )) {
495492 return false ;
496493 }
497494 return true ;
498495 }
499496 } else {
500- if (Boolean .FALSE .equals (current .get ("configurable" ))) {
501- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "set" ))
502- && !Objects .equals (desc .get ("set" ), current .get ("set" ))) {
497+ if (current .isConfigurable (false )) {
498+ if (desc .hasSetter () && !Objects .equals (desc .setter , current .setter )) {
503499 return false ;
504500 }
505- if (Boolean .TRUE .equals (ScriptableObject .hasProperty (desc , "get" ))
506- && !Objects .equals (desc .get ("get" ), current .get ("get" ))) {
501+ if (desc .hasGetter () && !Objects .equals (desc .getter , current .getter )) {
507502 return false ;
508503 }
509504 return true ;
0 commit comments