Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge master into jasonmay/interpreter-oo (with inc/dec test fixes)
Conflicts:
	src/test/scala/org/moe/interpreter/IncrementDecrementNodeTestSuite.scala
  • Loading branch information
jasonmay committed Feb 12, 2013
2 parents 4876f0a + 1d7c2e7 commit d3e7def
Show file tree
Hide file tree
Showing 7 changed files with 238 additions and 20 deletions.
4 changes: 2 additions & 2 deletions src/main/scala/org/moe/ast/AST.scala
Expand Up @@ -38,8 +38,8 @@ case class RangeLiteralNode(start: AST, end: AST) extends AST

// unary operators

case class IncrementNode(receiver: AST) extends AST
case class DecrementNode(receiver: AST) extends AST
case class IncrementNode(receiver: AST, is_prefix: Boolean = false) extends AST
case class DecrementNode(receiver: AST, is_prefix: Boolean = false) extends AST
case class NotNode(receiver: AST) extends AST


Expand Down
7 changes: 4 additions & 3 deletions src/main/scala/org/moe/ast/Serializer.scala
Expand Up @@ -41,9 +41,10 @@ object Serializer {
)
)

case IncrementNode(receiver) => JSONObject(Map("IncrementNode" -> toJSON(receiver)))
case DecrementNode(receiver) => JSONObject(Map("DecrementNode" -> toJSON(receiver)))
case NotNode(receiver) => JSONObject(Map("NotNode" -> toJSON(receiver)))
// TODO we should probably be storing the "is_prefix" in the serialized JSON (not sure how to do that)
case IncrementNode(receiver, is_prefix) => JSONObject(Map("IncrementNode" -> toJSON(receiver)))
case DecrementNode(receiver, is_prefix) => JSONObject(Map("DecrementNode" -> toJSON(receiver)))
case NotNode(receiver) => JSONObject(Map("NotNode" -> toJSON(receiver)))

case AndNode(lhs, rhs) => JSONObject(
Map(
Expand Down
20 changes: 14 additions & 6 deletions src/main/scala/org/moe/interpreter/Interpreter.scala
Expand Up @@ -121,27 +121,35 @@ class Interpreter {

// unary operators

case IncrementNode(receiver: AST) => receiver match {
case IncrementNode(receiver: AST, is_prefix) => receiver match {
case VariableAccessNode(varName) => env.get(varName).getOrElse(
throw new MoeErrors.VariableNotFound(varName)
) match {
case i: MoeIntObject => {
env.set(varName, runtime.NativeObjects.getInt(i.getNativeValue + 1)).get
val new_i = runtime.NativeObjects.getInt(i.getNativeValue + 1)
env.set(varName, new_i)
if (is_prefix) new_i else i
}
case n: MoeFloatObject => {
env.set(varName, runtime.NativeObjects.getFloat(n.getNativeValue + 1.0)).get
val new_n = runtime.NativeObjects.getFloat(n.getNativeValue + 1.0)
env.set(varName, new_n)
if (is_prefix) new_n else n
}
}
}
case DecrementNode(receiver: AST) => receiver match {
case DecrementNode(receiver: AST, is_prefix) => receiver match {
case VariableAccessNode(varName) => env.get(varName).getOrElse(
throw new MoeErrors.VariableNotFound(varName)
) match {
case i: MoeIntObject => {
env.set(varName, runtime.NativeObjects.getInt(i.getNativeValue - 1)).get
val new_i = runtime.NativeObjects.getInt(i.getNativeValue - 1)
env.set(varName, new_i)
if (is_prefix) new_i else i
}
case n: MoeFloatObject => {
env.set(varName, runtime.NativeObjects.getFloat(n.getNativeValue - 1.0)).get
val new_n = runtime.NativeObjects.getFloat(n.getNativeValue - 1.0)
env.set(varName, new_n)
if (is_prefix) new_n else n
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/org/moe/interpreter/InterpreterUtils.scala
Expand Up @@ -44,8 +44,8 @@ object InterpreterUtils {
case ArrayLiteralNode(values) => values.foreach(walkAST(_, callback))
case HashLiteralNode(map) => map.foreach(walkAST(_, callback))

case IncrementNode(receiver) => walkAST(receiver, callback)
case DecrementNode(receiver) => walkAST(receiver, callback)
case IncrementNode(receiver, _) => walkAST(receiver, callback)
case DecrementNode(receiver, _) => walkAST(receiver, callback)
case NotNode(receiver) => walkAST(receiver, callback)

case AndNode(lhs, rhs) => {
Expand Down
25 changes: 25 additions & 0 deletions src/main/scala/org/moe/runtime/MoeClass.scala
Expand Up @@ -17,6 +17,9 @@ class MoeClass(
private var superclass: Option[MoeClass] = None
) extends MoeObject {

private var constructor: Option[MoeMethod] = None // BUILD
private var destructor: Option[MoeMethod] = None // DEMOLISH

private val methods: Map[String,MoeMethod] = new HashMap[String, MoeMethod]()
private val attributes: Map[String,MoeAttribute] = new HashMap[String, MoeAttribute]()

Expand Down Expand Up @@ -61,6 +64,28 @@ class MoeClass(
s => this :: s.getMRO
).getOrElse(List(this))

// Constructor

def getConstructor: Option[MoeMethod] = constructor

def setContructor(c: Option[MoeMethod]) = constructor = c

/**
* TODO: add a BUILDALL style method that
* walks the MRO and calls all constructors
*/

// Destructor

def getDestructor: Option[MoeMethod] = destructor

def setDestructor(d: Option[MoeMethod]) = destructor = d

/**
* TODO: add a DEMOLISHALL style method that
* walks the MRO and calls all destructors
*/

// Attributes

/**
Expand Down
Expand Up @@ -7,7 +7,23 @@ import org.moe.ast._

class IncrementDecrementNodeTestSuite extends FunSuite with InterpreterTestUtils {

test("... basic test with variable increment") {
// integer post-increment tests
test("... basic test with variable post-increment") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
IncrementNode(VariableAccessNode("$foo")),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 43)
}

test("... variable post-increment return value") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
Expand All @@ -18,10 +34,56 @@ class IncrementDecrementNodeTestSuite extends FunSuite with InterpreterTestUtils
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 42)
}

// integer pre-increment tests
test("... basic test with variable pre-increment") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
IncrementNode(VariableAccessNode("$foo"), true),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 43)
}

test("... variable pre-increment return value") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
IncrementNode(VariableAccessNode("$foo"),true)
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 43)
}

test("... basic test with variable increment (float)") {
// float post-increment tests
test("... basic test with variable post-increment (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
IncrementNode(VariableAccessNode("$foo")),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 99.6)
}

test("... variable post-increment return value (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
Expand All @@ -32,10 +94,56 @@ class IncrementDecrementNodeTestSuite extends FunSuite with InterpreterTestUtils
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 98.6)
}

// float pre-increment tests
test("... basic test with variable pre-increment (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
IncrementNode(VariableAccessNode("$foo"), true),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 99.6)
}

test("... variable pre-increment return value (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
IncrementNode(VariableAccessNode("$foo"), true)
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 99.6)
}

test("... basic test with variable decrement") {
// integer post-decrement tests
test("... basic test with variable post-decrement") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
DecrementNode(VariableAccessNode("$foo")),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 41)
}

test("... variable post-decrement return value") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
Expand All @@ -46,10 +154,56 @@ class IncrementDecrementNodeTestSuite extends FunSuite with InterpreterTestUtils
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 42)
}

// integer pre-decrement tests
test("... basic test with variable pre-decrement") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
DecrementNode(VariableAccessNode("$foo"), true),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 41)
}

test("... variable pre-decrement return value") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
IntLiteralNode(42)
),
DecrementNode(VariableAccessNode("$foo"),true)
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 41)
}

test("... basic test with variable decrement (float)") {
// float post-decrement tests
test("... basic test with variable post-decrement (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
DecrementNode(VariableAccessNode("$foo")),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 97.6)
}

test("... variable post-decrement return value (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
Expand All @@ -60,6 +214,36 @@ class IncrementDecrementNodeTestSuite extends FunSuite with InterpreterTestUtils
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 98.6)
}

// float pre-decrement tests
test("... basic test with variable pre-decrement (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
DecrementNode(VariableAccessNode("$foo"), true),
VariableAccessNode("$foo")
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 97.6)
}

test("... variable pre-decrement return value (float)") {
val ast = wrapSimpleAST(
List(
VariableDeclarationNode(
"$foo",
FloatLiteralNode(98.6)
),
DecrementNode(VariableAccessNode("$foo"), true)
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeFloatObject].getNativeValue === 97.6)
}

Expand Down
Expand Up @@ -113,7 +113,7 @@ class SubroutineNodeTestSuite extends FunSuite with InterpreterTestUtils {
List(),
StatementsNode(
List(
IncrementNode(VariableAccessNode("$n"))
IncrementNode(VariableAccessNode("$n"), true)
)
)
)
Expand Down Expand Up @@ -194,11 +194,11 @@ class SubroutineNodeTestSuite extends FunSuite with InterpreterTestUtils {
List("$a"),
StatementsNode(
List(
IncrementNode(VariableAccessNode("$a"))
IncrementNode(VariableAccessNode("$a"), true)
)
)
),
IncrementNode(VariableAccessNode("$a"))
IncrementNode(VariableAccessNode("$a"), true)
)
)
),
Expand Down

0 comments on commit d3e7def

Please sign in to comment.