@@ -152,6 +152,24 @@ export type VariableStore = Map<string, Variable>;
152152export class EvaluationContext {
153153 private static globalVariables : VariableStore = new Map ( ) ;
154154
155+ // Static v: variables whose values never change
156+ private static readonly vConstants : ReadonlyMap < string , Value > = new Map ( [
157+ [ 'true' , bool ( true ) ] ,
158+ [ 'false' , bool ( false ) ] ,
159+ [ 't_number' , int ( 0 ) ] ,
160+ [ 't_string' , int ( 1 ) ] ,
161+ [ 't_func' , int ( 2 ) ] ,
162+ [ 't_list' , int ( 3 ) ] ,
163+ [ 't_dict' , int ( 4 ) ] ,
164+ [ 't_float' , int ( 5 ) ] ,
165+ [ 't_bool' , int ( 6 ) ] ,
166+ [ 't_blob' , int ( 10 ) ] ,
167+ [ 'numbermax' , int ( Number . MAX_SAFE_INTEGER ) ] ,
168+ [ 'numbermin' , int ( Number . MIN_SAFE_INTEGER ) ] ,
169+ // NOTE: In VimScript this refers to a 64 bit integer; we have a 64 bit float because JavaScript
170+ [ 'numbersize' , int ( 64 ) ] ,
171+ ] ) ;
172+
155173 private vimState : VimState | undefined ;
156174 private localScopes : VariableStore [ ] = [ ] ;
157175 private errors : string [ ] = [ ] ;
@@ -345,35 +363,13 @@ export class EvaluationContext {
345363 // TODO: v:operator
346364 // TODO: v:register
347365 // TODO: v:statusmsg, v:warningmsg, v:errmsg
348- if ( varExpr . name === 'true' ) {
349- return bool ( true ) ;
350- } else if ( varExpr . name === 'false' ) {
351- return bool ( false ) ;
352- } else if ( varExpr . name === 'hlsearch' ) {
366+ const constant = EvaluationContext . vConstants . get ( varExpr . name ) ;
367+ if ( constant !== undefined ) {
368+ return constant ;
369+ }
370+
371+ if ( varExpr . name === 'hlsearch' ) {
353372 return bool ( globalState . hl ) ;
354- } else if ( varExpr . name === 't_number' ) {
355- return int ( 0 ) ;
356- } else if ( varExpr . name === 't_string' ) {
357- return int ( 1 ) ;
358- } else if ( varExpr . name === 't_func' ) {
359- return int ( 2 ) ;
360- } else if ( varExpr . name === 't_list' ) {
361- return int ( 3 ) ;
362- } else if ( varExpr . name === 't_dict' ) {
363- return int ( 4 ) ;
364- } else if ( varExpr . name === 't_float' ) {
365- return int ( 5 ) ;
366- } else if ( varExpr . name === 't_bool' ) {
367- return int ( 6 ) ;
368- } else if ( varExpr . name === 't_blob' ) {
369- return int ( 10 ) ;
370- } else if ( varExpr . name === 'numbermax' ) {
371- return int ( Number . MAX_SAFE_INTEGER ) ;
372- } else if ( varExpr . name === 'numbermin' ) {
373- return int ( Number . MIN_SAFE_INTEGER ) ;
374- } else if ( varExpr . name === 'numbersize' ) {
375- // NOTE: In VimScript this refers to a 64 bit integer; we have a 64 bit float because JavaScript
376- return int ( 64 ) ;
377373 } else if ( varExpr . name === 'errors' ) {
378374 return list ( this . errors . map ( str ) ) ;
379375 } else if ( varExpr . name === 'searchforward' ) {
0 commit comments