Parse -> Fetch, now tries to hit cache
This commit is contained in:
parent
a791063d5b
commit
2e79d9c834
@ -2,7 +2,7 @@ package parser
|
|||||||
|
|
||||||
// cacheItem stores an item of the parser cache.
|
// cacheItem stores an item of the parser cache.
|
||||||
type cacheItem struct {
|
type cacheItem struct {
|
||||||
section Section
|
tree SyntaxTree
|
||||||
skimmed bool
|
skimmed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,15 +18,28 @@ type ParsingOperation struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - implement parser cache
|
// * implement parser cache
|
||||||
// - have this try to hit the cache, and actually parse on miss
|
// * have this try to hit the cache, and actually parse on miss
|
||||||
// - rename this to Fetch
|
// - rename this to Fetch
|
||||||
// - add `skim bool` argument. when this is true, don't parse any code or data
|
// - add `skim bool` argument. when this is true, don't parse any code or data
|
||||||
// section initialization values, just definitions and their default values.
|
// section initialization values, just definitions and their default values.
|
||||||
|
|
||||||
// Parse reads the files located in the module specified by modulePath, and
|
// Fetch returns the parsed module located at the specified path, and returns an
|
||||||
// converts them into an abstract syntax tree.
|
// abstract syntax tree. If the module has not yet been parsed, it parses it
|
||||||
func Parse (modulePath string) (tree SyntaxTree, err error) {
|
// first.
|
||||||
|
func Fetch (modulePath string) (tree SyntaxTree, err error) {
|
||||||
|
if modulePath[0] != '/' {
|
||||||
|
panic("module path did not begin at filesystem root")
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to hit cache
|
||||||
|
cached, exists := cache[modulePath]
|
||||||
|
if exists {
|
||||||
|
tree = cached.tree
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// miss, so parse the module.
|
||||||
parser := ParsingOperation {
|
parser := ParsingOperation {
|
||||||
modulePath: modulePath,
|
modulePath: modulePath,
|
||||||
tree: SyntaxTree {
|
tree: SyntaxTree {
|
||||||
@ -56,6 +69,13 @@ func Parse (modulePath string) (tree SyntaxTree, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tree = parser.tree
|
tree = parser.tree
|
||||||
|
|
||||||
|
// cache tree
|
||||||
|
cache[modulePath] = cacheItem {
|
||||||
|
tree: tree,
|
||||||
|
skimmed: false,
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user