@@ -54,34 +54,30 @@ export class LVal implements RawValue {
5454 }
5555
5656 stringRep ( omitLevels ?: boolean , taintRef ?: any ) {
57- let v = this . val ;
58- let l = this . lev ;
59- let t = "" ;
60- if ( v . stringRep != undefined ) { // 2018-05-17; AA; ugly hack!
61- t = v . stringRep ( omitLevels , taintRef ) ;
62- } else {
63- if ( typeof v === 'string' ) {
64- t = `"${ v . toString ( ) } "` ;
65- } else {
66- t = v . toString ( ) ;
67- }
68- }
69-
70- if ( l . stringRep == undefined ) {
71- console . log ( "undefined stringrep" , l ) ;
72- }
73-
74- let s = t ;
75-
76- if ( ! omitLevels ) {
77- s = s + "@" + l . stringRep ( ) + "%" + this . tlev . stringRep ( ) ;
78- }
79-
80- if ( taintRef ) {
81- taintRef . lev = levels . lub ( taintRef . lev , l ) ;
82- }
83-
84- return s ;
57+ let output = "" ;
58+
59+ // HACK (AA; 2018-05-17): Branch on JavaScript builtins based on the
60+ // existence of `stringRep`.
61+ //
62+ // TODO (SS; 2025-12-05): We can simplify the stuff below to
63+ // `v.toString(omitLevels, taintRef)`; JavaScript
64+ // supports calling functions with more arguments
65+ // than it was defined with.
66+ if ( this . val . stringRep != undefined ) {
67+ output = this . val . stringRep ( omitLevels , taintRef ) ;
68+ } else if ( typeof this . val === 'string' ) {
69+ output = `"${ this . val . toString ( ) } "` ;
70+ } else {
71+ output = this . val . toString ( ) ;
72+ }
73+
74+ if ( taintRef ) {
75+ taintRef . lev = levels . lub ( taintRef . lev , this . lev ) ;
76+ }
77+
78+ return omitLevels
79+ ? output
80+ : `${ output } @${ this . lev . stringRep ( ) } %${ this . tlev . stringRep ( ) } ` ;
8581 }
8682}
8783
0 commit comments