1 29 30 package com.caucho.quercus.program; 31 32 import com.caucho.quercus.Location; 33 import com.caucho.quercus.env.Env; 34 import com.caucho.quercus.env.Value; 35 import com.caucho.quercus.expr.Expr; 36 import com.caucho.util.L10N; 37 38 41 abstract public class AbstractFunction { 42 private static final L10N L = new L10N(AbstractFunction.class); 43 44 private static final Arg []NULL_ARGS = new Arg[0]; 45 private static final Value []NULL_ARG_VALUES = new Value[0]; 46 47 private final Location _location; 48 49 private boolean _isGlobal = true; 50 51 public AbstractFunction() 52 { 53 _location = Location.UNKNOWN; 55 } 56 57 public AbstractFunction(Location location) 58 { 59 _location = location; 60 } 61 62 public String getName() 63 { 64 return "unknown"; 65 } 66 67 70 public final boolean isGlobal() 71 { 72 return _isGlobal; 73 } 74 75 78 public boolean isAbstract() 79 { 80 return false; 81 } 82 83 public final Location getLocation() 84 { 85 return _location; 86 } 87 88 91 public final void setGlobal(boolean isGlobal) 92 { 93 _isGlobal = isGlobal; 94 } 95 96 99 public boolean isBoolean() 100 { 101 return false; 102 } 103 104 107 public boolean isString() 108 { 109 return false; 110 } 111 112 115 public boolean isLong() 116 { 117 return false; 118 } 119 120 123 public boolean isDouble() 124 { 125 return false; 126 } 127 128 131 public boolean isCallUsesVariableArgs() 132 { 133 return false; 134 } 135 136 139 public boolean isCallUsesSymbolTable() 140 { 141 return false; 142 } 143 144 147 public boolean isReturnsReference() 148 { 149 return true; 150 } 151 152 155 public Arg []getArgs() 156 { 157 return NULL_ARGS; 158 } 159 160 166 public Value []evalArguments(Env env, Expr fun, Expr []args) 167 { 168 Value[]values = new Value[args.length]; 169 170 for (int i = 0; i < args.length; i++) 171 values[i] = args[i].evalArg(env); 172 173 return values; 174 } 175 176 179 abstract public Value call(Env env, Value []args); 180 181 184 public Value callRef(Env env, Value []args) 185 { 186 return call(env, args); 187 } 188 189 192 public Value callCopy(Env env, Value []args) 193 { 194 return call(env, args).copyReturn(); 195 } 196 197 200 public Value callMethod(Env env, Value obj, Value []args) 201 { 202 Value oldThis = env.getThis(); 203 204 try { 205 if (obj != null) 206 env.setThis(obj); 207 208 return call(env, args); 209 } finally { 210 env.setThis(oldThis); 211 } 212 } 213 214 217 public Value callMethodRef(Env env, Value obj, Value []args) 218 { 219 Value oldThis = env.getThis(); 220 221 try { 222 env.setThis(obj); 223 224 return callRef(env, args); 225 } finally { 226 env.setThis(oldThis); 227 } 228 } 229 230 233 public Value call(Env env) 234 { 235 return call(env, NULL_ARG_VALUES); 236 } 237 238 241 public Value call(Env env, Value a1) 242 { 243 return call(env, new Value[] { a1 }); 244 } 245 246 249 public Value call(Env env, Value a1, Value a2) 250 { 251 return call(env, new Value[] { a1, a2 }); 252 } 253 254 257 public Value call(Env env, Value a1, Value a2, Value a3) 258 { 259 return call(env, new Value[] { a1, a2, a3 }); 260 } 261 262 265 public Value call(Env env, Value a1, Value a2, Value a3, Value a4) 266 { 267 return call(env, new Value[] { a1, a2, a3, a4 }); 268 } 269 270 273 public Value call(Env env, Value a1, Value a2, Value a3, Value a4, Value a5) 274 { 275 return call(env, new Value[] { a1, a2, a3, a4, a5 }); 276 } 277 278 281 public Value call(Env env, Expr []exprs) 282 { 283 Value []argValues = new Value[exprs.length]; 284 Arg []args = getArgs(); 285 286 for (int i = 0; i < exprs.length; i++) { 287 if (i < args.length && args[i].isReference()) 289 argValues[i] = exprs[i].evalArg(env); 290 else 291 argValues[i] = exprs[i].eval(env); 292 } 293 294 return call(env, argValues); 295 } 296 297 300 public Value callCopy(Env env, Expr []exprs) 301 { 302 return call(env, exprs).copy(); 303 } 304 305 308 public Value callRef(Env env) 309 { 310 return callRef(env, NULL_ARG_VALUES); 311 } 312 313 316 public Value callRef(Env env, Value a1) 317 { 318 return callRef(env, new Value[] { a1 }); 319 } 320 321 324 public Value callRef(Env env, Value a1, Value a2) 325 { 326 return callRef(env, new Value[] { a1, a2 }); 327 } 328 329 332 public Value callRef(Env env, Value a1, Value a2, Value a3) 333 { 334 return callRef(env, new Value[] { a1, a2, a3 }); 335 } 336 337 340 public Value callRef(Env env, Value a1, Value a2, Value a3, Value a4) 341 { 342 return callRef(env, new Value[] { a1, a2, a3, a4 }); 343 } 344 345 348 public Value callRef(Env env, 349 Value a1, Value a2, Value a3, Value a4, Value a5) 350 { 351 return callRef(env, new Value[] { a1, a2, a3, a4, a5 }); 352 } 353 354 357 public Value callRef(Env env, Expr []exprs) 358 { 359 Value []argValues = new Value[exprs.length]; 360 Arg []args = getArgs(); 361 362 for (int i = 0; i < exprs.length; i++) { 363 if (i < args.length && args[i].isReference()) 365 argValues[i] = exprs[i].evalArg(env); 366 else 367 argValues[i] = exprs[i].eval(env); 368 } 369 370 return callRef(env, argValues); 371 } 372 373 376 public Value callMethod(Env env, Value obj) 377 { 378 return callMethod(env, obj, NULL_ARG_VALUES); 379 } 380 381 384 public Value callMethod(Env env, Value obj, Value a1) 385 { 386 return callMethod(env, obj, new Value[] { a1 }); 387 } 388 389 392 public Value callMethod(Env env, Value obj, Value a1, Value a2) 393 { 394 return callMethod(env, obj, new Value[] { a1, a2 }); 395 } 396 397 400 public Value callMethod(Env env, Value obj, 401 Value a1, Value a2, Value a3) 402 { 403 return callMethod(env, obj, new Value[] { a1, a2, a3 }); 404 } 405 406 409 public Value callMethod(Env env, Value obj, 410 Value a1, Value a2, Value a3, Value a4) 411 { 412 return callMethod(env, obj, new Value[] { a1, a2, a3, a4 }); 413 } 414 415 418 public Value callMethod(Env env, Value obj, 419 Value a1, Value a2, Value a3, Value a4, Value a5) 420 { 421 return callMethod(env, obj, new Value[] { a1, a2, a3, a4, a5 }); 422 } 423 424 427 public Value callMethod(Env env, Value obj, Expr []exprs) 428 { 429 Value []argValues = new Value[exprs.length]; 430 Arg []args = getArgs(); 431 432 for (int i = 0; i < exprs.length; i++) { 433 if (i < args.length && args[i].isReference()) { 434 argValues[i] = exprs[i].evalArg(env); 435 } 436 else 437 argValues[i] = exprs[i].eval(env); 438 } 439 440 return callMethod(env, obj, argValues); 441 } 442 443 446 public Value callMethodRef(Env env, Value obj) 447 { 448 return callMethodRef(env, obj, NULL_ARG_VALUES); 449 } 450 451 454 public Value callMethodRef(Env env, Value obj, Value a1) 455 { 456 return callMethodRef(env, obj, new Value[] { a1 }); 457 } 458 459 462 public Value callMethodRef(Env env, Value obj, Value a1, Value a2) 463 { 464 return callMethodRef(env, obj, new Value[] { a1, a2 }); 465 } 466 467 470 public Value callMethodRef(Env env, Value obj, 471 Value a1, Value a2, Value a3) 472 { 473 return callMethodRef(env, obj, new Value[] { a1, a2, a3 }); 474 } 475 476 479 public Value callMethodRef(Env env, Value obj, 480 Value a1, Value a2, Value a3, Value a4) 481 { 482 return callMethodRef(env, obj, new Value[] { a1, a2, a3, a4 }); 483 } 484 485 488 public Value callMethodRef(Env env, Value obj, 489 Value a1, Value a2, Value a3, Value a4, Value a5) 490 { 491 return callMethodRef(env, obj, new Value[] { a1, a2, a3, a4, a5 }); 492 } 493 494 497 public Value callMethodRef(Env env, Value obj, Expr []exprs) 498 { 499 Value []argValues = new Value[exprs.length]; 500 Arg []args = getArgs(); 501 502 for (int i = 0; i < exprs.length; i++) { 503 if (i < args.length && args[i].isReference()) 504 argValues[i] = exprs[i].evalArg(env); 505 else 506 argValues[i] = exprs[i].eval(env); 507 } 508 509 return callMethodRef(env, obj, argValues); 510 } 511 } 512 513 | Popular Tags |