Remove the isEOF helper function and slightly re-factor EOF
				
					
				
			Given how trivial the `isEOF` function is, we can simply inline the check at the various call-sites and remove the function (which ought to be ever so slightly more efficient as well). Furthermore, this patch also changes the `EOF` primitive itself to a `Symbol` instead of an Object since that has the nice benefit of making it unclonable (thus preventing *accidentally* trying to send `EOF` from the worker-thread).
This commit is contained in:
		
							parent
							
								
									0b95d698d8
								
							
						
					
					
						commit
						766299016f
					
				| @ -20,7 +20,7 @@ import { | |||||||
|   unreachable, |   unreachable, | ||||||
|   warn, |   warn, | ||||||
| } from "../shared/util.js"; | } from "../shared/util.js"; | ||||||
| import { isCmd, isEOF, isName, isStream } from "./primitives.js"; | import { EOF, isCmd, isName, isStream } from "./primitives.js"; | ||||||
| import { Lexer } from "./parser.js"; | import { Lexer } from "./parser.js"; | ||||||
| import { MissingDataException } from "./core_utils.js"; | import { MissingDataException } from "./core_utils.js"; | ||||||
| import { Stream } from "./stream.js"; | import { Stream } from "./stream.js"; | ||||||
| @ -773,7 +773,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|   function parseBfChar(cMap, lexer) { |   function parseBfChar(cMap, lexer) { | ||||||
|     while (true) { |     while (true) { | ||||||
|       let obj = lexer.getObj(); |       let obj = lexer.getObj(); | ||||||
|       if (isEOF(obj)) { |       if (obj === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (isCmd(obj, "endbfchar")) { |       if (isCmd(obj, "endbfchar")) { | ||||||
| @ -792,7 +792,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|   function parseBfRange(cMap, lexer) { |   function parseBfRange(cMap, lexer) { | ||||||
|     while (true) { |     while (true) { | ||||||
|       let obj = lexer.getObj(); |       let obj = lexer.getObj(); | ||||||
|       if (isEOF(obj)) { |       if (obj === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (isCmd(obj, "endbfrange")) { |       if (isCmd(obj, "endbfrange")) { | ||||||
| @ -810,7 +810,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|       } else if (isCmd(obj, "[")) { |       } else if (isCmd(obj, "[")) { | ||||||
|         obj = lexer.getObj(); |         obj = lexer.getObj(); | ||||||
|         const array = []; |         const array = []; | ||||||
|         while (!isCmd(obj, "]") && !isEOF(obj)) { |         while (!isCmd(obj, "]") && obj !== EOF) { | ||||||
|           array.push(obj); |           array.push(obj); | ||||||
|           obj = lexer.getObj(); |           obj = lexer.getObj(); | ||||||
|         } |         } | ||||||
| @ -825,7 +825,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|   function parseCidChar(cMap, lexer) { |   function parseCidChar(cMap, lexer) { | ||||||
|     while (true) { |     while (true) { | ||||||
|       let obj = lexer.getObj(); |       let obj = lexer.getObj(); | ||||||
|       if (isEOF(obj)) { |       if (obj === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (isCmd(obj, "endcidchar")) { |       if (isCmd(obj, "endcidchar")) { | ||||||
| @ -843,7 +843,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|   function parseCidRange(cMap, lexer) { |   function parseCidRange(cMap, lexer) { | ||||||
|     while (true) { |     while (true) { | ||||||
|       let obj = lexer.getObj(); |       let obj = lexer.getObj(); | ||||||
|       if (isEOF(obj)) { |       if (obj === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (isCmd(obj, "endcidrange")) { |       if (isCmd(obj, "endcidrange")) { | ||||||
| @ -864,7 +864,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|   function parseCodespaceRange(cMap, lexer) { |   function parseCodespaceRange(cMap, lexer) { | ||||||
|     while (true) { |     while (true) { | ||||||
|       let obj = lexer.getObj(); |       let obj = lexer.getObj(); | ||||||
|       if (isEOF(obj)) { |       if (obj === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (isCmd(obj, "endcodespacerange")) { |       if (isCmd(obj, "endcodespacerange")) { | ||||||
| @ -903,7 +903,7 @@ const CMapFactory = (function CMapFactoryClosure() { | |||||||
|     objLoop: while (true) { |     objLoop: while (true) { | ||||||
|       try { |       try { | ||||||
|         const obj = lexer.getObj(); |         const obj = lexer.getObj(); | ||||||
|         if (isEOF(obj)) { |         if (obj === EOF) { | ||||||
|           break; |           break; | ||||||
|         } else if (isName(obj)) { |         } else if (isName(obj)) { | ||||||
|           if (obj.name === "WMode") { |           if (obj.name === "WMode") { | ||||||
|  | |||||||
| @ -28,7 +28,6 @@ import { | |||||||
|   EOF, |   EOF, | ||||||
|   isCmd, |   isCmd, | ||||||
|   isDict, |   isDict, | ||||||
|   isEOF, |  | ||||||
|   isName, |   isName, | ||||||
|   Name, |   Name, | ||||||
|   Ref, |   Ref, | ||||||
| @ -124,10 +123,10 @@ class Parser { | |||||||
|           return this.makeInlineImage(cipherTransform); |           return this.makeInlineImage(cipherTransform); | ||||||
|         case "[": // array
 |         case "[": // array
 | ||||||
|           const array = []; |           const array = []; | ||||||
|           while (!isCmd(this.buf1, "]") && !isEOF(this.buf1)) { |           while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { | ||||||
|             array.push(this.getObj(cipherTransform)); |             array.push(this.getObj(cipherTransform)); | ||||||
|           } |           } | ||||||
|           if (isEOF(this.buf1)) { |           if (this.buf1 === EOF) { | ||||||
|             if (this.recoveryMode) { |             if (this.recoveryMode) { | ||||||
|               return array; |               return array; | ||||||
|             } |             } | ||||||
| @ -137,7 +136,7 @@ class Parser { | |||||||
|           return array; |           return array; | ||||||
|         case "<<": // dictionary or stream
 |         case "<<": // dictionary or stream
 | ||||||
|           const dict = new Dict(this.xref); |           const dict = new Dict(this.xref); | ||||||
|           while (!isCmd(this.buf1, ">>") && !isEOF(this.buf1)) { |           while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { | ||||||
|             if (!isName(this.buf1)) { |             if (!isName(this.buf1)) { | ||||||
|               info("Malformed dictionary: key must be a name object"); |               info("Malformed dictionary: key must be a name object"); | ||||||
|               this.shift(); |               this.shift(); | ||||||
| @ -146,12 +145,12 @@ class Parser { | |||||||
| 
 | 
 | ||||||
|             const key = this.buf1.name; |             const key = this.buf1.name; | ||||||
|             this.shift(); |             this.shift(); | ||||||
|             if (isEOF(this.buf1)) { |             if (this.buf1 === EOF) { | ||||||
|               break; |               break; | ||||||
|             } |             } | ||||||
|             dict.set(key, this.getObj(cipherTransform)); |             dict.set(key, this.getObj(cipherTransform)); | ||||||
|           } |           } | ||||||
|           if (isEOF(this.buf1)) { |           if (this.buf1 === EOF) { | ||||||
|             if (this.recoveryMode) { |             if (this.recoveryMode) { | ||||||
|               return dict; |               return dict; | ||||||
|             } |             } | ||||||
| @ -498,13 +497,13 @@ class Parser { | |||||||
|     // Parse dictionary.
 |     // Parse dictionary.
 | ||||||
|     const dict = new Dict(this.xref); |     const dict = new Dict(this.xref); | ||||||
|     let dictLength; |     let dictLength; | ||||||
|     while (!isCmd(this.buf1, "ID") && !isEOF(this.buf1)) { |     while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { | ||||||
|       if (!isName(this.buf1)) { |       if (!isName(this.buf1)) { | ||||||
|         throw new FormatError("Dictionary key must be a name object"); |         throw new FormatError("Dictionary key must be a name object"); | ||||||
|       } |       } | ||||||
|       const key = this.buf1.name; |       const key = this.buf1.name; | ||||||
|       this.shift(); |       this.shift(); | ||||||
|       if (isEOF(this.buf1)) { |       if (this.buf1 === EOF) { | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       dict.set(key, this.getObj(cipherTransform)); |       dict.set(key, this.getObj(cipherTransform)); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
| import { assert, shadow, unreachable } from "../shared/util.js"; | import { assert, shadow, unreachable } from "../shared/util.js"; | ||||||
| import { BaseStream } from "./base_stream.js"; | import { BaseStream } from "./base_stream.js"; | ||||||
| 
 | 
 | ||||||
| const EOF = {}; | const EOF = Symbol("EOF"); | ||||||
| 
 | 
 | ||||||
| const Name = (function NameClosure() { | const Name = (function NameClosure() { | ||||||
|   let nameCache = Object.create(null); |   let nameCache = Object.create(null); | ||||||
| @ -338,10 +338,6 @@ class RefSetCache { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function isEOF(v) { |  | ||||||
|   return v === EOF; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function isName(v, name) { | function isName(v, name) { | ||||||
|   return v instanceof Name && (name === undefined || v.name === name); |   return v instanceof Name && (name === undefined || v.name === name); | ||||||
| } | } | ||||||
| @ -390,7 +386,6 @@ export { | |||||||
|   EOF, |   EOF, | ||||||
|   isCmd, |   isCmd, | ||||||
|   isDict, |   isDict, | ||||||
|   isEOF, |  | ||||||
|   isName, |   isName, | ||||||
|   isRef, |   isRef, | ||||||
|   isRefsEqual, |   isRefsEqual, | ||||||
|  | |||||||
| @ -16,10 +16,8 @@ | |||||||
| import { | import { | ||||||
|   Cmd, |   Cmd, | ||||||
|   Dict, |   Dict, | ||||||
|   EOF, |  | ||||||
|   isCmd, |   isCmd, | ||||||
|   isDict, |   isDict, | ||||||
|   isEOF, |  | ||||||
|   isName, |   isName, | ||||||
|   isRef, |   isRef, | ||||||
|   isRefsEqual, |   isRefsEqual, | ||||||
| @ -473,17 +471,6 @@ describe("primitives", function () { | |||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe("isEOF", function () { |  | ||||||
|     it("handles non-EOF", function () { |  | ||||||
|       const nonEOF = "foo"; |  | ||||||
|       expect(isEOF(nonEOF)).toEqual(false); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     it("handles EOF", function () { |  | ||||||
|       expect(isEOF(EOF)).toEqual(true); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   describe("isName", function () { |   describe("isName", function () { | ||||||
|     it("handles non-names", function () { |     it("handles non-names", function () { | ||||||
|       const nonName = {}; |       const nonName = {}; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user