[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnetlib/JScript/Nodes JExpr.tc,1.3,1.4 JNode
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnetlib/JScript/Nodes JExpr.tc,1.3,1.4 JNode.tc,1.1,1.2 |
Date: |
Fri, 17 Jan 2003 01:34:50 -0500 |
Update of /cvsroot/dotgnu-pnet/pnetlib/JScript/Nodes
In directory subversions:/tmp/cvs-serv29381/JScript/Nodes
Modified Files:
JExpr.tc JNode.tc
Log Message:
Implement evaluation logic for JScript expressions.
Index: JExpr.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/JScript/Nodes/JExpr.tc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** JExpr.tc 14 Jan 2003 12:37:36 -0000 1.3
--- JExpr.tc 17 Jan 2003 06:34:47 -0000 1.4
***************
*** 81,86 ****
Eval(JSuper)
{
! // TODO
! return null;
}
--- 81,94 ----
Eval(JSuper)
{
! IActivationObject act =
! (engine.ScriptObjectStackTop() as IActivationObject);
! if(act != null)
! {
! return act.GetDefaultThisObject();
! }
! else
! {
! return DBNull.Value;
! }
}
***************
*** 88,93 ****
Eval(JIdentifier)
{
! // TODO
! return null;
}
--- 96,149 ----
Eval(JIdentifier)
{
! IVariableAccess scope = (engine.ScriptObjectStackTop() as
IVariableAccess);
! while(scope != null)
! {
! if(scope.HasVariable(name))
! {
! return scope.GetVariable(name);
! }
! scope = scope.GetParentScope();
! }
! return ((IVariableAccess)(engine.GetMainScope())).GetVariable(name);
! }
!
! // Prepare for a store into an identifier.
! Prepare(JIdentifier)
! {
! IVariableAccess scope = (engine.ScriptObjectStackTop() as
IVariableAccess);
! while(scope != null)
! {
! if(scope.HasVariable(name))
! {
! data1 = scope;
! return;
! }
! scope = scope.GetParentScope();
! }
! data1 = engine.GetMainScope();
! }
!
! // Get and prepare for a store into an identifier.
! GetAndPrepare(JIdentifier)
! {
! IVariableAccess scope = (engine.ScriptObjectStackTop() as
IVariableAccess);
! while(scope != null)
! {
! if(scope.HasVariable(name))
! {
! data1 = scope;
! return scope.GetVariable(name);
! }
! scope = scope.GetParentScope();
! }
! scope = (IVariableAccess)(engine.GetMainScope());
! data1 = scope;
! return scope.GetVariable(name);
! }
!
! // Store into an identifier in the current execution context.
! Store(JIdentifier)
! {
! ((IVariableAccess)data1).SetVariable(name, value);
}
***************
*** 127,131 ****
value1 = expr1.GetAndPrepare(engine, ref data1, ref data2);
value2 = expr2.Eval(engine);
! // TODO: compute "value1 op value2".
expr1.Store(engine, data1, data2, value1);
return value1;
--- 183,266 ----
value1 = expr1.GetAndPrepare(engine, ref data1, ref data2);
value2 = expr2.Eval(engine);
! value1 = Convert.ToPrimitive(value1, DefaultValueHint.None);
! value2 = Convert.ToPrimitive(value2, DefaultValueHint.None);
! switch(oper)
! {
! case JSToken.Plus:
! {
! if(value1 is String || value2 is String)
! {
! value1 = ((String)value1) + ((String)value2);
! }
! else
! {
! value1 = Convert.ToNumber(value1) +
Convert.ToNumber(value2);
! }
! }
! break;
!
! case JSToken.Minus:
! {
! value1 = Convert.ToNumber(value1) -
Convert.ToNumber(value2);
! }
! break;
!
! case JSToken.Multiply:
! {
! value1 = Convert.ToNumber(value1) *
Convert.ToNumber(value2);
! }
! break;
!
! case JSToken.Divide:
! {
! value1 = Convert.ToNumber(value1) /
Convert.ToNumber(value2);
! }
! break;
!
! case JSToken.Modulo:
! {
! value1 = Convert.ToNumber(value1) %
Convert.ToNumber(value2);
! }
! break;
!
! case JSToken.BitwiseOr:
! {
! value1 = Convert.ToInt32(value1) |
Convert.ToInt32(value2);
! }
! break;
!
! case JSToken.BitwiseXor:
! {
! value1 = Convert.ToInt32(value1) ^
Convert.ToInt32(value2);
! }
! break;
!
! case JSToken.BitwiseAnd:
! {
! value1 = Convert.ToInt32(value1) &
Convert.ToInt32(value2);
! }
! break;
!
! case JSToken.LeftShift:
! {
! value1 = Convert.ToInt32(value1) <<
! (int)(Convert.ToUInt32(value2) & 0x1F);
! }
! break;
!
! case JSToken.RightShift:
! {
! value1 = Convert.ToInt32(value1) >>
! (int)(Convert.ToUInt32(value2) & 0x1F);
! }
! break;
!
! case JSToken.UnsignedRightShift:
! {
! value1 = Convert.ToUInt32(value1) >>
! (int)(Convert.ToUInt32(value2) & 0x1F);
! }
! break;
! }
expr1.Store(engine, data1, data2, value1);
return value1;
***************
*** 177,182 ****
Eval(JBitwiseOr)
{
! // TODO
! return null;
}
--- 312,317 ----
Eval(JBitwiseOr)
{
! return Convert.ToInt32(expr1.Eval(engine)) |
! Convert.ToInt32(expr2.Eval(engine));
}
***************
*** 184,189 ****
Eval(JBitwiseXor)
{
! // TODO
! return null;
}
--- 319,324 ----
Eval(JBitwiseXor)
{
! return Convert.ToInt32(expr1.Eval(engine)) ^
! Convert.ToInt32(expr2.Eval(engine));
}
***************
*** 191,196 ****
Eval(JBitwiseAnd)
{
! // TODO
! return null;
}
--- 326,331 ----
Eval(JBitwiseAnd)
{
! return Convert.ToInt32(expr1.Eval(engine)) &
! Convert.ToInt32(expr2.Eval(engine));
}
***************
*** 198,203 ****
Eval(JEq)
{
! // TODO
! return null;
}
--- 333,337 ----
Eval(JEq)
{
! return Equality.JScriptEquals(expr1.Eval(engine), expr2.Eval(engine));
}
***************
*** 205,210 ****
Eval(JNe)
{
! // TODO
! return null;
}
--- 339,343 ----
Eval(JNe)
{
! return !Equality.JScriptEquals(expr1.Eval(engine), expr2.Eval(engine));
}
***************
*** 212,217 ****
Eval(JStrictEq)
{
! // TODO
! return null;
}
--- 345,350 ----
Eval(JStrictEq)
{
! return StrictEquality.JScriptStrictEquals
! (expr1.Eval(engine), expr2.Eval(engine));
}
***************
*** 219,224 ****
Eval(JStrictNe)
{
! // TODO
! return null;
}
--- 352,357 ----
Eval(JStrictNe)
{
! return !StrictEquality.JScriptStrictEquals
! (expr1.Eval(engine), expr2.Eval(engine));
}
***************
*** 226,231 ****
Eval(JLt)
{
! // TODO
! return null;
}
--- 359,374 ----
Eval(JLt)
{
! Object value1 = Convert.ToPrimitive(expr1.Eval(engine),
!
DefaultValueHint.Number);
! Object value2 = Convert.ToPrimitive(expr2.Eval(engine),
!
DefaultValueHint.Number);
! if(value1 is String && value2 is String)
! {
! return (String.CompareOrdinal((String)value1, (String)value2) <
0);
! }
! else
! {
! return (Convert.ToNumber(value1) < Convert.ToNumber(value2));
! }
}
***************
*** 233,238 ****
Eval(JLe)
{
! // TODO
! return null;
}
--- 376,391 ----
Eval(JLe)
{
! Object value1 = Convert.ToPrimitive(expr1.Eval(engine),
!
DefaultValueHint.Number);
! Object value2 = Convert.ToPrimitive(expr2.Eval(engine),
!
DefaultValueHint.Number);
! if(value1 is String && value2 is String)
! {
! return (String.CompareOrdinal((String)value1, (String)value2)
<= 0);
! }
! else
! {
! return (Convert.ToNumber(value1) <= Convert.ToNumber(value2));
! }
}
***************
*** 240,245 ****
Eval(JGt)
{
! // TODO
! return null;
}
--- 393,408 ----
Eval(JGt)
{
! Object value1 = Convert.ToPrimitive(expr1.Eval(engine),
!
DefaultValueHint.Number);
! Object value2 = Convert.ToPrimitive(expr2.Eval(engine),
!
DefaultValueHint.Number);
! if(value1 is String && value2 is String)
! {
! return (String.CompareOrdinal((String)value1, (String)value2) >
0);
! }
! else
! {
! return (Convert.ToNumber(value1) > Convert.ToNumber(value2));
! }
}
***************
*** 247,252 ****
Eval(JGe)
{
! // TODO
! return null;
}
--- 410,425 ----
Eval(JGe)
{
! Object value1 = Convert.ToPrimitive(expr1.Eval(engine),
!
DefaultValueHint.Number);
! Object value2 = Convert.ToPrimitive(expr2.Eval(engine),
!
DefaultValueHint.Number);
! if(value1 is String && value2 is String)
! {
! return (String.CompareOrdinal((String)value1, (String)value2)
>= 0);
! }
! else
! {
! return (Convert.ToNumber(value1) >= Convert.ToNumber(value2));
! }
}
***************
*** 254,259 ****
Eval(JInstanceof)
{
! // TODO
! return null;
}
--- 427,437 ----
Eval(JInstanceof)
{
! Object value1 = expr1.Eval(engine);
! Object value2 = expr2.Eval(engine);
! if(!(value2 is ScriptFunction))
! {
! throw new JScriptException(JSError.FunctionExpected);
! }
! return ((ScriptFunction)value2).HasInstance(value1);
}
***************
*** 261,266 ****
Eval(JIn)
{
! // TODO
! return null;
}
--- 439,443 ----
Eval(JIn)
{
! return In.JScriptIn(expr1.Eval(engine), expr2.Eval(engine));
}
***************
*** 268,273 ****
Eval(JShl)
{
! // TODO
! return null;
}
--- 445,450 ----
Eval(JShl)
{
! return Convert.ToInt32(expr1.Eval(engine)) <<
! (int)(Convert.ToUInt32(expr2.Eval(engine)) & 0x1F);
}
***************
*** 275,280 ****
Eval(JShr)
{
! // TODO
! return null;
}
--- 452,457 ----
Eval(JShr)
{
! return Convert.ToInt32(expr1.Eval(engine)) >>
! (int)(Convert.ToUInt32(expr2.Eval(engine)) & 0x1F);
}
***************
*** 282,287 ****
Eval(JUShr)
{
! // TODO
! return null;
}
--- 459,464 ----
Eval(JUShr)
{
! return Convert.ToUInt32(expr1.Eval(engine)) >>
! (int)(Convert.ToUInt32(expr2.Eval(engine)) & 0x1F);
}
***************
*** 289,294 ****
Eval(JAdd)
{
! // TODO
! return null;
}
--- 466,481 ----
Eval(JAdd)
{
! Object value1 = Convert.ToPrimitive(expr1.Eval(engine),
!
DefaultValueHint.None);
! Object value2 = Convert.ToPrimitive(expr2.Eval(engine),
!
DefaultValueHint.None);
! if(value1 is String || value2 is String)
! {
! return ((String)value1) + ((String)value2);
! }
! else
! {
! return Convert.ToNumber(value1) + Convert.ToNumber(value2);
! }
}
***************
*** 296,301 ****
Eval(JSub)
{
! // TODO
! return null;
}
--- 483,488 ----
Eval(JSub)
{
! return Convert.ToNumber(expr1.Eval(engine)) -
! Convert.ToNumber(expr2.Eval(engine));
}
***************
*** 303,308 ****
Eval(JMul)
{
! // TODO
! return null;
}
--- 490,495 ----
Eval(JMul)
{
! return Convert.ToNumber(expr1.Eval(engine)) *
! Convert.ToNumber(expr2.Eval(engine));
}
***************
*** 310,315 ****
Eval(JDiv)
{
! // TODO
! return null;
}
--- 497,502 ----
Eval(JDiv)
{
! return Convert.ToNumber(expr1.Eval(engine)) /
! Convert.ToNumber(expr2.Eval(engine));
}
***************
*** 317,322 ****
Eval(JRem)
{
! // TODO
! return null;
}
--- 504,509 ----
Eval(JRem)
{
! return Convert.ToNumber(expr1.Eval(engine)) %
! Convert.ToNumber(expr2.Eval(engine));
}
***************
*** 324,329 ****
Eval(JNeg)
{
! // TODO
! return null;
}
--- 511,515 ----
Eval(JNeg)
{
! return -(Convert.ToNumber(expr.Eval(engine)));
}
***************
*** 331,336 ****
Eval(JUnaryPlus)
{
! // TODO
! return null;
}
--- 517,521 ----
Eval(JUnaryPlus)
{
! return Convert.ToNumber(expr.Eval(engine));
}
***************
*** 338,343 ****
Eval(JDelete)
{
! // TODO
! return null;
}
--- 523,546 ----
Eval(JDelete)
{
! if(expr is JFieldAccess)
! {
! // Must be a "JFieldAccess" to make sense.
! Object thisob = Convert.ToObject
! (((JFieldAccess)expr).Eval(engine), engine);
! if(thisob is ScriptObject)
! {
! return
((ScriptObject)thisob).Delete(((JFieldAccess)expr).name);
! }
! else
! {
! return true;
! }
! }
! else
! {
! // Evaluate expr for its side-effects only.
! expr.Eval(engine);
! return true;
! }
}
***************
*** 359,364 ****
Eval(JPreInc)
{
! // TODO
! return null;
}
--- 562,571 ----
Eval(JPreInc)
{
! Object data1 = null;
! Object data2 = null;
! Object value = expr.GetAndPrepare(engine, ref data1, ref data2);
! value = Convert.ToNumber(value) + 1.0;
! expr.Store(engine, data1, data2, value);
! return value;
}
***************
*** 366,371 ****
Eval(JPreDec)
{
! // TODO
! return null;
}
--- 573,582 ----
Eval(JPreDec)
{
! Object data1 = null;
! Object data2 = null;
! Object value = expr.GetAndPrepare(engine, ref data1, ref data2);
! value = Convert.ToNumber(value) - 1.0;
! expr.Store(engine, data1, data2, value);
! return value;
}
***************
*** 373,378 ****
Eval(JPostInc)
{
! // TODO
! return null;
}
--- 584,593 ----
Eval(JPostInc)
{
! Object data1 = null;
! Object data2 = null;
! Object value = expr.GetAndPrepare(engine, ref data1, ref data2);
! double value2 = Convert.ToNumber(value);
! expr.Store(engine, data1, data2, value2 + 1.0);
! return value2;
}
***************
*** 380,385 ****
Eval(JPostDec)
{
! // TODO
! return null;
}
--- 595,604 ----
Eval(JPostDec)
{
! Object data1 = null;
! Object data2 = null;
! Object value = expr.GetAndPrepare(engine, ref data1, ref data2);
! double value2 = Convert.ToNumber(value);
! expr.Store(engine, data1, data2, value2 - 1.0);
! return value2;
}
***************
*** 387,392 ****
Eval(JBitwiseNot)
{
! // TODO
! return null;
}
--- 606,610 ----
Eval(JBitwiseNot)
{
! return ~(Convert.ToInt32(expr.Eval(engine)));
}
***************
*** 407,412 ****
Eval(JNew)
{
! // TODO
! return null;
}
--- 625,643 ----
Eval(JNew)
{
! // Evaluate the constructor.
! Object constructor;
! constructor = expr1.Eval(engine);
!
! // Evaluate the arguments.
! Object[] args = Support.EvalArgList(expr2, engine);
!
! // Bail out if the constructor object is invalid.
! if(!(constructor is ScriptFunction))
! {
! throw new JScriptException(JSError.FunctionExpected,
this.context);
! }
!
! // Call the constructor.
! return ((ScriptFunction)constructor).Construct(args);
}
***************
*** 414,419 ****
Eval(JArrayAccess)
{
! // TODO
! return null;
}
--- 645,766 ----
Eval(JArrayAccess)
{
! Object thisob = Convert.ToObject(expr1.Eval(engine), engine);
! Object value = expr2.Eval(engine);
! if(thisob is ScriptObject)
! {
! // Try to handle special cases to make array accesses more
efficient.
! if(value is int)
! {
! return ((ScriptObject)thisob)[(int)value];
! }
! else if(value is double)
! {
! return ((ScriptObject)thisob)[(double)value];
! }
! else if(value is String)
! {
! return ((ScriptObject)thisob)[(String)value];
! }
! else
! {
! return ((ScriptObject)thisob)[value];
! }
! }
! else if(thisob is Array)
! {
! // Get the element from an underlying CLI array.
! return ((Array)thisob).GetValue(Convert.ToInt32(value));
! }
! else if(thisob is IDictionary)
! {
! // Get the element from an underlying CLI dictionary.
! return ((IDictionary)thisob)[value];
! }
! else
! {
! return null;
! }
! }
!
! // Prepare for an array store operation.
! Prepare(JArrayAccess)
! {
! data1 = Convert.ToObject(expr1.Eval(engine), engine);
! data2 = expr2.Eval(engine);
! }
!
! // Get and prepare for an array store operation.
! GetAndPrepare(JArrayAccess)
! {
! data1 = Convert.ToObject(expr1.Eval(engine), engine);
! data2 = expr2.Eval(engine);
! if(data1 is ScriptObject)
! {
! // Try to handle special cases to make array accesses more
efficient.
! if(data2 is int)
! {
! return ((ScriptObject)data1)[(int)data2];
! }
! else if(data2 is double)
! {
! return ((ScriptObject)data1)[(double)data2];
! }
! else if(data2 is String)
! {
! return ((ScriptObject)data1)[(String)data2];
! }
! else
! {
! return ((ScriptObject)data1)[data2];
! }
! }
! else if(data1 is Array)
! {
! // Get the element from an underlying CLI array.
! return ((Array)data1).GetValue(Convert.ToInt32(data2));
! }
! else if(data1 is IDictionary)
! {
! // Get the element from an underlying CLI dictionary.
! return ((IDictionary)data1)[data2];
! }
! else
! {
! return null;
! }
! }
!
! // Perform an array store operation.
! Store(JArrayAccess)
! {
! if(data1 is ScriptObject)
! {
! if(data2 is int)
! {
! ((ScriptObject)data1)[(int)data2] = value;
! }
! else if(data2 is double)
! {
! ((ScriptObject)data1)[(double)data2] = value;
! }
! else if(data2 is String)
! {
! ((ScriptObject)data1)[(String)data2] = value;
! }
! else
! {
! ((ScriptObject)data1)[data2] = value;
! }
! }
! else if(data1 is Array)
! {
! // Store the element into an underlying CLI array.
! ((Array)data1).SetValue(value, Convert.ToInt32(data2));
! }
! else if(data1 is IDictionary)
! {
! // Store the element into an underlying CLI dictionary.
! ((IDictionary)data1)[data2] = value;
! }
}
***************
*** 421,426 ****
Eval(JFieldAccess)
{
! // TODO
! return null;
}
--- 768,809 ----
Eval(JFieldAccess)
{
! Object thisob = Convert.ToObject(expr.Eval(engine), engine);
! if(thisob is ScriptObject)
! {
! return ((ScriptObject)thisob)[name];
! }
! else
! {
! return null;
! }
! }
!
! // Prepare to store into a field access.
! Prepare(JFieldAccess)
! {
! data1 = Convert.ToObject(expr.Eval(engine), engine);
! }
!
! // Get and prepare to store into a field access.
! GetAndPrepare(JFieldAccess)
! {
! data1 = Convert.ToObject(expr.Eval(engine), engine);
! if(data1 is ScriptObject)
! {
! return ((ScriptObject)data1)[name];
! }
! else
! {
! return null;
! }
! }
!
! // Store into a field access.
! Store(JFieldAccess)
! {
! if(data1 is ScriptObject)
! {
! ((ScriptObject)data1)[name] = value;
! }
}
***************
*** 428,433 ****
Eval(JCall)
{
! // TODO
! return null;
}
--- 811,847 ----
Eval(JCall)
{
! // Evaluate the function and the "this" object.
! Object thisob;
! Object func;
! if(expr1 is JFieldAccess)
! {
! thisob = Convert.ToObject
! (((JFieldAccess)expr1).expr.Eval(engine), engine);
! if(thisob is ScriptObject)
! {
! func =
((ScriptObject)thisob).Get(((JFieldAccess)expr1).name);
! }
! else
! {
! func = null;
! }
! }
! else
! {
! thisob = null;
! func = expr1.Eval(engine);
! }
!
! // Evaluate the arguments.
! Object[] args = Support.EvalArgList(expr2, engine);
!
! // Bail out if the function object is invalid.
! if(!(func is ScriptFunction))
! {
! throw new JScriptException(JSError.FunctionExpected,
this.context);
! }
!
! // Call the function.
! return ((ScriptFunction)func).Call(thisob, args);
}
***************
*** 435,439 ****
Eval(JArgList)
{
! // TODO
return null;
}
--- 849,853 ----
Eval(JArgList)
{
! // Nothing to do here: handled by "Support.EvalArgList" instead.
return null;
}
Index: JNode.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/JScript/Nodes/JNode.tc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** JNode.tc 13 Jan 2003 10:53:20 -0000 1.1
--- JNode.tc 17 Jan 2003 06:34:47 -0000 1.2
***************
*** 22,25 ****
--- 22,26 ----
using Microsoft.JScript.Vsa;
using System.Reflection;
+ using System.Collections;
%}
***************
*** 286,290 ****
Eval(JScriptBlock)
{
! // TODO: declare the functions into the global scope.
// Execute the global statements within the block.
--- 287,296 ----
Eval(JScriptBlock)
{
! // Declare the functions into the global scope. We do this by
! // evaluating them - JFunction.Eval does the rest.
! if(functions != null)
! {
! functions.Eval(engine);
! }
// Execute the global statements within the block.
***************
*** 315,320 ****
Eval(JFunction)
{
! // TODO
! return null;
}
--- 321,337 ----
Eval(JFunction)
{
! // Get the scope to declare the function within.
! ScriptObject scope = engine.ScriptObjectStackTop();
!
! // Create a function object to wrap up this function.
! FunctionObject obj = new FunctionObject
!
(EngineInstance.GetEngineInstance(engine).GetFunctionPrototype(),
! this, scope);
!
! // Add the function to the scope.
! scope.Put(name, obj);
!
! // Nothing else to do.
! return Empty.Value;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnetlib/JScript/Nodes JExpr.tc,1.3,1.4 JNode.tc,1.1,1.2,
Rhys Weatherley <address@hidden> <=
- Prev by Date:
[Dotgnu-pnet-commits] CVS: pnetlib/JScript/Jsc Equality.cs,1.1,1.2 In.cs,1.1,1.2 StrictEquality.cs,1.1,1.2
- Next by Date:
[Dotgnu-pnet-commits] CVS: pnetlib/System.Xml XmlTextReader.cs,1.26,1.27
- Previous by thread:
[Dotgnu-pnet-commits] CVS: pnetlib/JScript/Jsc Equality.cs,1.1,1.2 In.cs,1.1,1.2 StrictEquality.cs,1.1,1.2
- Next by thread:
[Dotgnu-pnet-commits] CVS: pnetlib/System.Xml XmlTextReader.cs,1.26,1.27
- Index(es):