[GHC] #1088: <interactive>: internal error: interpretBCO: unknown
or unimplemented opcode
GHC
trac at galois.com
Sat Jan 6 07:01:49 EST 2007
#1088: <interactive>: internal error: interpretBCO: unknown or unimplemented
opcode
---------------------------------------------+------------------------------
Reporter: matthew at wellquite dot org | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHCi | Version: 6.6
Severity: normal | Keywords:
Difficulty: Unknown | Testcase:
Architecture: x86 | Os: Linux
---------------------------------------------+------------------------------
I did try to post this to glasgow-haskell-bugs at haskell.org before
christmas because I could not log into trac but as a non-subscriber it was
"moderated" and never appeared...
(Although architecture is set to x86, this also occurs on x86_64)
I'm not sure precisely what the problem is here, but if you remove all the
strictness modifiers then the problem goes away.
Also, the following works fine:
buildOctTree (Vec 0 0 0) 10 10 10 [(a,(Vec a a a)) | a <-
[(-4.0),(-2.0)..4.0]]
Also, having done that, the problematic expressions work fine - the bug
only appears if the expression below is run as the first call to
buildOctTree in the ghci session.
This is on a P4, 2GB RAM, Debian unstable, ghc 6.6 (both hand rolled and
from debian).
uname -a =
Linux smudge 2.6.18-2-686 #1 SMP Wed Nov 8 19:52:12 UTC 2006 i686
GNU/Linux
> ghci -v OctTree
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.6, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Using package config file: /usr/lib/ghc-6.6/package.conf
wired-in package base mapped to base-2.0
wired-in package rts mapped to rts-1.0
wired-in package haskell98 mapped to haskell98-1.0
wired-in package template-haskell mapped to template-haskell-2.0
Hsc static flags: -static
Loading package base ... linking ... done.
*** Parser:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
*** Parser:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
*** Chasing dependencies:
Stable obj: []
Stable BCO: []
unload: retaining objs []
unload: retaining bcos []
Upsweep completely successful.
*** Deleting temp files:
Deleting:
*** Chasing dependencies:
Stable obj: []
Stable BCO: []
unload: retaining objs []
unload: retaining bcos []
compile: input file OctTree.hs
*** Checking old interface for main:OctTree:
[1 of 1] Compiling OctTree ( OctTree.hs, interpreted )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
Result size = 1587
*** Simplify:
Result size = 2390
Result size = 2137
Result size = 2105
Result size = 2100
*** Tidy Core:
Result size = 2198
*** CorePrep:
Result size = 2646
*** ByteCodeGen:
*** Deleting temp files:
Deleting:
Upsweep completely successful.
*** Deleting temp files:
Deleting:
Ok, modules loaded: OctTree.
*OctTree> buildOctTree (Vec 0 0 0) 10 10 10 [(a,(Vec a a a)) | a <-
[(-4.0),(-3.9)..4.0]]
*** Parser:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
<interactive>: internal error: interpretBCO: unknown or unimplemented
opcode 20196
(GHC version 6.6 for i386_unknown_linux)
Please report this as a GHC bug:
http://www.haskell.org/ghc/reportabug
Aborted
Thanks,
Matthew
Code follows:
{-
- OctTrees.hs: Implementation of OctTrees in Haskell
- Copyright (C) 2006 Matthew Sackman
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; version 2
- of the License only.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-
1301, USA.
-}
module OctTree
(OctTree,
buildOctTree,
findInRadius
)
where
import Data.List
data Vector = Vec !Double !Double !Double
deriving (Show, Eq)
findDisplacement :: Vector -> Vector -> (Double, Vector)
findDisplacement (Vec ax ay az) (Vec bx by bz) =
(len, Vec dx dy dz)
where
len = sqrt ((dx*dx) + (dy*dy) + (dz*dz))
dx = (bx - ax)
dy = (by - ay)
dz = (bz - az)
-- lne usw
data OctTree value = OctTree !Vector !Vector !(OctTreeNode value)
deriving (Show)
data OctTreeNode value = EmptyLeaf
-- pos value
| Leaf !Vector !(value)
| Node
-- lne lse lsw
lnw
!(OctTree value) !(OctTree value) !(OctTree
value) !(OctTree value)
-- unw usw use
une
!(OctTree value) !(OctTree value) !(OctTree
value) !(OctTree value)
deriving (Show)
buildOctTree :: (Show a) => Vector -> Double -> Double -> Double ->
[(a,Vector)] -> (OctTree a)
buildOctTree (Vec mx my mz) x_size y_size z_size values = foldl' (\t
(v,pos) -> insertValue t v pos) initial values
where
initial = OctTree (Vec (mx+x) (my+y) (mz-z)) (Vec (mx-x) (my-y)
(mz+z)) EmptyLeaf
x = x_size /2
y = y_size /2
z = z_size /2
insertValue :: (Show a) => (OctTree a) -> a -> Vector -> (OctTree a)
insertValue (OctTree lnePos uswPos EmptyLeaf) value pos = OctTree lnePos
uswPos (Leaf pos value)
insertValue (OctTree lnePos@(Vec lne_x lne_y lne_z) uswPos@(Vec usw_x
usw_y usw_z) (Leaf pos1 v1)) v2 pos2 = n3
where
n1 = OctTree lnePos uswPos (Node lne lse lsw lnw unw usw use une)
n2 = insertValue n1 v1 pos1
n3 = insertValue n2 v2 pos2
middle@(Vec mx my mz) = (Vec ((lne_x + usw_x)/2) ((lne_y + usw_y)/2)
((lne_z + usw_z)/2))
lne = OctTree lnePos middle EmptyLeaf
lse = OctTree (Vec lne_x my lne_z) (Vec mx usw_y mz) EmptyLeaf
lsw = OctTree (Vec mx my lne_z) (Vec usw_x usw_y mz) EmptyLeaf
lnw = OctTree (Vec mx lne_y lne_z) (Vec usw_x my mz) EmptyLeaf
unw = OctTree (Vec mx lne_y mz) (Vec usw_x my usw_z) EmptyLeaf
usw = OctTree middle uswPos EmptyLeaf
use = OctTree (Vec lne_x my mz) (Vec mx usw_y usw_z) EmptyLeaf
une = OctTree (Vec lne_x lne_y mz) (Vec mx my usw_z) EmptyLeaf
insertValue n@(OctTree lnePos uswPos (Node lne lse lsw lnw unw usw use
une))
value pos = OctTree lnePos uswPos node
where
node =
case inQuadrant lne pos of
True -> (Node (insertValue lne value pos) lse lsw lnw unw usw
use une)
False -> case inQuadrant lse pos of
True -> (Node lne (insertValue lse value pos) lsw
lnw unw usw use une)
False -> case inQuadrant lsw pos of
True -> (Node lne lse (insertValue lsw
value pos) lnw unw usw use une)
False -> case inQuadrant lnw pos of
True -> (Node lne lse lsw
(insertValue lnw value pos) unw usw use une)
False -> case inQuadrant unw
pos of
True -> (Node lne
lse lsw lnw (insertValue unw value pos) usw use une)
False -> case
inQuadrant usw pos of
True ->
(Node lne lse lsw lnw unw (insertValue usw value pos) use une)
False
-> case inQuadrant use pos of
True -> (Node lne lse lsw lnw unw usw (insertValue use value pos) une)
False -> case inQuadrant une pos of
True -> (Node lne lse lsw lnw unw usw use (insertValue une value pos))
False -> error $ "Value " ++ (show value)
+++ " at position " ++ (show pos) ++ " is not in node " ++ (show n)
inQuadrant :: (OctTree a) -> Vector -> Bool
inQuadrant (OctTree (Vec lne_x lne_y lne_z) (Vec usw_x usw_y usw_z) _)
(Vec x y z) =
(x > usw_x) && (y > usw_y) && (z < usw_z) && (x <= lne_x) && (y <=
lne_y) && (z >= lne_z)
findInRadius :: OctTree a -> Vector -> Double -> [(a,Vector,Double)]
findInRadius (OctTree _ _ EmptyLeaf) _ _ = []
findInRadius (OctTree _ _ (Leaf vPos value)) from radius =
case dist <= radius of
True -> [(value, vPos, dist)]
False -> []
where
(dist,_) = findDisplacement from vPos
findInRadius (OctTree _ _ (Node lne lse lsw lnw unw usw use une))
from@(Vec fx fy fz) radius =
concat result
where
children = filter findInRadius' [lne, lse, lsw, lnw, unw, usw, use,
une]
result = map (\n -> findInRadius n from radius) children
findInRadius' :: OctTree a -> Bool
findInRadius' (OctTree _ _ EmptyLeaf) = False
findInRadius' (OctTree (Vec lne_x lne_y lne_z) (Vec usw_x usw_y
usw_z) _) =
((fx + radius) > usw_x) && ((fx - radius) <= lne_x) &&
((fy + radius) > usw_y) && ((fy - radius) <= lne_y) &&
((fz - radius) < usw_z) && ((fz + radius) >= lne_z)
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1088>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list