ソースを参照

Improve memory usage by making Thread a ref object

Zed 7 年 前
コミット
92e3df411f
4 ファイル変更7 行追加4 行削除
  1. 2 0
      src/api.nim
  2. 1 0
      src/parser.nim
  3. 1 1
      src/types.nim
  4. 3 3
      src/views/user.nimf

+ 2 - 0
src/api.nim

@@ -110,6 +110,7 @@ proc getVideo*(tweet: Tweet; token: string) {.async.} =
   tokenUses.inc
 
 proc getVideos*(thread: Thread; token="") {.async.} =
+  if thread == nil: return
 
   var gToken = token
   if gToken.len == 0:
@@ -150,6 +151,7 @@ proc getPoll*(tweet: Tweet) {.async.} =
   tweet.poll = some(parsePoll(html))
 
 proc getPolls*(thread: Thread) {.async.} =
+  if thread == nil: return
   var polls = thread.tweets.filterIt(it.poll.isSome)
   await all(polls.map(getPoll))
 

+ 1 - 0
src/parser.nim

@@ -88,6 +88,7 @@ proc parseTweet*(node: XmlNode): Tweet =
 
 proc parseThread*(nodes: XmlNode): Thread =
   if nodes == nil: return
+  result = Thread()
   for n in nodes.filterIt(it.kind != xnText):
     let class = n.attr("class").toLower()
     if "tombstone" in class or "unavailable" in class:

+ 1 - 1
src/types.nim

@@ -91,7 +91,7 @@ type
     photos*: seq[string]
     poll*: Option[Poll]
 
-  Thread* = object
+  Thread* = ref object
     tweets*: seq[Tweet]
     more*: int
 

+ 3 - 3
src/views/user.nimf

@@ -104,7 +104,7 @@
 #proc renderConversation*(conversation: Conversation): string =
 <div class="conversation" id="tweets">
   <div class="main-thread">
-    #if conversation.before.tweets.len > 0:
+    #if conversation.before != nil:
     <div class="before-tweet thread-line">
       #for i, tweet in conversation.before.tweets:
         ${renderTweet(tweet, first=(i == 0))}
@@ -112,10 +112,10 @@
     </div>
     #end if
     <div class="main-tweet">
-      #let afterClass = if conversation.after.tweets.len > 0: "thread thread-line" else: ""
+      #let afterClass = if conversation.after != nil: "thread thread-line" else: ""
       ${renderTweet(conversation.tweet, class=afterClass)}
     </div>
-    #if conversation.after.tweets.len > 0:
+    #if conversation.after != nil:
     <div class="after-tweet thread-line">
       #for i, tweet in conversation.after.tweets:
       ${renderTweet(tweet, first=(i == 0), last=(i == conversation.after.tweets.high))}