From 2e5cb3f35ccb5b58d9e041a93493820991a5a6d1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Sep 2018 14:55:02 +0300 Subject: [PATCH 1/3] avoid some JS deopts in expression evaluation --- src/style-spec/expression/evaluation_context.js | 3 +++ src/style-spec/expression/index.js | 17 ++++------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/style-spec/expression/evaluation_context.js b/src/style-spec/expression/evaluation_context.js index f6a88333048..6b301d61007 100644 --- a/src/style-spec/expression/evaluation_context.js +++ b/src/style-spec/expression/evaluation_context.js @@ -14,6 +14,9 @@ class EvaluationContext { _parseColorCache: {[string]: ?Color}; constructor() { + this.globals = (null: any); + this.feature = null; + this.featureState = null; this._parseColorCache = {}; } diff --git a/src/style-spec/expression/index.js b/src/style-spec/expression/index.js index 5b9f07c3d86..2cb8a2ec4b9 100644 --- a/src/style-spec/expression/index.js +++ b/src/style-spec/expression/index.js @@ -52,17 +52,12 @@ export class StyleExpression { constructor(expression: Expression, propertySpec: StylePropertySpecification) { this.expression = expression; this._warningHistory = {}; + this._evaluator = new EvaluationContext(); this._defaultValue = getDefaultValue(propertySpec); - if (propertySpec.type === 'enum') { - this._enumValues = propertySpec.values; - } + this._enumValues = propertySpec.type === 'enum' ? propertySpec.values : {}; } evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState): any { - if (!this._evaluator) { - this._evaluator = new EvaluationContext(); - } - this._evaluator.globals = globals; this._evaluator.feature = feature; this._evaluator.featureState = featureState; @@ -71,13 +66,9 @@ export class StyleExpression { } evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState): any { - if (!this._evaluator) { - this._evaluator = new EvaluationContext(); - } - this._evaluator.globals = globals; - this._evaluator.feature = feature; - this._evaluator.featureState = featureState; + if (feature !== undefined) this._evaluator.feature = feature; + if (featureState !== undefined) this._evaluator.featureState = featureState; try { const val = this.expression.evaluate(this._evaluator); From ceb5114a3ddef38b337b314fb615d42c01a27ce1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Sep 2018 15:02:21 +0300 Subject: [PATCH 2/3] update deopt fix --- src/style-spec/expression/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/style-spec/expression/index.js b/src/style-spec/expression/index.js index 2cb8a2ec4b9..1d4a56ea0f0 100644 --- a/src/style-spec/expression/index.js +++ b/src/style-spec/expression/index.js @@ -47,14 +47,14 @@ export class StyleExpression { _evaluator: EvaluationContext; _defaultValue: Value; _warningHistory: {[key: string]: boolean}; - _enumValues: {[string]: any}; + _enumValues: ?{[string]: any}; constructor(expression: Expression, propertySpec: StylePropertySpecification) { this.expression = expression; this._warningHistory = {}; this._evaluator = new EvaluationContext(); this._defaultValue = getDefaultValue(propertySpec); - this._enumValues = propertySpec.type === 'enum' ? propertySpec.values : {}; + this._enumValues = propertySpec.type === 'enum' ? propertySpec.values : null; } evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState): any { From a7ed2166b4920cc8fd3ce2caa1427e6116c7bfe4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Sep 2018 16:33:16 +0300 Subject: [PATCH 3/3] update deopt fix 2 --- src/style-spec/expression/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/style-spec/expression/index.js b/src/style-spec/expression/index.js index 1d4a56ea0f0..11bb9bd262a 100644 --- a/src/style-spec/expression/index.js +++ b/src/style-spec/expression/index.js @@ -67,8 +67,8 @@ export class StyleExpression { evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState): any { this._evaluator.globals = globals; - if (feature !== undefined) this._evaluator.feature = feature; - if (featureState !== undefined) this._evaluator.featureState = featureState; + this._evaluator.feature = feature || null; + this._evaluator.featureState = featureState || null; try { const val = this.expression.evaluate(this._evaluator);