Changeset 4318 for trunk/ProjectFortress
- Timestamp:
- 11/06/09 14:37:52 (3 weeks ago)
- Location:
- trunk/ProjectFortress
- Files:
-
- 2 added
- 3 modified
-
compiler_tests/EmptyDoEnd.fss (added)
-
compiler_tests/EmptyDoEnd.test (added)
-
compiler_tests/TreapAndTest.fss (modified) (17 diffs)
-
src/com/sun/fortress/compiler/codegen/CodeGen.java (modified) (5 diffs)
-
src/com/sun/fortress/scala_src/typechecker/AbstractMethodChecker.scala (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/compiler_tests/TreapAndTest.fss
r4317 r4318 1 (******************************************************************************* 2 Copyright 2009 Sun Microsystems, Inc., 3 4150 Network Circle, Santa Clara, California 95054, U.S.A. 4 All rights reserved. 5 6 U.S. Government Rights - Commercial software. 7 Government users are subject to the Sun Microsystems, Inc. standard 8 license agreement and applicable provisions of the FAR and its supplements. 9 10 Use is subject to license terms. 11 12 This distribution may include materials developed by third parties. 13 14 Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered 15 trademarks of Sun Microsystems, Inc. in the U.S. and other countries. 16 ******************************************************************************) 17 1 18 export Executable 2 19 … … 55 72 56 73 57 58 59 Min_HK : ZZ32 = -1 74 Min_W : ZZ32 = -1 60 75 61 76 (* We organize the treap as a max-treap; a min-treap would work just as well. *) … … 67 82 getter min(): Treap = Treap(root.min) 68 83 getter max(): Treap = Treap(root.max) 84 (* Union and intersection are left-biased *) 69 85 opr UNION(self, other: Treap): Treap = Treap(root.combine(UnionOp, other.root)) 70 86 opr INTERSECTION(self, other: Treap): Treap = Treap(root.combine(IntersectionOp, other.root)) … … 73 89 opr SYMDIFF(self, other: Treap): Treap = 74 90 Treap(root.combine(SymdiffOp, other.root)) 91 containsKey(key:ZZ32): Boolean = NOT root.nodeWithKey(key).isEmpty 75 92 replace(key:ZZ32, val:String): Treap = singleton(key,val) UNION self 76 93 add(key:ZZ32, val:String): Treap = self UNION singleton(key,val) 77 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_ HK,key,""))94 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_W,key,"")) 78 95 lookup(key:ZZ32, defaultValue:String): String = 79 96 root.nodeWithKey(key).rootValue(defaultValue) … … 88 105 trait TreapNode comprises { NonEmpty, Empty } 89 106 getter isEmpty(): Boolean 90 getter hk(): ZZ32107 getter w(): ZZ32 91 108 getter min(): TreapNode 92 109 getter max(): TreapNode … … 121 138 object Empty extends TreapNode 122 139 getter isEmpty(): Boolean = true 123 getter hk(): ZZ32 = Min_HK140 getter w(): ZZ32 = Min_W 124 141 getter min(): TreapNode = self 125 142 getter max(): TreapNode = self … … 140 157 joinNE(l: NonEmpty): NonEmpty = l 141 158 142 combine(c: CombiningOp, r: TreapNode): TreapNode = c. leftEmpty(r)143 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c. rightEmpty(l)144 145 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c. rightEmpty(lr)146 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c. leftEmpty(rr)159 combine(c: CombiningOp, r: TreapNode): TreapNode = c.rightAlone(r) 160 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c.leftAlone(l) 161 162 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.leftAlone(lr) 163 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.rightAlone(rr) 147 164 148 165 rootKey(defaultKey: ZZ32): ZZ32 = defaultKey … … 151 168 152 169 trait NonEmpty extends TreapNode comprises { Leaf1, Node } 170 getter isEmpty(): Boolean = false 153 171 getter k(): ZZ32 154 172 getter v(): String 155 173 getter root(): Leaf1 174 175 join(r: TreapNode): TreapNode = r.joinNE(self) 156 176 (* Join this treap (on left) to r (on right); 157 assumes hk > r.hk*)177 assumes w > r.w *) 158 178 joinNEH(r: NonEmpty): NonEmpty 159 179 180 combine(c: CombiningOp, r: TreapNode): TreapNode = 181 r.combineNE(self,c) 160 182 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode 161 end 162 163 object Leaf1(hk0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty 164 getter isEmpty(): Boolean = false 183 184 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self.root) 185 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self.root,rr) 186 187 rootKey(defaultKey: ZZ32): ZZ32 = self.k 188 rootValue(defaultValue: String): String = self.v 189 end 190 191 object Leaf1(w0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty 165 192 getter k(): ZZ32 = k0 166 193 getter v(): String = v0 167 194 getter root(): Leaf1 = self 168 getter hk(): ZZ32 = hk0195 getter w(): ZZ32 = w0 169 196 getter min(): TreapNode = self 170 197 getter max(): TreapNode = self … … 172 199 mkString(withParens: Boolean): String = 173 200 if withParens then 174 "<" hk0.asString ">" self.asString201 "<" w0.asString ">" self.asString 175 202 else 176 203 self.asString … … 197 224 if key < k0 then self else Empty end 198 225 199 join(r: TreapNode): TreapNode = r.joinNE(self)200 226 joinNE(l: NonEmpty): NonEmpty = 201 if hk0 > l.hkthen202 Node(l, hk0, k0, v0, Empty)227 if w0 > l.w then 228 Node(l, w0, k0, v0, Empty) 203 229 else 204 230 l.joinNEH(self) 205 231 end 206 232 joinNEH(r: NonEmpty): NonEmpty = 207 Node(Empty, hk0, k0, v0, r) 208 209 combine(c: CombiningOp, r: TreapNode): TreapNode = 210 r.combineNE(self,c) 233 Node(Empty, w0, k0, v0, r) 234 211 235 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 212 if hk0 < l.hk then 236 if w0 > l.w then 237 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0)) 238 c.leftAlone(lt).join(m.combineRootR(c, self)).join(c.leftAlone(rt)) 239 else 213 240 l.combineNEH(c,self) 214 else215 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0))216 c.rightEmpty(lt).join(m.combineRootR(c, self)).join(c.rightEmpty(rt))217 241 end 218 242 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode = do 219 243 (lt, m, rt) = (r.splitL(k0), r.nodeWithKey(k0), r.splitR(k0)) 220 c.leftEmpty(lt).join(m.combineRootL(self, c)).join(c.leftEmpty(rt)) 221 end 222 223 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self) 224 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self,rr) 225 226 rootKey(defaultKey: ZZ32): ZZ32 = k0 227 rootValue(defaultValue: String): String = v0 244 c.rightAlone(lt).join(m.combineRootL(self, c)).join(c.rightAlone(rt)) 245 end 228 246 end 229 247 … … 231 249 Leaf1(randomZZ32(2147483647), key, val) 232 250 233 object Node(left: TreapNode, hk0: ZZ32, k0: ZZ32, v0: String, right: TreapNode)251 object Node(left: TreapNode, w0: ZZ32, k0: ZZ32, v0: String, right: TreapNode) 234 252 extends NonEmpty 235 getter isEmpty(): Boolean = false236 253 getter k(): ZZ32 = k0 237 254 getter v(): String = v0 238 getter root(): Leaf1 = Leaf1( hk0, k0, v0)239 getter hk(): ZZ32 = hk0255 getter root(): Leaf1 = Leaf1(w0, k0, v0) 256 getter w(): ZZ32 = w0 240 257 getter min(): TreapNode = 241 258 if left.isEmpty then self.root else left.min end … … 247 264 (l,r) = (left.mkString(withParens), right.mkString(withParens)) 248 265 if withParens then 249 "(" l ") <" hk0.asString ">" mid " (" r ")"266 "(" l ") <" w0.asString ">" mid " (" r ")" 250 267 else 251 268 lh = if l.isEmpty then mid else l " " mid end … … 258 275 if key < k0 then 259 276 (l, match, r) = left.split(key) 260 (l, match, node(r, hk0, k0, v0, right))277 (l, match, node(r, w0, k0, v0, right)) 261 278 elif key > k0 then 262 279 (l, match, r) = right.split(key) 263 (node(left, hk0, k0, v0, l), match, r)280 (node(left, w0, k0, v0, l), match, r) 264 281 else 265 282 (left, self, right) … … 271 288 left.splitL(key) 272 289 elif key > k0 then 273 Node(left, hk0, k0, v0, right.splitL(key))290 Node(left, w0, k0, v0, right.splitL(key)) 274 291 else 275 292 left … … 287 304 splitR(key:ZZ32): TreapNode = 288 305 if key < k0 then 289 Node(left.splitR(key), hk0, k0, v0, right)306 Node(left.splitR(key), w0, k0, v0, right) 290 307 elif key > k0 then 291 308 right.splitR(key) … … 294 311 end 295 312 296 join(r: TreapNode): TreapNode = r.joinNE(self)297 313 joinNE(l: NonEmpty): NonEmpty = 298 if hk0 > l.hkthen299 Node(l.join(left), hk0, k0, v0, right)314 if w0 > l.w then 315 Node(l.join(left), w0, k0, v0, right) 300 316 else 301 317 l.joinNEH(self) 302 318 end 303 319 joinNEH(r: NonEmpty): NonEmpty = 304 Node(left, hk0, k0, v0, right.join(r)) 305 306 combine(c: CombiningOp, r: TreapNode): TreapNode = 307 r.combineNE(self,c) 320 Node(left, w0, k0, v0, right.join(r)) 321 308 322 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 309 if hk0 < l.hk then 310 l.combineNEH(c,self) 311 else 323 if w0 > l.w then 312 324 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0)) 313 325 lt.combine(c,left).join(m.combineRootR(c, self.root)).join(rt.combine(c,right)) 326 else 327 l.combineNEH(c,self) 314 328 end 315 329 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode = do … … 317 331 left.combine(c,lt).join(m.combineRootL(self.root, c)).join(right.combine(c,rt)) 318 332 end 319 320 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self.root)321 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self.root,rr)322 323 rootKey(defaultKey: ZZ32): ZZ32 = k0324 rootValue(defaultValue: String): String = v0325 333 end 326 334 327 335 trait CombiningOp 328 leftEmpty(right: TreapNode): TreapNode329 rightEmpty(left: TreapNode): TreapNode336 rightAlone(right: TreapNode): TreapNode 337 leftAlone(left: TreapNode): TreapNode 330 338 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode 331 339 end 332 340 333 341 object UnionOp extends CombiningOp 334 leftEmpty(right: TreapNode): TreapNode = right335 rightEmpty(left: TreapNode): TreapNode = left342 rightAlone(right: TreapNode): TreapNode = right 343 leftAlone(left: TreapNode): TreapNode = left 336 344 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 337 345 end 338 346 339 347 object IntersectionOp extends CombiningOp 340 leftEmpty(right: TreapNode): TreapNode = Empty341 rightEmpty(left: TreapNode): TreapNode = Empty348 rightAlone(right: TreapNode): TreapNode = Empty 349 leftAlone(left: TreapNode): TreapNode = Empty 342 350 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 343 351 end 344 352 345 353 object DifferenceOp extends CombiningOp 346 leftEmpty(right: TreapNode): TreapNode = Empty347 rightEmpty(left: TreapNode): TreapNode = left354 rightAlone(right: TreapNode): TreapNode = Empty 355 leftAlone(left: TreapNode): TreapNode = left 348 356 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 349 357 end 350 358 351 359 object SymdiffOp extends CombiningOp 352 leftEmpty(right: TreapNode): TreapNode = right353 rightEmpty(left: TreapNode): TreapNode = left360 rightAlone(right: TreapNode): TreapNode = right 361 leftAlone(left: TreapNode): TreapNode = left 354 362 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 355 363 end -
trunk/ProjectFortress/src/com/sun/fortress/compiler/codegen/CodeGen.java
r4315 r4318 524 524 private void doStatements(List<Expr> stmts) { 525 525 int onStack = 0; 526 if (stmts.isEmpty()) { 527 pushVoid(); 528 return; 529 } 526 530 for ( Expr e : stmts ) { 527 531 popAll(onStack); … … 555 559 inABlock=oldInABlock; 556 560 } 561 557 562 public void forChainExpr(ChainExpr x) { 558 563 debug( "forChainExpr", x); … … 651 656 652 657 dumpClass( packageAndClassName ); 653 658 654 659 try { 655 660 jos.close(); … … 2410 2415 Type receiverType = exprType(obj); 2411 2416 if (!(receiverType instanceof TraitType)) { 2412 sayWhat(x, "receiver type is not TraitType in " + x);2417 sayWhat(x, "receiver type "+receiverType+" is not TraitType in " + x); 2413 2418 } 2414 2419 … … 2482 2487 public void for_RewriteFnApp(_RewriteFnApp x) { 2483 2488 debug("for_RewriteFnApp ", x, 2484 " args = ", x.getArgument(), " function = ", x.getFunction(), 2489 " args = ", x.getArgument(), " function = ", x.getFunction(), 2485 2490 " function class = ", x.getFunction()); 2486 2491 // This is a little weird. If a function takes no arguments the parser gives me a void literal expr -
trunk/ProjectFortress/src/com/sun/fortress/scala_src/typechecker/AbstractMethodChecker.scala
r4309 r4318 74 74 val inherited = inheritedMethods(traits, extendsC, Set(), typeAnalyzer) 75 75 .map(t => t._1.asInstanceOf[IdOrOp].getText) 76 for ( d <- decls ; if d.isInstanceOf[FnDecl] ) { 77 if ( NU.isFunctionalMethod(NU.getParams(d.asInstanceOf[FnDecl])) && 78 ! inherited.exists(NU.getName(d.asInstanceOf[FnDecl]).asInstanceOf[IdOrOp].getText.equals(_)) ) 79 error(span, "Object expressions should not define any new " + 80 "functional methods.") 81 } 76 for { 77 d <- decls; 78 if d.isInstanceOf[FnDecl]; 79 if NU.isFunctionalMethod(NU.getParams(d.asInstanceOf[FnDecl])); 80 if !inherited.exists(NU.getName(d.asInstanceOf[FnDecl]).asInstanceOf[IdOrOp] 81 .getText.equals(_)) 82 } error(span, "Object expressions should not define any new " + 83 "functional methods.") 82 84 83 85 case _ => super.walk(node) … … 95 97 typeAnalyzer = typeAnalyzer.extend(sparams, None) 96 98 val toCheck = inheritedAbstractMethods(extendsC) 97 for ( (owner, d) <- toCheck ) { 98 if ( ! implement(d, decls, owner) ) { 99 for ( (owner, d) <- toCheck; if (!implement(d, decls, owner)) ) { 99 100 error(span, 100 101 "The inherited abstract method " + d + " from the trait " + owner + 101 102 "\n in the object " + name + 102 103 " is not defined in the component " + componentName + ".") 103 }104 104 } 105 105 typeAnalyzer = oldTypeAnalyzer … … 129 129 private def collectAbstractMethods(name: IdOrOp, decls: List[Decl]) = { 130 130 val set = new HashSet[FnDecl] 131 decls.foreach( (d: Decl) => d match { 132 case fd@SFnDecl(_,SFnHeader(_,mods,_,_,_,_,_,_),_,body,_) => 133 if ( component.typeConses.containsKey(name) ) { 134 if ( ! body.isDefined ) set += fd 135 } else if ( mods.isAbstract ) set += fd 136 case _ => }) 131 for ( fd@SFnDecl(_,SFnHeader(_,mods,_,_,_,_,_,_),_,body,_) <- decls ) { 132 if ( component.typeConses.containsKey(name) ) { 133 if ( ! body.isDefined ) set += fd 134 } else if ( mods.isAbstract ) set += fd 135 } 137 136 set 138 137 }

